re PR c/9072 (-Wconversion should be split into two distinct flags)

2006-11-23  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR c/9072 
	* c.opt (Wtraditional-conversion): New.
	(Wconversion): Update description.
	* c-typeck.c (convert_arguments): Warnings for prototypes causing
	type conversions different from what would happen in the absence
	of prototype are now handled by Wtraditional-conversion.
	* doc/invoke.texi (Wtraditional-conversion): New.
	(Wconversion): Update description.
	* doc/trouble.texi (Wconversion): Replace Wconversion by
	Wtraditional-conversion.

testsuite/

	PR c/9072 
	* gcc.dg/builtin-protos-1.c: Replace Wconversion by
	Wtraditional-conversion.
	* gcc.dg/overflow-warn-2.c: Likewise.
	* gcc.dg/Wconversion.c: Likewise. Renamed as
	Wtraditional-conversion.c .
	* gcc.dg/Wconversion-2.c: Likewise. Renamed as
	Wtraditional-conversion-2.c .
	* gcc.dg/dfp/Wconversion-2.c: Likewise. Renamed as
	Wtraditional-conversion-2.c 
	* gcc.dg/Wconversion-negative-constants.c: New.

From-SVN: r119129
This commit is contained in:
Manuel López-Ibáñez 2006-11-23 18:39:32 +00:00
parent 61968738d5
commit 05170031ab
13 changed files with 140 additions and 51 deletions

View File

@ -1,3 +1,16 @@
2006-11-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c/9072
* c.opt (Wtraditional-conversion): New.
(Wconversion): Update description.
* c-typeck.c (convert_arguments): Warnings for prototypes causing
type conversions different from what would happen in the absence
of prototype are now handled by Wtraditional-conversion.
* doc/invoke.texi (Wtraditional-conversion): New.
(Wconversion): Update description.
* doc/trouble.texi (Wconversion): Replace Wconversion by
Wtraditional-conversion.
2006-11-23 Andrew Pinski <pinskia@gmail.com> 2006-11-23 Andrew Pinski <pinskia@gmail.com>
* predict.c (tree_estimate_probability): Check to make * predict.c (tree_estimate_probability): Check to make

View File

@ -2427,7 +2427,7 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
{ {
/* Optionally warn about conversions that /* Optionally warn about conversions that
differ from the default conversions. */ differ from the default conversions. */
if (warn_conversion || warn_traditional) if (warn_traditional_conversion || warn_traditional)
{ {
unsigned int formal_prec = TYPE_PRECISION (type); unsigned int formal_prec = TYPE_PRECISION (type);
@ -2503,8 +2503,8 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
} }
/* Detect integer changing in width or signedness. /* Detect integer changing in width or signedness.
These warnings are only activated with These warnings are only activated with
-Wconversion, not with -Wtraditional. */ -Wtraditional-conversion, not with -Wtraditional. */
else if (warn_conversion && INTEGRAL_TYPE_P (type) else if (warn_traditional_conversion && INTEGRAL_TYPE_P (type)
&& INTEGRAL_TYPE_P (TREE_TYPE (val))) && INTEGRAL_TYPE_P (TREE_TYPE (val)))
{ {
tree would_have_been = default_conversion (val); tree would_have_been = default_conversion (val);
@ -2517,7 +2517,7 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
and the actual arg is that enum type. */ and the actual arg is that enum type. */
; ;
else if (formal_prec != TYPE_PRECISION (type1)) else if (formal_prec != TYPE_PRECISION (type1))
warning (OPT_Wconversion, "passing argument %d of %qE " warning (OPT_Wtraditional_conversion, "passing argument %d of %qE "
"with different width due to prototype", "with different width due to prototype",
argnum, rname); argnum, rname);
else if (TYPE_UNSIGNED (type) == TYPE_UNSIGNED (type1)) else if (TYPE_UNSIGNED (type) == TYPE_UNSIGNED (type1))
@ -2540,11 +2540,11 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
&& TYPE_UNSIGNED (TREE_TYPE (val))) && TYPE_UNSIGNED (TREE_TYPE (val)))
; ;
else if (TYPE_UNSIGNED (type)) else if (TYPE_UNSIGNED (type))
warning (OPT_Wconversion, "passing argument %d of %qE " warning (OPT_Wtraditional_conversion, "passing argument %d of %qE "
"as unsigned due to prototype", "as unsigned due to prototype",
argnum, rname); argnum, rname);
else else
warning (OPT_Wconversion, "passing argument %d of %qE " warning (OPT_Wtraditional_conversion, "passing argument %d of %qE "
"as signed due to prototype", argnum, rname); "as signed due to prototype", argnum, rname);
} }
} }

