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