1 // RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only %s 2 // RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++98 %s 3 // RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple -emit-llvm-only -std=c++11 %s 4 // Check that we don't crash. 5 // PR12305, PR12315 6 7 # 1 "a.h" 3 8 template < typename T1 > struct Types1 9 { 10 typedef T1 Head; 11 }; 12 template < typename > struct Types; 13 template < template < typename > class Tmpl > struct TemplateSel 14 { 15 template < typename T > struct Bind 16 { 17 typedef Tmpl < T > type; 18 }; 19 }; 20 template < typename > struct NoneT; 21 template < template < typename > class T1, template < typename > class > struct Templates2 22 { 23 typedef TemplateSel < T1 > Head; 24 }; 25 template < template < typename > class, template < typename > class = 26 NoneT, template < typename > class = NoneT, template < typename > class = 27 NoneT > struct Templates; 28 template < template < typename > class T1, 29 template < typename > class T2 > struct Templates <T1, T2 > 30 { 31 typedef Templates2 < T1, T2 > type; 32 }; 33 template < typename T > struct TypeList 34 { 35 typedef Types1 < T > type; 36 }; 37 template < template < typename > class, class TestSel, 38 typename Types > class TypeParameterizedTest 39 { 40 public:static bool Register () 41 { 42 typedef typename Types::Head Type; 43 typename TestSel::template Bind < Type >::type TestClass; 44 }}; 45 46 template < template < typename > class Fixture, typename Tests, 47 typename Types > class TypeParameterizedTestCase 48 { 49 public:static bool Register (char *, char *, int *) 50 { 51 typedef typename Tests::Head Head; 52 TypeParameterizedTest < Fixture, Head, Types >::Register; 53 }}; 54 55 template < typename > class TypedTestP1 56 { 57 }; 58 59 namespace gtest_case_TypedTestP1_ 60 { 61 template < typename gtest_TypeParam_ > class A:TypedTestP1 < 62 gtest_TypeParam_ > 63 { 64 }; 65 template < typename gtest_TypeParam_ > class B:TypedTestP1 < 66 gtest_TypeParam_ > 67 { 68 }; 69 typedef Templates < A >::type gtest_AllTests_; 70 } 71 72 template < typename > class TypedTestP2 73 { 74 }; 75 76 namespace 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 85 bool gtest_Int_TypedTestP1 = 86 TypeParameterizedTestCase < TypedTestP1, 87 gtest_case_TypedTestP1_::gtest_AllTests_, 88 TypeList < int >::type >::Register ("Int", "TypedTestP1", 0); 89 bool gtest_Int_TypedTestP2 = 90 TypeParameterizedTestCase < TypedTestP2, 91 gtest_case_TypedTestP2_::gtest_AllTests_, 92 TypeList < Types < int > >::type >::Register ("Int", "TypedTestP2", 0); 93 94 template < typename _Tp > struct new_allocator 95 { 96 typedef _Tp *pointer; 97 template < typename > struct rebind { 98 typedef new_allocator other; 99 }; 100 }; 101 template < typename _Tp > struct allocator:new_allocator < _Tp > { 102 }; 103 template < 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 }; 114 template < typename _Tp, typename _Alloc = 115 allocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > { }; 116 117 118 template < class T> struct HHH {}; 119 struct DDD { int x_;}; 120 struct Data; 121 struct X1; 122 struct CCC:DDD { virtual void xxx (HHH < X1 >); }; 123 template < class SSS > struct EEE:vector < HHH < SSS > > { }; 124 template < class SSS, class = EEE < SSS > >class FFF { }; 125 template < class SSS, class GGG = EEE < SSS > >class AAA:FFF <GGG> { }; 126 class BBB:virtual CCC { 127 void xxx (HHH < X1 >); 128 vector < HHH < X1 > >aaa; 129 }; 130 class ZZZ:AAA < Data >, BBB { virtual ZZZ *ppp () ; }; 131 ZZZ * ZZZ::ppp () { return new ZZZ; } 132 133 namespace std 134 { 135 template < class, class > struct pair; 136 } 137 namespace __gnu_cxx { 138 template < typename > class new_allocator; 139 } 140 namespace std { 141 template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > { 142 }; 143 template < typename, typename > struct _Vector_base { 144 }; 145 template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:_Vector_base < _Tp, 146 _Alloc 147 > { 148 }; 149 } 150 151 namespace 152 std { 153 template < 154 typename, 155 typename > struct unary_function; 156 template < 157 typename, 158 typename, 159 typename > struct binary_function; 160 template < 161 typename 162 _Tp > struct equal_to: 163 binary_function < 164 _Tp, 165 _Tp, 166 bool > { 167 }; 168 template < 169 typename 170 _Pair > struct _Select1st: 171 unary_function < 172 _Pair, 173 typename 174 _Pair::first_type > { 175 }; 176 } 177 # 1 "f.h" 3 178 using 179 std::pair; 180 namespace 181 __gnu_cxx { 182 template < 183 class > struct hash; 184 template < 185 class, 186 class, 187 class, 188 class, 189 class 190 _EqualKey, 191 class > 192 class 193 hashtable { 194 public: 195 typedef _EqualKey 196 key_equal; 197 typedef void key_type; 198 }; 199 using 200 std::equal_to; 201 using 202 std::allocator; 203 using 204 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 typedef 209 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 typename 225 _Ht::key_equal 226 key_equal; 227 }; 228 } 229 using 230 __gnu_cxx::hash_map; 231 class 232 C2; 233 template < class > class scoped_ptr { 234 }; 235 namespace { 236 class 237 AAA { 238 protected: 239 virtual ~ 240 AAA () { 241 }}; 242 } 243 template < typename > class EEE; 244 template < typename CCC, typename = 245 typename CCC::key_equal, typename = 246 EEE < CCC > >class III { 247 }; 248 namespace 249 util { 250 class 251 EEE { 252 }; 253 } 254 namespace { 255 class 256 C1: 257 util::EEE { 258 public: 259 class 260 C3: 261 AAA { 262 struct FFF; 263 typedef 264 III < 265 hash_map < 266 C2, 267 FFF > > 268 GGG; 269 GGG 270 aaa; 271 friend 272 C1; 273 }; 274 void 275 HHH (C3::GGG &); 276 }; 277 } 278 namespace 279 n1 { 280 class 281 Test { 282 }; 283 template < 284 typename > 285 class 286 C7 { 287 }; 288 class 289 C4: 290 n1::Test { 291 vector < 292 C1::C3 * > 293 a1; 294 }; 295 enum C5 { }; 296 class 297 C6: 298 C4, 299 n1::C7 < 300 C5 > { 301 }; 302 class 303 C8: 304 C6 { 305 }; 306 class 307 C9: 308 C8 { 309 void 310 TestBody (); 311 }; 312 void 313 C9::TestBody () { 314 scoped_ptr < C1::C3 > context; 315 } 316 } 317