diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-12-11 21:20:23 +0100 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-12-11 20:20:23 +0000 |
commit | 4eab75dd128cec9fd5b1b011f992be6b69f7ee81 (patch) | |
tree | 0277ae7a99c17b3afc64d4b3af39811c76bdd446 /gcc | |
parent | 759deff3ac0e0c8a7680dd106e05394ad219f84b (diff) | |
download | gcc-4eab75dd128cec9fd5b1b011f992be6b69f7ee81.zip gcc-4eab75dd128cec9fd5b1b011f992be6b69f7ee81.tar.gz gcc-4eab75dd128cec9fd5b1b011f992be6b69f7ee81.tar.bz2 |
re PR c++/53094 (constexpr vector subscripting)
2012-12-11 Marc Glisse <marc.glisse@inria.fr>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/cp/tree.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C | 19 |
7 files changed, 52 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2cd295b..5e75a14 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-12-11 Marc Glisse <marc.glisse@inria.fr> + + 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 <jakub@redhat.com> PR c++/55643 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ad33c65..f649399 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 00fe53f..c430237 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 ef71057..2f80e7d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2012-12-11 Marc Glisse <marc.glisse@inria.fr> + + 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 <jakub@redhat.com> 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 0000000..c24ff60 --- /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 0000000..af4b8d9 --- /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 0000000..bd17ac7 --- /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); |