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

Reply via email to