293 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s2// expected-no-diagnostics3namespace A {4template <typename T>5concept C = true;6 7template <typename T>8requires C<T> && C<T>9void f() {}10 11template <typename T>12requires C<T> && true13void f() {}14 15void test() { f<int>(); };16}17 18namespace B {19template <typename T>20concept A = true;21template <typename T>22concept B = true;23 24template <typename T>25requires (A<T> && B<T>)26constexpr int f() { return 0; }27 28template <typename T>29requires (A<T> || B<T>)30constexpr int f() { return 1; }31 32static_assert(f<int>() == 0);33}34 35namespace GH122581 {36// Test that producing a Conjunctive Normal Form37// does not blow up exponentially.38// i.e, this should terminate reasonably quickly39// within a small memory footprint40template <typename T> concept C0 = true;41template <typename T> concept C1 = true;42template <typename T> concept C2 = true;43template <typename T> concept C3 = true;44template <typename T> concept C4 = true;45template <typename T> concept C5 = true;46template <typename T> concept C6 = true;47template <typename T> concept C7 = true;48template <typename T> concept C8 = true;49template <typename T> concept C9 = true;50 51template <typename T>52concept Majority8 =53 (C0<T> && C1<T> && C2<T> && C3<T>) ||54 (C0<T> && C1<T> && C2<T> && C4<T>) ||55 (C0<T> && C1<T> && C2<T> && C5<T>) ||56 (C0<T> && C1<T> && C2<T> && C6<T>) ||57 (C0<T> && C1<T> && C2<T> && C7<T>) ||58 (C0<T> && C1<T> && C3<T> && C4<T>) ||59 (C0<T> && C1<T> && C3<T> && C5<T>) ||60 (C0<T> && C1<T> && C3<T> && C6<T>) ||61 (C0<T> && C1<T> && C3<T> && C7<T>) ||62 (C0<T> && C1<T> && C4<T> && C5<T>) ||63 (C0<T> && C1<T> && C4<T> && C6<T>) ||64 (C0<T> && C1<T> && C4<T> && C7<T>) ||65 (C0<T> && C1<T> && C5<T> && C6<T>) ||66 (C0<T> && C1<T> && C5<T> && C7<T>) ||67 (C0<T> && C1<T> && C6<T> && C7<T>) ||68 (C0<T> && C2<T> && C3<T> && C4<T>) ||69 (C0<T> && C2<T> && C3<T> && C5<T>) ||70 (C0<T> && C2<T> && C3<T> && C6<T>) ||71 (C0<T> && C2<T> && C3<T> && C7<T>) ||72 (C0<T> && C2<T> && C4<T> && C5<T>) ||73 (C0<T> && C2<T> && C4<T> && C6<T>) ||74 (C0<T> && C2<T> && C4<T> && C7<T>) ||75 (C0<T> && C2<T> && C5<T> && C6<T>) ||76 (C0<T> && C2<T> && C5<T> && C7<T>) ||77 (C0<T> && C2<T> && C6<T> && C7<T>) ||78 (C0<T> && C3<T> && C4<T> && C5<T>) ||79 (C0<T> && C3<T> && C4<T> && C6<T>) ||80 (C0<T> && C3<T> && C4<T> && C7<T>) ||81 (C0<T> && C3<T> && C5<T> && C6<T>) ||82 (C0<T> && C3<T> && C5<T> && C7<T>) ||83 (C0<T> && C3<T> && C6<T> && C7<T>) ||84 (C0<T> && C4<T> && C5<T> && C6<T>) ||85 (C0<T> && C4<T> && C5<T> && C7<T>) ||86 (C0<T> && C4<T> && C6<T> && C7<T>) ||87 (C0<T> && C5<T> && C6<T> && C7<T>) ||88 (C1<T> && C2<T> && C3<T> && C4<T>) ||89 (C1<T> && C2<T> && C3<T> && C5<T>) ||90 (C1<T> && C2<T> && C3<T> && C6<T>) ||91 (C1<T> && C2<T> && C3<T> && C7<T>) ||92 (C1<T> && C2<T> && C4<T> && C5<T>) ||93 (C1<T> && C2<T> && C4<T> && C6<T>) ||94 (C1<T> && C2<T> && C4<T> && C7<T>) ||95 (C1<T> && C2<T> && C5<T> && C6<T>) ||96 (C1<T> && C2<T> && C5<T> && C7<T>) ||97 (C1<T> && C2<T> && C6<T> && C7<T>) ||98 (C1<T> && C3<T> && C4<T> && C5<T>) ||99 (C1<T> && C3<T> && C4<T> && C6<T>) ||100 (C1<T> && C3<T> && C4<T> && C7<T>) ||101 (C1<T> && C3<T> && C5<T> && C6<T>) ||102 (C1<T> && C3<T> && C5<T> && C7<T>) ||103 (C1<T> && C3<T> && C6<T> && C7<T>) ||104 (C1<T> && C4<T> && C5<T> && C6<T>) ||105 (C1<T> && C4<T> && C5<T> && C7<T>) ||106 (C1<T> && C4<T> && C6<T> && C7<T>) ||107 (C1<T> && C5<T> && C6<T> && C7<T>) ||108 (C2<T> && C3<T> && C4<T> && C5<T>) ||109 (C2<T> && C3<T> && C4<T> && C6<T>) ||110 (C2<T> && C3<T> && C4<T> && C7<T>) ||111 (C2<T> && C3<T> && C5<T> && C6<T>) ||112 (C2<T> && C3<T> && C5<T> && C7<T>) ||113 (C2<T> && C3<T> && C6<T> && C7<T>) ||114 (C2<T> && C4<T> && C5<T> && C6<T>) ||115 (C2<T> && C4<T> && C5<T> && C7<T>) ||116 (C2<T> && C4<T> && C6<T> && C7<T>) ||117 (C2<T> && C5<T> && C6<T> && C7<T>) ||118 (C3<T> && C4<T> && C5<T> && C6<T>) ||119 (C3<T> && C4<T> && C5<T> && C7<T>) ||120 (C3<T> && C4<T> && C6<T> && C7<T>) ||121 (C3<T> && C5<T> && C6<T> && C7<T>) ||122 (C4<T> && C5<T> && C6<T> && C7<T>);123 124template <typename T>concept Y = C0<T> || Majority8<T>;125template <typename T>concept Z = Majority8<T> && C1<T>;126 127constexpr int foo(Majority8 auto x) { return 10; }128constexpr int foo(Y auto y) { return 20; }129constexpr int foo(Z auto y) { return 30; }130static_assert(foo(0) == 30);131}132 133namespace WhateverThisIs {134template <typename T> concept C0 = true;135template <typename T> concept C1 = true;136template <typename T> concept C2 = true;137template <typename T> concept C3 = true;138template <typename T> concept C4 = true;139 140template <typename T>141concept X =142 (C0<T> || C1<T> || C2<T>) &&143 (C0<T> || C1<T> || C3<T>) &&144 (C0<T> || C1<T> || C4<T>) &&145 (C0<T> || C2<T> || C3<T>) &&146 (C0<T> || C2<T> || C4<T>) &&147 (C0<T> || C3<T> || C4<T>) &&148 (C1<T> || C2<T> || C3<T>) &&149 (C1<T> || C2<T> || C4<T>) &&150 (C1<T> || C3<T> || C4<T>) &&151 (C2<T> || C3<T> || C4<T>);152 153template <typename T>concept Y = C0<T> && X<T>;154 155template <typename T>concept Z = Y<T> && C1<T>;156 157constexpr int foo(X auto x) { return 10; }158constexpr int foo(Y auto y) { return 20; }159constexpr int foo(Z auto y) { return 30; }160 161static_assert(foo(0) == 30);162}163 164namespace WAT{165// randomly generated formulas misshandled by clang 20,166// and some other compilers. There is no particular meaning167// to it except to stress-test the compiler.168 169template<typename T>170concept Z0 = true;171 172template<typename T>173concept Z1 = true;174 175template<typename T>176concept Z2 = true;177 178template<typename T>179concept Z3 = true;180 181template<typename T>182concept Z4 = true;183 184template<typename T>185concept Z5 = true;186 187template<typename T>188concept Z6 = true;189 190template<typename T>191concept Z7 = true;192 193template<typename T>194concept Z8 = true;195 196template<typename T>197concept Z9 = true;198 199template<typename T>200concept Z10 = true;201 202template<typename T>203concept Z11 = true;204 205template<typename T>206concept Z12 = true;207 208template<typename T>209concept Z13 = true;210 211template<typename T>212concept Z14 = true;213 214template<typename T>215concept Z15 = true;216 217template<typename T>218concept Z16 = true;219 220template<typename T>221concept Z17 = true;222 223template<typename T>224concept Z18 = true;225 226template<typename T>227concept Z19 = true;228 229namespace T1 {230template<typename T>231concept X = ((((((((Z13<T> || (Z2<T> || Z10<T>)) && (Z2<T> && (Z6<T> && ((Z7<T> && Z13<T>) && Z0<T>)))) && (Z13<T> ||232(Z12<T> && Z8<T>))) && (Z9<T> || (Z2<T> && Z17<T>))) || Z2<T>) && ((((Z17<T> || Z6<T>) && (((Z6<T> || Z4<T>) || Z9<T>)233&& Z13<T>)) || ((Z14<T> || Z10<T>) || Z3<T>)) || (Z8<T> || ((Z19<T> && (Z3<T> && Z14<T>)) && ((Z5<T> || (Z3<T> &&234Z5<T>)) || (Z7<T> && Z13<T>)))))) || ((((Z14<T> && (Z2<T> && Z1<T>)) || ((Z17<T> && Z12<T>) && (Z0<T> || ((((Z9<T> ||235(Z6<T> && Z16<T>)) && Z19<T>) && (Z6<T> && (Z12<T> && Z17<T>))) && (Z19<T> && Z8<T>))))) || (((Z10<T> || Z17<T>) &&236Z1<T>) && ((Z16<T> && (Z15<T> || Z5<T>)) || ((Z4<T> && Z5<T>) || ((Z1<T> || Z4<T>) || Z2<T>))))) && (((Z12<T> && (Z5<T>237&& Z10<T>)) || ((Z4<T> && Z18<T>) && Z0<T>)) || ((((Z10<T> || Z0<T>) && Z18<T>) || (Z15<T> && ((Z11<T> && Z5<T>) &&238Z6<T>))) && Z2<T>)))) && ((((((((((Z8<T> && Z13<T>) && Z7<T>) && Z18<T>) && ((((Z7<T> && Z11<T>) || (Z19<T> && Z6<T>))239|| Z13<T>) && Z15<T>)) || (Z1<T> || Z15<T>)) || (Z9<T> && (Z6<T> || Z10<T>))) || Z0<T>) && (((Z14<T> || Z4<T>) &&240(Z4<T> || ((Z4<T> && Z10<T>) && Z11<T>))) || Z4<T>)) && ((((((Z8<T> && ((Z1<T> && (Z16<T> && (Z0<T> && Z6<T>))) &&241(Z1<T> && Z10<T>))) && ((Z18<T> && Z3<T>) || ((Z14<T> && Z1<T>) || Z15<T>))) && (((Z19<T> || Z17<T>) || ((Z17<T> &&242(Z9<T> && Z19<T>)) || Z6<T>)) || (((Z4<T> || (((Z4<T> || Z9<T>) && Z6<T>) && Z2<T>)) || ((Z17<T> && (Z16<T> && ((Z14<T>243&& Z10<T>) && Z17<T>))) || Z9<T>)) && (Z5<T> && Z6<T>)))) && (((Z3<T> && Z14<T>) || Z5<T>) && Z8<T>)) && ((((Z10<T> ||244(Z17<T> && Z8<T>)) || ((Z16<T> && (((Z12<T> && Z16<T>) || Z18<T>) || (Z4<T> && Z13<T>))) || (Z17<T> && Z10<T>))) ||245((((Z9<T> && ((Z7<T> || Z2<T>) && Z15<T>)) || ((Z18<T> && Z13<T>) || (Z4<T> || Z14<T>))) || (((Z7<T> || (Z10<T> &&246(Z14<T> && Z18<T>))) && (Z9<T> || Z5<T>)) || (Z8<T> && ((Z14<T> || Z11<T>) || ((Z4<T> || Z2<T>) && (Z7<T> &&247Z5<T>)))))) && (((Z14<T> && (Z13<T> && Z10<T>)) || Z8<T>) && (((((Z7<T> || (Z8<T> && Z14<T>)) || Z0<T>) && Z0<T>) ||248Z17<T>) || Z5<T>)))) && (Z16<T> && Z4<T>))) && (((Z1<T> && Z12<T>) || ((Z17<T> || Z4<T>) || (Z15<T> || (Z6<T> ||249Z8<T>)))) || (((Z2<T> || Z19<T>) && Z5<T>) && Z1<T>)))) || ((((Z9<T> || (Z12<T> || Z6<T>)) && (Z5<T> || Z12<T>)) &&250((Z1<T> || Z8<T>) || (Z18<T> && Z19<T>))) || ((Z11<T> && Z17<T>) || (Z5<T> && Z12<T>)))));251 252template<typename T>253concept Y = Z0<T> && X<T>;254 255constexpr int foo(X auto x) { return 1; }256constexpr int foo(Y auto y) { return 2; }257static_assert(foo(0) == 2);258}259 260namespace T3 {261 262template<typename T>263concept X = (((Z2<T> && ((Z7<T> || (Z8<T> && (Z6<T> && Z4<T>))) && ((Z1<T> && Z3<T>) || ((Z1<T> && (Z7<T> && Z2<T>)) &&264Z1<T>)))) && ((Z7<T> || (((Z6<T> || Z0<T>) || (Z5<T> || Z3<T>)) && Z3<T>)) && ((Z6<T> || ((((Z6<T> && Z8<T>) && (Z8<T>265&& Z3<T>)) || (Z6<T> && Z5<T>)) && (Z6<T> || (Z3<T> && (Z3<T> || Z8<T>))))) && ((((Z3<T> || (Z3<T> && (Z6<T> ||266Z8<T>))) && Z3<T>) && Z9<T>) || ((Z7<T> || Z6<T>) || ((Z3<T> && (Z4<T> && (Z0<T> && Z3<T>))) && (((Z5<T> && (Z1<T> ||267Z5<T>)) || Z3<T>) && (((Z7<T> || Z5<T>) || ((Z9<T> || Z1<T>) && ((Z9<T> && Z0<T>) || Z0<T>))) && (Z5<T> &&268Z7<T>))))))))) || (((((Z5<T> || Z0<T>) || (Z7<T> && (Z8<T> && (Z9<T> || (Z6<T> && Z1<T>))))) || (((Z6<T> || Z3<T>) ||269Z1<T>) && Z3<T>)) || (((Z9<T> && ((((Z9<T> || (Z9<T> && (((Z7<T> || ((Z4<T> || Z3<T>) || Z8<T>)) && Z3<T>) && (Z1<T> &&270Z3<T>)))) || ((Z1<T> && ((Z8<T> && (Z9<T> && Z6<T>)) && (Z1<T> || Z5<T>))) || Z0<T>)) && Z2<T>) && ((Z1<T> || (Z0<T> ||271Z7<T>)) || (Z9<T> && Z4<T>)))) || (Z4<T> || Z3<T>)) && ((Z3<T> && Z9<T>) || ((Z6<T> || Z8<T>) && (Z7<T> && (Z9<T> ||272(Z3<T> || Z7<T>))))))) && (Z2<T> && (Z7<T> || Z3<T>))));273 274template<typename T>275concept Y = X<T> && ((Z2<T> && (((Z6<T> || Z5<T>) || Z1<T>) && (Z4<T> || ((Z9<T> || (Z2<T> || Z5<T>)) || Z7<T>)))) ||276((((((Z9<T> || (Z1<T> || Z3<T>)) && Z5<T>) || ((Z5<T> || Z0<T>) || (Z2<T> && Z1<T>))) || Z3<T>) || (((Z0<T> && ((Z4<T>277&& (((Z3<T> && Z0<T>) || (Z1<T> || Z5<T>)) || Z6<T>)) || ((Z7<T> || (Z1<T> || Z8<T>)) || Z8<T>))) && ((Z6<T> || (Z6<T>278|| Z9<T>)) && (Z1<T> || Z0<T>))) || (Z5<T> || (((Z8<T> || Z5<T>) && (((((((Z3<T> || Z2<T>) || Z6<T>) || ((Z6<T> ||279Z4<T>) || ((Z1<T> && Z9<T>) || Z8<T>))) || (Z3<T> && (Z9<T> && (Z6<T> || (Z1<T> || Z0<T>))))) && (((Z3<T> && Z5<T>) ||280(Z4<T> || Z2<T>)) && (Z5<T> && (Z6<T> || (Z0<T> || Z1<T>))))) || Z1<T>) || (Z4<T> || (Z1<T> || Z4<T>)))) && Z9<T>))))281&& ((((Z6<T> || (((Z6<T> && (Z3<T> || Z9<T>)) && Z6<T>) && (Z1<T> && Z9<T>))) && ((Z4<T> && (Z4<T> && Z3<T>)) &&282Z4<T>)) && (((((Z1<T> && Z3<T>) && (Z5<T> && Z2<T>)) || (Z1<T> || (Z9<T> || Z1<T>))) && (Z8<T> || Z1<T>)) || ((Z4<T> ||283Z5<T>) && Z3<T>))) && ((((((Z8<T> || Z4<T>) || (Z6<T> && Z3<T>)) || (Z4<T> || Z0<T>)) || Z4<T>) && (Z7<T> || Z5<T>)) &&284((Z8<T> || (Z2<T> && Z1<T>)) && (Z8<T> || Z1<T>))))));285 286constexpr int foo(X auto x) { return 1; }287constexpr int foo(Y auto y) { return 2; }288static_assert(foo(0) == 2);289 290}291 292}293