| // { dg-do compile { target c++11 } } |
| |
| template<typename T, typename U> |
| struct is_same |
| { |
| static const bool value = false; |
| }; |
| |
| template<typename T> |
| struct is_same<T, T> |
| { |
| static const bool value = true; |
| }; |
| |
| template<typename T> const T& foo(); |
| |
| |
| int i; |
| |
| template<typename T> |
| struct A |
| { |
| double x; |
| }; |
| |
| const A<double>* a = new A<double>(); |
| |
| static_assert(is_same<decltype(foo<int>()), const int&>::value, |
| "type should be const int&"); |
| static_assert(is_same<decltype(i), int>::value, |
| "type should be int"); |
| static_assert(is_same<decltype(a->x), double>::value, |
| "type should be double"); |
| static_assert(is_same<decltype((a->x)), const double&>::value, |
| "type should be const double&"); |