[analyzer] Fix crash when building CFG with variable of incomplete type

Summary:
I've included a unit test with a function template containing a variable
of incomplete type. Clang compiles this without errors (the standard
does not require a diagnostic in this case). Without the fix, this case
triggers the crash.

Reviewers: klimek

Reviewed By: klimek

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D30636

llvm-svn: 297129
This commit is contained in:
Martin Bohme 2017-03-07 08:42:37 +00:00
parent 8f0a62a999
commit 0c11c29121
2 changed files with 14 additions and 2 deletions

View File

@ -1390,7 +1390,7 @@ LocalScope* CFGBuilder::addLocalScopeForVarDecl(VarDecl *VD,
// Check if type is a C++ class with non-trivial destructor.
if (const CXXRecordDecl *CD = QT->getAsCXXRecordDecl())
if (!CD->hasTrivialDestructor()) {
if (CD->hasDefinition() && !CD->hasTrivialDestructor()) {
// Add the variable to scope
Scope = createOrReuseLocalScope(Scope);
Scope->addVar(VD);

View File

@ -35,7 +35,9 @@ public:
if (!Body)
return;
TheBuildResult = SawFunctionBody;
if (CFG::buildCFG(nullptr, Body, Result.Context, CFG::BuildOptions()))
CFG::BuildOptions Options;
Options.AddImplicitDtors = true;
if (CFG::buildCFG(nullptr, Body, Result.Context, Options))
TheBuildResult = BuiltCFG;
}
};
@ -75,6 +77,16 @@ TEST(CFG, DeleteExpressionOnDependentType) {
EXPECT_EQ(BuiltCFG, BuildCFG(Code));
}
// Constructing a CFG on a function template with a variable of incomplete type
// should not crash.
TEST(CFG, VariableOfIncompleteType) {
const char *Code = "template<class T> void f() {\n"
" class Undefined;\n"
" Undefined u;\n"
"}\n";
EXPECT_EQ(BuiltCFG, BuildCFG(Code));
}
} // namespace
} // namespace analysis
} // namespace clang