View File

@ -151,7 +151,7 @@ Synonym for -Wcomment
Wconversion Wconversion
C ObjC C++ ObjC++ Var(warn_conversion) C ObjC C++ ObjC++ Var(warn_conversion)
Warn about possibly confusing type conversions Warn for implicit type conversions that may change a value
Wctor-dtor-privacy Wctor-dtor-privacy
C++ ObjC++ Var(warn_ctor_dtor_privacy) C++ ObjC++ Var(warn_ctor_dtor_privacy)
@ -399,6 +399,10 @@ Wtraditional
C ObjC Var(warn_traditional) C ObjC Var(warn_traditional)
Warn about features not present in traditional C Warn about features not present in traditional C
Wtraditional-conversion
C ObjC Var(warn_traditional_conversion)
Warn of prototypes causing type conversions different from what would happen in the absence of prototype
Wtrigraphs Wtrigraphs
C ObjC C++ ObjC++ C ObjC C++ ObjC++
Warn if trigraphs are encountered that might affect the meaning of the program Warn if trigraphs are encountered that might affect the meaning of the program

View File

@ -255,7 +255,7 @@ Objective-C and Objective-C++ Dialects}.
@item C-only Warning Options @item C-only Warning Options
@gccoptlist{-Wbad-function-cast -Wmissing-declarations @gol @gccoptlist{-Wbad-function-cast -Wmissing-declarations @gol
-Wmissing-prototypes -Wnested-externs -Wold-style-definition @gol -Wmissing-prototypes -Wnested-externs -Wold-style-definition @gol
-Wstrict-prototypes -Wtraditional @gol -Wstrict-prototypes -Wtraditional -Wtraditional-conversion @gol
-Wdeclaration-after-statement -Wpointer-sign} -Wdeclaration-after-statement -Wpointer-sign}
@item Debugging Options @item Debugging Options
@ -3058,7 +3058,7 @@ traditional C case.
Conversions by prototypes between fixed/floating point values and vice Conversions by prototypes between fixed/floating point values and vice
versa. The absence of these prototypes when compiling with traditional versa. The absence of these prototypes when compiling with traditional
C would cause serious problems. This is a subset of the possible C would cause serious problems. This is a subset of the possible
conversion warnings, for the full set use @option{-Wconversion}. conversion warnings, for the full set use @option{-Wtraditional-conversion}.
@item @item
Use of ISO C style function definitions. This warning intentionally is Use of ISO C style function definitions. This warning intentionally is
@ -3070,6 +3070,14 @@ because that feature is already a GCC extension and thus not relevant to
traditional C compatibility. traditional C compatibility.
@end itemize @end itemize
@item -Wtraditional-conversion @r{(C only)}
@opindex Wtraditional-conversion
Warn if a prototype causes a type conversion that is different from what
would happen to the same argument in the absence of a prototype. This
includes conversions of fixed point to floating and vice versa, and
conversions changing the width or signedness of a fixed point argument
except when the same as the default promotion.
@item -Wdeclaration-after-statement @r{(C only)} @item -Wdeclaration-after-statement @r{(C only)}
@opindex Wdeclaration-after-statement @opindex Wdeclaration-after-statement
Warn when a declaration is found after a statement in a block. This Warn when a declaration is found after a statement in a block. This
@ -3148,16 +3156,10 @@ this is why we did not make @option{-Wall} request these warnings.
@item -Wconversion @item -Wconversion
@opindex Wconversion @opindex Wconversion
Warn if a prototype causes a type conversion that is different from what Warn if a negative integer constant expression is implicitly converted
would happen to the same argument in the absence of a prototype. This to an unsigned type. For example, warn about the assignment
includes conversions of fixed point to floating and vice versa, and @code{unsigned x = -1} if @code{x} is unsigned. But do not warn about
conversions changing the width or signedness of a fixed point argument explicit casts like @code{(unsigned) -1}.
except when the same as the default promotion.
Also, warn if a negative integer constant expression is implicitly
converted to an unsigned type. For example, warn about the assignment
@code{x = -1} if @code{x} is unsigned. But do not warn about explicit
casts like @code{(unsigned) -1}.
@item -Wsign-compare @item -Wsign-compare
@opindex Wsign-compare @opindex Wsign-compare

