[PATCH] D118226: [clang][dataflow] Assign aggregate storage locations to union stmts
Stanislav Gatev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 26 02:38:26 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG188d28f73cc7: [clang][dataflow] Assign aggregate storage locations to union stmts (authored by sgatev).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D118226/new/
https://reviews.llvm.org/D118226
Files:
clang/lib/Analysis/FlowSensitive/DataflowEnvironment.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
@@ -1952,4 +1952,37 @@
}
}
+TEST_F(TransferTest, AssignToUnionMember) {
+ std::string Code = R"(
+ union A {
+ int Foo;
+ };
+
+ void target(int Bar) {
+ A Baz;
+ Baz.Foo = Bar;
+ // [[p]]
+ }
+ )";
+ runDataflow(Code,
+ [](llvm::ArrayRef<
+ std::pair<std::string, DataflowAnalysisState<NoopLattice>>>
+ Results,
+ ASTContext &ASTCtx) {
+ ASSERT_THAT(Results, ElementsAre(Pair("p", _)));
+ const Environment &Env = Results[0].second.Env;
+
+ const ValueDecl *BazDecl = findValueDecl(ASTCtx, "Baz");
+ ASSERT_THAT(BazDecl, NotNull());
+ ASSERT_TRUE(BazDecl->getType()->isUnionType());
+
+ const auto *BazLoc = dyn_cast_or_null<AggregateStorageLocation>(
+ Env.getStorageLocation(*BazDecl, SkipPast::None));
+ ASSERT_THAT(BazLoc, NotNull());
+
+ // FIXME: Add support for union types.
+ EXPECT_THAT(Env.getValue(*BazLoc), IsNull());
+ });
+}
+
} // namespace
Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -100,7 +100,7 @@
StorageLocation &Environment::createStorageLocation(QualType Type) {
assert(!Type.isNull());
- if (Type->isStructureOrClassType()) {
+ if (Type->isStructureOrClassType() || Type->isUnionType()) {
// FIXME: Explore options to avoid eager initialization of fields as some of
// them might not be needed for a particular analysis.
llvm::DenseMap<const ValueDecl *, StorageLocation *> FieldLocs;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118226.403185.patch
Type: text/x-patch
Size: 2075 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220126/c5454bbf/attachment-0001.bin>
More information about the cfe-commits
mailing list