From: Marc Glisse Date: Tue, 9 Jul 2013 15:58:36 +0000 (+0200) Subject: re PR c++/53094 (constexpr vector subscripting) X-Git-Tag: releases/gcc-4.9.0~5064 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=40e0364c5564fa3d9cab209ecafe22778bf4c25b;p=thirdparty%2Fgcc.git re PR c++/53094 (constexpr vector subscripting) 2013-07-09 Marc Glisse 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. From-SVN: r200822 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6a04e58fcd3b..9262813ef2eb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-07-09 Marc Glisse + + PR c++/53094 + * semantics.c (cxx_eval_bit_field_ref): Handle VECTOR_CST. + 2013-07-09 Marc Glisse PR c++/53000 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 0a6c77541a6f..c9a292e82494 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7197,7 +7197,9 @@ cxx_eval_bit_field_ref (const constexpr_call *call, tree t, 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); @@ -7206,6 +7208,10 @@ cxx_eval_bit_field_ref (const constexpr_call *call, tree t, 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 573d78a2726c..a9b8829d24c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-07-09 Marc Glisse + + PR c++/53094 + * g++.dg/cpp0x/constexpr-53094-1.C: Adjust. + * g++.dg/ext/vector24.C: New testcase. + 2013-07-09 Marc Glisse PR c++/53000 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C index c24ff60219d7..e49023d869e1 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C @@ -3,4 +3,4 @@ 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; diff --git a/gcc/testsuite/g++.dg/ext/vector24.C b/gcc/testsuite/g++.dg/ext/vector24.C new file mode 100644 index 000000000000..3eca7fb0bf9c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector24.C @@ -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");