c++: class-scope qualified constrained auto [PR107188]
commit147e276b580b674a46bc3b9c461ae7837fd48aba
authorPatrick Palka <ppalka@redhat.com>
Thu, 15 Dec 2022 21:07:09 +0000 (15 16:07 -0500)
committerPatrick Palka <ppalka@redhat.com>
Thu, 15 Dec 2022 21:07:09 +0000 (15 16:07 -0500)
tree192e57b9cd779198287b423416a45984e21a7fdd
parent18499b9f848707aee42d810e99ac0a4c9788433c
c++: class-scope qualified constrained auto [PR107188]

Here when parsing the class-scope auto constrained by a qualified
concept-id, we first tentatively parse the overall member-declaration as
a deprecated access-declaration, during which we parse C<int> as a
standalone TEMPLATE_ID_EXPR (separate from the auto) and end up emitting
the stray error

concepts-placeholder11.C:9:6: error: wrong number of template arguments (1, should be 2)
    9 |   N::C<int> auto f() { return 0; }
      |      ^~~~~~
concepts-placeholder11.C:5:34: note: provided for ‘template<class, class> concept N::C’
    5 |   template<class, class> concept C = true;
      |                                  ^

from build_concept_id called from cp_parser_template_id_expr.

We could fix this by adding a complain parameter to build_concept_id and
passing tf_none when parsing tentatively.  However, it seems this can
also be fixed in a more general way that might benefit non-concepts
code: when tentatively parsing an access-declaration, abort the parse
early if the qualifying scope isn't possibly a class or enumeration
type, so that we avoid parsing C<int> as a TEMPLATE_ID_EXPR here in the
first place.  This patch takes this latter approach.

PR c++/107188

gcc/cp/ChangeLog:

* parser.cc (cp_parser_using_declaration): Give up early if the
scope of an access-declaration isn't possibly a class type.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-placeholder11.C: New test.
gcc/cp/parser.cc
gcc/testsuite/g++.dg/cpp2a/concepts-placeholder11.C [new file with mode: 0644]