1 // RUN: %clang_cc1 -triple %itanium_abi_triple -ffreestanding -fsyntax-only -verify -std=c++11 %s
5 template<typename T
, typename U
>
7 static const bool value
= false;
10 struct is_same_type
<T
, T
> {
11 static const bool value
= true;
14 __underlying_type(int) a
; // expected-error {{only enumeration types}}
15 __underlying_type(struct b
) c
; // expected-error {{only enumeration types}}
18 static_assert(is_same_type
<char, __underlying_type(f
)>::value
,
19 "f has the wrong underlying type");
21 enum g
{d
= INT_MIN
};
22 static_assert(is_same_type
<int, __underlying_type(g
)>::value
,
23 "g has the wrong underlying type");
25 __underlying_type(f
) h
;
26 static_assert(is_same_type
<char, decltype(h
)>::value
,
27 "h has the wrong type");
30 struct underlying_type
{
31 typedef __underlying_type(T
) type
; // expected-error {{only enumeration types}}
34 static_assert(is_same_type
<underlying_type
<f
>::type
, char>::value
,
35 "f has the wrong underlying type in the template");
37 underlying_type
<int>::type e
; // expected-note {{requested here}}
39 using uint
= unsigned;
40 enum class foo
: uint
{ bar
};
42 static_assert(is_same_type
<underlying_type
<foo
>::type
, unsigned>::value
,
43 "foo has the wrong underlying type");
46 void PR19966(enum Invalid
) { // expected-note 2{{forward declaration of}}
47 // expected-error@-1 {{ISO C++ forbids forward references to 'enum'}}
48 // expected-error@-2 {{variable has incomplete type}}
49 __underlying_type(Invalid
) dont_crash
;
50 // expected-error@-1 {{cannot determine underlying type of incomplete enumeration type 'PR19966::Invalid'}}
52 enum E
{ // expected-note {{forward declaration of 'E'}}
53 a
= (__underlying_type(E
)){}
54 // expected-error@-1 {{cannot determine underlying type of incomplete enumeration type 'PR19966::E'}}
55 // expected-error@-2 {{constant expression}}
59 template<typename T
> void f(__underlying_type(T
));
60 template<typename T
> void f(__underlying_type(T
));
62 void PR26014() { f
<E
>(0); } // should not yield an ambiguity error.
64 template<typename
...T
> void f(__underlying_type(T
) v
); // expected-error {{declaration type contains unexpanded parameter pack 'T'}}
68 using underlying_type_t
= __underlying_type(T
);
71 struct make_unsigned_impl
{ using type
= underlying_type_t
<T
>; };
72 using AnotherType
= make_unsigned_impl
<E
>::type
;
74 // also should not crash.
76 __underlying_type(T
) ft();