diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/c.opt 1of3-split/gcc/c.opt --- pristine/gcc/c.opt 2006-10-26 01:24:51.000000000 +0100 +++ 1of3-split/gcc/c.opt 2006-10-26 01:41:57.000000000 +0100 @@ -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 diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/c-typeck.c 1of3-split/gcc/c-typeck.c --- pristine/gcc/c-typeck.c 2006-10-26 01:24:47.000000000 +0100 +++ 1of3-split/gcc/c-typeck.c 2006-10-26 01:41:57.000000000 +0100 @@ -2416,7 +2416,7 @@ convert_arguments (tree typelist, tree v { /* 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); @@ -2492,8 +2492,8 @@ convert_arguments (tree typelist, tree v } /* 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); @@ -2506,7 +2506,7 @@ convert_arguments (tree typelist, tree v 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)) @@ -2529,11 +2529,11 @@ convert_arguments (tree typelist, tree v && 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); } } diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/doc/invoke.texi 1of3-split/gcc/doc/invoke.texi --- pristine/gcc/doc/invoke.texi 2006-10-26 01:25:11.000000000 +0100 +++ 1of3-split/gcc/doc/invoke.texi 2006-10-26 01:41:58.000000000 +0100 @@ -256,7 +256,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 @@ -3039,7 +3039,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 @@ -3051,6 +3051,14 @@ because that feature is already a GCC ex 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 @@ -3129,16 +3137,10 @@ this is why we did not make @option{-Wal @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 diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/doc/trouble.texi 1of3-split/gcc/doc/trouble.texi --- pristine/gcc/doc/trouble.texi 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/doc/trouble.texi 2006-09-18 12:29:53.000000000 +0100 @@ -985,10 +985,10 @@ you are removing prototypes that were ma 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 diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/builtin-protos-1.c 1of3-split/gcc/testsuite/gcc.dg/builtin-protos-1.c --- pristine/gcc/testsuite/gcc.dg/builtin-protos-1.c 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/builtin-protos-1.c 2006-09-18 12:29:53.000000000 +0100 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options -Wconversion } */ +/* { dg-options -Wtraditional-conversion } */ int test_s (signed int x) diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/dfp/Wconversion-2.c 1of3-split/gcc/testsuite/gcc.dg/dfp/Wconversion-2.c --- pristine/gcc/testsuite/gcc.dg/dfp/Wconversion-2.c 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/dfp/Wconversion-2.c 2006-09-18 12:29:53.000000000 +0100 @@ -1,6 +1,6 @@ -/* Test messages for -Wconversion (based on gcc.dg/Wconversion-2.c). */ +/* Test messages for -Wtraditional-conversion (based on gcc.dg/Wconversion-2.c). */ /* { dg-do compile } */ -/* { dg-options "-std=gnu99 -Wconversion" } */ +/* { dg-options "-std=gnu99 -Wtraditional-conversion" } */ void fsi(signed int); void fd32(_Decimal32); diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/overflow-warn-2.c 1of3-split/gcc/testsuite/gcc.dg/overflow-warn-2.c --- pristine/gcc/testsuite/gcc.dg/overflow-warn-2.c 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/overflow-warn-2.c 2006-09-18 12:29:53.000000000 +0100 @@ -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 */ /* { dg-do compile } */ -/* { dg-options "-std=c99 -Wconversion" } */ +/* { dg-options "-std=c99 -Wtraditional-conversion" } */ #include @@ -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; } diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/Wconversion-2.c 1of3-split/gcc/testsuite/gcc.dg/Wconversion-2.c --- pristine/gcc/testsuite/gcc.dg/Wconversion-2.c 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/Wconversion-2.c 2006-09-18 12:30:00.000000000 +0100 @@ -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 */ /* { 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); diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/Wconversion.c 1of3-split/gcc/testsuite/gcc.dg/Wconversion.c --- pristine/gcc/testsuite/gcc.dg/Wconversion.c 2006-09-18 12:28:34.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/Wconversion.c 2006-09-18 12:30:00.000000000 +0100 @@ -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) {} diff -paur -N --exclude='*.rej' --exclude='*.orig' --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/gcc.dg/Wconversion-negative-constants.c 1of3-split/gcc/testsuite/gcc.dg/Wconversion-negative-constants.c --- pristine/gcc/testsuite/gcc.dg/Wconversion-negative-constants.c 1970-01-01 01:00:00.000000000 +0100 +++ 1of3-split/gcc/testsuite/gcc.dg/Wconversion-negative-constants.c 2006-10-31 23:18:00.000000000 +0000 @@ -0,0 +1,56 @@ +/* Test for diagnostics for negative constants coerced to unsigned types + These tests come from gcc/testsuite/gcc.dg/overflow-warn-2.c */ + +/* { dg-do compile } */ +/* { dg-options "-std=c99 -Wconversion" } */ + +#include + +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" "" { target *-*-* } 18 } */ + uc = x ? SCHAR_MIN : 1U; + /* { dg-warning "negative integer implicitly converted to unsigned type" "" { target *-*-* } 20 } */ + 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" } */