From 68df8e8c3438dda209c3ad9843933da640c9a71c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 11 Jun 2020 18:21:57 -0400 Subject: [PATCH] c++: Add test for C++20 NB comment CA107. We already implemented this, but it's good to have a test. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-ca107.C: New test. --- gcc/testsuite/g++.dg/cpp2a/concepts-ca107.C | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-ca107.C diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ca107.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ca107.C new file mode 100644 index 00000000000..e18280a04bc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ca107.C @@ -0,0 +1,33 @@ +// 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 +} -- 2.30.2