1 // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
2 
3 template < bool condition, typename T = void >
4 struct enable_if { typedef T type; };
5 
6 template< typename T >
7 struct enable_if< false, T > {};
8 
9 // PR5876
10 namespace 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 
33   // CHECK: define weak_odr void @_ZN5Casts8implicitILj4EEEvPN9enable_ifIXleT_Li4EEvE4typeE
34   template void implicit<4>(void*);
35   // CHECK: define weak_odr void @_ZN5Casts6cstyleILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
36   template void cstyle<4>(void*);
37   // CHECK: define weak_odr void @_ZN5Casts10functionalILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
38   template void functional<4>(void*);
39   // CHECK: define weak_odr void @_ZN5Casts7static_ILj4EEEvPN9enable_ifIXleT_cvjLi4EEvE4typeE
40   template void static_<4>(void*);
41 
42   // CHECK: define weak_odr i64 @_ZN5Casts1fILi6EEENS_1TIXT_EEEv
43   template T<6> f<6>();
44 }
45