[PATCH] D102640: [ASTimporter] Remove decl from lookup only if it has decl context
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 18 00:44:25 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rG88ee91cd8779: [ASTimporter] Remove decl from lookup only if it has decl context (authored by steakhal).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D102640/new/
https://reviews.llvm.org/D102640
Files:
clang/lib/AST/ASTImporter.cpp
clang/unittests/AST/ASTImporterTest.cpp
Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -5225,6 +5225,40 @@
EXPECT_TRUE(ImportedOK);
}
+TEST_P(ErrorHandlingTest, ODRViolationWithinTypedefDecls) {
+ // Importing `z` should fail - instead of crashing - due to an ODR violation.
+ // The `bar::e` typedef sets it's DeclContext after the import is done.
+ // However, if the importation fails, it will be left as a nullptr.
+ // During the cleanup of the failed import, we should check whether the
+ // DeclContext is null or not - instead of dereferencing that unconditionally.
+ constexpr auto ToTUCode = R"(
+ namespace X {
+ struct bar {
+ int odr_violation;
+ };
+ })";
+ constexpr auto FromTUCode = R"(
+ namespace X {
+ enum b {};
+ struct bar {
+ typedef b e;
+ static e d;
+ };
+ }
+ int z = X::bar::d;
+ )";
+ Decl *ToTU = getToTuDecl(ToTUCode, Lang_CXX11);
+ static_cast<void>(ToTU);
+ Decl *FromTU = getTuDecl(FromTUCode, Lang_CXX11);
+ auto *FromZ =
+ FirstDeclMatcher<VarDecl>().match(FromTU, varDecl(hasName("z")));
+ ASSERT_TRUE(FromZ);
+ ASSERT_TRUE(FromZ->hasInit());
+
+ auto *ImportedZ = Import(FromZ, Lang_CXX11);
+ EXPECT_FALSE(ImportedZ);
+}
+
// An error should be set for a class if it had a previous import with an error
// from another TU.
TEST_P(ErrorHandlingTest,
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -8383,7 +8383,11 @@
// traverse of the 'to' context).
auto PosF = ImportedFromDecls.find(ToD);
if (PosF != ImportedFromDecls.end()) {
- SharedState->removeDeclFromLookup(ToD);
+ // In the case of TypedefNameDecl we create the Decl first and only
+ // then we import and set its DeclContext. So, the DC might not be set
+ // when we reach here.
+ if (ToD->getDeclContext())
+ SharedState->removeDeclFromLookup(ToD);
ImportedFromDecls.erase(PosF);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102640.346067.patch
Type: text/x-patch
Size: 2235 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210518/c323a843/attachment-0001.bin>
More information about the cfe-commits
mailing list