[PATCH] D126419: [clang][dataflow] Improve handling of constructor initializers.
Yitzhak Mandelbaum via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 25 13:40:55 PDT 2022
ymandel created this revision.
ymandel added reviewers: sgatev, li.zhe.hua, xazax.hun.
Herald added subscribers: tschuett, steakhal, rnkovacs.
Herald added a project: All.
ymandel requested review of this revision.
Herald added a project: clang.
Currently, we assert that `CXXCtorInitializer`s are field initializers. Replace
the assertion with an early return. Otherwise, we crash every time we process a
constructor with a non-field (e.g. base class) initializer.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D126419
Files:
clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
===================================================================
--- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
+++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
@@ -1274,6 +1274,49 @@
});
}
+TEST_F(TransferTest, BaseClassInitializer) {
+ using ast_matchers::cxxConstructorDecl;
+ using ast_matchers::hasName;
+ using ast_matchers::ofClass;
+
+ std::string Code = R"(
+ class A {
+ public:
+ A(int I) : Bar(I) {}
+ int Bar;
+ };
+
+ class B : public A {
+ public:
+ B(int I) : A(I) {
+ (void)0;
+ // [[p]]
+ }
+ };
+ )";
+ ASSERT_THAT_ERROR(
+ test::checkDataflow<NoopAnalysis>(
+ Code, cxxConstructorDecl(ofClass(hasName("B"))),
+ [](ASTContext &C, Environment &) {
+ return NoopAnalysis(C, /*ApplyBuiltinTransfer=*/true);
+ },
+ [](llvm::ArrayRef<
+ std::pair<std::string, DataflowAnalysisState<NoopLattice>>>
+ Results,
+ ASTContext &ASTCtx) {
+ // Regression test to verify that base-class initializers do not
+ // trigger an assertion. If we add support for such initializers in
+ // the future, we can expand this test to check more specific
+ // properties.
+ EXPECT_THAT(Results, ElementsAre(Pair("p", _)));
+ },
+ {"-fsyntax-only", "-fno-delayed-template-parsing",
+ "-std=" + std::string(LangStandard::getLangStandardForKind(
+ LangStandard::lang_cxx17)
+ .getName())}),
+ llvm::Succeeded());
+}
+
TEST_F(TransferTest, ReferenceMember) {
std::string Code = R"(
struct A {
Index: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
+++ clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
@@ -257,6 +257,11 @@
const CXXCtorInitializer *Initializer = CfgInit.getInitializer();
assert(Initializer != nullptr);
+ const FieldDecl *Member = Initializer->getMember();
+ if (Member == nullptr)
+ // Not a field initializer.
+ return;
+
auto *InitStmt = Initializer->getInit();
assert(InitStmt != nullptr);
@@ -269,9 +274,6 @@
if (InitStmtVal == nullptr)
return;
- const FieldDecl *Member = Initializer->getMember();
- assert(Member != nullptr);
-
if (Member->getType()->isReferenceType()) {
auto &MemberLoc = ThisLoc.getChild(*Member);
State.Env.setValue(MemberLoc,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D126419.432113.patch
Type: text/x-patch
Size: 2698 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220525/a9be5b23/attachment.bin>
More information about the cfe-commits
mailing list