View File

@ -985,10 +985,10 @@ you are removing prototypes that were made with @command{protoize}; if
the program worked before without any prototypes, it will work again the program worked before without any prototypes, it will work again
without them. without them.
@opindex Wconversion @opindex Wtraditional-conversion
You can find all the places where this problem might occur by compiling You can find all the places where this problem might occur by compiling
the program with the @option{-Wconversion} option. It prints a warning the program with the @option{-Wtraditional-conversion} option. It
whenever an argument is converted. prints a warning whenever an argument is converted.
@item @item
Both conversion programs can be confused if there are macro calls in and Both conversion programs can be confused if there are macro calls in and

View File

@ -1,3 +1,17 @@
2006-11-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c/9072
* gcc.dg/builtin-protos-1.c: Replace Wconversion by
Wtraditional-conversion.
* gcc.dg/overflow-warn-2.c: Likewise.
* gcc.dg/Wconversion.c: Likewise. Renamed as
Wtraditional-conversion.c .
* gcc.dg/Wconversion-2.c: Likewise. Renamed as
Wtraditional-conversion-2.c .
* gcc.dg/dfp/Wconversion-2.c: Likewise. Renamed as
Wtraditional-conversion-2.c
* gcc.dg/Wconversion-negative-constants.c: New.
2006-11-23 Andrew Pinski <pinskia@gmail.com> 2006-11-23 Andrew Pinski <pinskia@gmail.com>
* gcc.dg/tree-ssa/dump-1.c: New test. * gcc.dg/tree-ssa/dump-1.c: New test.

View File

@ -0,0 +1,54 @@
/* Test for diagnostics for negative constants converted to unsigned types.
These tests come from gcc/testsuite/gcc.dg/overflow-warn-2.c */
/* { dg-do compile } */
/* { dg-options "-std=c99 -Wconversion" } */
#include <limits.h>
void fuc (unsigned char);
void hc (int x)
{
unsigned char uc;
fuc (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */
uc = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
uc = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
uc = x ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
uc = '\xa0'; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
fuc('A');
uc = 'A';
uc = x ? 1 : -1;
uc = x ? SCHAR_MIN : 1;
}
unsigned fui (unsigned int ui);
void hi (int x)
{
unsigned ui;
fui (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = x ? INT_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = ui ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = 1U * -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = ui + INT_MIN; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
ui = -1 * (1 * -1);
ui = (unsigned) -1;
ui = x ? 1 : -1;
ui = x ? INT_MIN : 1;
ui = ui ? SCHAR_MIN : 1;
}
unsigned fui(unsigned a) { return a + -1; } /* { dg-warning "negative integer implicitly converted to unsigned type" } */

View File

@ -1,8 +1,8 @@
/* Test messages for -Wconversion, including that they are not /* Test messages for -Wtraditional-conversion, including that they are not
pedwarns. */ pedwarns. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ /* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-std=c99 -pedantic-errors -Wconversion" } */ /* { dg-options "-std=c99 -pedantic-errors -Wtraditional-conversion" } */
void fsc(signed char); void fsc(signed char);
void fsi(signed int); void fsi(signed int);

View File

@ -5,7 +5,7 @@
not used in the appropriate place in the warning code. */ not used in the appropriate place in the warning code. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options -Wconversion } */ /* { dg-options -Wtraditional-conversion } */
typedef enum { a } __attribute__((packed)) t; typedef enum { a } __attribute__((packed)) t;
void f(t x) {} void f(t x) {}

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options -Wconversion } */ /* { dg-options -Wtraditional-conversion } */
int int
test_s (signed int x) test_s (signed int x)

