From 91929b4dee6788fdfbaee519272b8d027b3d47ba Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 5 Dec 2007 11:45:21 +0100 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/parser.c | 7 +++++-- gcc/cp/semantics.c | 3 ++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/decltype10.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp0x/decltype9.C | 10 ++++++++++ 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype10.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0ade8cded77..98316fedad7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2007-12-05 Jakub Jelinek + + 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 PR c++/34101 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7b173f0b7b2..879e7015a27 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 381774ea139..1933792d7a3 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 a58e365aca2..77b97d213fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-12-05 Jakub Jelinek + + PR c++/34271 + * g++.dg/cpp0x/decltype9.C: New test. + * g++.dg/cpp0x/decltype10.C: New test. + 2007-12-05 Samuel Tardieu 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 00000000000..6c488998c59 --- /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 struct A +{ + static int i; +}; + +template int A::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 00000000000..4cd150ea6cf --- /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 struct A +{ + static int i; +}; + +template int A::i(decltype (A::i)); // { dg-error "member function|must be an expression" }