diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 9 | ||||
-rw-r--r-- | clang/test/Index/index-file.cpp | 10 |
2 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 527005094c9..b5b8b1ea8a9 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -7386,11 +7386,16 @@ Sema::ActOnExplicitInstantiation(Scope *S, } } + // Set the template specialization kind. Make sure it is set before + // instantiating the members which will trigger ASTConsumer callbacks. + Specialization->setTemplateSpecializationKind(TSK); InstantiateClassTemplateSpecializationMembers(TemplateNameLoc, Def, TSK); + } else { + + // Set the template specialization kind. + Specialization->setTemplateSpecializationKind(TSK); } - // Set the template specialization kind. - Specialization->setTemplateSpecializationKind(TSK); return Specialization; } diff --git a/clang/test/Index/index-file.cpp b/clang/test/Index/index-file.cpp index 37b14a2715a..d42b4b2de7d 100644 --- a/clang/test/Index/index-file.cpp +++ b/clang/test/Index/index-file.cpp @@ -15,9 +15,19 @@ void tfoo() {} void tfoo<int>() {} } +namespace crash1 { +template<typename T> class A { + A(A &) = delete; + void meth(); +}; +template <> void A<int>::meth(); +template class A<int>; +} + // RUN: c-index-test -index-file %s > %t // RUN: FileCheck %s -input-file=%t // CHECK: [indexDeclaration]: kind: type-alias | name: MyTypeAlias | {{.*}} | loc: 1:7 // CHECK: [indexDeclaration]: kind: struct-template-spec | name: TS | {{.*}} | loc: 11:8 // CHECK: [indexDeclaration]: kind: function-template-spec | name: tfoo | {{.*}} | loc: 15:6 +// CHECK: [indexDeclaration]: kind: c++-instance-method | name: meth | {{.*}} | loc: 23:26 |