blob: 6f1ca5568ed6d88b8966b1a331db466b7c90235f [file] [log] [blame]
Douglas Gregor46287c72010-01-29 16:37:09 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
2
3template < bool condition, typename T = void >
4struct enable_if { typedef T type; };
5
6template< typename T >
7struct enable_if< false, T > {};
8
9// PR5876
10namespace Casts {
11 template< unsigned O >
12 void implicit(typename enable_if< O <= 4 >::type* = 0) {
13 }
14
15 template< unsigned O >
16 void cstyle(typename enable_if< O <= (unsigned)4 >::type* = 0) {
17 }
18
19 template< unsigned O >
20 void functional(typename enable_if< O <= unsigned(4) >::type* = 0) {
21 }
22
23 template< unsigned O >
24 void static_(typename enable_if< O <= static_cast<unsigned>(4) >::type* = 0) {
25 }
26
27 // FIXME: Test const_cast, reinterpret_cast, dynamic_cast, which are
28 // a bit harder to use in template arguments.
29 template <unsigned N> struct T {};
30
31 template <int N> T<N> f() { return T<N>(); }
32
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000033 // CHECK: define weak_odr void @_ZN5Casts8implicitILj4EEEvPN9enable_ifIXleT_Li4EEvE4typeE
Douglas Gregor46287c72010-01-29 16:37:09 +000034 template void implicit<4>(void*);
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000035 // CHECK: define weak_odr void @_ZN5Casts6cstyleILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
Douglas Gregor46287c72010-01-29 16:37:09 +000036 template void cstyle<4>(void*);
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000037 // CHECK: define weak_odr void @_ZN5Casts10functionalILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
Douglas Gregor46287c72010-01-29 16:37:09 +000038 template void functional<4>(void*);
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000039 // CHECK: define weak_odr void @_ZN5Casts7static_ILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
Douglas Gregor46287c72010-01-29 16:37:09 +000040 template void static_<4>(void*);
41
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000042 // CHECK: define weak_odr i64 @_ZN5Casts1fILi6EEENS_1TIXT_EEEv
Douglas Gregor46287c72010-01-29 16:37:09 +000043 template T<6> f<6>();
44}