[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
jakub at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Thu Nov 6 15:16:00 GMT 2008
------- Comment #3 from jakub at gcc dot gnu dot org 2008-11-06 15:15 -------
And for:
struct A
{
template <typename T> __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<unsigned int>()
A::operator unsigned char<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
More information about the Gcc-bugs
mailing list