aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-10-03 20:46:26 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-10-03 20:46:26 +0000
commite23390d29e19a8a6aea06fd3c4cc3990c9977ac8 (patch)
treea5f8481646a3870a8fef6c6dcdafad2ce7158667 /gcc/fortran/simplify.c
parent24ec3cc957c4181d8da9972cb2aa212a3e0cec1c (diff)
downloadgcc-e23390d29e19a8a6aea06fd3c4cc3990c9977ac8.zip
gcc-e23390d29e19a8a6aea06fd3c4cc3990c9977ac8.tar.gz
gcc-e23390d29e19a8a6aea06fd3c4cc3990c9977ac8.tar.bz2
re PR fortran/91497 (-Wconversion warns when doing explicit type conversion)
2019-10-03 Steven G. Kargl <kargl@gcc.gnu.org> 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 <kargl@gcc.gnu.org> PR fortran/91497 * gfortran.dg/pr91497.f90: New test. From-SVN: r276532
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 32ebcc0..8c1577e 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -2189,11 +2189,22 @@ gfc_expr *
gfc_simplify_dble (gfc_expr *e)
{
gfc_expr *result = NULL;
+ int tmp1, tmp2;
if (e->expr_type != EXPR_CONSTANT)
return NULL;
+ /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
+ warnings. */
+ tmp1 = warn_conversion;
+ tmp2 = warn_conversion_extra;
+ warn_conversion = warn_conversion_extra = 0;
+
result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
+
+ warn_conversion = tmp1;
+ warn_conversion_extra = tmp2;
+
if (result == &gfc_bad_expr)
return &gfc_bad_expr;
@@ -3572,6 +3583,7 @@ static gfc_expr *
simplify_intconv (gfc_expr *e, int kind, const char *name)
{
gfc_expr *result = NULL;
+ int tmp1, tmp2;
/* Convert BOZ to integer, and return without range checking. */
if (e->ts.type == BT_BOZ)
@@ -3585,7 +3597,17 @@ simplify_intconv (gfc_expr *e, int kind, const char *name)
if (e->expr_type != EXPR_CONSTANT)
return NULL;
+ /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
+ warnings. */
+ tmp1 = warn_conversion;
+ tmp2 = warn_conversion_extra;
+ warn_conversion = warn_conversion_extra = 0;
+
result = gfc_convert_constant (e, BT_INTEGER, kind);
+
+ warn_conversion = tmp1;
+ warn_conversion_extra = tmp2;
+
if (result == &gfc_bad_expr)
return &gfc_bad_expr;
@@ -6472,7 +6494,7 @@ gfc_expr *
gfc_simplify_real (gfc_expr *e, gfc_expr *k)
{
gfc_expr *result = NULL;
- int kind;
+ int kind, tmp1, tmp2;
/* Convert BOZ to real, and return without range checking. */
if (e->ts.type == BT_BOZ)
@@ -6500,7 +6522,17 @@ gfc_simplify_real (gfc_expr *e, gfc_expr *k)
if (e->expr_type != EXPR_CONSTANT)
return NULL;
+ /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
+ warnings. */
+ tmp1 = warn_conversion;
+ tmp2 = warn_conversion_extra;
+ warn_conversion = warn_conversion_extra = 0;
+
result = gfc_convert_constant (e, BT_REAL, kind);
+
+ warn_conversion = tmp1;
+ warn_conversion_extra = tmp2;
+
if (result == &gfc_bad_expr)
return &gfc_bad_expr;
@@ -7551,11 +7583,22 @@ gfc_expr *
gfc_simplify_sngl (gfc_expr *a)
{
gfc_expr *result;
+ int tmp1, tmp2;
if (a->expr_type != EXPR_CONSTANT)
return NULL;
+ /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
+ warnings. */
+ tmp1 = warn_conversion;
+ tmp2 = warn_conversion_extra;
+ warn_conversion = warn_conversion_extra = 0;
+
result = gfc_real2real (a, gfc_default_real_kind);
+
+ warn_conversion = tmp1;
+ warn_conversion_extra = tmp2;
+
return range_check (result, "SNGL");
}