Commit daf8c6f0 by Daniel Franke Committed by Daniel Franke

re PR fortran/44055 (Warn (-Wconversion*) when converting single to double precision)

gcc/fortran/:
2010-05-19  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/44055
	* lang.opt (Wconversion-extra): New option.
	* gfortran.h (gfc_option_t): Add warn_conversion_extra.
	* options.c (gfc_init_options): Disable -Wconversion-extra by default.
	(set_Wall): Enable -Wconversion.
	(gfc_handle_option): Set warn_conversion_extra.
	* intrinsic.c (gfc_convert_type_warn): Ignore kind conditions
	introduced for -Wconversion if -Wconversion-extra is present.
	* invoke.texi: Add -Wconversion to -Wall; document new behaviour of
	-Wconversion; document -Wconversion-extra.

gcc/testsuite/:
2010-05-19  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/44055
	* gfortran.dg/c_sizeof_2.f90: Add -Wno-conversion to dg-options;
	Fixed scope of C_SIZEOF.
	* gfortran.dg/warn_conversion_2.f90: New.

From-SVN: r159586
parent f311c3b4
2010-05-19 Daniel Franke <franke.daniel@gmail.com> 2010-05-19 Daniel Franke <franke.daniel@gmail.com>
PR fortran/44055
* lang.opt (Wconversion-extra): New option.
* gfortran.h (gfc_option_t): Add warn_conversion_extra.
* options.c (gfc_init_options): Disable -Wconversion-extra by default.
(set_Wall): Enable -Wconversion.
(gfc_handle_option): Set warn_conversion_extra.
* intrinsic.c (gfc_convert_type_warn): Ignore kind conditions
introduced for -Wconversion if -Wconversion-extra is present.
* invoke.texi: Add -Wconversion to -Wall; document new behaviour of
-Wconversion; document -Wconversion-extra.
2010-05-19 Daniel Franke <franke.daniel@gmail.com>
PR fortran/42360 PR fortran/42360
* gfortran.h (gfc_has_default_initializer): New. * gfortran.h (gfc_has_default_initializer): New.
* expr.c (gfc_has_default_initializer): New. * expr.c (gfc_has_default_initializer): New.
......
...@@ -2105,6 +2105,7 @@ typedef struct ...@@ -2105,6 +2105,7 @@ typedef struct
int warn_aliasing; int warn_aliasing;
int warn_ampersand; int warn_ampersand;
int warn_conversion; int warn_conversion;
int warn_conversion_extra;
int warn_implicit_interface; int warn_implicit_interface;
int warn_implicit_procedure; int warn_implicit_procedure;
int warn_line_truncation; int warn_line_truncation;
......
...@@ -4015,18 +4015,38 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) ...@@ -4015,18 +4015,38 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
/* At this point, a conversion is necessary. A warning may be needed. */ /* At this point, a conversion is necessary. A warning may be needed. */
if ((gfc_option.warn_std & sym->standard) != 0) if ((gfc_option.warn_std & sym->standard) != 0)
gfc_warning_now ("Extension: Conversion from %s to %s at %L",
gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
else if (wflag && gfc_option.warn_conversion)
{ {
gfc_warning_now ("Extension: Conversion from %s to %s at %L",
gfc_typename (&from_ts), gfc_typename (ts),
&expr->where);
}
else if (wflag)
{
/* Two modes of warning:
- gfc_option.warn_conversion tries to be more intelligent
about the warnings raised and omits those where smaller
kinds are promoted to larger ones without change in the
value
- gfc_option.warn_conversion_extra does not take the kinds
into account and also warns for coversions like
REAL(4) -> REAL(8)
NOTE: Possible enhancement for warn_conversion
If converting from a smaller to a larger kind, check if the
value is constant and if yes, whether the value still fits
in the smaller kind. If yes, omit the warning.
*/
/* If the types are the same (but not LOGICAL), and if from-kind /* If the types are the same (but not LOGICAL), and if from-kind
is larger than to-kind, this may indicate a loss of precision. is larger than to-kind, this may indicate a loss of precision.
The same holds for conversions from REAL to COMPLEX. */ The same holds for conversions from REAL to COMPLEX. */
if (((from_ts.type == ts->type && from_ts.type != BT_LOGICAL) if (((from_ts.type == ts->type && from_ts.type != BT_LOGICAL)
&& from_ts.kind > ts->kind) && ((gfc_option.warn_conversion && from_ts.kind > ts->kind)
|| gfc_option.warn_conversion_extra))
|| ((from_ts.type == BT_REAL && ts->type == BT_COMPLEX) || ((from_ts.type == BT_REAL && ts->type == BT_COMPLEX)
&& from_ts.kind > ts->kind)) && ((gfc_option.warn_conversion && from_ts.kind > ts->kind)
gfc_warning_now ("Possible loss of precision in conversion " || gfc_option.warn_conversion_extra)))
gfc_warning_now ("Possible change of value in conversion "
"from %s to %s at %L", gfc_typename (&from_ts), "from %s to %s at %L", gfc_typename (&from_ts),
gfc_typename (ts), &expr->where); gfc_typename (ts), &expr->where);
...@@ -4037,18 +4057,21 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) ...@@ -4037,18 +4057,21 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
an overflow error with range checking. */ an overflow error with range checking. */
else if (from_ts.type == BT_INTEGER else if (from_ts.type == BT_INTEGER
&& (ts->type == BT_REAL || ts->type == BT_COMPLEX) && (ts->type == BT_REAL || ts->type == BT_COMPLEX)
&& from_ts.kind > ts->kind) && ((gfc_option.warn_conversion && from_ts.kind > ts->kind)
gfc_warning_now ("Possible loss of digits in conversion " || gfc_option.warn_conversion_extra))
gfc_warning_now ("Possible change of value in conversion "
"from %s to %s at %L", gfc_typename (&from_ts), "from %s to %s at %L", gfc_typename (&from_ts),
gfc_typename (ts), &expr->where); gfc_typename (ts), &expr->where);
/* If REAL/COMPLEX is converted to INTEGER, or COMPLEX is converted /* If REAL/COMPLEX is converted to INTEGER, or COMPLEX is converted
to REAL we almost certainly have a loss of digits, regardless of to REAL we almost certainly have a loss of digits, regardless of
the respective kinds. */ the respective kinds. */
else if (((from_ts.type == BT_REAL || from_ts.type == BT_COMPLEX) else if ((((from_ts.type == BT_REAL || from_ts.type == BT_COMPLEX)
&& ts->type == BT_INTEGER) && ts->type == BT_INTEGER)
|| (from_ts.type == BT_COMPLEX && ts->type == BT_REAL)) || (from_ts.type == BT_COMPLEX && ts->type == BT_REAL))
gfc_warning_now ("Likely loss of digits in conversion from" && (gfc_option.warn_conversion
|| gfc_option.warn_conversion_extra))
gfc_warning_now ("Possible change of value in conversion from "
"%s to %s at %L", gfc_typename (&from_ts), "%s to %s at %L", gfc_typename (&from_ts),
gfc_typename (ts), &expr->where); gfc_typename (ts), &expr->where);
} }
......
...@@ -688,8 +688,8 @@ warnings. ...@@ -688,8 +688,8 @@ warnings.
@cindex warnings, all @cindex warnings, all
Enables commonly used warning options pertaining to usage that Enables commonly used warning options pertaining to usage that
we recommend avoiding and that we believe are easy to avoid. we recommend avoiding and that we believe are easy to avoid.
This currently includes @option{-Waliasing}, This currently includes @option{-Waliasing}, @option{-Wampersand},
@option{-Wampersand}, @option{-Wsurprising}, @option{-Wintrinsics-std}, @option{-Wconversion}, @option{-Wsurprising}, @option{-Wintrinsics-std},
@option{-Wno-tabs}, @option{-Wintrinsic-shadow} and @option{-Wline-truncation}. @option{-Wno-tabs}, @option{-Wintrinsic-shadow} and @option{-Wline-truncation}.
@item -Waliasing @item -Waliasing
...@@ -746,7 +746,14 @@ Warn when a source code line will be truncated. ...@@ -746,7 +746,14 @@ Warn when a source code line will be truncated.
@opindex @code{Wconversion} @opindex @code{Wconversion}
@cindex warnings, conversion @cindex warnings, conversion
@cindex conversion @cindex conversion
Warn about implicit conversions between different types. Warn about implicit conversions that are likely to change the value of
the expression after conversion. Implied by @option{-Wall}.
@item -Wconversion-extra
@opindex @code{Wconversion-extra}
@cindex warnings, conversion
@cindex conversion
Warn about implicit conversions between different types and kinds.
@item -Wimplicit-interface @item -Wimplicit-interface
@opindex @code{Wimplicit-interface} @opindex @code{Wimplicit-interface}
......
...@@ -92,6 +92,10 @@ Wconversion ...@@ -92,6 +92,10 @@ Wconversion
Fortran Warning Fortran Warning
; Documented in C ; Documented in C
Wconversion-extra
Fortran Warning
Warn about most implicit conversions
Wimplicit-interface Wimplicit-interface
Fortran Warning Fortran Warning
Warn about calls with implicit interface Warn about calls with implicit interface
......
...@@ -78,6 +78,7 @@ gfc_init_options (unsigned int argc, const char **argv) ...@@ -78,6 +78,7 @@ gfc_init_options (unsigned int argc, const char **argv)
gfc_option.warn_character_truncation = 0; gfc_option.warn_character_truncation = 0;
gfc_option.warn_array_temp = 0; gfc_option.warn_array_temp = 0;
gfc_option.warn_conversion = 0; gfc_option.warn_conversion = 0;
gfc_option.warn_conversion_extra = 0;
gfc_option.warn_implicit_interface = 0; gfc_option.warn_implicit_interface = 0;
gfc_option.warn_line_truncation = 0; gfc_option.warn_line_truncation = 0;
gfc_option.warn_surprising = 0; gfc_option.warn_surprising = 0;
...@@ -402,6 +403,7 @@ set_Wall (int setting) ...@@ -402,6 +403,7 @@ set_Wall (int setting)
{ {
gfc_option.warn_aliasing = setting; gfc_option.warn_aliasing = setting;
gfc_option.warn_ampersand = setting; gfc_option.warn_ampersand = setting;
gfc_option.warn_conversion = setting;
gfc_option.warn_line_truncation = setting; gfc_option.warn_line_truncation = setting;
gfc_option.warn_surprising = setting; gfc_option.warn_surprising = setting;
gfc_option.warn_tabs = !setting; gfc_option.warn_tabs = !setting;
...@@ -568,6 +570,10 @@ gfc_handle_option (size_t scode, const char *arg, int value, ...@@ -568,6 +570,10 @@ gfc_handle_option (size_t scode, const char *arg, int value,
gfc_option.warn_conversion = value; gfc_option.warn_conversion = value;
break; break;
case OPT_Wconversion_extra:
gfc_option.warn_conversion_extra = value;
break;
case OPT_Wimplicit_interface: case OPT_Wimplicit_interface:
gfc_option.warn_implicit_interface = value; gfc_option.warn_implicit_interface = value;
break; break;
......
2010-05-19 Daniel Franke <franke.daniel@gmail.com>
PR fortran/44055
* gfortran.dg/c_sizeof_2.f90: Add -Wno-conversion to dg-options;
Fixed scope of C_SIZEOF.
* gfortran.dg/warn_conversion_2.f90: New.
2010-05-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2010-05-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* lib/target-supports.exp (check_effective_target_sse2): New proc. * lib/target-supports.exp (check_effective_target_sse2): New proc.
......
! { dg-do compile } ! { dg-do compile }
! { dg-options "-std=f2003 -Wall" } ! { dg-options "-std=f2003 -Wall -Wno-conversion" }
! Support F2008's c_sizeof() ! Support F2008's c_sizeof()
! !
integer(4) :: i USE ISO_C_BINDING
i = c_sizeof(i) ! { dg-warning "Fortran 2008" } integer(C_SIZE_T) :: i
i = c_sizeof(i) ! { dg-warning "Fortran 2008" }
end end
! { dg-do "compile" }
! { dg-options "-Wconversion-extra" }
real(8) :: sqrt2
sqrt2 = sqrt(2.0) ! { dg-warning "conversion" }
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment