Index: lib/AST/DeclCXX.cpp =================================================================== --- lib/AST/DeclCXX.cpp +++ lib/AST/DeclCXX.cpp @@ -1346,10 +1346,14 @@ if (auto *TD = dyn_cast(this)) { auto From = TD->getInstantiatedFrom(); if (auto *CTD = From.dyn_cast()) { - while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) { - if (NewCTD->isMemberSpecialization()) - break; - CTD = NewCTD; + while (true) { + if (!CTD->isMemberSpecialization()) { + if (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) { + CTD = NewCTD; + continue; + } + } + break; } return CTD->getTemplatedDecl()->getDefinition(); } Index: test/CodeGenCXX/cxx11-crashes.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/cxx11-crashes.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -std=c++11 %s -o - | FileCheck %s + +namespace rd28886662 { + +template +class A { +public: + template + struct Inner; +}; + +template<> +template +struct A::Inner { + int member = 42; // should be ok +}; + +int foo() { + return A::Inner<0>().member; +} + +// CHECK: _ZN10rd288866621AIiE5InnerILi0EEC2Ev +// CHECK: store i32 42, i32* %member + +template +class B { +public: + template + struct Inner; +}; + +template +template +struct B::Inner { + int member = 21; +}; + +int bar() { + return B::Inner<0>().member; +} + +// CHECK: _ZN10rd288866621BIiE5InnerILi0EEC2Ev +// CHECK: store i32 21, i32* %member + +} Index: test/Modules/cxx-templates.cpp =================================================================== --- test/Modules/cxx-templates.cpp +++ test/Modules/cxx-templates.cpp @@ -199,7 +199,7 @@ cls uk4; // expected-error 1+{{partial specialization of 'cls' must be imported}} expected-error 1+{{definition of}} cls::nested_cls unk1; // expected-error 1+{{explicit specialization of 'nested_cls' must be imported}} expected-error 1+{{definition of}} cls::nested_cls_t unk2; // expected-error 1+{{explicit specialization of 'nested_cls_t' must be imported}} expected-error 1+{{definition of}} - cls::nested_cls_t unk3; // expected-error 1+{{explicit specialization of 'nested_cls_t' must be imported}} + cls::nested_cls_t unk3; // expected-error 1+{{explicit specialization of 'nested_cls_t' must be imported}} expected-error 1+{{definition of}} // For enums, uses that would trigger instantiations of definitions are not // allowed.