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,6 +1,6 @@
2006-11-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* MAINTAINERS (Write After Approval): Add myself.
* MAINTAINERS (Write After Approval): Add myself.
2006-11-22 Philipp Thomas <pth@suse.de>

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>
* 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
differ from the default conversions. */
if (warn_conversion || warn_traditional)
if (warn_traditional_conversion || warn_traditional)
{
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.
These warnings are only activated with
-Wconversion, not with -Wtraditional. */
else if (warn_conversion && INTEGRAL_TYPE_P (type)
-Wtraditional-conversion, not with -Wtraditional. */
else if (warn_traditional_conversion && INTEGRAL_TYPE_P (type)
&& INTEGRAL_TYPE_P (TREE_TYPE (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. */
;
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",
argnum, rname);
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)))
;
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",
argnum, rname);
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);
}
}

View File

@ -151,7 +151,7 @@ Synonym for -Wcomment
Wconversion
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
C++ ObjC++ Var(warn_ctor_dtor_privacy)
@ -399,6 +399,10 @@ Wtraditional
C ObjC Var(warn_traditional)
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
C ObjC C++ ObjC++
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
@gccoptlist{-Wbad-function-cast -Wmissing-declarations @gol
-Wmissing-prototypes -Wnested-externs -Wold-style-definition @gol
-Wstrict-prototypes -Wtraditional @gol
-Wstrict-prototypes -Wtraditional -Wtraditional-conversion @gol
-Wdeclaration-after-statement -Wpointer-sign}
@item Debugging Options
@ -3058,7 +3058,7 @@ traditional C case.
Conversions by prototypes between fixed/floating point values and vice
versa. The absence of these prototypes when compiling with traditional
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
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.
@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)}
@opindex Wdeclaration-after-statement
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
@opindex Wconversion
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.
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}.
Warn if a negative integer constant expression is implicitly converted
to an unsigned type. For example, warn about the assignment
@code{unsigned x = -1} if @code{x} is unsigned. But do not warn about
explicit casts like @code{(unsigned) -1}.
@item -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
without them.
@opindex Wconversion
@opindex Wtraditional-conversion
You can find all the places where this problem might occur by compiling
the program with the @option{-Wconversion} option. It prints a warning
whenever an argument is converted.
the program with the @option{-Wtraditional-conversion} option. It
prints a warning whenever an argument is converted.
@item
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>
* 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. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */
/* { dg-options "-std=c99 -pedantic-errors -Wconversion" } */
/* { dg-options "-std=c99 -pedantic-errors -Wtraditional-conversion" } */
void fsc(signed char);
void fsi(signed int);

View File

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

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options -Wconversion } */
/* { dg-options -Wtraditional-conversion } */
int
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-options "-std=gnu99 -Wconversion" } */
/* { dg-options "-std=gnu99 -Wtraditional-conversion" } */
void fsi(signed int);
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> */
/* { dg-do compile } */
/* { dg-options "-std=c99 -Wconversion" } */
/* { dg-options "-std=c99 -Wtraditional-conversion" } */
#include <limits.h>
@ -82,23 +82,23 @@ void
h2 (void)
{
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" } */
/* { 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);
/* { 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" } */
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wconversion" { target *-*-* } 90 } */
fuc (-1); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 92 } */
/* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" "-Wtraditional-conversion" { target *-*-* } 90 } */
fuc (-1);
/* { 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" } */
/* { dg-warning "warning: passing argument 1 of 'fuc' with different width due to prototype" "-Wconversion" { target *-*-* } 94 } */
fuc (SCHAR_MIN); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
/* { 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 *-*-* } 94 } */
fuc (SCHAR_MIN);
/* { 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" } */
/* { 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" } */
/* { 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);
@ -111,7 +111,7 @@ void
h2i (int x)
{
/* 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. */
fsi ((unsigned)INT_MAX + 1); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */
si = (unsigned)INT_MAX + 1;
@ -121,12 +121,12 @@ h2i (int x)
si = x ? (unsigned)INT_MAX + 2 : 1;
fsi (UINT_MAX); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */
si = UINT_MAX;
fui (-1); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wconversion" { target *-*-* } 124 } */
ui = -1; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
ui = x ? -1 : 1U; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
fui (INT_MIN); /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
/* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wconversion" { target *-*-* } 128 } */
ui = INT_MIN; /* { dg-warning "warning: negative integer implicitly converted to unsigned type" } */
ui = x ? INT_MIN : 1U; /* { 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" "-Wtraditional-conversion" { target *-*-* } 124 } */
ui = -1;
ui = x ? -1 : 1U;
fui (INT_MIN);
/* { dg-warning "warning: passing argument 1 of 'fui' as unsigned due to prototype" "-Wtraditional-conversion" { target *-*-* } 128 } */
ui = INT_MIN;
ui = x ? INT_MIN : 1U;
}