Author: Raphael Isemann Date: 2021-10-30T13:12:12+02:00 New Revision: 01b3bd3992b4b79ef103558eccc49981e97be479
URL: https://github.com/llvm/llvm-project/commit/01b3bd3992b4b79ef103558eccc49981e97be479 DIFF: https://github.com/llvm/llvm-project/commit/01b3bd3992b4b79ef103558eccc49981e97be479.diff LOG: [ASTImporter] Remove ASTNodeImporter::IsStructuralMatch overload for EnumConstantDecl 1. Moves the check to ASTStructuralEquivalence.cpp like all the other checks. 2. Adds the missing checks for identifier and init expression. Also add the respective tests for that stuff. Reviewed By: martong Differential Revision: https://reviews.llvm.org/D112804 Added: Modified: clang/lib/AST/ASTImporter.cpp clang/lib/AST/ASTStructuralEquivalence.cpp clang/unittests/AST/StructuralEquivalenceTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 183849c86f01c..8062b4fcab532 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -468,7 +468,6 @@ namespace clang { bool hasSameVisibilityContextAndLinkage(T *Found, T *From); bool IsStructuralMatch(Decl *From, Decl *To, bool Complain = true); - bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); ExpectedDecl VisitDecl(Decl *D); ExpectedDecl VisitImportDecl(ImportDecl *D); ExpectedDecl VisitEmptyDecl(EmptyDecl *D); @@ -2182,16 +2181,6 @@ bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) { return Ctx.IsEquivalent(From, To); } -bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, - EnumConstantDecl *ToEC) { - const llvm::APSInt &FromVal = FromEC->getInitVal(); - const llvm::APSInt &ToVal = ToEC->getInitVal(); - - return FromVal.isSigned() == ToVal.isSigned() && - FromVal.getBitWidth() == ToVal.getBitWidth() && - FromVal == ToVal; -} - ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) { Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) << D->getDeclKindName(); diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp index c4ff05ba9325d..e85feb779190f 100644 --- a/clang/lib/AST/ASTStructuralEquivalence.cpp +++ b/clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1591,6 +1591,26 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, return true; } +static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, + EnumConstantDecl *D1, + EnumConstantDecl *D2) { + const llvm::APSInt &FromVal = D1->getInitVal(); + const llvm::APSInt &ToVal = D2->getInitVal(); + if (FromVal.isSigned() != ToVal.isSigned()) + return false; + if (FromVal.getBitWidth() != ToVal.getBitWidth()) + return false; + if (FromVal != ToVal) + return false; + + if (!IsStructurallyEquivalent(D1->getIdentifier(), D2->getIdentifier())) + return false; + + // Init expressions are the most expensive check, so do them last. + return IsStructurallyEquivalent(Context, D1->getInitExpr(), + D2->getInitExpr()); +} + /// Determine structural equivalence of two enums. static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2) { diff --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp index d416e9d301274..9ae0da8b9dd2c 100644 --- a/clang/unittests/AST/StructuralEquivalenceTest.cpp +++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp @@ -956,6 +956,48 @@ TEST_F(StructuralEquivalenceEnumTest, EnumsWithDifferentBody) { EXPECT_FALSE(testStructuralMatch(t)); } +struct StructuralEquivalenceEnumConstantTest : StructuralEquivalenceTest {}; + +TEST_F(StructuralEquivalenceEnumConstantTest, EnumConstantsWithSameValues) { + auto t = makeNamedDecls("enum foo { foo = 1 };", "enum foo { foo = 1 };", + Lang_C89); + EXPECT_TRUE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceEnumConstantTest, + EnumConstantsWithDifferentValues) { + auto t = + makeNamedDecls("enum e { foo = 1 };", "enum e { foo = 2 };", Lang_C89); + EXPECT_FALSE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceEnumConstantTest, + EnumConstantsWithDifferentExprsButSameValues) { + auto t = makeNamedDecls("enum e { foo = 1 + 1 };", "enum e { foo = 2 };", + Lang_CXX11); + EXPECT_FALSE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceEnumConstantTest, + EnumConstantsWithDifferentSignedness) { + auto t = makeNamedDecls("enum e : unsigned { foo = 1 };", + "enum e : int { foo = 1 };", Lang_CXX11); + EXPECT_FALSE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceEnumConstantTest, EnumConstantsWithDifferentWidth) { + auto t = makeNamedDecls("enum e : short { foo = 1 };", + "enum e : int { foo = 1 };", Lang_CXX11); + EXPECT_FALSE(testStructuralMatch(t)); +} + +TEST_F(StructuralEquivalenceEnumConstantTest, EnumConstantsWithDifferentName) { + auto t = + makeDecls<EnumConstantDecl>("enum e { foo = 1 };", "enum e { bar = 1 };", + Lang_CXX11, enumConstantDecl()); + EXPECT_FALSE(testStructuralMatch(t)); +} + struct StructuralEquivalenceTemplateTest : StructuralEquivalenceTest {}; TEST_F(StructuralEquivalenceTemplateTest, ExactlySameTemplates) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits