diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-12-05 11:45:21 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-12-05 11:45:21 +0100 |
commit | 91929b4dee6788fdfbaee519272b8d027b3d47ba (patch) | |
tree | e4f95a8babd3e9a324a6a69a07ea38fb5fddd190 /gcc | |
parent | c0742514bdd2e2e51b3bfcf267719bf5f9a146f0 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype10.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype9.C | 10 |
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" } |