c++: Don't try to parse a function declaration as deduction guide [PR97663]
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 Nov 2020 20:42:51 +0000 (21:42 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 3 Nov 2020 20:42:51 +0000 (21:42 +0100)
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.

gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp1z/class-deduction75.C [new file with mode: 0644]

index 274797f1879ea2b3a1732ae985d789b277cb7fa6..b0d5c69f1d6b8be3ebc0d241ce551a9aa1c8cd96 100644 (file)
@@ -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 (file)
index 0000000..52e6131
--- /dev/null
@@ -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 (); 
+}