https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118463
Bug ID: 118463
Summary: requires-clause considered ill-formed but not leading
to clause failure
Product: gcc
Version: 14.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ing.russomauro at gmail dot com
Target Milestone: ---
In the following code (https://godbolt.org/z/nPW7Mds6Y):
gcc does not like the expression used for the requires-clause of the first
overload. Indeed, gcc seems to consider it as ill-formed, without finally
choosing the constraints to be just failed.
I am not currently aware of all rules about concepts, but MVSC and Clang accept
the call to the implicitly instantiated f<B>, whereas gcc does not.
Note also that, in case of enabling the call to f<A>, then gcc still complains
about the requires-clause of the first overload, while also reefrring about an
ambiguous result of overload resolution, which is a bit weird to read together
the complain of ill-formed first overload.
Reconnecting to PR 118398, is the expression "k<T>();" another case of non -
immediate context ? I guess not.
//#include <concepts>
#include <iostream>
//#include <type_traits>
struct A{
int x;
};
struct B{
int y;
};
template<typename T>
requires (!requires{k<T>();}) // accepted by Clang and MVSC, not gcc, with
error
// " no arguments ... that depend on a template
// parameter, so a declaration ... must be
// available "
//requires (!requires{k();}) // second alternative:
// accepted by Clang and MVSC, not gcc (with the
// same kind of compilation error)
//requires (!requires(T t){k(t);}) this alternative is accepted by gcc, too.
void f()
{std::cout << "first overload\n";}
template<typename T>
requires requires(T t){t.x;}
void f()
{std::cout << "second overload\n";}
int main(){
// f<A>(); // all consider it ambiguous, even gcc, that refers ambiguity
// a bit weirdly, that is, despite gcc raises the error on 'k'
// for the requires-clause of the first overload.
f<B>();
return 0;
}