diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-09-19 22:45:03 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-09-19 20:45:03 +0000 |
commit | 7cea661c88ddced65b79e0fadebfa5bc9b412415 (patch) | |
tree | 1b8b62f4631c171d22b47c9a71ca142f712e2750 /gcc | |
parent | b7f401de87c6f396a1d44ac9754e9ec82fd5a028 (diff) | |
download | gcc-7cea661c88ddced65b79e0fadebfa5bc9b412415.zip gcc-7cea661c88ddced65b79e0fadebfa5bc9b412415.tar.gz gcc-7cea661c88ddced65b79e0fadebfa5bc9b412415.tar.bz2 |
re PR c++/54581 (decltype and opaque vector types)
2012-09-19 Marc Glisse <marc.glisse@inria.fr>
PR c++/54581
gcc/cp/
* semantics.c (finish_decltype_type): Make vectors not opaque.
gcc/testsuite/
* g++.dg/cpp0x/decltype-54581.C: New testcase.
From-SVN: r191500
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype-54581.C | 28 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 676c166..0427a19 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-09-19 Marc Glisse <marc.glisse@inria.fr> + + PR c++/54581 + * semantics.c (finish_decltype_type): Make vectors not opaque. + 2012-09-17 Jason Merrill <jason@redhat.com> PR c++/54575 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index db093e0..1aa5a8b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5312,6 +5312,11 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, cp_lvalue_kind clk = lvalue_kind (expr); type = unlowered_expr_type (expr); gcc_assert (TREE_CODE (type) != REFERENCE_TYPE); + + /* For vector types, pick a non-opaque variant. */ + if (TREE_CODE (type) == VECTOR_TYPE) + type = strip_typedefs (type); + if (clk != clk_none && !(clk & clk_class)) type = cp_build_reference_type (type, (clk & clk_rvalueref)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f02d154..09c1d3f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-19 Marc Glisse <marc.glisse@inria.fr> + + PR c++/54581 + * g++.dg/cpp0x/decltype-54581.C: New testcase. + 2012-09-19 Steve Ellcey <sellcey@mips.com> * gcc.target/mips/pr37362.c: Add mips*-mti-elf exception. diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C b/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C new file mode 100644 index 0000000..5747e5c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-std=gnu++11 -Wall" } */ + +typedef float v4f __attribute__((vector_size(4*sizeof(float)))); + +template <class T> void eat (T&&) {} + +void test1 () +{ + v4f x = {0,1,2,3}; + typedef decltype (x < x) v4i; + v4i y = {4,5,6,7}; // v4i is not opaque + eat (y); +} + +template<class V> +void test2 () +{ + V x = {0,1,2,3}; + typedef decltype (x < x) v4i; + v4i y = {4,5,6,7}; // v4i is not opaque + eat (y); +} + +int main(){ + test1(); + test2<v4f>(); +} |