[index] Fix assertion hit when handling a declaration of C++'s 'operator new' function.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Nov 2016 23:42:33 +0000 (23:42 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Nov 2016 23:42:33 +0000 (23:42 +0000)
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

clang/lib/Index/IndexingContext.cpp
clang/lib/Index/USRGeneration.cpp
clang/test/Index/Core/index-source.cpp

index bcc367c..21869d8 100644 (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);
index 6a114f9..bec777d 100644 (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);
index c4e1290..11ac895 100644 (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);