[index] Fix assertion hit when handling a declaration of C++'s 'operator 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

llvm-svn: 285868
This commit is contained in:
Argyrios Kyrtzidis 2016-11-02 23:42:33 +00:00
parent 80b64f0861
commit f12918d218
3 changed files with 14 additions and 13 deletions

View File

@ -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);

View File

@ -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) {
@ -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);

View File

@ -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);