| ! RUN: %python %S/test_errors.py %s %flang_fc1 | |
| ! Error tests for structure constructors. | |
| ! Errors caught by name resolution are tested elsewhere; these are the | |
| ! errors meant to be caught by expression semantic analysis, as well as | |
| ! acceptable use cases. | |
| ! Type parameters are used here to make the parses unambiguous. | |
| ! C796 (R756) The derived-type-spec shall not specify an abstract type (7.5.7). | |
| ! This refers to a derived-type-spec used in a structure constructor | |
| module module1 | |
| type :: type1(j) | |
| integer, kind :: j | |
| integer :: n = 1 | |
| end type type1 | |
| type, extends(type1) :: type2(k) | |
| integer, kind :: k | |
| integer :: m | |
| end type type2 | |
| type, abstract :: abstract(j) | |
| integer, kind :: j | |
| integer :: n | |
| end type abstract | |
| type :: privaten(j) | |
| integer, kind :: j | |
| integer, private :: n | |
| end type privaten | |
| contains | |
| subroutine type1arg(x) | |
| type(type1(0)), intent(in) :: x | |
| end subroutine type1arg | |
| subroutine type2arg(x) | |
| type(type2(0,0)), intent(in) :: x | |
| end subroutine type2arg | |
| subroutine abstractarg(x) | |
| class(abstract(0)), intent(in) :: x | |
| end subroutine abstractarg | |
| subroutine errors | |
| call type1arg(type1(0)()) | |
| call type1arg(type1(0)(1)) | |
| call type1arg(type1(0)(n=1)) | |
| !ERROR: Type parameter 'j' may not appear as a component of a structure constructor | |
| call type1arg(type1(0)(j=1)) | |
| !ERROR: Component 'n' conflicts with another component earlier in this structure constructor | |
| call type1arg(type1(0)(1,n=2)) | |
| !ERROR: Value in structure constructor lacks a component name | |
| call type1arg(type1(0)(n=1,2)) | |
| !ERROR: Component 'n' conflicts with another component earlier in this structure constructor | |
| call type1arg(type1(0)(n=1,n=2)) | |
| !ERROR: Unexpected value in structure constructor | |
| call type1arg(type1(0)(1,2)) | |
| call type2arg(type2(0,0)(n=1,m=2)) | |
| call type2arg(type2(0,0)(m=2)) | |
| !ERROR: Structure constructor lacks a value for component 'm' | |
| call type2arg(type2(0,0)()) | |
| call type2arg(type2(0,0)(type1=type1(0)(n=1),m=2)) | |
| call type2arg(type2(0,0)(type1=type1(0)(),m=2)) | |
| !ERROR: Component 'type1' conflicts with another component earlier in this structure constructor | |
| call type2arg(type2(0,0)(n=1,type1=type1(0)(n=2),m=3)) | |
| !ERROR: Component 'n' conflicts with another component earlier in this structure constructor | |
| call type2arg(type2(0,0)(type1=type1(0)(n=1),n=2,m=3)) | |
| !ERROR: Component 'n' conflicts with another component earlier in this structure constructor | |
| call type2arg(type2(0,0)(type1=type1(0)(1),n=2,m=3)) | |
| !ERROR: Type parameter 'j' may not appear as a component of a structure constructor | |
| call type2arg(type2(0,0)(j=1, & | |
| !ERROR: Type parameter 'k' may not appear as a component of a structure constructor | |
| k=2,m=3)) | |
| !ERROR: ABSTRACT derived type 'abstract' may not be used in a structure constructor | |
| call abstractarg(abstract(0)(n=1)) | |
| !This case is ok | |
| end subroutine errors | |
| subroutine polycomponent | |
| type :: poly | |
| class(*), allocatable :: p | |
| end type poly | |
| type(poly) :: x | |
| type :: poly2 | |
| class(type1(1)), allocatable :: p1 | |
| type(type1(1)), allocatable :: p2 | |
| end type poly2 | |
| type(type1(1)) :: t1val | |
| type(poly2) :: x2 | |
| ! These cases are not errors | |
| x = poly(1) | |
| x = poly('hello') | |
| x = poly(type1(1)(123)) | |
| x2 = poly2(t1val, t1val) | |
| !ERROR: Value in structure constructor is incompatible with component 'p' of type CLASS(*) | |
| x = poly(z'feedface') | |
| end subroutine | |
| end module module1 |