aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-09-19 22:45:03 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2012-09-19 20:45:03 +0000
commit7cea661c88ddced65b79e0fadebfa5bc9b412415 (patch)
tree1b8b62f4631c171d22b47c9a71ca142f712e2750 /gcc
parentb7f401de87c6f396a1d44ac9754e9ec82fd5a028 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/semantics.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype-54581.C28
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>();
+}