blob: d9d5535e532f4867f00a6953c881894474a05508 [file] [log] [blame] [edit]
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s
// expected-no-diagnostics
namespace A {
template <typename T>
concept C = true;
template <typename T>
requires C<T> && C<T>
void f() {}
template <typename T>
requires C<T> && true
void f() {}
void test() { f<int>(); };
}
namespace B {
template <typename T>
concept A = true;
template <typename T>
concept B = true;
template <typename T>
requires (A<T> && B<T>)
constexpr int f() { return 0; }
template <typename T>
requires (A<T> || B<T>)
constexpr int f() { return 1; }
static_assert(f<int>() == 0);
}
namespace GH122581 {
// Test that producing a Conjunctive Normal Form
// does not blow up exponentially.
// i.e, this should terminate reasonably quickly
// within a small memory footprint
template <typename T> concept C0 = true;
template <typename T> concept C1 = true;
template <typename T> concept C2 = true;
template <typename T> concept C3 = true;
template <typename T> concept C4 = true;
template <typename T> concept C5 = true;
template <typename T> concept C6 = true;
template <typename T> concept C7 = true;
template <typename T> concept C8 = true;
template <typename T> concept C9 = true;
template <typename T>
concept Majority8 =
(C0<T> && C1<T> && C2<T> && C3<T>) ||
(C0<T> && C1<T> && C2<T> && C4<T>) ||
(C0<T> && C1<T> && C2<T> && C5<T>) ||
(C0<T> && C1<T> && C2<T> && C6<T>) ||
(C0<T> && C1<T> && C2<T> && C7<T>) ||
(C0<T> && C1<T> && C3<T> && C4<T>) ||
(C0<T> && C1<T> && C3<T> && C5<T>) ||
(C0<T> && C1<T> && C3<T> && C6<T>) ||
(C0<T> && C1<T> && C3<T> && C7<T>) ||
(C0<T> && C1<T> && C4<T> && C5<T>) ||
(C0<T> && C1<T> && C4<T> && C6<T>) ||
(C0<T> && C1<T> && C4<T> && C7<T>) ||
(C0<T> && C1<T> && C5<T> && C6<T>) ||
(C0<T> && C1<T> && C5<T> && C7<T>) ||
(C0<T> && C1<T> && C6<T> && C7<T>) ||
(C0<T> && C2<T> && C3<T> && C4<T>) ||
(C0<T> && C2<T> && C3<T> && C5<T>) ||
(C0<T> && C2<T> && C3<T> && C6<T>) ||
(C0<T> && C2<T> && C3<T> && C7<T>) ||
(C0<T> && C2<T> && C4<T> && C5<T>) ||
(C0<T> && C2<T> && C4<T> && C6<T>) ||
(C0<T> && C2<T> && C4<T> && C7<T>) ||
(C0<T> && C2<T> && C5<T> && C6<T>) ||
(C0<T> && C2<T> && C5<T> && C7<T>) ||
(C0<T> && C2<T> && C6<T> && C7<T>) ||
(C0<T> && C3<T> && C4<T> && C5<T>) ||
(C0<T> && C3<T> && C4<T> && C6<T>) ||
(C0<T> && C3<T> && C4<T> && C7<T>) ||
(C0<T> && C3<T> && C5<T> && C6<T>) ||
(C0<T> && C3<T> && C5<T> && C7<T>) ||
(C0<T> && C3<T> && C6<T> && C7<T>) ||
(C0<T> && C4<T> && C5<T> && C6<T>) ||
(C0<T> && C4<T> && C5<T> && C7<T>) ||
(C0<T> && C4<T> && C6<T> && C7<T>) ||
(C0<T> && C5<T> && C6<T> && C7<T>) ||
(C1<T> && C2<T> && C3<T> && C4<T>) ||
(C1<T> && C2<T> && C3<T> && C5<T>) ||
(C1<T> && C2<T> && C3<T> && C6<T>) ||
(C1<T> && C2<T> && C3<T> && C7<T>) ||
(C1<T> && C2<T> && C4<T> && C5<T>) ||
(C1<T> && C2<T> && C4<T> && C6<T>) ||
(C1<T> && C2<T> && C4<T> && C7<T>) ||
(C1<T> && C2<T> && C5<T> && C6<T>) ||
(C1<T> && C2<T> && C5<T> && C7<T>) ||
(C1<T> && C2<T> && C6<T> && C7<T>) ||
(C1<T> && C3<T> && C4<T> && C5<T>) ||
(C1<T> && C3<T> && C4<T> && C6<T>) ||
(C1<T> && C3<T> && C4<T> && C7<T>) ||
(C1<T> && C3<T> && C5<T> && C6<T>) ||
(C1<T> && C3<T> && C5<T> && C7<T>) ||
(C1<T> && C3<T> && C6<T> && C7<T>) ||
(C1<T> && C4<T> && C5<T> && C6<T>) ||
(C1<T> && C4<T> && C5<T> && C7<T>) ||
(C1<T> && C4<T> && C6<T> && C7<T>) ||
(C1<T> && C5<T> && C6<T> && C7<T>) ||
(C2<T> && C3<T> && C4<T> && C5<T>) ||
(C2<T> && C3<T> && C4<T> && C6<T>) ||
(C2<T> && C3<T> && C4<T> && C7<T>) ||
(C2<T> && C3<T> && C5<T> && C6<T>) ||
(C2<T> && C3<T> && C5<T> && C7<T>) ||
(C2<T> && C3<T> && C6<T> && C7<T>) ||
(C2<T> && C4<T> && C5<T> && C6<T>) ||
(C2<T> && C4<T> && C5<T> && C7<T>) ||
(C2<T> && C4<T> && C6<T> && C7<T>) ||
(C2<T> && C5<T> && C6<T> && C7<T>) ||
(C3<T> && C4<T> && C5<T> && C6<T>) ||
(C3<T> && C4<T> && C5<T> && C7<T>) ||
(C3<T> && C4<T> && C6<T> && C7<T>) ||
(C3<T> && C5<T> && C6<T> && C7<T>) ||
(C4<T> && C5<T> && C6<T> && C7<T>);
template <typename T>concept Y = C0<T> || Majority8<T>;
template <typename T>concept Z = Majority8<T> && C1<T>;
constexpr int foo(Majority8 auto x) { return 10; }
constexpr int foo(Y auto y) { return 20; }
constexpr int foo(Z auto y) { return 30; }
static_assert(foo(0) == 30);
}
namespace WhateverThisIs {
template <typename T> concept C0 = true;
template <typename T> concept C1 = true;
template <typename T> concept C2 = true;
template <typename T> concept C3 = true;
template <typename T> concept C4 = true;
template <typename T>
concept X =
(C0<T> || C1<T> || C2<T>) &&
(C0<T> || C1<T> || C3<T>) &&
(C0<T> || C1<T> || C4<T>) &&
(C0<T> || C2<T> || C3<T>) &&
(C0<T> || C2<T> || C4<T>) &&
(C0<T> || C3<T> || C4<T>) &&
(C1<T> || C2<T> || C3<T>) &&
(C1<T> || C2<T> || C4<T>) &&
(C1<T> || C3<T> || C4<T>) &&
(C2<T> || C3<T> || C4<T>);
template <typename T>concept Y = C0<T> && X<T>;
template <typename T>concept Z = Y<T> && C1<T>;
constexpr int foo(X auto x) { return 10; }
constexpr int foo(Y auto y) { return 20; }
constexpr int foo(Z auto y) { return 30; }
static_assert(foo(0) == 30);
}
namespace WAT{
// randomly generated formulas misshandled by clang 20,
// and some other compilers. There is no particular meaning
// to it except to stress-test the compiler.
template<typename T>
concept Z0 = true;
template<typename T>
concept Z1 = true;
template<typename T>
concept Z2 = true;
template<typename T>
concept Z3 = true;
template<typename T>
concept Z4 = true;
template<typename T>
concept Z5 = true;
template<typename T>
concept Z6 = true;
template<typename T>
concept Z7 = true;
template<typename T>
concept Z8 = true;
template<typename T>
concept Z9 = true;
template<typename T>
concept Z10 = true;
template<typename T>
concept Z11 = true;
template<typename T>
concept Z12 = true;
template<typename T>
concept Z13 = true;
template<typename T>
concept Z14 = true;
template<typename T>
concept Z15 = true;
template<typename T>
concept Z16 = true;
template<typename T>
concept Z17 = true;
template<typename T>
concept Z18 = true;
template<typename T>
concept Z19 = true;
namespace T1 {
template<typename T>
concept X = ((((((((Z13<T> || (Z2<T> || Z10<T>)) && (Z2<T> && (Z6<T> && ((Z7<T> && Z13<T>) && Z0<T>)))) && (Z13<T> ||
(Z12<T> && Z8<T>))) && (Z9<T> || (Z2<T> && Z17<T>))) || Z2<T>) && ((((Z17<T> || Z6<T>) && (((Z6<T> || Z4<T>) || Z9<T>)
&& Z13<T>)) || ((Z14<T> || Z10<T>) || Z3<T>)) || (Z8<T> || ((Z19<T> && (Z3<T> && Z14<T>)) && ((Z5<T> || (Z3<T> &&
Z5<T>)) || (Z7<T> && Z13<T>)))))) || ((((Z14<T> && (Z2<T> && Z1<T>)) || ((Z17<T> && Z12<T>) && (Z0<T> || ((((Z9<T> ||
(Z6<T> && Z16<T>)) && Z19<T>) && (Z6<T> && (Z12<T> && Z17<T>))) && (Z19<T> && Z8<T>))))) || (((Z10<T> || Z17<T>) &&
Z1<T>) && ((Z16<T> && (Z15<T> || Z5<T>)) || ((Z4<T> && Z5<T>) || ((Z1<T> || Z4<T>) || Z2<T>))))) && (((Z12<T> && (Z5<T>
&& Z10<T>)) || ((Z4<T> && Z18<T>) && Z0<T>)) || ((((Z10<T> || Z0<T>) && Z18<T>) || (Z15<T> && ((Z11<T> && Z5<T>) &&
Z6<T>))) && Z2<T>)))) && ((((((((((Z8<T> && Z13<T>) && Z7<T>) && Z18<T>) && ((((Z7<T> && Z11<T>) || (Z19<T> && Z6<T>))
|| Z13<T>) && Z15<T>)) || (Z1<T> || Z15<T>)) || (Z9<T> && (Z6<T> || Z10<T>))) || Z0<T>) && (((Z14<T> || Z4<T>) &&
(Z4<T> || ((Z4<T> && Z10<T>) && Z11<T>))) || Z4<T>)) && ((((((Z8<T> && ((Z1<T> && (Z16<T> && (Z0<T> && Z6<T>))) &&
(Z1<T> && Z10<T>))) && ((Z18<T> && Z3<T>) || ((Z14<T> && Z1<T>) || Z15<T>))) && (((Z19<T> || Z17<T>) || ((Z17<T> &&
(Z9<T> && Z19<T>)) || Z6<T>)) || (((Z4<T> || (((Z4<T> || Z9<T>) && Z6<T>) && Z2<T>)) || ((Z17<T> && (Z16<T> && ((Z14<T>
&& Z10<T>) && Z17<T>))) || Z9<T>)) && (Z5<T> && Z6<T>)))) && (((Z3<T> && Z14<T>) || Z5<T>) && Z8<T>)) && ((((Z10<T> ||
(Z17<T> && Z8<T>)) || ((Z16<T> && (((Z12<T> && Z16<T>) || Z18<T>) || (Z4<T> && Z13<T>))) || (Z17<T> && Z10<T>))) ||
((((Z9<T> && ((Z7<T> || Z2<T>) && Z15<T>)) || ((Z18<T> && Z13<T>) || (Z4<T> || Z14<T>))) || (((Z7<T> || (Z10<T> &&
(Z14<T> && Z18<T>))) && (Z9<T> || Z5<T>)) || (Z8<T> && ((Z14<T> || Z11<T>) || ((Z4<T> || Z2<T>) && (Z7<T> &&
Z5<T>)))))) && (((Z14<T> && (Z13<T> && Z10<T>)) || Z8<T>) && (((((Z7<T> || (Z8<T> && Z14<T>)) || Z0<T>) && Z0<T>) ||
Z17<T>) || Z5<T>)))) && (Z16<T> && Z4<T>))) && (((Z1<T> && Z12<T>) || ((Z17<T> || Z4<T>) || (Z15<T> || (Z6<T> ||
Z8<T>)))) || (((Z2<T> || Z19<T>) && Z5<T>) && Z1<T>)))) || ((((Z9<T> || (Z12<T> || Z6<T>)) && (Z5<T> || Z12<T>)) &&
((Z1<T> || Z8<T>) || (Z18<T> && Z19<T>))) || ((Z11<T> && Z17<T>) || (Z5<T> && Z12<T>)))));
template<typename T>
concept Y = Z0<T> && X<T>;
constexpr int foo(X auto x) { return 1; }
constexpr int foo(Y auto y) { return 2; }
static_assert(foo(0) == 2);
}
namespace T3 {
template<typename T>
concept X = (((Z2<T> && ((Z7<T> || (Z8<T> && (Z6<T> && Z4<T>))) && ((Z1<T> && Z3<T>) || ((Z1<T> && (Z7<T> && Z2<T>)) &&
Z1<T>)))) && ((Z7<T> || (((Z6<T> || Z0<T>) || (Z5<T> || Z3<T>)) && Z3<T>)) && ((Z6<T> || ((((Z6<T> && Z8<T>) && (Z8<T>
&& Z3<T>)) || (Z6<T> && Z5<T>)) && (Z6<T> || (Z3<T> && (Z3<T> || Z8<T>))))) && ((((Z3<T> || (Z3<T> && (Z6<T> ||
Z8<T>))) && Z3<T>) && Z9<T>) || ((Z7<T> || Z6<T>) || ((Z3<T> && (Z4<T> && (Z0<T> && Z3<T>))) && (((Z5<T> && (Z1<T> ||
Z5<T>)) || Z3<T>) && (((Z7<T> || Z5<T>) || ((Z9<T> || Z1<T>) && ((Z9<T> && Z0<T>) || Z0<T>))) && (Z5<T> &&
Z7<T>))))))))) || (((((Z5<T> || Z0<T>) || (Z7<T> && (Z8<T> && (Z9<T> || (Z6<T> && Z1<T>))))) || (((Z6<T> || Z3<T>) ||
Z1<T>) && Z3<T>)) || (((Z9<T> && ((((Z9<T> || (Z9<T> && (((Z7<T> || ((Z4<T> || Z3<T>) || Z8<T>)) && Z3<T>) && (Z1<T> &&
Z3<T>)))) || ((Z1<T> && ((Z8<T> && (Z9<T> && Z6<T>)) && (Z1<T> || Z5<T>))) || Z0<T>)) && Z2<T>) && ((Z1<T> || (Z0<T> ||
Z7<T>)) || (Z9<T> && Z4<T>)))) || (Z4<T> || Z3<T>)) && ((Z3<T> && Z9<T>) || ((Z6<T> || Z8<T>) && (Z7<T> && (Z9<T> ||
(Z3<T> || Z7<T>))))))) && (Z2<T> && (Z7<T> || Z3<T>))));
template<typename T>
concept Y = X<T> && ((Z2<T> && (((Z6<T> || Z5<T>) || Z1<T>) && (Z4<T> || ((Z9<T> || (Z2<T> || Z5<T>)) || Z7<T>)))) ||
((((((Z9<T> || (Z1<T> || Z3<T>)) && Z5<T>) || ((Z5<T> || Z0<T>) || (Z2<T> && Z1<T>))) || Z3<T>) || (((Z0<T> && ((Z4<T>
&& (((Z3<T> && Z0<T>) || (Z1<T> || Z5<T>)) || Z6<T>)) || ((Z7<T> || (Z1<T> || Z8<T>)) || Z8<T>))) && ((Z6<T> || (Z6<T>
|| Z9<T>)) && (Z1<T> || Z0<T>))) || (Z5<T> || (((Z8<T> || Z5<T>) && (((((((Z3<T> || Z2<T>) || Z6<T>) || ((Z6<T> ||
Z4<T>) || ((Z1<T> && Z9<T>) || Z8<T>))) || (Z3<T> && (Z9<T> && (Z6<T> || (Z1<T> || Z0<T>))))) && (((Z3<T> && Z5<T>) ||
(Z4<T> || Z2<T>)) && (Z5<T> && (Z6<T> || (Z0<T> || Z1<T>))))) || Z1<T>) || (Z4<T> || (Z1<T> || Z4<T>)))) && Z9<T>))))
&& ((((Z6<T> || (((Z6<T> && (Z3<T> || Z9<T>)) && Z6<T>) && (Z1<T> && Z9<T>))) && ((Z4<T> && (Z4<T> && Z3<T>)) &&
Z4<T>)) && (((((Z1<T> && Z3<T>) && (Z5<T> && Z2<T>)) || (Z1<T> || (Z9<T> || Z1<T>))) && (Z8<T> || Z1<T>)) || ((Z4<T> ||
Z5<T>) && Z3<T>))) && ((((((Z8<T> || Z4<T>) || (Z6<T> && Z3<T>)) || (Z4<T> || Z0<T>)) || Z4<T>) && (Z7<T> || Z5<T>)) &&
((Z8<T> || (Z2<T> && Z1<T>)) && (Z8<T> || Z1<T>))))));
constexpr int foo(X auto x) { return 1; }
constexpr int foo(Y auto y) { return 2; }
static_assert(foo(0) == 2);
}
}