1fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer// RUN: %clang_cc1 -emit-llvm-only -O1 %s
2fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer// This used to crash under asan and valgrind.
3fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer// PR12284
4fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer
5fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < typename _Tp > struct new_allocator
6fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer{
7fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  typedef _Tp *pointer;
8fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  template < typename > struct rebind {
9fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer    typedef new_allocator other;
10fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  };
11fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer};
12fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < typename _Tp > struct allocator:new_allocator < _Tp > {
13fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer};
14fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < typename _Tp, typename _Alloc > struct _Vector_base {
15fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
16fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  struct _Vector_impl {
17fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer    typename _Tp_alloc_type::pointer _M_end_of_storage;
18fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  };
19fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  _Vector_base () {
20fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer    foo((int *) this->_M_impl._M_end_of_storage);
21fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  }
22fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  void foo(int *);
23fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  _Vector_impl _M_impl;
24fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer};
25fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < typename _Tp, typename _Alloc =
26fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerallocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > { };
27fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer
28fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer
29fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < class T> struct HHH {};
30fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerstruct DDD { int x_;};
31fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerstruct Data;
32fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerstruct X1;
33fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerstruct CCC:DDD {   virtual void xxx (HHH < X1 >); };
34fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < class SSS > struct EEE:vector < HHH < SSS > > { };
35fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < class SSS, class = EEE < SSS > >class FFF { };
36fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramertemplate < class SSS, class GGG = EEE < SSS > >class AAA:FFF <GGG> { };
37fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerclass BBB:virtual CCC {
38fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  void xxx (HHH < X1 >);
39fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer  vector < HHH < X1 > >aaa;
40fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramer};
41fce80091da9e5d83d05944e36c834f9137dc329cBenjamin Kramerclass ZZZ:AAA < Data >, BBB { virtual ZZZ *ppp () ; };
42fce80091da9e5d83d05944e36c834f9137dc329cBenjamin KramerZZZ * ZZZ::ppp () { return new ZZZ; }
43