aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-04-17 17:20:02 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-04-17 17:20:02 +0000
commit0fced8150b9bc8be3dd0ea2134002f4645428f6b (patch)
tree3c2f1f6512eae507a52d28f15ef83744c1a25051
parent9fc37b2b7bd36846fa166fe8f9911a9ec8c6978a (diff)
downloadgcc-0fced8150b9bc8be3dd0ea2134002f4645428f6b.zip
gcc-0fced8150b9bc8be3dd0ea2134002f4645428f6b.tar.gz
gcc-0fced8150b9bc8be3dd0ea2134002f4645428f6b.tar.bz2
re PR c++/52599 (ICE on illegal constexpr constructor declaration)
/cp 2012-04-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/52599 * semantics.c (build_constexpr_constructor_member_initializers): Check for function-try-block as function-body. /testsuite 2012-04-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/52599 * g++.dg/cpp0x/constexpr-ctor10.C: New. /cp 2012-04-17 Paolo Carlini <paolo.carlini@oracle.com> 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 <paolo.carlini@oracle.com> PR c++/53003 * g++.dg/parse/crash59.C: New. From-SVN: r186541
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/crash59.C3
6 files changed, 38 insertions, 1 deletions
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 <paolo.carlini@oracle.com>
+
+ PR c++/52599
+ * semantics.c (build_constexpr_constructor_member_initializers):
+ Check for function-try-block as function-body.
+
+2012-04-17 Paolo Carlini <paolo.carlini@oracle.com>
+
+ 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 <jason@redhat.com>
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 %<constexpr%> 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 <paolo.carlini@oracle.com>
+
+ PR c++/52599
+ * g++.dg/cpp0x/constexpr-ctor10.C: New.
+
+2012-04-17 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/53003
+ * g++.dg/parse/crash59.C: New.
+
2012-04-17 Michael Matz <matz@suse.de>
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" }