Index: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -462,7 +462,7 @@ // Mark the decl as visited. if (VisitedCallees) - VisitedCallees->insert(D); + VisitedCallees->insert(D->getCanonicalDecl()); return true; } Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp =================================================================== --- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -482,7 +482,7 @@ // Skip the functions which have been processed already or previously // inlined. - if (shouldSkipFunction(D, Visited, VisitedAsTopLevel)) + if (shouldSkipFunction(D->getCanonicalDecl(), Visited, VisitedAsTopLevel)) continue; // Analyze the function. Index: test/Analysis/inlining/analysis-order.c =================================================================== --- /dev/null +++ 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