mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-04 06:51:56 +00:00
[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:
parent
8f0a62a999
commit
0c11c29121
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user