aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-12-05 11:45:21 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-12-05 11:45:21 +0100
commit91929b4dee6788fdfbaee519272b8d027b3d47ba (patch)
treee4f95a8babd3e9a324a6a69a07ea38fb5fddd190 /gcc
parentc0742514bdd2e2e51b3bfcf267719bf5f9a146f0 (diff)
downloadgcc-91929b4dee6788fdfbaee519272b8d027b3d47ba.zip
gcc-91929b4dee6788fdfbaee519272b8d027b3d47ba.tar.gz
gcc-91929b4dee6788fdfbaee519272b8d027b3d47ba.tar.bz2
re PR c++/34271 (ICE in invalid initialization of static template member)
PR c++/34271 * semantics.c (finish_decltype_type): For SCOPE_REF issue an error instead of assertion failure. * parser.c (cp_parser_decltype): If closing paren is not found, return error_mark_node. * g++.dg/cpp0x/decltype9.C: New test. * g++.dg/cpp0x/decltype10.C: New test. From-SVN: r130619
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/cp/semantics.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype10.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype9.C10
6 files changed, 41 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0ade8cd..98316fe 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2007-12-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34271
+ * semantics.c (finish_decltype_type): For SCOPE_REF issue an
+ error instead of assertion failure.
+ * parser.c (cp_parser_decltype): If closing paren is not found,
+ return error_mark_node.
+
2007-12-04 Douglas Gregor <doug.gregor@gmail.com>
PR c++/34101
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 7b173f0..879e701 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8602,8 +8602,11 @@ cp_parser_decltype (cp_parser *parser)
/* Parse to the closing `)'. */
if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"))
- cp_parser_skip_to_closing_parenthesis (parser, true, false,
- /*consume_paren=*/true);
+ {
+ cp_parser_skip_to_closing_parenthesis (parser, true, false,
+ /*consume_paren=*/true);
+ return error_mark_node;
+ }
return finish_decltype_type (expr, id_expression_or_member_access_p);
}
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 381774e..1933792 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4164,7 +4164,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
break;
default:
- gcc_assert (TYPE_P (expr) || DECL_P (expr));
+ gcc_assert (TYPE_P (expr) || DECL_P (expr)
+ || TREE_CODE (expr) == SCOPE_REF);
error ("argument to decltype must be an expression");
return error_mark_node;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a58e365..77b97d2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-12-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34271
+ * g++.dg/cpp0x/decltype9.C: New test.
+ * g++.dg/cpp0x/decltype10.C: New test.
+
2007-12-05 Samuel Tardieu <sam@rfc1149.net>
PR ada/21489
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype10.C b/gcc/testsuite/g++.dg/cpp0x/decltype10.C
new file mode 100644
index 0000000..6c48899
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype10.C
@@ -0,0 +1,10 @@
+// PR c++/34271
+// { dg-do compile }
+// { dg-options "-std=c++0x" }
+
+template<int> struct A
+{
+ static int i;
+};
+
+template<int N> int A<N>::i(decltype (A::i; // { dg-error "expected primary-expression before" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype9.C b/gcc/testsuite/g++.dg/cpp0x/decltype9.C
new file mode 100644
index 0000000..4cd150e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype9.C
@@ -0,0 +1,10 @@
+// PR c++/34271
+// { dg-do compile }
+// { dg-options "-std=c++0x" }
+
+template<int> struct A
+{
+ static int i;
+};
+
+template<int N> int A<N>::i(decltype (A::i)); // { dg-error "member function|must be an expression" }