// NB comments CA107/US117 // { dg-do compile { target concepts } } template constexpr bool Atomic = true; template concept C = Atomic; template concept Add1 = C; template concept AddOne = C; template void f() requires Add1<2 * M>; template int f() requires AddOne<2 * M> && true; int x = f<0>(); // OK, the atomic constraints from concept C in both fs are Atomic // with mapping similar to N -> 2 * M + 1 template struct WrapN; template using Add1Ty = WrapN; template using AddOneTy = WrapN; template void g(Add1Ty<2 * M> *); template void g(AddOneTy<2 * M> *); void h() { g<0>(nullptr); // OK, there is only one g } template void f2() requires Add1<2 * N>; template int f2() requires Add1 && true; void h2() { f2<0>(); // { dg-error "ambiguous" } ill-formed, no diagnostic required: // required determination of subsumption between atomic constraints that are // functionally equivalent but not equivalent }