Index: lib/AST/DeclCXX.cpp =================================================================== --- lib/AST/DeclCXX.cpp +++ lib/AST/DeclCXX.cpp @@ -1347,7 +1347,8 @@ auto From = TD->getInstantiatedFrom(); if (auto *CTD = From.dyn_cast()) { while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) { - if (NewCTD->isMemberSpecialization()) + if (NewCTD->isMemberSpecialization() || + !NewCTD->isThisDeclarationADefinition()) break; CTD = NewCTD; } Index: test/CodeGenCXX/cxx11-crashes.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/cxx11-crashes.cpp @@ -0,0 +1,25 @@ +// 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(void) { + return A::Inner<0>().member; +} + +// CHECK: _ZN10rd288866621AIiE5InnerILi0EEC2Ev +// CHECK: store i32 42, i32* %member + +}