| // RUN: %clang_cc1 -g -emit-llvm-only %s |
| // Check that we don't crash. |
| // PR12305, PR12315 |
| |
| # 1 "a.h" 3 |
| template < typename T1 > struct Types1 |
| { |
| typedef T1 Head; |
| }; |
| template < typename > struct Types; |
| template < template < typename > class Tmpl > struct TemplateSel |
| { |
| template < typename T > struct Bind |
| { |
| typedef Tmpl < T > type; |
| }; |
| }; |
| template < typename > struct NoneT; |
| template < template < typename > class T1, template < typename > class > struct Templates2 |
| { |
| typedef TemplateSel < T1 > Head; |
| }; |
| template < template < typename > class, template < typename > class = |
| NoneT, template < typename > class = NoneT, template < typename > class = |
| NoneT > struct Templates; |
| template < template < typename > class T1, |
| template < typename > class T2 > struct Templates <T1, T2 > |
| { |
| typedef Templates2 < T1, T2 > type; |
| }; |
| template < typename T > struct TypeList |
| { |
| typedef Types1 < T > type; |
| }; |
| template < template < typename > class, class TestSel, |
| typename Types > class TypeParameterizedTest |
| { |
| public:static bool Register () |
| { |
| typedef typename Types::Head Type; |
| typename TestSel::template Bind < Type >::type TestClass; |
| }}; |
| |
| template < template < typename > class Fixture, typename Tests, |
| typename Types > class TypeParameterizedTestCase |
| { |
| public:static bool Register (char *, char *, int *) |
| { |
| typedef typename Tests::Head Head; |
| TypeParameterizedTest < Fixture, Head, Types >::Register; |
| }}; |
| |
| template < typename > class TypedTestP1 |
| { |
| }; |
| |
| namespace gtest_case_TypedTestP1_ |
| { |
| template < typename gtest_TypeParam_ > class A:TypedTestP1 < |
| gtest_TypeParam_ > |
| { |
| }; |
| template < typename gtest_TypeParam_ > class B:TypedTestP1 < |
| gtest_TypeParam_ > |
| { |
| }; |
| typedef Templates < A >::type gtest_AllTests_; |
| } |
| |
| template < typename > class TypedTestP2 |
| { |
| }; |
| |
| namespace gtest_case_TypedTestP2_ |
| { |
| template < typename gtest_TypeParam_ > class A:TypedTestP2 < |
| gtest_TypeParam_ > |
| { |
| }; |
| typedef Templates < A >::type gtest_AllTests_; |
| } |
| |
| bool gtest_Int_TypedTestP1 = |
| TypeParameterizedTestCase < TypedTestP1, |
| gtest_case_TypedTestP1_::gtest_AllTests_, |
| TypeList < int >::type >::Register ("Int", "TypedTestP1", 0); |
| bool gtest_Int_TypedTestP2 = |
| TypeParameterizedTestCase < TypedTestP2, |
| gtest_case_TypedTestP2_::gtest_AllTests_, |
| TypeList < Types < int > >::type >::Register ("Int", "TypedTestP2", 0); |
| |
| template < typename _Tp > struct new_allocator |
| { |
| typedef _Tp *pointer; |
| template < typename > struct rebind { |
| typedef new_allocator other; |
| }; |
| }; |
| template < typename _Tp > struct allocator:new_allocator < _Tp > { |
| }; |
| template < typename _Tp, typename _Alloc > struct _Vector_base { |
| typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type; |
| struct _Vector_impl { |
| typename _Tp_alloc_type::pointer _M_end_of_storage; |
| }; |
| _Vector_base () { |
| foo((int *) this->_M_impl._M_end_of_storage); |
| } |
| void foo(int *); |
| _Vector_impl _M_impl; |
| }; |
| template < typename _Tp, typename _Alloc = |
| allocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > { }; |
| |
| |
| template < class T> struct HHH {}; |
| struct DDD { int x_;}; |
| struct Data; |
| struct X1; |
| struct CCC:DDD { virtual void xxx (HHH < X1 >); }; |
| template < class SSS > struct EEE:vector < HHH < SSS > > { }; |
| template < class SSS, class = EEE < SSS > >class FFF { }; |
| template < class SSS, class GGG = EEE < SSS > >class AAA:FFF <GGG> { }; |
| class BBB:virtual CCC { |
| void xxx (HHH < X1 >); |
| vector < HHH < X1 > >aaa; |
| }; |
| class ZZZ:AAA < Data >, BBB { virtual ZZZ *ppp () ; }; |
| ZZZ * ZZZ::ppp () { return new ZZZ; } |
| |
| namespace std |
| { |
| template < class, class > struct pair; |
| } |
| namespace __gnu_cxx { |
| template < typename > class new_allocator; |
| } |
| namespace std { |
| template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > { |
| }; |
| template < typename, typename > struct _Vector_base { |
| }; |
| template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:_Vector_base < _Tp, |
| _Alloc |
| > { |
| }; |
| } |
| |
| namespace |
| std { |
| template < |
| typename, |
| typename > struct unary_function; |
| template < |
| typename, |
| typename, |
| typename > struct binary_function; |
| template < |
| typename |
| _Tp > struct equal_to: |
| binary_function < |
| _Tp, |
| _Tp, |
| bool > { |
| }; |
| template < |
| typename |
| _Pair > struct _Select1st: |
| unary_function < |
| _Pair, |
| typename |
| _Pair::first_type > { |
| }; |
| } |
| # 1 "f.h" 3 |
| using |
| std::pair; |
| namespace |
| __gnu_cxx { |
| template < |
| class > struct hash; |
| template < |
| class, |
| class, |
| class, |
| class, |
| class |
| _EqualKey, |
| class > |
| class |
| hashtable { |
| public: |
| typedef _EqualKey |
| key_equal; |
| }; |
| using |
| std::equal_to; |
| using |
| std::allocator; |
| using |
| std::_Select1st; |
| template < class _Key, class _Tp, class _HashFn = |
| hash < _Key >, class _EqualKey = equal_to < _Key >, class _Alloc = |
| allocator < _Tp > >class hash_map { |
| typedef |
| hashtable < |
| pair < |
| _Key, |
| _Tp >, |
| _Key, |
| _HashFn, |
| _Select1st < |
| pair < |
| _Key, |
| _Tp > >, |
| _EqualKey, |
| _Alloc > |
| _Ht; |
| public: |
| typename _Ht::key_type; |
| typedef typename |
| _Ht::key_equal |
| key_equal; |
| }; |
| } |
| using |
| __gnu_cxx::hash_map; |
| class |
| C2; |
| template < class > class scoped_ptr { |
| }; |
| namespace { |
| class |
| AAA { |
| virtual ~ |
| AAA () { |
| }}; |
| } |
| template < typename > class EEE; |
| template < typename CCC, typename = |
| typename CCC::key_equal, typename = |
| EEE < CCC > >class III { |
| }; |
| namespace |
| util { |
| class |
| EEE { |
| }; |
| } |
| namespace { |
| class |
| C1: |
| util::EEE { |
| public: |
| class |
| C3: |
| AAA { |
| struct FFF; |
| typedef |
| III < |
| hash_map < |
| C2, |
| FFF > > |
| GGG; |
| GGG |
| aaa; |
| friend |
| C1; |
| }; |
| void |
| HHH (C3::GGG &); |
| }; |
| } |
| namespace |
| n1 { |
| class |
| Test { |
| }; |
| template < |
| typename > |
| class |
| C7 { |
| }; |
| class |
| C4: |
| n1::Test { |
| vector < |
| C1::C3 * > |
| a1; |
| }; |
| enum C5 { }; |
| class |
| C6: |
| C4, |
| n1::C7 < |
| C5 > { |
| }; |
| class |
| C8: |
| C6 { |
| }; |
| class |
| C9: |
| C8 { |
| void |
| TestBody (); |
| }; |
| void |
| C9::TestBody () { |
| scoped_ptr < C1::C3 > context; |
| } |
| } |