| ! RUN: %python %S/test_errors.py %s %flang_fc1 | |
| ! Tests valid and invalid NULL initializers | |
| module m1 | |
| implicit none | |
| !ERROR: No explicit type declared for 'null' | |
| private :: null | |
| end module | |
| module m2 | |
| implicit none | |
| private :: null | |
| integer, pointer :: p => null() | |
| end module | |
| module m3 | |
| private :: null | |
| integer, pointer :: p => null() | |
| end module | |
| module m4 | |
| intrinsic :: null | |
| integer, pointer :: p => null() | |
| end module | |
| module m5 | |
| external :: null | |
| !ERROR: Pointer initializer must be intrinsic NULL() | |
| integer, pointer :: p => null() | |
| end module | |
| module m6 | |
| !ERROR: Symbol 'null' cannot have both INTRINSIC and EXTERNAL attributes | |
| integer, pointer :: p => null() | |
| external :: null | |
| end module | |
| module m7 | |
| interface | |
| !WARNING: The external interface 'null' is not compatible with an earlier definition (function results have incompatible attributes) [-Wexternal-interface-mismatch] | |
| function null() result(p) | |
| integer, pointer :: p | |
| end function | |
| end interface | |
| !ERROR: Pointer initializer must be intrinsic NULL() | |
| integer, pointer :: p => null() | |
| end module | |
| module m8 | |
| integer, pointer :: p => null() | |
| interface | |
| !ERROR: 'null' is already declared in this scoping unit | |
| function null() result(p) | |
| integer, pointer :: p | |
| end function | |
| end interface | |
| end module | |
| module m9a | |
| intrinsic :: null | |
| contains | |
| function foo() | |
| integer, pointer :: foo | |
| foo => null() | |
| end function | |
| end module | |
| module m9b | |
| use m9a, renamed => null, null => foo | |
| integer, pointer :: p => renamed() | |
| !ERROR: Pointer initializer must be intrinsic NULL() | |
| integer, pointer :: q => null() | |
| integer, pointer :: d1, d2 | |
| data d1/renamed()/ | |
| !ERROR: An initial data target must be a designator with constant subscripts | |
| data d2/null()/ | |
| end module | |
| subroutine m10 | |
| real, pointer :: x, y | |
| !ERROR: 'null' must be an array or structure constructor if used with non-empty parentheses as a DATA statement constant | |
| data x/null(y)/ | |
| end | |
| subroutine m11 | |
| type :: null | |
| integer :: mold | |
| end type | |
| type(null) :: obj(2) | |
| integer, parameter :: j = 0 | |
| data obj/null(mold=j), null(j)/ ! both fine | |
| end subroutine | |
| subroutine m12 | |
| integer, parameter :: j = 1 | |
| integer, target, save :: null(1) | |
| integer, pointer :: p | |
| data p/null(j)/ ! ok | |
| end subroutine | |
| subroutine s13 | |
| integer, external, pointer :: p1 => null() | |
| procedure(), pointer :: p2 => null() | |
| end subroutine |