diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-11-03 21:42:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-11-03 21:42:51 +0100 |
commit | 875225301e356759982573d5578ed7ca54f81f86 (patch) | |
tree | 4badf3d271e09fccdd5859f8416b30e7af2a56f5 | |
parent | 9f925f3b198e210e0d124a3c69fae034f429942f (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/cp/parser.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction75.C | 15 |
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 (); +} |