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?), 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 <[email protected]>
PR c++/53094
gcc/cp/
* semantics.c (cxx_eval_bit_field_ref): Handle VECTOR_CST.
gcc/testsuite/
* g++.dg/cpp0x/constexpr-53094-1.C: Adjust.
* g++.dg/ext/vector24.C: New testcase.
--
Marc GlisseIndex: 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);