Bug 39371 - [4.3 Regression] Incorrectly rejects switch((unsigned int)boolvar)
Summary: [4.3 Regression] Incorrectly rejects switch((unsigned int)boolvar)
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.2
: P2 normal
Target Milestone: 4.3.4
Assignee: Richard Biener
URL: http://gcc.gnu.org/ml/gcc-patches/200...
Keywords: rejects-valid, wrong-code
: 40335 (view as bug list)
Depends on:
Blocks:
 
Reported: 2009-03-05 00:00 UTC by Anonymous
Modified: 2009-06-04 12:38 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work: 2.95.4 4.3.4 4.4.0
Known to fail: 3.3.6 4.3.3
Last reconfirmed: 2009-03-09 10:31:06


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Anonymous 2009-03-05 00:00:40 UTC
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.
Comment 1 Richard Biener 2009-03-05 10:35:56 UTC
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
Comment 2 Jakub Jelinek 2009-03-09 08:22:03 UTC
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.
Comment 3 Jakub Jelinek 2009-03-09 10:31:06 UTC
Patch posted: http://gcc.gnu.org/ml/gcc-patches/2009-03/msg00463.html
Comment 4 Jakub Jelinek 2009-03-09 19:34:34 UTC
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

Comment 5 Jakub Jelinek 2009-03-09 19:35:56 UTC
Fixed on the trunk so far.
Comment 6 Joseph S. Myers 2009-03-31 21:10:50 UTC
Closing 4.2 branch.
Comment 7 Richard Biener 2009-06-04 11:16:33 UTC
*** Bug 40335 has been marked as a duplicate of this bug. ***
Comment 8 Richard Biener 2009-06-04 11:21:51 UTC
I'm testing a backport.
Comment 9 Richard Biener 2009-06-04 12:35:40 UTC
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

Comment 10 Richard Biener 2009-06-04 12:38:03 UTC
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

Comment 11 Richard Biener 2009-06-04 12:38:36 UTC
Fixed.
Comment 12 Richard Biener 2009-06-04 12:41:52 UTC
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