From 0fced8150b9bc8be3dd0ea2134002f4645428f6b Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 17 Apr 2012 17:20:02 +0000 Subject: [PATCH] re PR c++/52599 (ICE on illegal constexpr constructor declaration) /cp 2012-04-17 Paolo Carlini PR c++/52599 * semantics.c (build_constexpr_constructor_member_initializers): Check for function-try-block as function-body. /testsuite 2012-04-17 Paolo Carlini PR c++/52599 * g++.dg/cpp0x/constexpr-ctor10.C: New. /cp 2012-04-17 Paolo Carlini PR c++/53003 * parser.c (cp_parser_member_declaration): Check that initializer_token_start is non null before dereferencing it. /testsuite 2012-04-17 Paolo Carlini PR c++/53003 * g++.dg/parse/crash59.C: New. From-SVN: r186541 --- gcc/cp/ChangeLog | 12 ++++++++++++ gcc/cp/parser.c | 2 +- gcc/cp/semantics.c | 6 ++++++ gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C | 6 ++++++ gcc/testsuite/g++.dg/parse/crash59.C | 3 +++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C create mode 100644 gcc/testsuite/g++.dg/parse/crash59.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8746c64..16dceec 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2012-04-17 Paolo Carlini + + PR c++/52599 + * semantics.c (build_constexpr_constructor_member_initializers): + Check for function-try-block as function-body. + +2012-04-17 Paolo Carlini + + PR c++/53003 + * parser.c (cp_parser_member_declaration): Check that + initializer_token_start is non null before dereferencing it. + 2012-04-16 Jason Merrill PR c++/38543 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 6809bc7..8aefefa 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -19109,7 +19109,7 @@ cp_parser_member_declaration (cp_parser* parser) possible that this fact is an oversight in the standard, since a pure function may be defined outside of the class-specifier. */ - if (initializer) + if (initializer && initializer_token_start) error_at (initializer_token_start->location, "pure-specifier on function-definition"); decl = cp_parser_save_member_function_body (parser, diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 9bdd2ee..22185ea 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5921,6 +5921,12 @@ build_constexpr_constructor_member_initializers (tree type, tree body) break; } } + else if (TREE_CODE (body) == TRY_BLOCK) + { + error ("body of % constructor cannot be " + "a function-try-block"); + return error_mark_node; + } else if (EXPR_P (body)) ok = build_data_member_initialization (body, &vec); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 301f561..0c42dee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2012-04-17 Paolo Carlini + + PR c++/52599 + * g++.dg/cpp0x/constexpr-ctor10.C: New. + +2012-04-17 Paolo Carlini + + PR c++/53003 + * g++.dg/parse/crash59.C: New. + 2012-04-17 Michael Matz PR tree-optimization/18437 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C new file mode 100644 index 0000000..c1279e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C @@ -0,0 +1,6 @@ +// PR c++/52599 +// { dg-options -std=c++11 } + +struct foo { + constexpr foo() try { } catch(...) { }; // { dg-error "constructor" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash59.C b/gcc/testsuite/g++.dg/parse/crash59.C new file mode 100644 index 0000000..e5e6298 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash59.C @@ -0,0 +1,3 @@ +// PR c++/53003 + +struct A{ void a{} return b // { dg-error "function definition|expected" } -- 2.7.4