Skip to content

Commit

Permalink
AnalysisConsumer: use canonical decl for both lookup and store of
Browse files Browse the repository at this point in the history
visited decls.

Due to redeclarations, the function may have different declarations used
in CallExpr and in the definition. However, we need to use a unique
declaration for both store and lookup in VisitedCallees. This patch
fixes issues with analysis in topological order. A simple test is
included.

Patch by Alex Sidorin!

Differential Revision: http://reviews.llvm.org/D15410

llvm-svn: 257318
  • Loading branch information
Yury Gribov committed Jan 11, 2016
1 parent 7ceec0b commit 054873b
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
9 changes: 5 additions & 4 deletions clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
Expand Up @@ -496,10 +496,11 @@ void AnalysisConsumer::HandleDeclsCallGraph(const unsigned LocalTUDeclsSize) {
(Mgr->options.InliningMode == All ? nullptr : &VisitedCallees));

// Add the visited callees to the global visited set.
for (SetOfConstDecls::iterator I = VisitedCallees.begin(),
E = VisitedCallees.end(); I != E; ++I) {
Visited.insert(*I);
}
for (const Decl *Callee : VisitedCallees)
// Decls from CallGraph are already canonical. But Decls coming from
// CallExprs may be not. We should canonicalize them manually.
Visited.insert(isa<ObjCMethodDecl>(Callee) ? Callee
: Callee->getCanonicalDecl());
VisitedAsTopLevel.insert(D);
}
}
Expand Down
15 changes: 15 additions & 0 deletions clang/test/Analysis/inlining/analysis-order.c
@@ -0,0 +1,15 @@
// RUN: %clang_cc1 -analyze -analyzer-checker=core.builtin.NoReturnFunctions -analyzer-display-progress %s 2>&1 | FileCheck %s

// Do not analyze test1() again because it was inlined
void test1();

void test2() {
test1();
}

void test1() {
}

// CHECK: analysis-order.c test2
// CHECK-NEXT: analysis-order.c test1
// CHECK-NEXT: analysis-order.c test2

0 comments on commit 054873b

Please sign in to comment.