[Bug c++/92044] New: Poor diagnostics for concept that should be a qualified-id
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 10 10:37:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92044
Bug ID: 92044
Summary: Poor diagnostics for concept that should be a
qualified-id
Product: gcc
Version: 9.1.1
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
namespace N {
template<typename T>
concept foo = true;
}
template<typename T> requires N::foo<T>
void ok(T) { }
template<typename T> requires foo<T>
void bad1(T) { }
template<typename T> requires (foo<T>)
void bad2(T) { }
dym.cc:9:34: error: expression after 'requires' must be enclosed in parentheses
9 | template<typename T> requires foo<T>
| ^
dym.cc:9:34: error: expression after 'requires' must be enclosed in parentheses
dym.cc:9:34: error: expected unqualified-id before '<' token
dym.cc:12:32: error: 'foo' was not declared in this scope; did you mean
'concept foo'?
12 | template<typename T> requires (foo<T>)
| ^~~
| concept foo
dym.cc:3:13: note: 'concept foo' declared here
3 | concept foo = true;
| ^~~
dym.cc:12:32: error: 'foo' was not declared in this scope; did you mean
'concept foo'?
12 | template<typename T> requires (foo<T>)
| ^~~
| concept foo
dym.cc:3:13: note: 'concept foo' declared here
3 | concept foo = true;
| ^~~
dym.cc:12:22: error: expression after 'requires' must be enclosed in
parentheses
12 | template<typename T> requires (foo<T>)
| ^~~~~~~~
dym.cc:12:35: error: expected ')' before '<' token
12 | template<typename T> requires (foo<T>)
| ~ ^
| )
The first error is misleading, the expression doesn't need to be enclosed in
parentheses, it needs to be qualified (but the compiler doesn't know that so
thinks it's a less-than expression).
The second error is a duplicate of the first. The third is reasonable, given
the first error, but it would be nice if it could be suppressed.
Ideally the compiler would look for 'foo' and suggest qualifying it instead of
adding the parentheses (which wouldn't actually fix anything).
The fourth error should say "did you mean 'N::foo'?" not 'concept foo'.
The fifth error is just nonsense, it *is* enclosed in parentheses. Could that
and the sixth error be suppressed after the earlier "did you mean"?
More information about the Gcc-bugs
mailing list