xref: /aosp_15_r20/external/clang/test/SemaTemplate/deduction-crash.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -std=c++11 2>&1| FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Note that the error count below doesn't matter. We just want to
4*67e74705SXin Li // make sure that the parser doesn't crash.
5*67e74705SXin Li // CHECK: 16 errors
6*67e74705SXin Li 
7*67e74705SXin Li // PR7511
8*67e74705SXin Li template<a>
9*67e74705SXin Li struct int_;
10*67e74705SXin Li 
11*67e74705SXin Li template<a>
12*67e74705SXin Li template<int,typename T1,typename>
13*67e74705SXin Li struct ac
14*67e74705SXin Li {
15*67e74705SXin Li   typedef T1 ae
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li template<class>struct aaa
19*67e74705SXin Li {
20*67e74705SXin Li   typedef ac<1,int,int>::ae ae
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li template<class>
24*67e74705SXin Li struct state_machine
25*67e74705SXin Li {
26*67e74705SXin Li   typedef aaa<int>::ae aaa;
startac::aaa::state_machine27*67e74705SXin Li   int start()
28*67e74705SXin Li   {
29*67e74705SXin Li     ant(0);
30*67e74705SXin Li   }
31*67e74705SXin Li 
32*67e74705SXin Li   template<class>
33*67e74705SXin Li   struct region_processing_helper
34*67e74705SXin Li   {
35*67e74705SXin Li     template<class,int=0>
36*67e74705SXin Li     struct In;
37*67e74705SXin Li 
38*67e74705SXin Li     template<int my>
39*67e74705SXin Li     struct In<a::int_<aaa::a>,my>;
40*67e74705SXin Li 
41*67e74705SXin Li     template<class Event>
processac::aaa::state_machine::region_processing_helper42*67e74705SXin Li     int process(Event)
43*67e74705SXin Li     {
44*67e74705SXin Li       In<a::int_<0> > a;
45*67e74705SXin Li     }
46*67e74705SXin Li   }
47*67e74705SXin Li   template<class Event>
48*67e74705SXin Li   int ant(Event)
49*67e74705SXin Li   {
50*67e74705SXin Li     region_processing_helper<int>* helper;
51*67e74705SXin Li     helper->process(0)
52*67e74705SXin Li   }
53*67e74705SXin Li };
54*67e74705SXin Li 
55*67e74705SXin Li int a()
56*67e74705SXin Li {
57*67e74705SXin Li   state_machine<int> p;
58*67e74705SXin Li   p.ant(0);
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li // PR9974
62*67e74705SXin Li template <int> struct enable_if;
63*67e74705SXin Li template <class > struct remove_reference ;
64*67e74705SXin Li template <class _Tp> struct remove_reference<_Tp&> ;
65*67e74705SXin Li 
66*67e74705SXin Li template <class > struct __tuple_like;
67*67e74705SXin Li 
68*67e74705SXin Li template <class _Tp, class _Up, int = __tuple_like<typename remove_reference<_Tp>::type>::value>
69*67e74705SXin Li struct __tuple_convertible;
70*67e74705SXin Li 
71*67e74705SXin Li struct pair
72*67e74705SXin Li {
73*67e74705SXin Li template<class _Tuple, int = enable_if<__tuple_convertible<_Tuple, pair>::value>::type>
74*67e74705SXin Li pair(_Tuple&& );
75*67e74705SXin Li };
76*67e74705SXin Li 
77*67e74705SXin Li template <class> struct basic_ostream;
78*67e74705SXin Li 
79*67e74705SXin Li template <int>
80*67e74705SXin Li void endl( ) ;
81*67e74705SXin Li 
82*67e74705SXin Li extern basic_ostream<char> cout;
83*67e74705SXin Li 
84*67e74705SXin Li int operator<<( basic_ostream<char> , pair ) ;
85*67e74705SXin Li 
86*67e74705SXin Li void register_object_imp ( )
87*67e74705SXin Li {
88*67e74705SXin Li cout << endl<1>;
89*67e74705SXin Li }
90*67e74705SXin Li 
91*67e74705SXin Li // PR12933
92*67e74705SXin Li namespacae PR12933 {
93*67e74705SXin Li   template<typename S>
94*67e74705SXin Li     template<typename T>
95*67e74705SXin Li     void function(S a, T b) {}
96*67e74705SXin Li 
97*67e74705SXin Li   int main() {
98*67e74705SXin Li     function(0, 1);
99*67e74705SXin Li     return 0;
100*67e74705SXin Li   }
101*67e74705SXin Li }
102*67e74705SXin Li 
103*67e74705SXin Li // A buildbot failure from libcxx
104*67e74705SXin Li namespace libcxx_test {
105*67e74705SXin Li   template <class _Ptr, bool> struct __pointer_traits_element_type;
106*67e74705SXin Li   template <class _Ptr> struct __pointer_traits_element_type<_Ptr, true>;
107*67e74705SXin Li   template <template <class, class...> class _Sp, class _Tp, class ..._Args> struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> {
108*67e74705SXin Li     typedef char type;
109*67e74705SXin Li   };
110*67e74705SXin Li   template <class T> struct B {};
111*67e74705SXin Li   __pointer_traits_element_type<B<int>, true>::type x;
112*67e74705SXin Li }
113*67e74705SXin Li 
114*67e74705SXin Li namespace PR14281_part1 {
115*67e74705SXin Li   template <class P, int> struct A;
116*67e74705SXin Li   template <class P> struct A<P, 1>;
117*67e74705SXin Li   template <template <class, int> class S, class T> struct A<S<T, 1>, 1> {
118*67e74705SXin Li     typedef char type;
119*67e74705SXin Li   };
120*67e74705SXin Li   template <class T, int i> struct B {};
121*67e74705SXin Li   A<B<int, 1>, 1>::type x;
122*67e74705SXin Li }
123*67e74705SXin Li 
124*67e74705SXin Li namespace PR14281_part2 {
125*67e74705SXin Li   typedef decltype(nullptr) nullptr_t;
126*67e74705SXin Li   template <class P, nullptr_t> struct A;
127*67e74705SXin Li   template <class P> struct A<P, nullptr>;
128*67e74705SXin Li   template <template <class, nullptr_t> class S, class T> struct A<S<T, nullptr>, nullptr> {
129*67e74705SXin Li     typedef char type;
130*67e74705SXin Li   };
131*67e74705SXin Li   template <class T, nullptr_t i> struct B {};
132*67e74705SXin Li   A<B<int, nullptr>, nullptr>::type x;
133*67e74705SXin Li }
134*67e74705SXin Li 
135*67e74705SXin Li namespace PR14281_part3 {
136*67e74705SXin Li   extern int some_decl;
137*67e74705SXin Li   template <class P, int*> struct A;
138*67e74705SXin Li   template <class P> struct A<P, &some_decl>;
139*67e74705SXin Li   template <template <class, int*> class S, class T> struct A<S<T, &some_decl>, &some_decl> {
140*67e74705SXin Li     typedef char type;
141*67e74705SXin Li   };
142*67e74705SXin Li   template <class T, int* i> struct B {};
143*67e74705SXin Li   A<B<int, &some_decl>, &some_decl>::type x;
144*67e74705SXin Li }
145