On Sun, Jul 7, 2013 at 10:54 AM, Marc Glisse <marc.gli...@inria.fr> wrote: > Hello, > > it turns out there wasn't much missing here. I got side-tracked because > fold_unary_loc doesn't call fold_indirect_ref_1, and fold_indirect_ref_1 has > a too strict comparison type == TREE_TYPE (optype) (should compare > TYPE_MAIN_VARIANT instead?),
or same_type_p. > but none of that was necessary so I'll leave it > for another time. The new testcase is not that useful, but I didn't remember > there was already one with dg-bogus. > > > Bootstrap+testsuite on x86_64-unknown-linux-gnu. > > 2013-07-07 Marc Glisse <marc.gli...@inria.fr> > > PR c++/53094 > gcc/cp/ > * semantics.c (cxx_eval_bit_field_ref): Handle VECTOR_CST. OK. > > gcc/testsuite/ > * g++.dg/cpp0x/constexpr-53094-1.C: Adjust. > * g++.dg/ext/vector24.C: New testcase. > > -- > Marc Glisse > Index: testsuite/g++.dg/cpp0x/constexpr-53094-1.C > =================================================================== > --- testsuite/g++.dg/cpp0x/constexpr-53094-1.C (revision 200742) > +++ testsuite/g++.dg/cpp0x/constexpr-53094-1.C (working copy) > @@ -1,6 +1,6 @@ > // { dg-do compile } > // { dg-options "-std=gnu++11" } > > typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4; > constexpr V4 v = { 1, 1, 1, 0 }; > -constexpr V4 r = v[0] + v; // { dg-bogus "not a constant expression" "" { > xfail *-*-* } } > +constexpr V4 r = v[0] + v; > Index: testsuite/g++.dg/ext/vector24.C > =================================================================== > --- testsuite/g++.dg/ext/vector24.C (revision 0) > +++ testsuite/g++.dg/ext/vector24.C (revision 0) > @@ -0,0 +1,8 @@ > +// { dg-do compile { target c++11 } } > + > +typedef long vec __attribute__((vector_size(2*sizeof(long)))); > +constexpr vec v = { 33, 42 }; > +constexpr auto l0 = v[0]; > +constexpr auto l1 = v[1]; > +static_assert(l0==33,"Fail"); > +static_assert(l1==42,"Fail"); > > Property changes on: testsuite/g++.dg/ext/vector24.C > ___________________________________________________________________ > Added: svn:eol-style > + native > Added: svn:keywords > + Author Date Id Revision URL > > Index: cp/semantics.c > =================================================================== > --- cp/semantics.c (revision 200742) > +++ cp/semantics.c (working copy) > @@ -7179,29 +7179,35 @@ cxx_eval_bit_field_ref (const constexpr_ > tree whole = cxx_eval_constant_expression (call, orig_whole, > allow_non_constant, addr, > non_constant_p, overflow_p); > tree start, field, value; > unsigned HOST_WIDE_INT i; > > if (whole == orig_whole) > return t; > /* Don't VERIFY_CONSTANT here; we only want to check that we got a > CONSTRUCTOR. */ > - if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR) > + if (!*non_constant_p > + && TREE_CODE (whole) != VECTOR_CST > + && TREE_CODE (whole) != CONSTRUCTOR) > { > if (!allow_non_constant) > error ("%qE is not a constant expression", orig_whole); > *non_constant_p = true; > } > if (*non_constant_p) > return t; > > + if (TREE_CODE (whole) == VECTOR_CST) > + return fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole, > + TREE_OPERAND (t, 1), TREE_OPERAND (t, 2)); > + > start = TREE_OPERAND (t, 2); > istart = tree_low_cst (start, 0); > isize = tree_low_cst (TREE_OPERAND (t, 1), 0); > utype = TREE_TYPE (t); > if (!TYPE_UNSIGNED (utype)) > utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1); > retval = build_int_cst (utype, 0); > FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value) > { > tree bitpos = bit_position (field); >