aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-03-26 16:07:17 -0400
committerMarek Polacek <polacek@redhat.com>2020-03-26 22:08:11 -0400
commit71d69548a1b2c85220ac6354564fd272beb9263f (patch)
treecafdd6cd34005dfab1c31bff2825aa78078fcad1 /gcc
parent54f58e9416debf139bd88d8055cdfbacf7e20204 (diff)
downloadgcc-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')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/template-keyword2.C5
4 files changed, 25 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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4cbfdca..3a1c5e7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-26 Marek Polacek <polacek@redhat.com>
+
+ PR c++/94336 - template keyword accepted before destructor names.
+ * g++.dg/template/template-keyword2.C: New test.
+
2020-03-27 Iain Sandoe <iain@sandoe.co.uk>
* g++.dg/coroutines/torture/symmetric-transfer-00-basic.C:
diff --git a/gcc/testsuite/g++.dg/template/template-keyword2.C b/gcc/testsuite/g++.dg/template/template-keyword2.C
new file mode 100644
index 0000000..27d874b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/template-keyword2.C
@@ -0,0 +1,5 @@
+// PR c++/94336 - template keyword accepted before destructor names.
+
+template<typename T> void f(T *p) { p->template ~X(); } // { dg-error ".template. keyword not permitted in destructor name" }
+template<typename T> struct X {};
+void g(X<int> *p) { f(p); }