Bug 27979 - [4.2 Regression] conversion check confused by enum bitfields
Summary: [4.2 Regression] conversion check confused by enum bitfields
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.2.0
: P1 normal
Target Milestone: 4.2.0
Assignee: Mark Mitchell
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2006-06-09 16:21 UTC by Martin Michlmayr
Modified: 2006-06-16 23:13 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.1.0
Known to fail: 4.2.0
Last reconfirmed: 2006-06-09 16:56:28


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Martin Michlmayr 2006-06-09 16:21:07 UTC
I think the following "invalid conversion" error, which is believe is wrong.  When I remove the bitfield, the program compile fine.  In any case, the error message isn't really optimal. :)


(sid)4502:tbm@test: ~/src] cat test.cpp
class Ast
{
    enum AstKind { };
    const AstKind kind : 8;
    void foo(AstKind k) { }
    void bar(void) { foo(kind); }
};
[with gcc 4.2 20060508]
(sid)4503:tbm@test: ~/src] /usr/lib/gcc-snapshot/bin/g++ -c test.cpp
test.cpp: In member function 'void Ast::bar()':
test.cpp:6: error: invalid conversion from 'unsigned char' to 'Ast::AstKind'
test.cpp:6: error:   initializing argument 1 of 'void Ast::foo(Ast::AstKind)'
zsh: exit 1     /usr/lib/gcc-snapshot/bin/g++ -c test.cpp

[with gcc 4.2 20060530]
(sid)4504:tbm@test: ~/src] /usr/lib/gcc-snapshot/bin/g++ -c test.cpp
test.cpp: In member function 'void Ast::bar()':
test.cpp:6: error: invalid conversion from 'Ast::AstKind' to 'Ast::AstKind'
test.cpp:6: error:   initializing argument 1 of 'void Ast::foo(Ast::AstKind)'
zsh: exit 1     /usr/lib/gcc-snapshot/bin/g++ -c test.cpp
(sid)4505:tbm@test: ~/src]
Comment 1 Andrew Pinski 2006-06-09 16:56:28 UTC
Confirmed, 4.1.0 accepted this code.
Comment 2 Martin Michlmayr 2006-06-09 17:47:16 UTC
The following, related example, fails with gcc 4.2 20060508 but works with 20060530.  It would be great if whoever works on this PR could check what change was responsible to get this working, and if it was just an accidental change, whether the following test case should be added to the test suite:

enum EBorderStyle {
   BNATIVE, BNONE, BHIDDEN
};

class BorderValue
{
  public:
    EBorderStyle style : 8;
};

class bar
{
    BorderValue *border;
    EBorderStyle foo() { return border ? border->style : BHIDDEN; }
};
Comment 3 Martin Michlmayr 2006-06-09 18:03:46 UTC
It wasn't accidentally fixed.  It was fixed by Mark Mitchell for PR c++/27506, which contain the same test case as my 2nd example.  In any case, the first test case wasn't fixed by the fix for PR 27506.
Comment 4 Mark Mitchell 2006-06-16 23:12:15 UTC
Subject: Bug 27979

Author: mmitchel
Date: Fri Jun 16 23:12:08 2006
New Revision: 114733

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=114733
Log:
	PR c++/27979
	* call.c (standard_conversion): Strip cv-qualifiers from bitfield
	types.
	PR c++/27979
	* g++.dg/expr/bitfield2.C: New test. 

Added:
    trunk/gcc/testsuite/g++.dg/expr/bitfield2.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/testsuite/ChangeLog

Comment 5 Mark Mitchell 2006-06-16 23:13:07 UTC
Fixed in 4.2.0.