https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89997
Bug ID: 89997 Summary: Garbled expression in error message with -fconcepts Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redbeard0531 at gmail dot com Target Milestone: --- Usually -fconcepts delivers excellent error messages, but this one is pretty bad. It looks like this goes back to 6.2, when it first started to show the expression. https://godbolt.org/z/m9DlOZ struct Y; struct X { Y operator<< (const char*); }; struct Y { X operator<< (void*); }; template <typename T> void check() requires requires (X x, T val) { x << "hello" << val; } {} void test() { check<int*>(); // no error check<int>(); // mangled error } ------------- <source>: In function 'void test()': <source>:16:16: error: cannot call function 'void check() requires (<requires (X x, T val) <valid-expression (x.X::operator<<()("hello") << val)>> [with T = int]' 16 | check<int>(); // mangled error | ^ <source>:12:6: note: constraints not satisfied 12 | void check() requires requires (X x, T val) { x << "hello" << val; } {} | ^~~~~ <source>:12:6: note: with 'X x' <source>:12:6: note: with 'int val' <source>:12:6: note: the required expression '("hello"->x.X::operator<<() << val)' would be ill-formed What is that expression? How did it end up applying -> to a string literal!?