Skip to content
Snippets Groups Projects
Commit 3605e057 authored by Marek Polacek's avatar Marek Polacek
Browse files

c++: too many errors with sneaky template [PR118516]

Since C++20 P0846, a name followed by a < can be treated as a template-name
even though name lookup did not find a template-name.  That happens
in this test with "i < foo ()":

  for (int id = 0; i < foo(); ++id);

and results in a raft of errors about non-constant foo().  The problem
is that the require_potential_constant_expression call in
cp_parser_template_argument emits errors even when we're parsing
tentatively.  So we repeat the error when we're trying to parse
as a nested-name-specifier, type-name, etc.

Guarding the call with !cp_parser_uncommitted_to_tentative_parse_p would
mean that require_potential_constant_expression never gets called.  But
we don't need the call at all as far as I can tell.  Stuff like

  template<int N> struct S { };
  int foo () { return 4; }
  void
  g ()
  {
    S<foo()> s;
  }

gets diagnosed in convert_nontype_argument.  In fact, with this patch,
we only emit "call to non-constexpr function" once.  (That is, in C++17
only; C++14 uses a different path.)

	PR c++/118516

gcc/cp/ChangeLog:

	* parser.cc (cp_parser_template_argument): Don't call
	require_potential_constant_expression.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/fn-template11.C:
	* g++.dg/template/fn-template1.C: New test.
	* g++.dg/template/fn-template2.C: New test.
parent 767a7a06
No related branches found
No related tags found
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment