https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63764

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jsm28 at gcc dot gnu.org

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
For the #c4 testcase, it is even unclear to me whether we shouldn't reject it.
typedef float V __attribute__((vector_size (4 * sizeof (float))));
void
fn2 ()
{
  V saijplus16 = (V) { 0.0, 0.0, 0.0, 0.0 };
  ((V) saijplus16)[0] = 0;
}
doesn't ICE (at least on x86_64) though,
void
fn3 ()
{
  float __attribute__((vector_size (4 * sizeof (float)))) saijplus16 = (float
__attribute__((vector_size (4 * sizeof (float))))) { 0.0, 0.0, 0.0, 0.0 };
  ((float __attribute__((vector_size (4 * sizeof (float))))) saijplus16)[0] =
0;
}
does.  The difference is when
handling the (type) saijplus16 cast in build_c_cast.
In the ppc case and fn3 case, the type is the same, so we end up with
NON_LVALUE_EXPR of saijplus16.  In the fn2 case with V typedef, the type is
different (saijplus16 has V type, the cast uses its main variant), so we end up
with VIEW_CONVERT_EXPR of saijplus16 instead.  The VCE gets folded away, while
NON_LVALUE_EXPR remains.  But in all cases the casts aren't valid lvalue.
Note, C++ ICEs on all the testcases.
IMHO either we need to reject it (but how to find out in the case of
build_c_cast that it originally was non-lvalue?), or we need to skip the
NON_LVALUE_EXPRs when marking the var as addressable and taking address of it.

Reply via email to