Hi, unfortunately we have to return to these few lines of code :(
This regression is a more subtle variant of c++/65858: if the user passes -Wno-error=narrowing the pedwarn didn't result in an actual error (even if we are forcing -pedantic-errors around it) but produces anyway a warning, thus returns true, and ok isn't set to true, thus we have a miscompilation in this case too. Jakub suggested simply checking by hand errorcount, which passes all my tests.
Thanks, Paolo. ////////////////////
/cp 2015-05-04 Paolo Carlini <paolo.carl...@oracle.com> Jakub Jelinek <ja...@redhat.com> PR c++/66007 * typeck2.c (check_narrowing): Check by-hand that the pedwarn didn't result in an actual error. /testsuite 2015-05-04 Paolo Carlini <paolo.carl...@oracle.com> Jakub Jelinek <ja...@redhat.com> PR c++/66007 * g++.dg/cpp0x/Wnarrowing4.C: New.
Index: cp/typeck2.c =================================================================== --- cp/typeck2.c (revision 222767) +++ cp/typeck2.c (working copy) @@ -958,10 +958,12 @@ check_narrowing (tree type, tree init, tsubst_flag } else if (complain & tf_error) { + int savederrorcount = errorcount; global_dc->pedantic_errors = 1; - if (!pedwarn (EXPR_LOC_OR_LOC (init, input_location), OPT_Wnarrowing, - "narrowing conversion of %qE from %qT to %qT " - "inside { }", init, ftype, type)) + pedwarn (EXPR_LOC_OR_LOC (init, input_location), OPT_Wnarrowing, + "narrowing conversion of %qE from %qT to %qT " + "inside { }", init, ftype, type); + if (errorcount == savederrorcount) ok = true; global_dc->pedantic_errors = flag_pedantic_errors; } Index: testsuite/g++.dg/cpp0x/Wnarrowing4.C =================================================================== --- testsuite/g++.dg/cpp0x/Wnarrowing4.C (revision 0) +++ testsuite/g++.dg/cpp0x/Wnarrowing4.C (working copy) @@ -0,0 +1,14 @@ +// PR c++/66007 +// { dg-do run { target c++11 } } +// { dg-options "-Wno-error=narrowing" } + +extern "C" void abort(); + +int main() +{ + unsigned foo[] = { 1, -1, 3 }; + if (foo[0] != 1 || foo[1] != __INT_MAX__ * 2U + 1 || foo[2] != 3) + abort(); +} + +// { dg-prune-output "narrowing conversion" }