xref: /llvm-project/flang/test/Semantics/implicit14.f90 (revision 1c530b3d9f86422cbc0417ea8ec97a462e9abe26)
1*1c530b3dSPeter Klausler! RUN: %python %S/test_errors.py %s %flang_fc1
2*1c530b3dSPeter Klauslermodule m
3*1c530b3dSPeter Klausler  type dt
4*1c530b3dSPeter Klausler    procedure(explicit), pointer, nopass :: p
5*1c530b3dSPeter Klausler  end type
6*1c530b3dSPeter Klausler contains
7*1c530b3dSPeter Klausler  integer function one()
8*1c530b3dSPeter Klausler    one = 1
9*1c530b3dSPeter Klausler  end
10*1c530b3dSPeter Klausler  function onePtr()
11*1c530b3dSPeter Klausler    procedure(one), pointer :: onePtr
12*1c530b3dSPeter Klausler    onePtr => one
13*1c530b3dSPeter Klausler  end
14*1c530b3dSPeter Klausler  function explicit
15*1c530b3dSPeter Klausler    character(:), allocatable :: explicit
16*1c530b3dSPeter Klausler    explicit = "abc"
17*1c530b3dSPeter Klausler  end
18*1c530b3dSPeter Klauslerend
19*1c530b3dSPeter Klausler
20*1c530b3dSPeter Klauslerprogram test
21*1c530b3dSPeter Klausler  use m
22*1c530b3dSPeter Klausler  procedure(), pointer :: p0
23*1c530b3dSPeter Klausler  procedure(one), pointer :: p1
24*1c530b3dSPeter Klausler  procedure(integer), pointer :: p2
25*1c530b3dSPeter Klausler  procedure(explicit), pointer :: p3
26*1c530b3dSPeter Klausler  external implicit
27*1c530b3dSPeter Klausler  type(dt) x
28*1c530b3dSPeter Klausler  p0 => one ! ok
29*1c530b3dSPeter Klausler  p0 => onePtr() ! ok
30*1c530b3dSPeter Klausler  p0 => implicit ! ok
31*1c530b3dSPeter Klausler  !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
32*1c530b3dSPeter Klausler  p0 => explicit
33*1c530b3dSPeter Klausler  p1 => one ! ok
34*1c530b3dSPeter Klausler  p1 => onePtr() ! ok
35*1c530b3dSPeter Klausler  p1 => implicit ! ok
36*1c530b3dSPeter Klausler  !ERROR: Function pointer 'p1' associated with incompatible function designator 'explicit': function results have incompatible attributes
37*1c530b3dSPeter Klausler  p1 => explicit
38*1c530b3dSPeter Klausler  p2 => one ! ok
39*1c530b3dSPeter Klausler  p2 => onePtr() ! ok
40*1c530b3dSPeter Klausler  p2 => implicit ! ok
41*1c530b3dSPeter Klausler  !ERROR: Function pointer 'p2' associated with incompatible function designator 'explicit': function results have incompatible attributes
42*1c530b3dSPeter Klausler  p2 => explicit
43*1c530b3dSPeter Klausler  !ERROR: Function pointer 'p3' associated with incompatible function designator 'one': function results have incompatible attributes
44*1c530b3dSPeter Klausler  p3 => one
45*1c530b3dSPeter Klausler  !ERROR: Procedure pointer 'p3' associated with result of reference to function 'oneptr' that is an incompatible procedure pointer: function results have incompatible attributes
46*1c530b3dSPeter Klausler  p3 => onePtr()
47*1c530b3dSPeter Klausler  p3 => explicit ! ok
48*1c530b3dSPeter Klausler  !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
49*1c530b3dSPeter Klausler  p3 => implicit
50*1c530b3dSPeter Klausler  !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
51*1c530b3dSPeter Klausler  x = dt(implicit)
52*1c530b3dSPeter Klausler  !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
53*1c530b3dSPeter Klausler  x%p => implicit
54*1c530b3dSPeter Klauslerend
55