View File

@ -1,6 +1,8 @@
/* Test messages for -Wconversion (based on gcc.dg/Wconversion-2.c). */ /* Test messages for -Wtraditional-conversion
(based on gcc.dg/Wtraditional-conversion-2.c). */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-std=gnu99 -Wconversion" } */ /* { dg-options "-std=gnu99 -Wtraditional-conversion" } */
void fsi(signed int); void fsi(signed int);
void fd32(_Decimal32); void fd32(_Decimal32);

View File

@ -1,7 +1,7 @@
/* Test for diagnostics for constant overflow. Test with -Wconversion. */ /* Test for diagnostics for constant overflow. Test with -Wtraditional-conversion. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */ /* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-std=c99 -Wconversion" } */ /* { dg-options "-std=c99 -Wtraditional-conversion" } */
#include <limits.h> #include <limits.h>
@ -82,23 +82,23 @@ void
h2 (void) h2 (void)
{ {
fsc (SCHAR_MAX + 1); fsc (SCHAR_MAX + 1);
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wconversion" { target *-*-* } 84 } */ /* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 84 } */
fsc (SCHAR_MIN - 1); /* { dg-warning "warning: overflow in implicit constant conversion" } */ fsc (SCHAR_MIN - 1); /* { dg-warning "warning: overflow in implicit constant conversion" } */
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wconversion" { target *-*-* } 86 } */ /* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 86 } */
fsc (UCHAR_MAX); fsc (UCHAR_MAX);
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wconversion" { target *-*-* } 88 } */ /* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 88 } */
fsc (UCHAR_MAX + 1); /* { dg-warning "warning: overflow in implicit constant conversion" } */ fsc (UCHAR_MAX + 1); /* { dg-warning "warning: overflow in implicit constant conversion" } */
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wconversion" { target *-*-* } 90 } */ /* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 90 } */
fuc (-1); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ fuc (-1);
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 92 } */ /* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 92 } */
fuc (UCHAR_MAX + 1); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */ fuc (UCHAR_MAX + 1); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 94 } */ /* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 94 } */
fuc (SCHAR_MIN); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ fuc (SCHAR_MIN);
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 96 } */ /* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 96 } */
fuc (SCHAR_MIN - 1); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */ fuc (SCHAR_MIN - 1); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 98 } */ /* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 98 } */
fuc (-UCHAR_MAX); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */ fuc (-UCHAR_MAX); /* { dg-warning "warning: large integer implicitly truncated to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 100 } */ /* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 100 } */
} }
void fui (unsigned int); void fui (unsigned int);
@ -111,7 +111,7 @@ void
h2i (int x) h2i (int x)
{ {
/* For some reason, we only give certain warnings for implicit /* For some reason, we only give certain warnings for implicit
conversions among values of the same precision with -Wconversion, conversions among values of the same precision with -Wtraditional-conversion,
while we don't give others at all. */ while we don't give others at all. */
fsi ((unsigned)INT_MAX + 1); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */ fsi ((unsigned)INT_MAX + 1); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */
si = (unsigned)INT_MAX + 1; si = (unsigned)INT_MAX + 1;
@ -121,12 +121,12 @@ h2i (int x)
si = x ? (unsigned)INT_MAX + 2 : 1; si = x ? (unsigned)INT_MAX + 2 : 1;
fsi (UINT_MAX); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */ fsi (UINT_MAX); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */
si = UINT_MAX; si = UINT_MAX;
fui (-1); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ fui (-1);
/* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wconversion" { target *-*-* } 124 } */ /* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wtraditional-conversion" { target *-*-* } 124 } */
ui = -1; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ ui = -1;
ui = x ? -1 : 1U; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ ui = x ? -1 : 1U;
fui (INT_MIN); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ fui (INT_MIN);
/* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wconversion" { target *-*-* } 128 } */ /* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wtraditional-conversion" { target *-*-* } 128 } */
ui = INT_MIN; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ ui = INT_MIN;
ui = x ? INT_MIN : 1U; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */ ui = x ? INT_MIN : 1U;
} }