===================================================================
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4;
+constexpr V4 build (float x, float y, float z) { return (V4){ x, y, z, 0 };}
+constexpr V4 x = build (1, 0, 0);
Property changes on: gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C
___________________________________________________________________
Added: svn:eol-style
+ native
Added: svn:keywords
+ Author Date Id Revision URL
===================================================================
@@ -0,0 +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 *-*-* } }
Property changes on: gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision URL
Added: svn:eol-style
+ native
===================================================================
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4;
+
+struct Rot3 {
+ typedef float T;
+ typedef V4 Vec;
+ Vec axis[3];
+ constexpr Rot3 (V4 ix, V4 iy, V4 iz) : axis {ix, iy, iz} {}
+
+ constexpr Rot3(T xx, T xy, T xz, T yx, T yy, T yz, T zx, T zy, T zz) :
+ Rot3((Vec) { xx, xy, xz, 0 },
+ (Vec) { yx, yy, yz, 0 },
+ (Vec) { zx, zy, zz, 0 }) {}
+
+};
+
+constexpr Rot3 r1( 0, 1 ,0, 0, 0, 1, 1, 0, 0);
Property changes on: gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C
___________________________________________________________________
Added: svn:eol-style
+ native
Added: svn:keywords
+ Author Date Id Revision URL
===================================================================
@@ -7104,45 +7104,47 @@ cxx_eval_bare_aggregate (const constexpr
for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
{
tree elt = cxx_eval_constant_expression (call, ce->value,
allow_non_constant, addr,
non_constant_p, overflow_p);
/* Don't VERIFY_CONSTANT here. */
if (allow_non_constant && *non_constant_p)
goto fail;
if (elt != ce->value)
changed = true;
- if (TREE_CODE (ce->index) == COMPONENT_REF)
+ if (ce->index && TREE_CODE (ce->index) == COMPONENT_REF)
{
/* This is an initialization of a vfield inside a base
subaggregate that we already initialized; push this
initialization into the previous initialization. */
constructor_elt *inner = base_field_constructor_elt (n, ce->index);
inner->value = elt;
}
- else if (TREE_CODE (ce->index) == NOP_EXPR)
+ else if (ce->index && TREE_CODE (ce->index) == NOP_EXPR)
{
/* This is an initializer for an empty base; now that we've
checked that it's constant, we can ignore it. */
gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (ce->index))));
}
else
CONSTRUCTOR_APPEND_ELT (n, ce->index, elt);
}
if (*non_constant_p || !changed)
{
fail:
vec_free (n);
return t;
}
t = build_constructor (TREE_TYPE (t), n);
TREE_CONSTANT (t) = true;
+ if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
+ t = fold (t);
return t;
}
/* Subroutine of cxx_eval_constant_expression.
The expression tree T is a VEC_INIT_EXPR which denotes the desired
initialization of a non-static data member of array type. Reduce it to a
CONSTRUCTOR.
Note that apart from value-initialization (when VALUE_INIT is true),
this is only intended to support value-initialization and the
===================================================================
@@ -2462,20 +2462,23 @@ cp_tree_equal (tree t1, tree t2)
TREE_STRING_LENGTH (t1));
case FIXED_CST:
return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
TREE_FIXED_CST (t2));
case COMPLEX_CST:
return cp_tree_equal (TREE_REALPART (t1), TREE_REALPART (t2))
&& cp_tree_equal (TREE_IMAGPART (t1), TREE_IMAGPART (t2));
+ case VECTOR_CST:
+ return operand_equal_p (t1, t2, OEP_ONLY_CONST);
+
case CONSTRUCTOR:
/* We need to do this when determining whether or not two
non-type pointer to member function template arguments
are the same. */
if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
|| CONSTRUCTOR_NELTS (t1) != CONSTRUCTOR_NELTS (t2))
return false;
{
tree field, value;
unsigned int i;