From 4eab75dd128cec9fd5b1b011f992be6b69f7ee81 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Tue, 11 Dec 2012 21:20:23 +0100 Subject: [PATCH] re PR c++/53094 (constexpr vector subscripting) 2012-12-11 Marc Glisse PR c++/53094 cp/ * tree.c (cp_tree_equal): Handle VECTOR_CST. * semantics.c (cxx_eval_bare_aggregate): Protect a dereference. Handle VECTOR_CST. testsuite/ * g++.dg/cpp0x/constexpr-53094-1.C: New testcase. * g++.dg/cpp0x/constexpr-53094-2.C: Likewise. * g++.dg/cpp0x/constexpr-53094-3.C: Likewise. From-SVN: r194421 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/semantics.c | 6 ++++-- gcc/cp/tree.c | 3 +++ gcc/testsuite/ChangeLog | 7 +++++++ .../g++.dg/cpp0x/constexpr-53094-1.C | 6 ++++++ .../g++.dg/cpp0x/constexpr-53094-2.C | 6 ++++++ .../g++.dg/cpp0x/constexpr-53094-3.C | 19 +++++++++++++++++++ 7 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2cd295b5b53..5e75a143aa9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-12-11 Marc Glisse + + PR c++/53094 + * tree.c (cp_tree_equal): Handle VECTOR_CST. + * semantics.c (cxx_eval_bare_aggregate): Protect a dereference. + Handle VECTOR_CST. + 2012-12-11 Jakub Jelinek PR c++/55643 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ad33c658fba..f6493993b37 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7123,7 +7123,7 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree t, 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 @@ -7131,7 +7131,7 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree t, 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. */ @@ -7148,6 +7148,8 @@ cxx_eval_bare_aggregate (const constexpr_call *call, tree 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; } diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 00fe53f5214..c4302371b73 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2468,6 +2468,9 @@ cp_tree_equal (tree t1, tree t2) 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ef71057069e..2f80e7df419 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2012-12-11 Marc Glisse + + PR c++/53094 + * g++.dg/cpp0x/constexpr-53094-1.C: New testcase. + * g++.dg/cpp0x/constexpr-53094-2.C: Likewise. + * g++.dg/cpp0x/constexpr-53094-3.C: Likewise. + 2012-12-11 Jakub Jelinek PR c++/55643 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C new file mode 100644 index 00000000000..c24ff60219d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C @@ -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 *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C new file mode 100644 index 00000000000..af4b8d93bbf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C @@ -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); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C new file mode 100644 index 00000000000..bd17ac746ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C @@ -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); -- 2.30.2