return false;
// Compare the definitions of these two records. If either or both are
- // incomplete (i.e. it is a forward decl), we assume that they are
- // equivalent.
+ // incomplete, we assume that they are equivalent.
D1 = D1->getDefinition();
D2 = D2->getDefinition();
if (!D1 || !D2)
if (D1->hasExternalLexicalStorage() || D2->hasExternalLexicalStorage())
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 *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
if (D1CXX->hasExternalLexicalStorage() &&
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,
::testing::Values(ArgVector()), );