From: Argyrios Kyrtzidis Date: Wed, 2 Nov 2016 23:42:33 +0000 (+0000) Subject: [index] Fix assertion hit when handling a declaration of C++'s 'operator new' function. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eab101ef5f6d2b3c93dc6b13325d1d96bde00772;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285868 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Index/IndexingContext.cpp b/lib/Index/IndexingContext.cpp index bcc367c662..21869d88a5 100644 --- a/lib/Index/IndexingContext.cpp +++ b/lib/Index/IndexingContext.cpp @@ -290,19 +290,9 @@ bool IndexingContext::handleDeclOccurrence(const Decl *D, SourceLocation Loc, Roles |= (unsigned)SymbolRole::Declaration; D = getCanonicalDecl(D); - if (D->isImplicit() && !isa(D) && - !(isa(D) && cast(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(Parent) && - cast(Parent)->getBuiltinID()) || - isa(Parent) || isa(Parent)) && - "unexpected implicit parent!"); SmallVector FinalRelations; FinalRelations.reserve(Relations.size()+1); diff --git a/lib/Index/USRGeneration.cpp b/lib/Index/USRGeneration.cpp index 6a114f934a..bec777ddf4 100644 --- a/lib/Index/USRGeneration.cpp +++ b/lib/Index/USRGeneration.cpp @@ -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 &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); diff --git a/test/Index/Core/index-source.cpp b/test/Index/Core/index-source.cpp index c4e12903f6..11ac89529d 100644 --- a/test/Index/Core/index-source.cpp +++ b/test/Index/Core/index-source.cpp @@ -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);