void foo(bool b) { switch ((unsigned int)b) { case 1: case 2: ; } } % g++ test.cc test.cc: In function ‘void foo(bool)’: test.cc:6: error: duplicate case value test.cc:5: error: previously used here The bug only appears with casts to (unsigned int) or wider; casts to (int), (unsigned short), etc., work as expected. Reproduces with GCC versions 4.2.4 and 4.3.2.
Confirmed. 2.95.4 only (incorrectly) warned about an out-of-range case value: /space/rguenther/install/gcc-2.95/bin/g++ -S t.C t.C: In function `void foo(bool)': t.C:5: warning: case value out of range
This isn't related to just bool, e.g.: void foo (unsigned char b) { switch ((unsigned int) b) { case 1: case 257: break; } } also results in pr39371-2.C:7: warning: large integer implicitly truncated to unsigned type pr39371-2.C:7: error: duplicate case value pr39371-2.C:6: error: previously used here In C both testcases are fine.
Patch posted: http://gcc.gnu.org/ml/gcc-patches/2009-03/msg00463.html
Subject: Bug 39371 Author: jakub Date: Mon Mar 9 19:34:10 2009 New Revision: 144732 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=144732 Log: PR c++/39371 * semantics.c (finish_switch_cond): Don't call get_unwidened. * decl.c (finish_case_label): Pass SWITCH_STMT_TYPE as 3rd argument instead of TREE_TYPE (cond). * g++.dg/opt/switch2.C: Add -w to dg-options. * g++.dg/warn/Wswitch-1.C: Adjust expected warnings. * g++.dg/warn/switch1.C: New test. * g++.dg/other/switch3.C: New test. Added: trunk/gcc/testsuite/g++.dg/other/switch3.C trunk/gcc/testsuite/g++.dg/warn/switch1.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/decl.c trunk/gcc/cp/semantics.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/opt/switch2.C trunk/gcc/testsuite/g++.dg/warn/Wswitch-1.C
Fixed on the trunk so far.
Closing 4.2 branch.
*** Bug 40335 has been marked as a duplicate of this bug. ***
I'm testing a backport.
Subject: Bug 39371 Author: rguenth Date: Thu Jun 4 12:35:25 2009 New Revision: 148165 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=148165 Log: 2009-06-04 Richard Guenther <rguenther@suse.de> Backport from mainline 2009-03-09 Jakub Jelinek <jakub@redhat.com> PR c++/39371 * semantics.c (finish_switch_cond): Don't call get_unwidened. * decl.c (finish_case_label): Pass SWITCH_STMT_TYPE as 3rd argument instead of TREE_TYPE (cond). * g++.dg/opt/switch2.C: Add -w to dg-options. * g++.dg/warn/Wswitch-1.C: Adjust expected warnings. * g++.dg/warn/switch1.C: New test. * g++.dg/other/switch3.C: New test. * g++.dg/torture/pr40335.C: New testcase. Added: branches/gcc-4_3-branch/gcc/testsuite/g++.dg/other/switch3.C branches/gcc-4_3-branch/gcc/testsuite/g++.dg/torture/pr40335.C branches/gcc-4_3-branch/gcc/testsuite/g++.dg/warn/switch1.C Modified: branches/gcc-4_3-branch/gcc/cp/ChangeLog branches/gcc-4_3-branch/gcc/cp/decl.c branches/gcc-4_3-branch/gcc/cp/semantics.c branches/gcc-4_3-branch/gcc/testsuite/ChangeLog branches/gcc-4_3-branch/gcc/testsuite/g++.dg/opt/switch2.C branches/gcc-4_3-branch/gcc/testsuite/g++.dg/warn/Wswitch-1.C
Subject: Bug 39371 Author: rguenth Date: Thu Jun 4 12:37:48 2009 New Revision: 148166 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=148166 Log: 2009-06-04 Richard Guenther <rguenther@suse.de> PR c++/39371 * g++.dg/torture/pr40335.C: New testcase. Added: branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr40335.C Modified: branches/gcc-4_4-branch/gcc/testsuite/ChangeLog
Fixed.
Subject: Bug 39371 Author: rguenth Date: Thu Jun 4 12:41:31 2009 New Revision: 148167 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=148167 Log: 2009-06-04 Richard Guenther <rguenther@suse.de> PR c++/39371 * g++.dg/torture/pr40335.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/torture/pr40335.C Modified: trunk/gcc/testsuite/ChangeLog