[Bug c++/38007] [4.2/4.3/4.4 Regression] g++ instantiate same operator twice due to bitfield in -O0 mode, causing symbol already defined assembler error

2008-11-03 Thread pinskia at gcc dot gnu dot org


--- Comment #1 from pinskia at gcc dot gnu dot org  2008-11-03 20:07 ---
Confirmed, a regression from GCC 4.1.1.
Here is a self contained example :):
class foo {
public:
template  operator T ();
};

template 
inline foo::operator T () {
return (T)0;
}

struct bar {
unsigned int _bar : 24;
};

int main() {
foo a;
unsigned int b = a;
bar c;
c._bar = a;
return 1;
}


-- 

pinskia at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||pinskia at gcc dot gnu dot
   ||org
   Severity|normal  |critical
 Status|UNCONFIRMED |NEW
 Ever Confirmed|0   |1
   Keywords||assemble-failure
  Known to fail||4.3.0 4.4.0
  Known to work||4.1.1
   Last reconfirmed|-00-00 00:00:00 |2008-11-03 20:07:32
   date||
Summary|g++ instantiate same|[4.2/4.3/4.4 Regression] g++
   |operator twice due to   |instantiate same operator
   |bitfield in -O0 mode,   |twice due to bitfield in -O0
   |causing symbol already  |mode, causing symbol already
   |defined assembler error |defined assembler error
   Target Milestone|--- |4.2.5


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38007



[Bug c++/38007] [4.2/4.3/4.4 Regression] g++ instantiate same operator twice due to bitfield in -O0 mode, causing symbol already defined assembler error

2008-11-04 Thread rguenth at gcc dot gnu dot org


--- Comment #2 from rguenth at gcc dot gnu dot org  2008-11-04 10:39 ---
The following also fails the same way with optimization:

class foo {
public:
template  __attribute__((noinline))
operator T () { return (T)0; }
};

struct bar {
unsigned int _bar : 24;
};

int main()
{
foo a;
unsigned int b = a;
bar c;
c._bar = a;
return 0;
}


we instantiate the operator for unsigned int and unsigned int : 24

what we probably should do is treat

  c._bar = a;

as

  c._bar = (unsigned int : 24)(unsigned int)a;

instead.


-- 

rguenth at gcc dot gnu dot org changed:

   What|Removed |Added

   Priority|P3  |P1


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38007



[Bug c++/38007] [4.2/4.3/4.4 Regression] g++ instantiate same operator twice due to bitfield in -O0 mode, causing symbol already defined assembler error

2008-11-06 Thread jakub at gcc dot gnu dot org


--- Comment #3 from jakub at gcc dot gnu dot org  2008-11-06 15:15 ---
And for:
struct A
{
  template  __attribute__((noinline)) operator T ()
  {
return (T) 0;
  }
};

struct B
{
  unsigned int b : 8;
};

int
main ()
{
  A u;
  unsigned int v = u;
  B w;
  w.b = u;
}

we instantiate both
A::operator unsigned int()
A::operator unsigned char()
Shouldn't it use unsigned int conversion in both cases as well, or is it
allowed (or required) to use the lowered type?  I see 3.4 through 4.4 all use
unsigned char, if RHS' type isn't MAYBE_CLASS_TYPE_P, then I understand it, but
for
class RHS it is an important difference.

I believe the place which needs to be revisited is cp_build_modify_expr, if
is_bitfield_expr_with_lowered_type use the type returned by that in
convert_for_assignment.  But I'm e.g. confused by:

  /* If storing into a structure or union member, it has probably been
 given type `int'.  Compute the type that would go with the actual
 amount of storage the member occupies.  */

  if (TREE_CODE (lhs) == COMPONENT_REF
  && (TREE_CODE (lhstype) == INTEGER_TYPE
  || TREE_CODE (lhstype) == REAL_TYPE
  || TREE_CODE (lhstype) == ENUMERAL_TYPE))
{
  lhstype = TREE_TYPE (get_unwidened (lhs, 0));
...
}

That seems like a remnant from the past, as get_unwidened for COMPONENT_REF
does
nothing but return the passed object.  See
http://gcc.gnu.org/ml/gcc-patches/2008-03/msg01621.html


-- 

jakub at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||mmitchel at gcc dot gnu dot
   ||org, dodji at gcc dot gnu
   ||dot org, jason at gcc dot
   ||gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38007



[Bug c++/38007] [4.2/4.3/4.4 Regression] g++ instantiate same operator twice due to bitfield in -O0 mode, causing symbol already defined assembler error

2008-11-07 Thread jason at gcc dot gnu dot org


-- 

jason at gcc dot gnu dot org changed:

   What|Removed |Added

 AssignedTo|unassigned at gcc dot gnu   |jason at gcc dot gnu dot org
   |dot org |
 Status|NEW |ASSIGNED
   Last reconfirmed|2008-11-03 20:07:32 |2008-11-07 22:24:09
   date||


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38007



[Bug c++/38007] [4.2/4.3/4.4 Regression] g++ instantiate same operator twice due to bitfield in -O0 mode, causing symbol already defined assembler error

2008-11-12 Thread jason at gcc dot gnu dot org


--- Comment #4 from jason at gcc dot gnu dot org  2008-11-12 20:52 ---
Subject: Bug 38007

Author: jason
Date: Wed Nov 12 20:50:45 2008
New Revision: 141800

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=141800
Log:
PR c++/38007
gcc/cp/ 
* typeck.c (cp_build_modify_expr): Update bitfield handling.
gcc/
* c-common.c (c_common_signed_or_unsigned_type): Remove C++ 
special casing. 
gcc/testsuite/  
* g++.dg/conversion/bitfield10.C: New test. 
* g++.dg/warn/pr35635.C (func1): Accept additional warning. 
* g++.old-deja/g++.mike/enum1.C: Expect warn about assignment.  
* g++.dg/expr/bitfield9.C: Pass -Wno-overflow.  

Added:
trunk/gcc/testsuite/g++.dg/conversion/bitfield10.C
Modified:
trunk/gcc/ChangeLog
trunk/gcc/c-common.c
trunk/gcc/cp/ChangeLog
trunk/gcc/cp/typeck.c
trunk/gcc/testsuite/ChangeLog
trunk/gcc/testsuite/g++.dg/expr/bitfield9.C
trunk/gcc/testsuite/g++.dg/warn/pr35635.C
trunk/gcc/testsuite/g++.old-deja/g++.mike/enum1.C


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38007