167c608a9SSaar Raz // RUN: %clang_cc1 -std=c++2a -verify %s 2b65b1f32SSaar Raz 3b65b1f32SSaar Raz template<typename T, typename U> 4b65b1f32SSaar Raz constexpr static bool is_same_v = false; 5b65b1f32SSaar Raz 6b65b1f32SSaar Raz template<typename T> 7b65b1f32SSaar Raz constexpr static bool is_same_v<T, T> = true; 8b65b1f32SSaar Raz 9b65b1f32SSaar Raz template<typename T> 10b65b1f32SSaar Raz concept AtLeast2 = sizeof(T) >= 2; 11b65b1f32SSaar Raz 12b65b1f32SSaar Raz template<typename T> 13b65b1f32SSaar Raz concept AtMost8 = sizeof(T) <= 8; 14b65b1f32SSaar Raz 15*6da3d66fSErich Keane template<typename T> 16*6da3d66fSErich Keane struct S { fooS17*6da3d66fSErich Keanestatic int foo() requires AtLeast2<long> && AtMost8<long> { 18b65b1f32SSaar Raz return 0; 19b65b1f32SSaar Raz } 20b65b1f32SSaar Raz fooS21*6da3d66fSErich Keanestatic double foo() requires AtLeast2<char> { 22b65b1f32SSaar Raz return 0.0; 23b65b1f32SSaar Raz } 24b65b1f32SSaar Raz barS25*6da3d66fSErich Keanestatic char bar() requires AtLeast2<char> { 26b65b1f32SSaar Raz return 1.0; 27b65b1f32SSaar Raz } 28b65b1f32SSaar Raz barS29*6da3d66fSErich Keanestatic short bar() requires AtLeast2<long> && AtMost8<long> { 30b65b1f32SSaar Raz return 0.0; 31b65b1f32SSaar Raz } 32b65b1f32SSaar Raz barS33*6da3d66fSErich Keanestatic int bar() requires AtMost8<long> && AtLeast2<long> { 34b65b1f32SSaar Raz return 0.0; 35b65b1f32SSaar Raz } 36b65b1f32SSaar Raz bazS37*6da3d66fSErich Keanestatic char baz() requires AtLeast2<char> { 38b65b1f32SSaar Raz return 1.0; 39b65b1f32SSaar Raz } 40b65b1f32SSaar Raz bazS41*6da3d66fSErich Keanestatic short baz() requires AtLeast2<long> && AtMost8<long> { 42b65b1f32SSaar Raz return 0.0; 43b65b1f32SSaar Raz } 44b65b1f32SSaar Raz bazS45*6da3d66fSErich Keanestatic int baz() requires AtMost8<long> && AtLeast2<long> { 46b65b1f32SSaar Raz return 0.0; 47b65b1f32SSaar Raz } 48b65b1f32SSaar Raz bazS49*6da3d66fSErich Keanestatic long baz() requires AtMost8<long> && AtLeast2<long> && AtLeast2<short> { 50b65b1f32SSaar Raz return 3.0; 51b65b1f32SSaar Raz } 52*6da3d66fSErich Keane }; 53b65b1f32SSaar Raz a()54b65b1f32SSaar Razvoid a() { 55*6da3d66fSErich Keane static_assert(is_same_v<decltype(&S<int>::foo), int(*)()>); 56*6da3d66fSErich Keane static_assert(is_same_v<decltype(&S<int>::bar), long(*)()>); 57*6da3d66fSErich Keane // expected-error@-1{{reference to overloaded function could not be resolved; did you mean to call it?}} 58*6da3d66fSErich Keane static_assert(is_same_v<decltype(&S<int>::baz), long(*)()>); 59b65b1f32SSaar Raz } 60