317 lines · cpp
1// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only %s2// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++98 %s3// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++11 %s4// Check that we don't crash.5// PR12305, PR123156 7# 1 "a.h" 38template < typename T1 > struct Types19{10 typedef T1 Head;11};12template < typename > struct Types;13template < template < typename > class Tmpl > struct TemplateSel14{15 template < typename T > struct Bind16 {17 typedef Tmpl < T > type;18 };19};20template < typename > struct NoneT;21template < template < typename > class T1, template < typename > class > struct Templates222{23 typedef TemplateSel < T1 > Head;24};25template < template < typename > class, template < typename > class =26 NoneT, template < typename > class = NoneT, template < typename > class =27 NoneT > struct Templates;28template < template < typename > class T1,29 template < typename > class T2 > struct Templates <T1, T2 >30{31 typedef Templates2 < T1, T2 > type;32};33template < typename T > struct TypeList34{35 typedef Types1 < T > type;36};37template < template < typename > class, class TestSel,38 typename Types > class TypeParameterizedTest39{40public:static bool Register ()41 {42 typedef typename Types::Head Type;43 typename TestSel::template Bind < Type >::type TestClass;44}};45 46template < template < typename > class Fixture, typename Tests,47 typename Types > class TypeParameterizedTestCase48{49public:static bool Register (char *, char *, int *)50 {51 typedef typename Tests::Head Head;52 TypeParameterizedTest < Fixture, Head, Types >::Register;53}};54 55template < typename > class TypedTestP156{57};58 59namespace gtest_case_TypedTestP1_60{61 template < typename gtest_TypeParam_ > class A:TypedTestP1 <62 gtest_TypeParam_ >63 {64 };65template < typename gtest_TypeParam_ > class B:TypedTestP1 <66 gtest_TypeParam_ >67 {68 };69 typedef Templates < A >::type gtest_AllTests_;70}71 72template < typename > class TypedTestP273{74};75 76namespace gtest_case_TypedTestP2_77{78 template < typename gtest_TypeParam_ > class A:TypedTestP2 <79 gtest_TypeParam_ >80 {81 };82 typedef Templates < A >::type gtest_AllTests_;83}84 85bool gtest_Int_TypedTestP1 =86 TypeParameterizedTestCase < TypedTestP1,87 gtest_case_TypedTestP1_::gtest_AllTests_,88 TypeList < int >::type >::Register ("Int", "TypedTestP1", 0);89bool gtest_Int_TypedTestP2 =90 TypeParameterizedTestCase < TypedTestP2,91 gtest_case_TypedTestP2_::gtest_AllTests_,92 TypeList < Types < int > >::type >::Register ("Int", "TypedTestP2", 0);93 94template < typename _Tp > struct new_allocator95{96 typedef _Tp *pointer;97 template < typename > struct rebind {98 typedef new_allocator other;99 };100};101template < typename _Tp > struct allocator:new_allocator < _Tp > {102};103template < typename _Tp, typename _Alloc > struct _Vector_base {104 typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;105 struct _Vector_impl {106 typename _Tp_alloc_type::pointer _M_end_of_storage;107 };108 _Vector_base () {109 foo((int *) this->_M_impl._M_end_of_storage);110 }111 void foo(int *);112 _Vector_impl _M_impl;113};114template < typename _Tp, typename _Alloc =115allocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > { };116 117 118template < class T> struct HHH {};119struct DDD { int x_;};120struct Data;121struct X1;122struct CCC:DDD { virtual void xxx (HHH < X1 >); };123template < class SSS > struct EEE:vector < HHH < SSS > > { };124template < class SSS, class = EEE < SSS > >class FFF { };125template < class SSS, class GGG = EEE < SSS > >class AAA:FFF <GGG> { };126class BBB:virtual CCC {127 void xxx (HHH < X1 >);128 vector < HHH < X1 > >aaa;129};130class ZZZ:AAA < Data >, BBB { virtual ZZZ *ppp () ; };131ZZZ * ZZZ::ppp () { return new ZZZ; }132 133namespace std134{135 template < class, class > struct pair;136}137namespace __gnu_cxx {138template < typename > class new_allocator;139}140namespace std {141template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > {142};143template < typename, typename > struct _Vector_base {144};145template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:_Vector_base < _Tp,146 _Alloc147 > {148 };149}150 151namespace152std {153 template <154 typename,155 typename > struct unary_function;156 template <157 typename,158 typename,159 typename > struct binary_function;160 template <161 typename162 _Tp > struct equal_to:163 binary_function <164 _Tp,165 _Tp,166 bool > {167 };168 template <169 typename170 _Pair > struct _Select1st:171 unary_function <172 _Pair,173 typename174 _Pair::first_type > {175 };176}177# 1 "f.h" 3178using179std::pair;180namespace181__gnu_cxx {182 template <183 class > struct hash;184 template <185 class,186 class,187 class,188 class,189 class190 _EqualKey,191 class >192 class193 hashtable {194 public:195 typedef _EqualKey196 key_equal;197 typedef void key_type;198 };199 using200 std::equal_to;201 using202 std::allocator;203 using204 std::_Select1st;205 template < class _Key, class _Tp, class _HashFn =206 hash < _Key >, class _EqualKey = equal_to < _Key >, class _Alloc =207 allocator < _Tp > >class hash_map {208 typedef209 hashtable <210 pair <211 _Key,212 _Tp >,213 _Key,214 _HashFn,215 _Select1st <216 pair <217 _Key,218 _Tp > >,219 _EqualKey,220 _Alloc >221 _Ht;222 public:223 typedef typename _Ht::key_type key_type;224 typedef typename225 _Ht::key_equal226 key_equal;227 };228}229using230__gnu_cxx::hash_map;231class232C2;233template < class > class scoped_ptr {234};235namespace {236class237 AAA {238protected:239 virtual ~240 AAA () {241 }};242}243template < typename > class EEE;244template < typename CCC, typename =245typename CCC::key_equal, typename =246EEE < CCC > >class III {247};248namespace249util {250 class251 EEE {252 };253}254namespace {255class256 C1:257 util::EEE {258 public:259 class260 C3:261 AAA {262 struct FFF;263 typedef264 III <265 hash_map <266 C2,267 FFF > >268 GGG;269 GGG270 aaa;271 friend272 C1;273 };274 void275 HHH (C3::GGG &);276 };277}278namespace279n1 {280 class281 Test {282 };283 template <284 typename >285 class286 C7 {287 };288 class289 C4:290 n1::Test {291 vector <292 C1::C3 * >293 a1;294 };295 enum C5 { };296 class297 C6:298 C4,299 n1::C7 <300 C5 > {301 };302 class303 C8:304 C6 {305 };306 class307 C9:308 C8 {309 void310 TestBody ();311 };312 void313 C9::TestBody () {314 scoped_ptr < C1::C3 > context;315 }316}317