aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-11-03 21:42:51 +0100
committerJakub Jelinek <jakub@redhat.com>2020-11-03 21:42:51 +0100
commit875225301e356759982573d5578ed7ca54f81f86 (patch)
tree4badf3d271e09fccdd5859f8416b30e7af2a56f5 /gcc
parent9f925f3b198e210e0d124a3c69fae034f429942f (diff)
downloadgcc-875225301e356759982573d5578ed7ca54f81f86.zip
gcc-875225301e356759982573d5578ed7ca54f81f86.tar.gz
gcc-875225301e356759982573d5578ed7ca54f81f86.tar.bz2
c++: Don't try to parse a function declaration as deduction guide [PR97663]
While these function declarations have NULL decl_specifiers->type, they have still type specifiers specified from which the default int in the return type is added, so we shouldn't try to parse those as deduction guides. 2020-11-03 Jakub Jelinek <jakub@redhat.com> PR c++/97663 * parser.c (cp_parser_init_declarator): Don't try to parse C++17 deduction guides if there are any type specifiers even when type is NULL. * g++.dg/cpp1z/class-deduction75.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/parser.c1
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction75.C15
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 274797f..b0d5c69 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -20790,6 +20790,7 @@ cp_parser_init_declarator (cp_parser* parser,
{
/* Handle C++17 deduction guides. */
if (!decl_specifiers->type
+ && !decl_specifiers->any_type_specifiers_p
&& ctor_dtor_or_conv_p <= 0
&& cxx_dialect >= cxx17)
{
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction75.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction75.C
new file mode 100644
index 0000000..52e6131
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction75.C
@@ -0,0 +1,15 @@
+// PR c++/97663
+
+template <class T> struct foo {};
+template <class T> struct bar {};
+template <class T> struct baz {};
+template <class T> struct qux {};
+template <class T> struct corge {};
+
+namespace N {
+ unsigned foo ();
+ signed bar ();
+ long baz ();
+ long long qux ();
+ short corge ();
+}