1! { dg-do compile }
2
3! Abstract Types.
4! Check for errors when using abstract types in an inappropriate way.
5
6MODULE m
7  USE ISO_C_BINDING
8  IMPLICIT NONE
9
10  TYPE, ABSTRACT, BIND(C) :: bindc_t ! { dg-error "must not be ABSTRACT" }
11    INTEGER(C_INT) :: x
12  END TYPE bindc_t
13
14  TYPE, ABSTRACT :: sequence_t ! { dg-error "must not be ABSTRACT" }
15    SEQUENCE
16    INTEGER :: x
17  END TYPE sequence_t
18
19  TYPE, ABSTRACT :: abst_t
20    INTEGER :: x = 0
21  END TYPE abst_t
22
23  TYPE, EXTENDS(abst_t) :: concrete_t
24    INTEGER :: y = 1
25  END TYPE concrete_t
26
27  TYPE :: myt
28    TYPE(abst_t) :: comp ! { dg-error "is of the ABSTRACT type 'abst_t'" }
29  END TYPE myt
30
31  ! This should be ok.
32  TYPE, ABSTRACT, EXTENDS(concrete_t) :: again_abst_t
33    INTEGER :: z = 2
34  END TYPE again_abst_t
35
36CONTAINS
37
38  TYPE(abst_t) FUNCTION func () ! { dg-error "of the ABSTRACT type 'abst_t'" }
39  END FUNCTION func
40
41  SUBROUTINE sub (arg) ! { dg-error "is of the ABSTRACT type 'again_abst_t'" }
42    IMPLICIT NONE
43    TYPE(again_abst_t) :: arg
44    arg = again_abst_t () ! { dg-error "Can't construct ABSTRACT type 'again_abst_t'" }
45  END SUBROUTINE sub
46
47  SUBROUTINE impl ()
48    IMPLICIT TYPE(abst_t) (a-z) ! { dg-error "ABSTRACT type 'abst_t' used" }
49  END SUBROUTINE impl
50
51END MODULE m
52