view gcc/testsuite/gfortran.dg/structure_constructor_8.f03 @ 118:fd00160c1b76

ifdef TARGET_64BIT
author mir3636
date Tue, 27 Feb 2018 15:01:35 +0900
parents 04ced10e8804
children
line wrap: on
line source

! { dg-do compile }
! Test for errors when setting private components inside a structure constructor
! or when constructing a private structure.

MODULE privmod
  IMPLICIT NONE

  TYPE :: haspriv_t
    INTEGER :: a
    INTEGER, PRIVATE :: b = 42
  END TYPE haspriv_t

  TYPE :: allpriv_t
    PRIVATE
    INTEGER :: a = 25
  END TYPE allpriv_t

  TYPE, PRIVATE :: ispriv_t
    INTEGER :: x
  END TYPE ispriv_t

CONTAINS
  
  SUBROUTINE testfunc ()
    IMPLICIT NONE
    TYPE(haspriv_t) :: struct1
    TYPE(allpriv_t) :: struct2
    TYPE(ispriv_t) :: struct3

    ! This should succeed from within the module, no error.
    struct1 = haspriv_t (1, 2)
    struct2 = allpriv_t (42)
    struct3 = ispriv_t (42)
  END SUBROUTINE testfunc

END MODULE privmod

PROGRAM test
  USE privmod
  IMPLICIT NONE

  TYPE(haspriv_t) :: struct1
  TYPE(allpriv_t) :: struct2

  ! This should succeed, not giving value to private component
  struct1 = haspriv_t (5)
  struct2 = allpriv_t ()

  ! These should fail
  struct1 = haspriv_t (1, 2) ! { dg-error "is a PRIVATE component" }
  struct1 = haspriv_t (b = 2, a = 1) ! { dg-error "is a PRIVATE component" }

  ! This should fail as all components are private
  struct2 = allpriv_t (5) ! { dg-error "is a PRIVATE component" }

  ! This should fail as the type itself is private, and the expression should
  ! be deduced as call to an undefined function.
  WRITE (*,*) ispriv_t (5) ! { dg-error "has no IMPLICIT type" }

END PROGRAM test