g++ with -std=c++17 since version 7.1 up to current trunk misdetects 'bar::foo' the following code as a deduction guide for 'struct foo': ``` template <class T> struct foo {}; namespace bar { unsigned foo(); } ``` Code on Godbolt: https://godbolt.org/z/6E4efY Workarounds: - Use 'unsigned int foo()' - Use 'auto foo() -> unsigned'. Related issue with more context: https://github.com/boostorg/histogram/issues/290
Started with r7-6608-ga56c0ac08242269bbcc4bd1f480eda2378336776
Created attachment 49486 [details] gcc11-pr97663.patch Only lightly tested fix (so far), passes check-c++-all without regressions.
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:875225301e356759982573d5578ed7ca54f81f86 commit r11-4695-g875225301e356759982573d5578ed7ca54f81f86 Author: Jakub Jelinek <jakub@redhat.com> Date: Tue Nov 3 21:42:51 2020 +0100 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.
The releases/gcc-10 branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:cd41e4a1864c10c7f9141284e82e5cc0a3007806 commit r10-9008-gcd41e4a1864c10c7f9141284e82e5cc0a3007806 Author: Jakub Jelinek <jakub@redhat.com> Date: Tue Nov 3 21:42:51 2020 +0100 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. (cherry picked from commit 875225301e356759982573d5578ed7ca54f81f86)
The releases/gcc-9 branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:c3a583316776a399fea9eb79019245138a2be181 commit r9-9392-gc3a583316776a399fea9eb79019245138a2be181 Author: Jakub Jelinek <jakub@redhat.com> Date: Tue Nov 3 21:42:51 2020 +0100 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. (cherry picked from commit cd41e4a1864c10c7f9141284e82e5cc0a3007806)
The releases/gcc-8 branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:a35abb48b025291cabc364c1b335d3f675e9e97f commit r8-10862-ga35abb48b025291cabc364c1b335d3f675e9e97f Author: Jakub Jelinek <jakub@redhat.com> Date: Tue Nov 3 21:42:51 2020 +0100 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. (cherry picked from commit cd41e4a1864c10c7f9141284e82e5cc0a3007806)
Fixed.