xref: /aosp_15_r20/external/clang/test/PCH/crash-12631281.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -emit-pch -o %t.pch
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -include-pch %t.pch -verify
3*67e74705SXin Li // expected-no-diagnostics
4*67e74705SXin Li 
5*67e74705SXin Li // rdar://12631281
6*67e74705SXin Li // This reduced test case exposed a use-after-free memory bug, which was reliable
7*67e74705SXin Li // reproduced only on guarded malloc (and probably valgrind).
8*67e74705SXin Li 
9*67e74705SXin Li #ifndef HEADER
10*67e74705SXin Li #define HEADER
11*67e74705SXin Li 
12*67e74705SXin Li template < class _T2> struct  is_convertible;
13*67e74705SXin Li template <> struct is_convertible<int> { typedef int type; };
14*67e74705SXin Li 
15*67e74705SXin Li template <class _T1, class _T2> struct  pair {
16*67e74705SXin Li   typedef _T1 first_type;
17*67e74705SXin Li   typedef _T2 second_type;
18*67e74705SXin Li   template <class _U1, class _U2, class = typename is_convertible< first_type>::type>
19*67e74705SXin Li     pair(_U1&& , _U2&& ); // expected-note {{candidate}}
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li template <class _ForwardIterator>
__equal_range(_ForwardIterator)23*67e74705SXin Li pair<_ForwardIterator, _ForwardIterator> __equal_range(_ForwardIterator) {
24*67e74705SXin Li   return pair<_ForwardIterator, _ForwardIterator>(0, 0); // expected-error {{no matching constructor}}
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li template <class _ForwardIterator>
equal_range(_ForwardIterator a)28*67e74705SXin Li pair<_ForwardIterator, _ForwardIterator> equal_range( _ForwardIterator a) {
29*67e74705SXin Li   return __equal_range(a); // expected-note {{instantiation}}
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li class A {
range()33*67e74705SXin Li   pair<int, int> range() {
34*67e74705SXin Li     return equal_range(0); // expected-note {{instantiation}}
35*67e74705SXin Li   }
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li #else
39*67e74705SXin Li 
40*67e74705SXin Li #endif
41