https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92186

            Bug ID: 92186
           Summary: [concepts] requires expression outside of concept
                    definition cannot return false
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kariya_mitsuru at hotmail dot com
  Target Milestone: ---

The sample code below cannot be compiled by current trunk.

==========================
template <typename T>
int foo()
{
    if (requires(T i) {
        i++;
    }) {
        return 42;
    } else {
        return 99;
    }
}

int main()
{
    return foo<bool>();
}
==========================
cf. https://wandbox.org/permlink/6S5cGSAJHBL86cfi

According to C++ standard draft N4835 [expr.prim.req] p.6,

> The substitution of template arguments into a requires-expression
> may result in the formation of invalid types or expressions in its
> requirements or the violation of the semantic constraints of those
> requirements.
> In such cases, the requires-expression evaluates to false; it does
> not cause the program to be ill-formed.

So I think that the code should be compiled successfully.

Note that the code below can be compiled.

==========================
template <typename T>
concept can_increment = requires(T i) {
    i++;
};

template <typename T>
int foo()
{
    if (can_increment<T>) {
        return 42;
    } else {
        return 99;
    }
}

int main()
{
    return foo<bool>();
}
==========================
cf. https://wandbox.org/permlink/VCqlkJwZHKNxZIaE

Reply via email to