diff options
author | Marek Polacek <polacek@redhat.com> | 2020-03-26 16:07:17 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-03-26 22:08:11 -0400 |
commit | 71d69548a1b2c85220ac6354564fd272beb9263f (patch) | |
tree | cafdd6cd34005dfab1c31bff2825aa78078fcad1 /gcc/cp | |
parent | 54f58e9416debf139bd88d8055cdfbacf7e20204 (diff) | |
download | gcc-71d69548a1b2c85220ac6354564fd272beb9263f.zip gcc-71d69548a1b2c85220ac6354564fd272beb9263f.tar.gz gcc-71d69548a1b2c85220ac6354564fd272beb9263f.tar.bz2 |
c++: template keyword accepted before destructor names [PR94336]
This came up on the C++ core list recently. We don't diagnose the case
when 'template' is followed by a destructor name which is not permitted
by [temp.names]/5.
PR c++/94336 - template keyword accepted before destructor names.
* parser.c (cp_parser_unqualified_id): Give an error when 'template'
is followed by a destructor name.
* g++.dg/template/template-keyword2.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index da556a4..6ac6a67 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-03-26 Marek Polacek <polacek@redhat.com> + + PR c++/94336 - template keyword accepted before destructor names. + * parser.c (cp_parser_unqualified_id): Give an error when 'template' + is followed by a destructor name. + 2020-03-27 Patrick Palka <ppalka@redhat.com> * decl.c (compute_array_index_type_loc): Remove redundant diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 753b314..1afd03d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6068,6 +6068,15 @@ cp_parser_unqualified_id (cp_parser* parser, cp_lexer_consume_token (parser->lexer); return error_mark_node; } + if (template_keyword_p) + { + if (!cp_parser_uncommitted_to_tentative_parse_p (parser)) + error_at (tilde_loc, "%<template%> keyword not permitted in " + "destructor name"); + cp_parser_simulate_error (parser); + return error_mark_node; + } + gcc_assert (!scope || TYPE_P (scope)); token = cp_lexer_peek_token (parser->lexer); |