Richard Smith | 762bb9d | 2011-10-13 22:29:44 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -ffreestanding -fsyntax-only -verify -std=c++11 %s |
Sean Hunt | c9858bc | 2011-05-19 20:36:08 +0000 | [diff] [blame] | 2 | |
| 3 | #include "limits.h" |
| 4 | |
| 5 | template<typename T, typename U> |
| 6 | struct is_same_type { |
| 7 | static const bool value = false; |
| 8 | }; |
| 9 | template <typename T> |
| 10 | struct is_same_type<T, T> { |
| 11 | static const bool value = true; |
| 12 | }; |
| 13 | |
| 14 | __underlying_type(int) a; // expected-error {{only enumeration types}} |
| 15 | __underlying_type(struct b) c; // expected-error {{only enumeration types}} |
| 16 | |
| 17 | enum class f : char; |
| 18 | static_assert(is_same_type<char, __underlying_type(f)>::value, |
| 19 | "f has the wrong underlying type"); |
| 20 | |
| 21 | enum g {d = INT_MIN }; |
| 22 | static_assert(is_same_type<int, __underlying_type(g)>::value, |
| 23 | "g has the wrong underlying type"); |
| 24 | |
| 25 | __underlying_type(f) h; |
| 26 | static_assert(is_same_type<char, decltype(h)>::value, |
| 27 | "h has the wrong type"); |
Sean Hunt | ca63c20 | 2011-05-24 22:41:36 +0000 | [diff] [blame] | 28 | |
| 29 | template <typename T> |
| 30 | struct underlying_type { |
| 31 | typedef __underlying_type(T) type; // expected-error {{only enumeration types}} |
| 32 | }; |
| 33 | |
| 34 | static_assert(is_same_type<underlying_type<f>::type, char>::value, |
| 35 | "f has the wrong underlying type in the template"); |
| 36 | |
| 37 | underlying_type<int>::type e; // expected-note {{requested here}} |
Peter Collingbourne | 12fc4b0 | 2012-03-05 16:02:06 +0000 | [diff] [blame] | 38 | |
| 39 | using uint = unsigned; |
| 40 | enum class foo : uint { bar }; |
| 41 | |
| 42 | static_assert(is_same_type<underlying_type<foo>::type, unsigned>::value, |
| 43 | "foo has the wrong underlying type"); |