forked from OSchip/llvm-project
[Index] Set OrigD before D is changed.
Reviewers: akyrtzi, arphaman Reviewed By: akyrtzi Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D49476 llvm-svn: 337529
This commit is contained in:
parent
c2c7d15486
commit
3e0051bb51
|
@ -350,6 +350,9 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!OrigD)
|
||||||
|
OrigD = D;
|
||||||
|
|
||||||
if (isTemplateImplicitInstantiation(D)) {
|
if (isTemplateImplicitInstantiation(D)) {
|
||||||
if (!IsRef)
|
if (!IsRef)
|
||||||
return true;
|
return true;
|
||||||
|
@ -359,9 +362,6 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc,
|
||||||
assert(!isTemplateImplicitInstantiation(D));
|
assert(!isTemplateImplicitInstantiation(D));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!OrigD)
|
|
||||||
OrigD = D;
|
|
||||||
|
|
||||||
if (IsRef)
|
if (IsRef)
|
||||||
Roles |= (unsigned)SymbolRole::Reference;
|
Roles |= (unsigned)SymbolRole::Reference;
|
||||||
else if (isDeclADefinition(OrigD, ContainerDC, *Ctx))
|
else if (isDeclADefinition(OrigD, ContainerDC, *Ctx))
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
template <typename T>
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
void f(T t) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void g() {
|
||||||
|
Foo<int> foo;
|
||||||
|
foo.f(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: if c-index-test uses OrigD for symbol info, refererences below should
|
||||||
|
// refer to template specialization decls.
|
||||||
|
// RUN: env CINDEXTEST_INDEXIMPLICITTEMPLATEINSTANTIATIONS=1 c-index-test -index-file %s | FileCheck %s
|
||||||
|
// CHECK: [indexDeclaration]: kind: c++-class-template | name: Foo
|
||||||
|
// CHECK-NEXT: [indexDeclaration]: kind: c++-instance-method | name: f
|
||||||
|
// CHECK-NEXT: [indexDeclaration]: kind: function | name: g
|
||||||
|
// CHECK-NEXT: [indexEntityReference]: kind: c++-class-template | name: Foo | USR: c:@ST>1#T@Foo
|
||||||
|
// CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: f | USR: c:@ST>1#T@Foo@F@f#t0.0#
|
|
@ -3652,6 +3652,8 @@ static unsigned getIndexOptions(void) {
|
||||||
index_opts |= CXIndexOpt_IndexFunctionLocalSymbols;
|
index_opts |= CXIndexOpt_IndexFunctionLocalSymbols;
|
||||||
if (!getenv("CINDEXTEST_DISABLE_SKIPPARSEDBODIES"))
|
if (!getenv("CINDEXTEST_DISABLE_SKIPPARSEDBODIES"))
|
||||||
index_opts |= CXIndexOpt_SkipParsedBodiesInSession;
|
index_opts |= CXIndexOpt_SkipParsedBodiesInSession;
|
||||||
|
if (getenv("CINDEXTEST_INDEXIMPLICITTEMPLATEINSTANTIATIONS"))
|
||||||
|
index_opts |= CXIndexOpt_IndexImplicitTemplateInstantiations;
|
||||||
|
|
||||||
return index_opts;
|
return index_opts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -402,6 +402,8 @@ static IndexingOptions getIndexingOptionsFromCXOptions(unsigned index_options) {
|
||||||
IndexingOptions IdxOpts;
|
IndexingOptions IdxOpts;
|
||||||
if (index_options & CXIndexOpt_IndexFunctionLocalSymbols)
|
if (index_options & CXIndexOpt_IndexFunctionLocalSymbols)
|
||||||
IdxOpts.IndexFunctionLocals = true;
|
IdxOpts.IndexFunctionLocals = true;
|
||||||
|
if (index_options & CXIndexOpt_IndexImplicitTemplateInstantiations)
|
||||||
|
IdxOpts.IndexImplicitInstantiation = true;
|
||||||
return IdxOpts;
|
return IdxOpts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue