diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-02 18:25:55 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-02 18:25:55 +0000 |
commit | b9c6afcdd29d83bf3477cb39a28c3066c82c9161 (patch) | |
tree | 578335d252c2aa921f7bd37cc8dc8c4fa46f7fd7 /gcc | |
parent | ba4d2b2f28479db60842a014a93613da093fd150 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr58535.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/crash65.C | 6 |
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" } +}; |