Skip to content

Commit e23390d

Browse files
author
Steven G. Kargl
committed
re PR fortran/91497 (-Wconversion warns when doing explicit type conversion)
2019-10-03 Steven G. Kargl <[email protected]> PR fortran/91497 * simplify.c (gfc_simplify_dble, simplify_intconv, gfc_simplify_real, gfc_simplify_sngl): Disable -Wconversion and -Wconversion-extra warnings for explicit conversion of literal constants. 2019-10-03 Steven G. Kargl <[email protected]> PR fortran/91497 * gfortran.dg/pr91497.f90: New test. From-SVN: r276532
1 parent 24ec3cc commit e23390d

File tree

4 files changed

+183
-1
lines changed

4 files changed

+183
-1
lines changed

gcc/fortran/ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
2019-10-03 Steven G. Kargl <[email protected]>
2+
3+
PR fortran/91497
4+
* simplify.c (gfc_simplify_dble, simplify_intconv, gfc_simplify_real,
5+
gfc_simplify_sngl): Disable -Wconversion and -Wconversion-extra
6+
warnings for explicit conversion of literal constants.
7+
18
2019-10-03 Bernd Edlinger <[email protected]>
29

310
* primary.c (match_real_constant): Remove shadowing local vars.

gcc/fortran/simplify.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2189,11 +2189,22 @@ gfc_expr *
21892189
gfc_simplify_dble (gfc_expr *e)
21902190
{
21912191
gfc_expr *result = NULL;
2192+
int tmp1, tmp2;
21922193

21932194
if (e->expr_type != EXPR_CONSTANT)
21942195
return NULL;
21952196

2197+
/* For explicit conversion, turn off -Wconversion and -Wconversion-extra
2198+
warnings. */
2199+
tmp1 = warn_conversion;
2200+
tmp2 = warn_conversion_extra;
2201+
warn_conversion = warn_conversion_extra = 0;
2202+
21962203
result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
2204+
2205+
warn_conversion = tmp1;
2206+
warn_conversion_extra = tmp2;
2207+
21972208
if (result == &gfc_bad_expr)
21982209
return &gfc_bad_expr;
21992210

@@ -3572,6 +3583,7 @@ static gfc_expr *
35723583
simplify_intconv (gfc_expr *e, int kind, const char *name)
35733584
{
35743585
gfc_expr *result = NULL;
3586+
int tmp1, tmp2;
35753587

35763588
/* Convert BOZ to integer, and return without range checking. */
35773589
if (e->ts.type == BT_BOZ)
@@ -3585,7 +3597,17 @@ simplify_intconv (gfc_expr *e, int kind, const char *name)
35853597
if (e->expr_type != EXPR_CONSTANT)
35863598
return NULL;
35873599

3600+
/* For explicit conversion, turn off -Wconversion and -Wconversion-extra
3601+
warnings. */
3602+
tmp1 = warn_conversion;
3603+
tmp2 = warn_conversion_extra;
3604+
warn_conversion = warn_conversion_extra = 0;
3605+
35883606
result = gfc_convert_constant (e, BT_INTEGER, kind);
3607+
3608+
warn_conversion = tmp1;
3609+
warn_conversion_extra = tmp2;
3610+
35893611
if (result == &gfc_bad_expr)
35903612
return &gfc_bad_expr;
35913613

@@ -6472,7 +6494,7 @@ gfc_expr *
64726494
gfc_simplify_real (gfc_expr *e, gfc_expr *k)
64736495
{
64746496
gfc_expr *result = NULL;
6475-
int kind;
6497+
int kind, tmp1, tmp2;
64766498

64776499
/* Convert BOZ to real, and return without range checking. */
64786500
if (e->ts.type == BT_BOZ)
@@ -6500,7 +6522,17 @@ gfc_simplify_real (gfc_expr *e, gfc_expr *k)
65006522
if (e->expr_type != EXPR_CONSTANT)
65016523
return NULL;
65026524

6525+
/* For explicit conversion, turn off -Wconversion and -Wconversion-extra
6526+
warnings. */
6527+
tmp1 = warn_conversion;
6528+
tmp2 = warn_conversion_extra;
6529+
warn_conversion = warn_conversion_extra = 0;
6530+
65036531
result = gfc_convert_constant (e, BT_REAL, kind);
6532+
6533+
warn_conversion = tmp1;
6534+
warn_conversion_extra = tmp2;
6535+
65046536
if (result == &gfc_bad_expr)
65056537
return &gfc_bad_expr;
65066538

@@ -7551,11 +7583,22 @@ gfc_expr *
75517583
gfc_simplify_sngl (gfc_expr *a)
75527584
{
75537585
gfc_expr *result;
7586+
int tmp1, tmp2;
75547587

75557588
if (a->expr_type != EXPR_CONSTANT)
75567589
return NULL;
75577590

7591+
/* For explicit conversion, turn off -Wconversion and -Wconversion-extra
7592+
warnings. */
7593+
tmp1 = warn_conversion;
7594+
tmp2 = warn_conversion_extra;
7595+
warn_conversion = warn_conversion_extra = 0;
7596+
75587597
result = gfc_real2real (a, gfc_default_real_kind);
7598+
7599+
warn_conversion = tmp1;
7600+
warn_conversion_extra = tmp2;
7601+
75597602
return range_check (result, "SNGL");
75607603
}
75617604

gcc/testsuite/ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
2019-10-03 Steven G. Kargl <[email protected]>
2+
3+
PR fortran/91497
4+
* gfortran.dg/pr91497.f90: New test.
5+
16
2019-10-03 Jan Hubicka <[email protected]>
27

38
* g++.dg/tree-ssa/pr61034.C: Add --param max-inline-insns-single-O2=200.

gcc/testsuite/gfortran.dg/pr91497.f90

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
! { dg-do compile }
2+
! { dg-options "-Wall" }
3+
! Code contributed by Manfred Schwarb <manfred99 at gmx dot ch>
4+
! PR fortran/91497
5+
!
6+
! Prior to applying the patch for this PR, the following code
7+
! would generate numerous conversion warnings.
8+
!
9+
program foo
10+
11+
real*4 a,aa
12+
real*8 b,bb
13+
real*10 c,cc
14+
real*16 d
15+
integer*2 e,ee
16+
integer*4 f,ff
17+
integer*8 g,gg
18+
PARAMETER(a=3.1415927_4)
19+
PARAMETER(b=3.1415927_8)
20+
PARAMETER(c=3.1415927_10)
21+
PARAMETER(d=3.1415927_16)
22+
PARAMETER(e=123_2)
23+
PARAMETER(f=123_4)
24+
PARAMETER(g=123_8)
25+
26+
aa=REAL(b)
27+
aa=REAL(c)
28+
aa=REAL(d)
29+
aa=REAL(e)
30+
aa=REAL(f)
31+
aa=REAL(g)
32+
aa=FLOAT(f)
33+
aa=FLOOR(b)
34+
aa=FLOOR(c)
35+
aa=FLOOR(d)
36+
aa=CEILING(b)
37+
aa=CEILING(c)
38+
aa=CEILING(d)
39+
!---unknown but documented type conversions:
40+
!!aa=FLOATI(e)
41+
!!aa=FLOATJ(f)
42+
!!aa=FLOATK(g)
43+
!---documentation is wrong for sngl:
44+
aa=SNGL(c)
45+
aa=SNGL(d)
46+
bb=REAL(c, kind=8)
47+
bb=REAL(d, kind=8)
48+
bb=DBLE(c)
49+
bb=DBLE(d)
50+
bb=DFLOAT(g)
51+
bb=FLOOR(c)
52+
bb=FLOOR(d)
53+
bb=CEILING(c)
54+
bb=CEILING(d)
55+
cc=REAL(d, kind=10)
56+
cc=FLOOR(d)
57+
cc=CEILING(d)
58+
59+
aa=AINT(b)
60+
aa=ANINT(b)
61+
aa=AINT(c)
62+
aa=ANINT(c)
63+
aa=AINT(d)
64+
aa=ANINT(d)
65+
bb=DINT(b)
66+
bb=DNINT(b)
67+
68+
ee=INT(a, kind=2)
69+
ee=NINT(a, kind=2)
70+
ee=INT(b, kind=2)
71+
ee=NINT(b, kind=2)
72+
ee=INT(c, kind=2)
73+
ee=NINT(c, kind=2)
74+
ee=INT(d, kind=2)
75+
ee=NINT(d, kind=2)
76+
ee=INT(f, kind=2)
77+
ee=INT(g, kind=2)
78+
ee=IFIX(a)
79+
ee=IDINT(b)
80+
ee=IDNINT(b)
81+
ee=INT2(a)
82+
ee=INT2(b)
83+
ee=INT2(c)
84+
ee=INT2(d)
85+
ee=INT2(f)
86+
ee=INT2(g)
87+
88+
ff=INT(a, kind=4)
89+
ff=NINT(a, kind=4)
90+
ff=INT(b, kind=4)
91+
ff=NINT(b, kind=4)
92+
ff=INT(c, kind=4)
93+
ff=NINT(c, kind=4)
94+
ff=INT(d, kind=4)
95+
ff=NINT(d, kind=4)
96+
ff=INT(f, kind=4)
97+
ff=INT(g, kind=4)
98+
ff=IFIX(a)
99+
ff=IDINT(b)
100+
ff=IDNINT(b)
101+
!---LONG not allowed anymore in gfortran 10 (?):
102+
!!ff=LONG(a)
103+
!!ff=LONG(b)
104+
!!ff=LONG(c)
105+
!!ff=LONG(d)
106+
!!ff=LONG(g)
107+
108+
gg=INT(a, kind=8)
109+
gg=NINT(a, kind=8)
110+
gg=INT(b, kind=8)
111+
gg=NINT(b, kind=8)
112+
gg=INT(c, kind=8)
113+
gg=NINT(c, kind=8)
114+
gg=INT(d, kind=8)
115+
gg=NINT(d, kind=8)
116+
gg=INT(f, kind=8)
117+
gg=INT(g, kind=8)
118+
gg=IFIX(a)
119+
gg=IDINT(b)
120+
gg=IDNINT(b)
121+
gg=INT8(a)
122+
gg=INT8(b)
123+
gg=INT8(c)
124+
gg=INT8(d)
125+
gg=INT8(g)
126+
end
127+

0 commit comments

Comments
 (0)