// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s // expected-no-diagnostics namespace A { template concept C = true; template requires C && C void f() {} template requires C && true void f() {} void test() { f(); }; } namespace B { template concept A = true; template concept B = true; template requires (A && B) constexpr int f() { return 0; } template requires (A || B) constexpr int f() { return 1; } static_assert(f() == 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 concept C0 = true; template concept C1 = true; template concept C2 = true; template concept C3 = true; template concept C4 = true; template concept C5 = true; template concept C6 = true; template concept C7 = true; template concept C8 = true; template concept C9 = true; template concept Majority8 = (C0 && C1 && C2 && C3) || (C0 && C1 && C2 && C4) || (C0 && C1 && C2 && C5) || (C0 && C1 && C2 && C6) || (C0 && C1 && C2 && C7) || (C0 && C1 && C3 && C4) || (C0 && C1 && C3 && C5) || (C0 && C1 && C3 && C6) || (C0 && C1 && C3 && C7) || (C0 && C1 && C4 && C5) || (C0 && C1 && C4 && C6) || (C0 && C1 && C4 && C7) || (C0 && C1 && C5 && C6) || (C0 && C1 && C5 && C7) || (C0 && C1 && C6 && C7) || (C0 && C2 && C3 && C4) || (C0 && C2 && C3 && C5) || (C0 && C2 && C3 && C6) || (C0 && C2 && C3 && C7) || (C0 && C2 && C4 && C5) || (C0 && C2 && C4 && C6) || (C0 && C2 && C4 && C7) || (C0 && C2 && C5 && C6) || (C0 && C2 && C5 && C7) || (C0 && C2 && C6 && C7) || (C0 && C3 && C4 && C5) || (C0 && C3 && C4 && C6) || (C0 && C3 && C4 && C7) || (C0 && C3 && C5 && C6) || (C0 && C3 && C5 && C7) || (C0 && C3 && C6 && C7) || (C0 && C4 && C5 && C6) || (C0 && C4 && C5 && C7) || (C0 && C4 && C6 && C7) || (C0 && C5 && C6 && C7) || (C1 && C2 && C3 && C4) || (C1 && C2 && C3 && C5) || (C1 && C2 && C3 && C6) || (C1 && C2 && C3 && C7) || (C1 && C2 && C4 && C5) || (C1 && C2 && C4 && C6) || (C1 && C2 && C4 && C7) || (C1 && C2 && C5 && C6) || (C1 && C2 && C5 && C7) || (C1 && C2 && C6 && C7) || (C1 && C3 && C4 && C5) || (C1 && C3 && C4 && C6) || (C1 && C3 && C4 && C7) || (C1 && C3 && C5 && C6) || (C1 && C3 && C5 && C7) || (C1 && C3 && C6 && C7) || (C1 && C4 && C5 && C6) || (C1 && C4 && C5 && C7) || (C1 && C4 && C6 && C7) || (C1 && C5 && C6 && C7) || (C2 && C3 && C4 && C5) || (C2 && C3 && C4 && C6) || (C2 && C3 && C4 && C7) || (C2 && C3 && C5 && C6) || (C2 && C3 && C5 && C7) || (C2 && C3 && C6 && C7) || (C2 && C4 && C5 && C6) || (C2 && C4 && C5 && C7) || (C2 && C4 && C6 && C7) || (C2 && C5 && C6 && C7) || (C3 && C4 && C5 && C6) || (C3 && C4 && C5 && C7) || (C3 && C4 && C6 && C7) || (C3 && C5 && C6 && C7) || (C4 && C5 && C6 && C7); template concept Y = C0 || Majority8; template concept Z = Majority8 && C1; 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 concept C0 = true; template concept C1 = true; template concept C2 = true; template concept C3 = true; template concept C4 = true; template concept X = (C0 || C1 || C2) && (C0 || C1 || C3) && (C0 || C1 || C4) && (C0 || C2 || C3) && (C0 || C2 || C4) && (C0 || C3 || C4) && (C1 || C2 || C3) && (C1 || C2 || C4) && (C1 || C3 || C4) && (C2 || C3 || C4); template concept Y = C0 && X; template concept Z = Y && C1; 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 concept Z0 = true; template concept Z1 = true; template concept Z2 = true; template concept Z3 = true; template concept Z4 = true; template concept Z5 = true; template concept Z6 = true; template concept Z7 = true; template concept Z8 = true; template concept Z9 = true; template concept Z10 = true; template concept Z11 = true; template concept Z12 = true; template concept Z13 = true; template concept Z14 = true; template concept Z15 = true; template concept Z16 = true; template concept Z17 = true; template concept Z18 = true; template concept Z19 = true; namespace T1 { template concept X = ((((((((Z13 || (Z2 || Z10)) && (Z2 && (Z6 && ((Z7 && Z13) && Z0)))) && (Z13 || (Z12 && Z8))) && (Z9 || (Z2 && Z17))) || Z2) && ((((Z17 || Z6) && (((Z6 || Z4) || Z9) && Z13)) || ((Z14 || Z10) || Z3)) || (Z8 || ((Z19 && (Z3 && Z14)) && ((Z5 || (Z3 && Z5)) || (Z7 && Z13)))))) || ((((Z14 && (Z2 && Z1)) || ((Z17 && Z12) && (Z0 || ((((Z9 || (Z6 && Z16)) && Z19) && (Z6 && (Z12 && Z17))) && (Z19 && Z8))))) || (((Z10 || Z17) && Z1) && ((Z16 && (Z15 || Z5)) || ((Z4 && Z5) || ((Z1 || Z4) || Z2))))) && (((Z12 && (Z5 && Z10)) || ((Z4 && Z18) && Z0)) || ((((Z10 || Z0) && Z18) || (Z15 && ((Z11 && Z5) && Z6))) && Z2)))) && ((((((((((Z8 && Z13) && Z7) && Z18) && ((((Z7 && Z11) || (Z19 && Z6)) || Z13) && Z15)) || (Z1 || Z15)) || (Z9 && (Z6 || Z10))) || Z0) && (((Z14 || Z4) && (Z4 || ((Z4 && Z10) && Z11))) || Z4)) && ((((((Z8 && ((Z1 && (Z16 && (Z0 && Z6))) && (Z1 && Z10))) && ((Z18 && Z3) || ((Z14 && Z1) || Z15))) && (((Z19 || Z17) || ((Z17 && (Z9 && Z19)) || Z6)) || (((Z4 || (((Z4 || Z9) && Z6) && Z2)) || ((Z17 && (Z16 && ((Z14 && Z10) && Z17))) || Z9)) && (Z5 && Z6)))) && (((Z3 && Z14) || Z5) && Z8)) && ((((Z10 || (Z17 && Z8)) || ((Z16 && (((Z12 && Z16) || Z18) || (Z4 && Z13))) || (Z17 && Z10))) || ((((Z9 && ((Z7 || Z2) && Z15)) || ((Z18 && Z13) || (Z4 || Z14))) || (((Z7 || (Z10 && (Z14 && Z18))) && (Z9 || Z5)) || (Z8 && ((Z14 || Z11) || ((Z4 || Z2) && (Z7 && Z5)))))) && (((Z14 && (Z13 && Z10)) || Z8) && (((((Z7 || (Z8 && Z14)) || Z0) && Z0) || Z17) || Z5)))) && (Z16 && Z4))) && (((Z1 && Z12) || ((Z17 || Z4) || (Z15 || (Z6 || Z8)))) || (((Z2 || Z19) && Z5) && Z1)))) || ((((Z9 || (Z12 || Z6)) && (Z5 || Z12)) && ((Z1 || Z8) || (Z18 && Z19))) || ((Z11 && Z17) || (Z5 && Z12))))); template concept Y = Z0 && X; constexpr int foo(X auto x) { return 1; } constexpr int foo(Y auto y) { return 2; } static_assert(foo(0) == 2); } namespace T3 { template concept X = (((Z2 && ((Z7 || (Z8 && (Z6 && Z4))) && ((Z1 && Z3) || ((Z1 && (Z7 && Z2)) && Z1)))) && ((Z7 || (((Z6 || Z0) || (Z5 || Z3)) && Z3)) && ((Z6 || ((((Z6 && Z8) && (Z8 && Z3)) || (Z6 && Z5)) && (Z6 || (Z3 && (Z3 || Z8))))) && ((((Z3 || (Z3 && (Z6 || Z8))) && Z3) && Z9) || ((Z7 || Z6) || ((Z3 && (Z4 && (Z0 && Z3))) && (((Z5 && (Z1 || Z5)) || Z3) && (((Z7 || Z5) || ((Z9 || Z1) && ((Z9 && Z0) || Z0))) && (Z5 && Z7))))))))) || (((((Z5 || Z0) || (Z7 && (Z8 && (Z9 || (Z6 && Z1))))) || (((Z6 || Z3) || Z1) && Z3)) || (((Z9 && ((((Z9 || (Z9 && (((Z7 || ((Z4 || Z3) || Z8)) && Z3) && (Z1 && Z3)))) || ((Z1 && ((Z8 && (Z9 && Z6)) && (Z1 || Z5))) || Z0)) && Z2) && ((Z1 || (Z0 || Z7)) || (Z9 && Z4)))) || (Z4 || Z3)) && ((Z3 && Z9) || ((Z6 || Z8) && (Z7 && (Z9 || (Z3 || Z7))))))) && (Z2 && (Z7 || Z3)))); template concept Y = X && ((Z2 && (((Z6 || Z5) || Z1) && (Z4 || ((Z9 || (Z2 || Z5)) || Z7)))) || ((((((Z9 || (Z1 || Z3)) && Z5) || ((Z5 || Z0) || (Z2 && Z1))) || Z3) || (((Z0 && ((Z4 && (((Z3 && Z0) || (Z1 || Z5)) || Z6)) || ((Z7 || (Z1 || Z8)) || Z8))) && ((Z6 || (Z6 || Z9)) && (Z1 || Z0))) || (Z5 || (((Z8 || Z5) && (((((((Z3 || Z2) || Z6) || ((Z6 || Z4) || ((Z1 && Z9) || Z8))) || (Z3 && (Z9 && (Z6 || (Z1 || Z0))))) && (((Z3 && Z5) || (Z4 || Z2)) && (Z5 && (Z6 || (Z0 || Z1))))) || Z1) || (Z4 || (Z1 || Z4)))) && Z9)))) && ((((Z6 || (((Z6 && (Z3 || Z9)) && Z6) && (Z1 && Z9))) && ((Z4 && (Z4 && Z3)) && Z4)) && (((((Z1 && Z3) && (Z5 && Z2)) || (Z1 || (Z9 || Z1))) && (Z8 || Z1)) || ((Z4 || Z5) && Z3))) && ((((((Z8 || Z4) || (Z6 && Z3)) || (Z4 || Z0)) || Z4) && (Z7 || Z5)) && ((Z8 || (Z2 && Z1)) && (Z8 || Z1)))))); constexpr int foo(X auto x) { return 1; } constexpr int foo(Y auto y) { return 2; } static_assert(foo(0) == 2); } }