------- Additional Comments From rguenth at gcc dot gnu dot org  2005-08-11 
10:44 -------
We inline all and get

void bar() ()
{
  char & D.1777;
  struct B * D.1776;
  char & D.1773;
  union C D.1772;

<bb 0>:
  D.1772.p = &a;
  D.1776_5 = D.1772.q;
  D.1777_6 = &D.1776_5->d;
  D.1773_7 = D.1777_6;
  *D.1773_7 = 0;
  return;

}

where we access the padding between c and i in struct A through an
object of type B.  This must be invalid code.  Even if it is, the
gcc_unreachable () is probably not a good idea - Danny, how should
we deal with this?  Ignore references to padding and just return
NULL from first_vi_for_offset?

There's a similar problem in get_constraint_for_component_ref which
I hit with array-aliasing and work-around by

*************** get_constraint_for_component_ref (tree t
*** 2075,2082 ****
            }
          /* assert that we found *some* field there. The user couldn't be
             accessing *only* padding.  */
!
!         gcc_assert (curr);
        }
        else
        if (dump_file && (dump_flags & TDF_DETAILS))
--- 2076,2084 ----
            }
          /* assert that we found *some* field there. The user couldn't be
             accessing *only* padding.  */
!         /* Still the user could access one past the end of an array
!            embedded in a struct resulting in accessing *only* padding.  */
!         /* gcc_assert (curr); */
        }
        else
        if (dump_file && (dump_flags & TDF_DETAILS))


-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu dot
                   |                            |org


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

Reply via email to