317 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only %s
 | 
						|
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++98 %s
 | 
						|
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++11 %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;
 | 
						|
            typedef void key_type;
 | 
						|
          };
 | 
						|
  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:
 | 
						|
        typedef typename _Ht::key_type key_type;
 | 
						|
        typedef typename
 | 
						|
            _Ht::key_equal
 | 
						|
            key_equal;
 | 
						|
      };
 | 
						|
}
 | 
						|
using
 | 
						|
__gnu_cxx::hash_map;
 | 
						|
class
 | 
						|
C2;
 | 
						|
template < class > class scoped_ptr {
 | 
						|
};
 | 
						|
namespace {
 | 
						|
class
 | 
						|
    AAA {
 | 
						|
protected:
 | 
						|
      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;
 | 
						|
      }
 | 
						|
}
 |