Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 90334cc

Browse files
authored
[flang] Use __builtin_int for integer conversions (#195748)
Frontend inserted conversions may conflict with variable names. Avoid this for integer conversions by using `__builtin_int` instead of `int`. Fixes #188879
1 parent 3bcbeef commit 90334cc

38 files changed

Lines changed: 150 additions & 137 deletions

flang/include/flang/Evaluate/intrinsics.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ class IntrinsicProcTable {
115115
static const inline std::string InvalidName{
116116
"(invalid intrinsic function call)"};
117117

118+
// Name of intrinsics used in various locations.
119+
static inline const char *const BuiltinIntName{"__builtin_int"};
120+
118121
llvm::raw_ostream &Dump(llvm::raw_ostream &) const;
119122

120123
private:

flang/lib/Evaluate/formatting.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ llvm::raw_ostream &Convert<TO, FROMCAT>::AsFortran(llvm::raw_ostream &o) const {
510510
if constexpr (TO::category == TypeCategory::Character) {
511511
this->left().AsFortran(o << "achar(iachar(") << ')';
512512
} else if constexpr (TO::category == TypeCategory::Integer) {
513-
this->left().AsFortran(o << "int(");
513+
this->left().AsFortran(o << IntrinsicProcTable::BuiltinIntName << "(");
514514
} else if constexpr (TO::category == TypeCategory::Real) {
515515
this->left().AsFortran(o << "real(");
516516
} else if constexpr (TO::category == TypeCategory::Complex) {
@@ -828,10 +828,10 @@ llvm::raw_ostream &DescriptorInquiry::AsFortran(llvm::raw_ostream &o) const {
828828
o << "%STRIDE(";
829829
break;
830830
case Field::Rank:
831-
o << "int(rank(";
831+
o << IntrinsicProcTable::BuiltinIntName << "(rank(";
832832
break;
833833
case Field::Len:
834-
o << "int(";
834+
o << IntrinsicProcTable::BuiltinIntName << "(";
835835
break;
836836
}
837837
base_.AsFortran(o);

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,7 @@ static const std::pair<const char *, const char *> genericAlias[]{
11871187
{"unsigned", "uint"}, // Sun vs gfortran names
11881188
{"xor", "ieor"},
11891189
{"__builtin_ieee_selected_real_kind", "selected_real_kind"},
1190+
{IntrinsicProcTable::BuiltinIntName, "int"},
11901191
};
11911192

11921193
// The following table contains the intrinsic functions listed in

flang/test/Evaluate/bug153031.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ pure integer function pure(n)
1111
end interface
1212
type(t) :: x(10)
1313
allocate(x(1)%a(2))
14-
!CHECK: PRINT *, ubound(x(int(impure(1_4),kind=8))%a,dim=1_4)
14+
!CHECK: PRINT *, ubound(x(__builtin_int(impure(1_4),kind=8))%a,dim=1_4)
1515
print *, ubound(x(impure(1))%a, dim=1)
16-
!CHECK: PRINT *, int(size(x(int(pure(1_4),kind=8))%a,dim=1,kind=8)+lbound(x(int(pure(1_4),kind=8))%a,dim=1,kind=8)-1_8,kind=4)
16+
!CHECK: PRINT *, __builtin_int(size(x(__builtin_int(pure(1_4),kind=8))%a,dim=1,kind=8)+lbound(x(__builtin_int(pure(1_4),kind=8))%a,dim=1,kind=8)-1_8,kind=4)
1717
print *, ubound(x(pure(1))%a, dim=1)
1818
end

flang/test/Evaluate/bug188879.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s
2+
! Ensure that integer conversions inserted by the frontend use __builtin_int.
3+
4+
subroutine sub0 (n, int )
5+
integer(kind=4) :: n
6+
!CHECK: Subprogram scope: sub0
7+
!CHECK: int {{.*}}: ObjectEntity dummy type: INTEGER(4) shape: 1_8:__builtin_int(n,kind=8)
8+
integer(kind=4) :: int(n)
9+
end subroutine

flang/test/Evaluate/elem-shape.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module m
55
subroutine sub(x,y)
66
real :: x(:), y(:)
77
optional x
8-
!CHECK: PRINT *, int(size(y,dim=1,kind=8),kind=4)
8+
!CHECK: PRINT *, __builtin_int(size(y,dim=1,kind=8),kind=4)
99
print *, size(f(x,y))
1010
end
1111
elemental function f(x,y)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
22
subroutine sub3(ar_at)
33
type(*) :: ar_at(..)
4-
!CHECK: PRINT *, int(int(rank(ar_at),kind=8),kind=4)
4+
!CHECK: PRINT *, __builtin_int(__builtin_int(rank(ar_at),kind=8),kind=4)
55
print *, rank(ar_at)
66
end

flang/test/Evaluate/rewrite-out_of_range.F90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,14 @@
178178
!CHECK: PRINT *, " real", 2_4, "real", 8_4, .false._4
179179
!CHECK: PRINT *, " real", 2_4, "real", 10_4, .false._4
180180
!CHECK-KIND16: PRINT *, " real", 2_4, "real", 16_4, .false._4
181-
!CHECK: PRINT *, " real", 3_4, "real", 2_4, blt(int(transfer(abs(x)-6.5536e4_3,0_2),kind=8)-1_8,32639_2)
181+
!CHECK: PRINT *, " real", 3_4, "real", 2_4, blt(__builtin_int(transfer(abs(x)-6.5536e4_3,0_2),kind=8)-1_8,32639_2)
182182
!CHECK: PRINT *, " real", 3_4, "real", 3_4, .false._4
183183
!CHECK: PRINT *, " real", 3_4, "real", 4_4, .false._4
184184
!CHECK: PRINT *, " real", 3_4, "real", 8_4, .false._4
185185
!CHECK: PRINT *, " real", 3_4, "real", 10_4, .false._4
186186
!CHECK-KIND16: PRINT *, " real", 3_4, "real", 16_4, .false._4
187-
!CHECK: PRINT *, " real", 4_4, "real", 2_4, blt(int(transfer(abs(x)-6.5504e4_4,0_4),kind=8)-1_8,2139095039_4)
188-
!CHECK: PRINT *, " real", 4_4, "real", 3_4, blt(int(transfer(abs(x)-3.3895313892515354759047080037148786688e38_4,0_4),kind=8)-1_8,2139095039_4)
187+
!CHECK: PRINT *, " real", 4_4, "real", 2_4, blt(__builtin_int(transfer(abs(x)-6.5504e4_4,0_4),kind=8)-1_8,2139095039_4)
188+
!CHECK: PRINT *, " real", 4_4, "real", 3_4, blt(__builtin_int(transfer(abs(x)-3.3895313892515354759047080037148786688e38_4,0_4),kind=8)-1_8,2139095039_4)
189189
!CHECK: PRINT *, " real", 4_4, "real", 4_4, .false._4
190190
!CHECK: PRINT *, " real", 4_4, "real", 8_4, .false._4
191191
!CHECK: PRINT *, " real", 4_4, "real", 10_4, .false._4

flang/test/Evaluate/rewrite01.f90

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function returns_array_3()
2626
subroutine ubound_test(x, n, m)
2727
integer :: x(n, m)
2828
integer :: y(0:n, 0:m) ! UBOUND could be 0 if n or m are < 0
29-
!CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1,kind=8),kind=4),int(size(x,dim=2,kind=8),kind=4)]
29+
!CHECK: PRINT *, [INTEGER(4)::__builtin_int(size(x,dim=1,kind=8),kind=4),__builtin_int(size(x,dim=2,kind=8),kind=4)]
3030
print *, ubound(x)
3131
!CHECK: PRINT *, ubound(returns_array(n,m))
3232
print *, ubound(returns_array(n, m))
@@ -44,7 +44,7 @@ subroutine ubound_test(x, n, m)
4444

4545
subroutine size_test(x, n, m)
4646
integer :: x(n, m)
47-
!CHECK: PRINT *, int(size(x,dim=1,kind=8)*size(x,dim=2,kind=8),kind=4)
47+
!CHECK: PRINT *, __builtin_int(size(x,dim=1,kind=8)*size(x,dim=2,kind=8),kind=4)
4848
print *, size(x)
4949
!CHECK: PRINT *, size(returns_array(n,m))
5050
print *, size(returns_array(n, m))
@@ -65,7 +65,7 @@ function foo(n)
6565
end interface
6666
procedure(foo), pointer :: pf
6767
integer :: x(n, m)
68-
!CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1,kind=8),kind=4),int(size(x,dim=2,kind=8),kind=4)]
68+
!CHECK: PRINT *, [INTEGER(4)::__builtin_int(size(x,dim=1,kind=8),kind=4),__builtin_int(size(x,dim=2,kind=8),kind=4)]
6969
print *, shape(x)
7070
!CHECK: PRINT *, shape(returns_array(n,m))
7171
print *, shape(returns_array(n, m))
@@ -126,7 +126,7 @@ function mofun(L)
126126
end function mofun
127127
end interface
128128

