mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-13 10:42:05 +00:00
[ASTImporter][Structural Eq] Check for isBeingDefined
Summary: If one definition is currently being defined, we do not compare for equality and we assume that the decls are equal. Reviewers: a_sidorin, a.sidorin, shafik Reviewed By: a_sidorin Subscribers: gamesh411, shafik, rnkovacs, dkrupp, Szelethus, cfe-commits Differential Revision: https://reviews.llvm.org/D53697 llvm-svn: 347564
This commit is contained in:
parent
4d3d82eef9
commit
17d39677e0
@ -1740,8 +1740,9 @@ Error ASTNodeImporter::ImportDefinition(
|
|||||||
return Err;
|
return Err;
|
||||||
|
|
||||||
// Add base classes.
|
// Add base classes.
|
||||||
if (auto *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
|
auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
|
||||||
auto *FromCXX = cast<CXXRecordDecl>(From);
|
auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
|
||||||
|
if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
|
||||||
|
|
||||||
struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
|
struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
|
||||||
struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
|
struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
|
||||||
|
@ -1016,7 +1016,8 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Compare the definitions of these two records. If either or both are
|
// Compare the definitions of these two records. If either or both are
|
||||||
// incomplete, we assume that they are equivalent.
|
// incomplete (i.e. it is a forward decl), we assume that they are
|
||||||
|
// equivalent.
|
||||||
D1 = D1->getDefinition();
|
D1 = D1->getDefinition();
|
||||||
D2 = D2->getDefinition();
|
D2 = D2->getDefinition();
|
||||||
if (!D1 || !D2)
|
if (!D1 || !D2)
|
||||||
@ -1031,6 +1032,11 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
|
|||||||
if (D1->hasExternalLexicalStorage() || D2->hasExternalLexicalStorage())
|
if (D1->hasExternalLexicalStorage() || D2->hasExternalLexicalStorage())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// If one definition is currently being defined, we do not compare for
|
||||||
|
// equality and we assume that the decls are equal.
|
||||||
|
if (D1->isBeingDefined() || D2->isBeingDefined())
|
||||||
|
return true;
|
||||||
|
|
||||||
if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
|
if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
|
||||||
if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
|
if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
|
||||||
if (D1CXX->hasExternalLexicalStorage() &&
|
if (D1CXX->hasExternalLexicalStorage() &&
|
||||||
|
@ -3725,6 +3725,45 @@ TEST_P(ImportFunctionTemplateSpecializations, DefinitionThenPrototype) {
|
|||||||
EXPECT_EQ(To1->getPreviousDecl(), To0);
|
EXPECT_EQ(To1->getPreviousDecl(), To0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(ASTImporterTestBase,
|
||||||
|
ImportShouldNotReportFalseODRErrorWhenRecordIsBeingDefined) {
|
||||||
|
{
|
||||||
|
Decl *FromTU = getTuDecl(
|
||||||
|
R"(
|
||||||
|
template <typename T>
|
||||||
|
struct B;
|
||||||
|
)",
|
||||||
|
Lang_CXX, "input0.cc");
|
||||||
|
auto *FromD = FirstDeclMatcher<ClassTemplateDecl>().match(
|
||||||
|
FromTU, classTemplateDecl(hasName("B")));
|
||||||
|
|
||||||
|
Import(FromD, Lang_CXX);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Decl *FromTU = getTuDecl(
|
||||||
|
R"(
|
||||||
|
template <typename T>
|
||||||
|
struct B {
|
||||||
|
void f();
|
||||||
|
B* b;
|
||||||
|
};
|
||||||
|
)",
|
||||||
|
Lang_CXX, "input1.cc");
|
||||||
|
FunctionDecl *FromD = FirstDeclMatcher<FunctionDecl>().match(
|
||||||
|
FromTU, functionDecl(hasName("f")));
|
||||||
|
Import(FromD, Lang_CXX);
|
||||||
|
auto *FromCTD = FirstDeclMatcher<ClassTemplateDecl>().match(
|
||||||
|
FromTU, classTemplateDecl(hasName("B")));
|
||||||
|
auto *ToCTD = cast<ClassTemplateDecl>(Import(FromCTD, Lang_CXX));
|
||||||
|
EXPECT_TRUE(ToCTD->isThisDeclarationADefinition());
|
||||||
|
|
||||||
|
// We expect no (ODR) warning during the import.
|
||||||
|
auto *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
|
||||||
|
EXPECT_EQ(0u, ToTU->getASTContext().getDiagnostics().getNumWarnings());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(ParameterizedTests, DeclContextTest,
|
INSTANTIATE_TEST_CASE_P(ParameterizedTests, DeclContextTest,
|
||||||
::testing::Values(ArgVector()), );
|
::testing::Values(ArgVector()), );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user