1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -g -triple %itanium_abi_triple -emit-llvm-only %s
26181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer// Check that we don't crash.
36181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer// PR12305, PR12315
46181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
56181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer# 1 "a.h"  3
66181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename T1 > struct Types1
76181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
86181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef T1 Head;
96181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
106181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > struct Types;
116181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class Tmpl > struct TemplateSel
126181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
136181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < typename T > struct Bind
146181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
156181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typedef Tmpl < T > type;
166181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
176181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
186181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > struct NoneT;
196181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class T1, template < typename > class > struct Templates2
206181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
216181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef TemplateSel < T1 > Head;
226181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
236181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class, template < typename > class =
246181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  NoneT, template < typename > class = NoneT, template < typename > class =
256181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  NoneT > struct Templates;
266181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class T1,
276181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < typename > class T2 > struct Templates <T1, T2 >
286181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
296181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef Templates2 < T1, T2 > type;
306181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
316181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename T > struct TypeList
326181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
336181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef Types1 < T > type;
346181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
356181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class, class TestSel,
366181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typename Types > class TypeParameterizedTest
376181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
386181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerpublic:static bool Register ()
396181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
406181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typedef typename Types::Head Type;
416181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typename TestSel::template Bind < Type >::type TestClass;
426181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}};
436181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
446181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < template < typename > class Fixture, typename Tests,
456181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typename Types > class TypeParameterizedTestCase
466181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
476181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerpublic:static bool Register (char *, char *, int *)
486181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
496181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typedef typename Tests::Head Head;
506181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    TypeParameterizedTest < Fixture, Head, Types >::Register;
516181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}};
526181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
536181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > class TypedTestP1
546181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
556181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
566181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
576181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace gtest_case_TypedTestP1_
586181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
596181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < typename gtest_TypeParam_ > class A:TypedTestP1 <
606181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    gtest_TypeParam_ >
616181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
626181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
636181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename gtest_TypeParam_ > class B:TypedTestP1 <
646181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    gtest_TypeParam_ >
656181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
666181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
676181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef Templates < A >::type gtest_AllTests_;
686181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
696181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
706181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > class TypedTestP2
716181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
726181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
736181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
746181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace gtest_case_TypedTestP2_
756181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
766181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < typename gtest_TypeParam_ > class A:TypedTestP2 <
776181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    gtest_TypeParam_ >
786181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  {
796181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
806181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef Templates < A >::type gtest_AllTests_;
816181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
826181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
836181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerbool gtest_Int_TypedTestP1 =
846181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  TypeParameterizedTestCase < TypedTestP1,
856181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  gtest_case_TypedTestP1_::gtest_AllTests_,
866181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  TypeList < int >::type >::Register ("Int", "TypedTestP1", 0);
876181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerbool gtest_Int_TypedTestP2 =
886181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  TypeParameterizedTestCase < TypedTestP2,
896181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  gtest_case_TypedTestP2_::gtest_AllTests_,
906181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  TypeList < Types < int > >::type >::Register ("Int", "TypedTestP2", 0);
916181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
926181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp > struct new_allocator
936181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
946181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef _Tp *pointer;
956181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < typename > struct rebind {
966181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typedef new_allocator other;
976181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
986181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
996181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp > struct allocator:new_allocator < _Tp > {
1006181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
1016181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp, typename _Alloc > struct _Vector_base {
1026181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
1036181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  struct _Vector_impl {
1046181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    typename _Tp_alloc_type::pointer _M_end_of_storage;
1056181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  };
1066181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  _Vector_base () {
1076181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    foo((int *) this->_M_impl._M_end_of_storage);
1086181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  }
1096181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  void foo(int *);
1106181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  _Vector_impl _M_impl;
1116181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
1126181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp, typename _Alloc =
1136181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerallocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > { };
1146181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
1156181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
1166181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < class T> struct HHH {};
1176181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstruct DDD { int x_;};
1186181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstruct Data;
1196181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstruct X1;
1206181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstruct CCC:DDD {   virtual void xxx (HHH < X1 >); };
1216181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < class SSS > struct EEE:vector < HHH < SSS > > { };
1226181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < class SSS, class = EEE < SSS > >class FFF { };
1236181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < class SSS, class GGG = EEE < SSS > >class AAA:FFF <GGG> { };
1246181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerclass BBB:virtual CCC {
1256181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  void xxx (HHH < X1 >);
1266181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  vector < HHH < X1 > >aaa;
1276181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
1286181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerclass ZZZ:AAA < Data >, BBB { virtual ZZZ *ppp () ; };
1296181e56a44ecc31dfca8baea2ae8738957003496Benjamin KramerZZZ * ZZZ::ppp () { return new ZZZ; }
1306181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
1316181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace std
1326181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer{
1336181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < class, class > struct pair;
1346181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
1356181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace __gnu_cxx {
1366181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > class new_allocator;
1376181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
1386181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace std {
1396181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > {
1406181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
1416181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename, typename > struct _Vector_base {
1426181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
1436181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:_Vector_base < _Tp,
1446181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  _Alloc
1456181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        > {
1466181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
1476181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
1486181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer
1496181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace
1506181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstd {
1516181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1526181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename,
1536181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename > struct unary_function;
1546181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1556181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename,
1566181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename,
1576181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename > struct binary_function;
1586181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1596181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename
1606181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      _Tp > struct equal_to:
1616181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        binary_function <
1626181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Tp,
1636181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Tp,
1646181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        bool > {
1656181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
1666181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1676181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename
1686181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      _Pair > struct _Select1st:
1696181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        unary_function <
1706181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Pair,
1716181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        typename
1726181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Pair::first_type > {
1736181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
1746181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
1756181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer# 1 "f.h"  3
1766181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerusing
1776181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerstd::pair;
1786181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace
1796181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer__gnu_cxx {
1806181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1816181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class > struct hash;
1826181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
1836181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class,
1846181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class,
1856181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class,
1866181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class,
1876181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class
1886181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          _EqualKey,
1896181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class >
1906181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          class
1916181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          hashtable {
1926181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer           public:
1936181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            typedef _EqualKey
1946181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                key_equal;
195c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith            typedef void key_type;
1966181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          };
1976181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  using
1986181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      std::equal_to;
1996181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  using
2006181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      std::allocator;
2016181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  using
2026181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      std::_Select1st;
2036181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template < class _Key, class _Tp, class _HashFn =
2046181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      hash < _Key >, class _EqualKey = equal_to < _Key >, class _Alloc =
2056181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      allocator < _Tp > >class hash_map {
2066181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        typedef
2076181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            hashtable <
2086181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            pair <
2096181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            _Key,
2106181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Tp >,
2116181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Key,
2126181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _HashFn,
2136181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Select1st <
2146181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            pair <
2156181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            _Key,
2166181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Tp > >,
2176181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _EqualKey,
2186181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        _Alloc >
2196181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            _Ht;
2206181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer       public:
221c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith        typedef typename _Ht::key_type key_type;
2226181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        typedef typename
2236181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            _Ht::key_equal
2246181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            key_equal;
2256181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      };
2266181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
2276181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerusing
2286181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer__gnu_cxx::hash_map;
2296181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerclass
2306181e56a44ecc31dfca8baea2ae8738957003496Benjamin KramerC2;
2316181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < class > class scoped_ptr {
2326181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
2336181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace {
2346181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerclass
2356181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    AAA {
2366181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      virtual ~
2376181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          AAA () {
2386181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          }};
2396181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
2406181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename > class EEE;
2416181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertemplate < typename CCC, typename =
2426181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramertypename CCC::key_equal, typename =
2436181e56a44ecc31dfca8baea2ae8738957003496Benjamin KramerEEE < CCC > >class III {
2446181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer};
2456181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace
2466181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerutil {
2476181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
2486181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      EEE {
2496181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      };
2506181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
2516181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace {
2526181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramerclass
2536181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer    C1:
2546181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      util::EEE {
2556181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer       public:
2566181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        class
2576181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            C3:
2586181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer              AAA {
2596181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                struct FFF;
2606181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                typedef
2616181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    III <
2626181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    hash_map <
2636181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    C2,
2646181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    FFF > >
2656181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                        GGG;
2666181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                GGG
2676181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    aaa;
2686181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                friend
2696181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer                    C1;
2706181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer              };
2716181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        void
2726181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer            HHH (C3::GGG &);
2736181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      };
2746181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
2756181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramernamespace
2766181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramern1 {
2776181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
2786181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      Test {
2796181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      };
2806181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  template <
2816181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      typename >
2826181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      class
2836181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C7 {
2846181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      };
2856181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
2866181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C4:
2876181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        n1::Test {
2886181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          vector <
2896181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer              C1::C3 * >
2906181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer              a1;
2916181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
2926181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  enum C5 { };
2936181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
2946181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C6:
2956181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        C4,
2966181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        n1::C7 <
2976181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        C5 > {
2986181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
2996181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
3006181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C8:
3016181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        C6 {
3026181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
3036181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  class
3046181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C9:
3056181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        C8 {
3066181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer          void
3076181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer              TestBody ();
3086181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        };
3096181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer  void
3106181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      C9::TestBody () {
3116181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer        scoped_ptr < C1::C3 > context;
3126181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer      }
3136181e56a44ecc31dfca8baea2ae8738957003496Benjamin Kramer}
314