xref: /llvm-project/clang/test/CXX/over/over.over/p4-2a.cpp (revision 6da3d66f03f9162ef341cc67218be40e22fe9808)
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 Keane static int foo() requires AtLeast2<long> && AtMost8<long> {
18b65b1f32SSaar Raz   return 0;
19b65b1f32SSaar Raz }
20b65b1f32SSaar Raz 
fooS21*6da3d66fSErich Keane static double foo() requires AtLeast2<char> {
22b65b1f32SSaar Raz   return 0.0;
23b65b1f32SSaar Raz }
24b65b1f32SSaar Raz 
barS25*6da3d66fSErich Keane static char bar() requires AtLeast2<char> {
26b65b1f32SSaar Raz   return 1.0;
27b65b1f32SSaar Raz }
28b65b1f32SSaar Raz 
barS29*6da3d66fSErich Keane static short bar() requires AtLeast2<long> && AtMost8<long> {
30b65b1f32SSaar Raz   return 0.0;
31b65b1f32SSaar Raz }
32b65b1f32SSaar Raz 
barS33*6da3d66fSErich Keane static int bar() requires AtMost8<long> && AtLeast2<long> {
34b65b1f32SSaar Raz   return 0.0;
35b65b1f32SSaar Raz }
36b65b1f32SSaar Raz 
bazS37*6da3d66fSErich Keane static char baz() requires AtLeast2<char> {
38b65b1f32SSaar Raz   return 1.0;
39b65b1f32SSaar Raz }
40b65b1f32SSaar Raz 
bazS41*6da3d66fSErich Keane static short baz() requires AtLeast2<long> && AtMost8<long> {
42b65b1f32SSaar Raz   return 0.0;
43b65b1f32SSaar Raz }
44b65b1f32SSaar Raz 
bazS45*6da3d66fSErich Keane static int baz() requires AtMost8<long> && AtLeast2<long> {
46b65b1f32SSaar Raz   return 0.0;
47b65b1f32SSaar Raz }
48b65b1f32SSaar Raz 
bazS49*6da3d66fSErich Keane static long baz() requires AtMost8<long> && AtLeast2<long> && AtLeast2<short> {
50b65b1f32SSaar Raz   return 3.0;
51b65b1f32SSaar Raz }
52*6da3d66fSErich Keane };
53b65b1f32SSaar Raz 
a()54b65b1f32SSaar Raz void 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