| !RUN: rm -rf %t && mkdir -p %t |
| !RUN: %flang_fc1 -fsyntax-only -fhermetic-module-files -DSTEP=1 -J%t %s |
| !RUN: %flang_fc1 -fsyntax-only -DSTEP=2 -J%t %s |
| !RUN: not %flang_fc1 -fsyntax-only -pedantic -J%t %s 2>&1 | FileCheck %s |
| |
| ! Tests that a module captured in a hermetic module file is compatible when |
| ! USE'd with a module of the same name USE'd directly. |
| |
| #if STEP == 1 |
| module modfile71a |
| ! not errors |
| integer, parameter :: good_named_const = 123 |
| integer :: good_var = 1 |
| type :: good_derived |
| integer component |
| end type |
| procedure(), pointer :: good_proc_ptr |
| generic :: gen => bad_subroutine |
| ! bad, but okay if unused |
| integer, parameter :: unused_bad_named_const = 123 |
| integer :: unused_bad_var = 1 |
| type :: unused_bad_derived |
| integer component |
| end type |
| procedure(), pointer :: unused_bad_proc_ptr |
| ! errors |
| integer, parameter :: bad_named_const = 123 |
| integer :: bad_var = 1 |
| type :: bad_derived |
| integer component |
| end type |
| procedure(), pointer :: bad_proc_ptr |
| contains |
| subroutine good_subroutine |
| end |
| subroutine unused_bad_subroutine(x) |
| integer x |
| end |
| subroutine bad_subroutine(x) |
| integer x |
| end |
| end |
| |
| module modfile71b |
| use modfile71a ! capture hermetically |
| end |
| |
| #elif STEP == 2 |
| module modfile71a |
| ! not errors |
| integer, parameter :: good_named_const = 123 |
| integer :: good_var = 1 |
| type :: good_derived |
| integer component |
| end type |
| procedure(), pointer :: good_proc_ptr |
| generic :: gen => bad_subroutine |
| ! bad, but okay if unused |
| integer, parameter :: unused_bad_named_const = 666 |
| real :: unused_bad_var = 1. |
| type :: unused_bad_derived |
| real component |
| end type |
| real, pointer :: unused_bad_proc_ptr |
| ! errors |
| integer, parameter :: bad_named_const = 666 |
| real :: bad_var = 1. |
| type :: bad_derived |
| real component |
| end type |
| real, pointer :: bad_proc_ptr |
| contains |
| subroutine good_subroutine |
| end |
| subroutine unused_bad_subroutine(x) |
| real x |
| end |
| subroutine bad_subroutine(x) |
| real x |
| end |
| end |
| |
| #else |
| |
| !CHECK: warning: 'bad_derived' is use-associated from 'bad_derived' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'bad_named_const' is use-associated from 'bad_named_const' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'bad_proc_ptr' is use-associated from 'bad_proc_ptr' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'bad_subroutine' is use-associated from 'bad_subroutine' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'bad_var' is use-associated from 'bad_var' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'good_derived' is use-associated from 'good_derived' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'good_named_const' is use-associated from 'good_named_const' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'good_proc_ptr' is use-associated from 'good_proc_ptr' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'good_subroutine' is use-associated from 'good_subroutine' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'good_var' is use-associated from 'good_var' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'unused_bad_derived' is use-associated from 'unused_bad_derived' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'unused_bad_named_const' is use-associated from 'unused_bad_named_const' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'unused_bad_proc_ptr' is use-associated from 'unused_bad_proc_ptr' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'unused_bad_subroutine' is use-associated from 'unused_bad_subroutine' in two distinct instances of module 'modfile71a' |
| !CHECK: warning: 'unused_bad_var' is use-associated from 'unused_bad_var' in two distinct instances of module 'modfile71a' |
| !CHECK: error: Reference to 'bad_derived' is ambiguous |
| !CHECK: error: Reference to 'bad_named_const' is ambiguous |
| !CHECK: error: Reference to 'bad_var' is ambiguous |
| !CHECK: error: Reference to 'bad_proc_ptr' is ambiguous |
| !CHECK: error: Reference to 'bad_subroutine' is ambiguous |
| !CHECK-NOT: error: |
| !CHECK-NOT: warning: |
| |
| program main |
| use modfile71a |
| use modfile71b |
| type(good_derived) goodx |
| type(bad_derived) badx |
| print *, good_named_const |
| good_var = 1 |
| good_proc_ptr => null() |
| call good_subroutine |
| print *, bad_named_const |
| print *, bad_var |
| bad_proc_ptr => null() |
| call bad_subroutine(1) |
| end |
| #endif |