129-
!CHECK: PRINT *, int(int(a%len,kind=8),kind=4)
129+
!CHECK: PRINT *, __builtin_int(__builtin_int(a%len,kind=8),kind=4)
130130
print *, len(a)
131131
!CHECK: PRINT *, 5_4
132132
print *, len(a(1:5))
@@ -136,7 +136,7 @@ end function mofun
136136
print *, len(b(a) // a)
137137
!CHECK: PRINT *, 10_4
138138
print *, len(c)
139-
!CHECK: PRINT *, len(c(int(i,kind=8):int(j,kind=8)))
139+
!CHECK: PRINT *, len(c(__builtin_int(i,kind=8):__builtin_int(j,kind=8)))
140140
print *, len(c(i:j))
141141
!CHECK: PRINT *, 5_4
142142
print *, len(c(1:5))
@@ -146,11 +146,11 @@ end function mofun
146146
print *, len(d(c) // c)
147147
!CHECK: PRINT *, 0_4
148148
print *, len(a(10:4))
149-
!CHECK: PRINT *, int(max(0_8,int(m,kind=8)-int(n,kind=8)+1_8),kind=4)
149+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(m,kind=8)-__builtin_int(n,kind=8)+1_8),kind=4)
150150
print *, len(a(n:m))
151-
!CHECK: PRINT *, len(b(a(int(n,kind=8):int(m,kind=8))))
151+
!CHECK: PRINT *, len(b(a(__builtin_int(n,kind=8):__builtin_int(m,kind=8))))
152152
print *, len(b(a(n:m)))
153-
!CHECK: PRINT *, int(max(0_8,max(0_8,int(n,kind=8))-4_8+1_8),kind=4)
153+
!CHECK: PRINT *, __builtin_int(max(0_8,max(0_8,__builtin_int(n,kind=8))-4_8+1_8),kind=4)
154154
print *, len(e(4:))
155155
!CHECK: PRINT *, len(fun1(n-m))
156156
print *, len(fun1(n-m))
@@ -162,7 +162,7 @@ end function mofun
162162
print *, len(trim(c))
163163
!CHECK: PRINT *, 40_4
164164
print *, len(repeat(c, 4))
165-
!CHECK: PRINT *, len(repeat(c,int(i,kind=8)))
165+
!CHECK: PRINT *, len(repeat(c,__builtin_int(i,kind=8)))
166166
print *, len(repeat(c, i))
167167
end subroutine len_test
168168

