| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| module m |
| type dt |
| procedure(explicit), pointer, nopass :: p |
| end type |
| contains |
| integer function one() |
| one = 1 |
| end |
| function onePtr() |
| procedure(one), pointer :: onePtr |
| onePtr => one |
| end |
| function explicit |
| character(:), allocatable :: explicit |
| explicit = "abc" |
| end |
| end |
| |
| program test |
| use m |
| procedure(), pointer :: p0 |
| procedure(one), pointer :: p1 |
| procedure(integer), pointer :: p2 |
| procedure(explicit), pointer :: p3 |
| external implicit |
| type(dt) x |
| p0 => one ! ok |
| p0 => onePtr() ! ok |
| p0 => implicit ! ok |
| !ERROR: Procedure pointer 'p0' with implicit interface may not be associated with procedure designator 'explicit' with explicit interface that cannot be called via an implicit interface |
| p0 => explicit |
| p1 => one ! ok |
| p1 => onePtr() ! ok |
| p1 => implicit ! ok |
| !ERROR: Function pointer 'p1' associated with incompatible function designator 'explicit': function results have incompatible attributes |
| p1 => explicit |
| p2 => one ! ok |
| p2 => onePtr() ! ok |
| p2 => implicit ! ok |
| !ERROR: Function pointer 'p2' associated with incompatible function designator 'explicit': function results have incompatible attributes |
| p2 => explicit |
| !ERROR: Function pointer 'p3' associated with incompatible function designator 'one': function results have incompatible attributes |
| p3 => one |
| !ERROR: Procedure pointer 'p3' associated with result of reference to function 'oneptr' that is an incompatible procedure pointer: function results have incompatible attributes |
| p3 => onePtr() |
| p3 => explicit ! ok |
| !ERROR: Procedure pointer 'p3' with explicit interface that cannot be called via an implicit interface cannot be associated with procedure designator with an implicit interface |
| p3 => implicit |
| !ERROR: Procedure pointer 'p' with explicit interface that cannot be called via an implicit interface cannot be associated with procedure designator with an implicit interface |
| x = dt(implicit) |
| !ERROR: Procedure pointer 'p' with explicit interface that cannot be called via an implicit interface cannot be associated with procedure designator with an implicit interface |
| x%p => implicit |
| end |