summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-02 18:25:55 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-02 18:25:55 +0000
commitb9c6afcdd29d83bf3477cb39a28c3066c82c9161 (patch)
tree578335d252c2aa921f7bd37cc8dc8c4fa46f7fd7 /gcc
parentba4d2b2f28479db60842a014a93613da093fd150 (diff)
downloadgcc-b9c6afcdd29d83bf3477cb39a28c3066c82c9161.tar.gz
/cp
2013-10-02 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58535 * parser.c (cp_parser_function_specifier_opt): Upon error about virtual templates don't set ds_virtual. (finish_fully_implicit_template): Reject virtual implicit templates. /testsuite 2013-10-02 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58535 * g++.dg/parse/crash65.C: New. * g++.dg/cpp1y/pr58535.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203123 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c11
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr58535.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash65.C6
5 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 55655c60bec..c984f9030f3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2013-10-02 Paolo Carlini <paolo.carlini@oracle.com>
+ PR c++/58535
+ * parser.c (cp_parser_function_specifier_opt): Upon error about
+ virtual templates don't set ds_virtual.
+ (finish_fully_implicit_template): Reject virtual implicit templates.
+
+2013-10-02 Paolo Carlini <paolo.carlini@oracle.com>
+
PR c++/58565
* semantics.c (potential_constant_expression_1): Handle LABEL_EXPR.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 5e68b363a35..d0a23f3c3b8 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -11460,7 +11460,8 @@ cp_parser_function_specifier_opt (cp_parser* parser,
A member function template shall not be virtual. */
if (PROCESSING_REAL_TEMPLATE_DECL_P ())
error_at (token->location, "templates may not be %<virtual%>");
- set_and_check_decl_spec_loc (decl_specs, ds_virtual, token);
+ else
+ set_and_check_decl_spec_loc (decl_specs, ds_virtual, token);
break;
case RID_EXPLICIT:
@@ -29035,6 +29036,14 @@ finish_fully_implicit_template (cp_parser *parser, tree member_decl_opt)
{
gcc_assert (parser->fully_implicit_function_template_p);
+ if (member_decl_opt && member_decl_opt != error_mark_node
+ && DECL_VIRTUAL_P (member_decl_opt))
+ {
+ error_at (DECL_SOURCE_LOCATION (member_decl_opt),
+ "implicit templates may not be %<virtual%>");
+ DECL_VIRTUAL_P (member_decl_opt) = false;
+ }
+
pop_deferring_access_checks ();
if (member_decl_opt)
member_decl_opt = finish_member_template_decl (member_decl_opt);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 754a6a2f293..ec43cc5e021 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-10-02 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/58535
+ * g++.dg/parse/crash65.C: New.
+ * g++.dg/cpp1y/pr58535.C: Likewise.
+
2013-10-02 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/ldist-11.c: Adjust.
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr58535.C b/gcc/testsuite/g++.dg/cpp1y/pr58535.C
new file mode 100644
index 00000000000..2bf62b0b3d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr58535.C
@@ -0,0 +1,7 @@
+// PR c++/58535
+// { dg-options "-std=gnu++1y" }
+
+struct A
+{
+ virtual void foo(auto); // { dg-error "templates" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash65.C b/gcc/testsuite/g++.dg/parse/crash65.C
new file mode 100644
index 00000000000..04154f40cd5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash65.C
@@ -0,0 +1,6 @@
+// PR c++/58535
+
+struct A
+{
+ template<int> virtual void foo(); // { dg-error "templates" }
+};