@@ -237,7 +237,7 @@ subroutine array_ctor_implied_do_index(x, j)
237237
character(10) :: c
238238
!CHECK: PRINT *, size([INTEGER(4)::(x(1_8:i:1_8),INTEGER(8)::i=1_8,2_8,1_8)])
239239
print *, size([(x(1:i), integer(8)::i=1,2)])
240-
!CHECK: PRINT *, int(2_8*max((j-1_8+1_8)/1_8,0_8),kind=4)
240+
!CHECK: PRINT *, __builtin_int(2_8*max((j-1_8+1_8)/1_8,0_8),kind=4)
241241
print *, size([(x(1:j), integer(8)::i=1,2)])
242242
!CHECK: PRINT *, len([(c(i:i),INTEGER(8)::i=1_8,4_8,1_8)])
243243
print *, len([(c(i:i), integer(8)::i = 1,4)])

flang/test/Evaluate/rewrite02.f90

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ subroutine foo(j)
88
character*4 sc, ac(1)
99
end type
1010
type(t) st, at(1)
11-
!CHECK: PRINT *, sc(1_8:int(j,kind=8))
11+
!CHECK: PRINT *, sc(1_8:__builtin_int(j,kind=8))
1212
print *, sc(1:j)
13-
!CHECK: PRINT *, ac(1_8)(1_8:int(j,kind=8))
13+
!CHECK: PRINT *, ac(1_8)(1_8:__builtin_int(j,kind=8))
1414
print *, ac(1)(1:j)
15-
!CHECK: PRINT *, st%sc(1_8:int(j,kind=8))
15+
!CHECK: PRINT *, st%sc(1_8:__builtin_int(j,kind=8))
1616
print *, st%sc(1:j)
17-
!CHECK: PRINT *, st%ac(1_8)(1_8:int(j,kind=8))
17+
!CHECK: PRINT *, st%ac(1_8)(1_8:__builtin_int(j,kind=8))
1818
print *, st%ac(1)(1:j)
19-
!CHECK: PRINT *, at(1_8)%sc(1_8:int(j,kind=8))
19+
!CHECK: PRINT *, at(1_8)%sc(1_8:__builtin_int(j,kind=8))
2020
print *, at(1)%sc(1:j)
21-
!CHECK: PRINT *, at(1_8)%ac(1_8)(1_8:int(j,kind=8))
21+
!CHECK: PRINT *, at(1_8)%ac(1_8)(1_8:__builtin_int(j,kind=8))
2222
print *, at(1)%ac(1)(1:j)
2323
!CHECK: PRINT *, 1_4
2424
print *, sc(1:j)%kind
@@ -32,16 +32,16 @@ subroutine foo(j)
3232
print *, at(1)%sc(1:j)%kind
3333
!CHECK: PRINT *, 1_4
3434
print *, at(1)%ac(1)(1:j)%kind
35-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
35+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
3636
print *, sc(1:j)%len
37-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
37+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
3838
print *, ac(1)(1:j)%len
39-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
39+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
4040
print *, st%sc(1:j)%len
41-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
41+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
4242
print *, st%ac(1)(1:j)%len
43-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
43+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
4444
print *, at(1)%sc(1:j)%len
45-
!CHECK: PRINT *, int(max(0_8,int(j,kind=8)-1_8+1_8),kind=4)
45+
!CHECK: PRINT *, __builtin_int(max(0_8,__builtin_int(j,kind=8)-1_8+1_8),kind=4)
4646
print *, at(1)%ac(1)(1:j)%len
4747
end

0 commit comments

Comments
 (0)