[PATCH] D53697: [ASTImporter][Structural Eq] Check for isBeingDefined
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 30 09:37:25 PDT 2018
martong marked 2 inline comments as done.
martong added a comment.
> I wonder if it is possible to get into situation where non-equivalent decls are marked equivalent with this patch? If yes, we can create a mapping between decls being imported and original decls as an alternative solution. However, I cannot find any counterexample.
I don't think so.
This change is the natural extension what we already do (in line 1021 and 1022) with `getDefinition()`.
`getDefinition()` works just as we would expect with a simple `RecordDecl`: `getDefinition()` returns a non-nullptr if `isBeingDefined()` is true.
However, `getDefinition()` may return a non-nullptr if `D` is a `CXXRecordDecl` even if `D` is being defined.
CXXRecordDecl *getDefinition() const {
// We only need an update if we don't already know which
// declaration is the definition.
auto *DD = DefinitionData ? DefinitionData : dataPtr();
return DD ? DD->Definition : nullptr;
}
This all depends on whether `DefinitionData` is set. And we do set that during `ImportDefinition(RecordDecl *,)`.
And then we start importing methods and fields of the `CXXRecordDecl` via `ImportDeclContext` before the call to `completeDefinition()` which sets `IsBeingDefined`.
During those imports, the `getDefinition()` of a `CXXRecordDecl` will return with a non-nullptr value and we would go on checking the fields, but we are in the middle of importing the fields (or methods).
================
Comment at: lib/AST/ASTStructuralEquivalence.cpp:1037
+ // equality and we assume that the decls are equal.
+ if (D1->isBeingDefined() || D2->isBeingDefined())
+ return true;
----------------
a_sidorin wrote:
> Is it worth it to assert if only one Decl should be in `isBeingDefined()` state at time?
Strictly speaking `D1` will always come from the "From" context and such it should report true for `isBeingDefined`. But the structural equivalence logic should be independent from the import logic ideally, so I would not add that assert.
================
Comment at: unittests/AST/ASTImporterTest.cpp:3729
+TEST_P(ASTImporterTestBase, ImportingTypedefShouldImportTheCompleteType) {
+ // We already have an incomplete underlying type in the "To" context.
----------------
a_sidorin wrote:
> Looks like this test is from another patch (D53693)?
Yes, exactly, good catch, I just removed it.
Repository:
rC Clang
https://reviews.llvm.org/D53697
More information about the cfe-commits
mailing list