[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
--- 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
--- 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
--- 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
-- 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
--- 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