Skip to content

Commit

Permalink
[index] Fix assertion hit when handling a declaration of C++'s 'opera…
Browse files Browse the repository at this point in the history
…tor new' function.

Part of this is to allow creating a USR for the canonical decl of that which is implicit and does
not have a source location.

rdar://28978992

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285868 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
akyrtzi committed Nov 2, 2016
1 parent fb4b957 commit eab101e
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 13 deletions.
10 changes: 0 additions & 10 deletions lib/Index/IndexingContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,19 +290,9 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc,
Roles |= (unsigned)SymbolRole::Declaration;

D = getCanonicalDecl(D);
if (D->isImplicit() && !isa<ObjCMethodDecl>(D) &&
!(isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->getBuiltinID())) {
// operator new declarations will link to the implicit one as canonical.
return true;
}
Parent = adjustParent(Parent);
if (Parent)
Parent = getCanonicalDecl(Parent);
assert((!Parent || !Parent->isImplicit() ||
(isa<FunctionDecl>(Parent) &&
cast<FunctionDecl>(Parent)->getBuiltinID()) ||
isa<ObjCInterfaceDecl>(Parent) || isa<ObjCMethodDecl>(Parent)) &&
"unexpected implicit parent!");

SmallVector<SymbolRelation, 6> FinalRelations;
FinalRelations.reserve(Relations.size()+1);
Expand Down
11 changes: 8 additions & 3 deletions lib/Index/USRGeneration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,11 @@ bool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) {
return false;
if (D->getParentFunctionOrMethod())
return true;
SourceLocation Loc = D->getLocation();
if (Loc.isInvalid())
return false;
const SourceManager &SM = Context->getSourceManager();
return !SM.isInSystemHeader(D->getLocation());
return !SM.isInSystemHeader(Loc);
}

void USRGenerator::VisitDeclContext(const DeclContext *DC) {
Expand Down Expand Up @@ -874,9 +877,11 @@ void clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS) {

bool clang::index::generateUSRForDecl(const Decl *D,
SmallVectorImpl<char> &Buf) {
// Don't generate USRs for things with invalid locations.
if (!D || D->getLocStart().isInvalid())
if (!D)
return true;
// We don't ignore decls with invalid source locations. Implicit decls, like
// C++'s operator new function, can have invalid locations but it is fine to
// create USRs that can identify them.

USRGenerator UG(&D->getASTContext(), Buf);
UG.Visit(D);
Expand Down
6 changes: 6 additions & 0 deletions test/Index/Core/index-source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@ class BT {
return { .idx = 0 }; // Make sure this doesn't trigger a crash.
}
};

// CHECK: [[@LINE+1]]:23 | type-alias/C | size_t |
typedef unsigned long size_t;
// CHECK: [[@LINE+2]]:7 | function/C | operator new | c:@F@operator new#l# | __Znwm |
// CHECK: [[@LINE+1]]:20 | type-alias/C | size_t | {{.*}} | Ref |
void* operator new(size_t sz);

0 comments on commit eab101e

Please sign in to comment.