[flang] Accept polymorphic component element in storage_size
[llvm-project.git] / flang / test / Semantics / generic01.f90
blob0e79a2f4747201ea80c88667c7525dad07bf23cc
1 ! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
2 ! Tests rules of 15.5.5.2 for generics and explicit intrinsics
3 ! competing at various scoping levels.
4 module m1
5 private
6 public abs
7 interface abs
8 module procedure :: abs_int_redef, abs_noargs
9 end interface
10 contains
11 integer function abs_int_redef(j)
12 integer, intent(in) :: j
13 abs_int_redef = j
14 end function
15 integer function abs_noargs()
16 abs_noargs = 0
17 end function
18 end module
20 module m2
21 private
22 public abs
23 interface abs
24 module procedure abs_real_redef
25 end interface
26 contains
27 real function abs_real_redef(x)
28 real, intent(in) :: x
29 abs_real_redef = x
30 end function
31 end module
33 module m3
34 use m1, only: abs
35 implicit none
36 contains
37 subroutine test1
38 use m2, only: abs
39 !CHECK: abs_int_redef(
40 print *, abs(1)
41 !CHECK: abs_real_redef(
42 print *, abs(1.)
43 !CHECK: 1.41421353816986083984375_4
44 print *, abs((1,1))
45 !CHECK: abs_noargs(
46 print *, abs()
47 end subroutine
48 subroutine test2
49 intrinsic abs ! override some of module's use of m1
50 block
51 use m2, only: abs
52 !CHECK: 1_4
53 print *, abs(1)
54 !CHECK: abs_real_redef(
55 print *, abs(1.)
56 !CHECK: 1.41421353816986083984375_4
57 print *, abs((1,1))
58 !CHECK: abs_noargs(
59 print *, abs()
60 end block
61 end subroutine
62 subroutine test3
63 interface abs
64 module procedure abs_complex_redef ! extend module's use of m1
65 end interface
66 !CHECK: abs_int_redef(
67 print *, abs(1)
68 !CHECK: 1._4
69 print *, abs(1.)
70 !CHECK: abs_complex_redef(
71 print *, abs((1,1))
72 !CHECK: abs_noargs(
73 print *, abs()
74 block
75 intrinsic abs ! override the extension
76 !CHECK: 1.41421353816986083984375_4
77 print *, abs((1,1))
78 end block
79 end subroutine
80 real function abs_complex_redef(z)
81 complex, intent(in) :: z
82 abs_complex_redef = z
83 end function
84 subroutine test4
85 !CHECK: abs(
86 print *, abs(1)
87 contains
88 integer function abs(n) ! override module's use of m1
89 integer, intent(in) :: n
90 abs = n
91 end function
92 end subroutine
93 end module
95 module m4
96 contains
97 integer function abs(n)
98 integer, intent(in) :: n
99 abs = n
100 end function
101 subroutine test5
102 interface abs
103 module procedure abs ! same name, host-associated
104 end interface
105 !CHECK: abs(
106 print *, abs(1)
107 end subroutine
108 end module