1 // PR c++/56970 2 // { dg-do compile { target c++11 } } 3 4 template <typename T> 5 struct has 6 { 7 template <typename> testhas8 constexpr static int test(...) { 9 return 0; 10 } 11 12 template <typename C> testhas13 constexpr static int test(decltype(sizeof(C::x))) { // Doesn't compile. 14 return 1; // Is a member variable. 15 } 16 17 template <typename C, int c = sizeof(decltype(((C*)nullptr)->x()))> testhas18 constexpr static int test(int) { 19 return 2; // Is a member function. 20 } 21 22 static const int value = test<T>(0); 23 }; 24 25 struct foo { 26 int x; 27 }; 28 29 struct bar { 30 int x(); 31 }; 32 33 static_assert(has<int>::value == 0, ""); 34 static_assert(has<foo>::value == 1, ""); 35 static_assert(has<bar>::value == 2, ""); 36