Author: David Stone Date: 2023-05-08T13:27:36-04:00 New Revision: 94252713f9a7fdeeb18a7e43a9d414ea09fc0c13
URL: https://github.com/llvm/llvm-project/commit/94252713f9a7fdeeb18a7e43a9d414ea09fc0c13 DIFF: https://github.com/llvm/llvm-project/commit/94252713f9a7fdeeb18a7e43a9d414ea09fc0c13.diff LOG: [clang][AST][NFC] Factor out check for structural equivalence of names. We have four places that we try to decide which name to use for the test for structural equivalence, and in each of those we evaluate getTypedefNameForAnonDecl twice. Pull out the check into a function to reduce duplication and evaluate things only once. Differential Revision: https://reviews.llvm.org/D149981 Added: Modified: clang/lib/AST/ASTStructuralEquivalence.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp index ba7dfc35edf2..a9470782c634 100644 --- a/clang/lib/AST/ASTStructuralEquivalence.cpp +++ b/clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1453,19 +1453,23 @@ static bool IsRecordContextStructurallyEquivalent(RecordDecl *D1, return true; } +static bool NameIsStructurallyEquivalent(const TagDecl &D1, const TagDecl &D2) { + auto GetName = [](const TagDecl &D) -> const IdentifierInfo * { + if (const IdentifierInfo *Name = D.getIdentifier()) + return Name; + if (const TypedefNameDecl *TypedefName = D.getTypedefNameForAnonDecl()) + return TypedefName->getIdentifier(); + return nullptr; + }; + return IsStructurallyEquivalent(GetName(D1), GetName(D2)); +} + /// Determine structural equivalence of two records. static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) { - - // Check for equivalent structure names. - IdentifierInfo *Name1 = D1->getIdentifier(); - if (!Name1 && D1->getTypedefNameForAnonDecl()) - Name1 = D1->getTypedefNameForAnonDecl()->getIdentifier(); - IdentifierInfo *Name2 = D2->getIdentifier(); - if (!Name2 && D2->getTypedefNameForAnonDecl()) - Name2 = D2->getTypedefNameForAnonDecl()->getIdentifier(); - if (!IsStructurallyEquivalent(Name1, Name2)) + if (!NameIsStructurallyEquivalent(*D1, *D2)) { return false; + } if (D1->isUnion() != D2->isUnion()) { if (Context.Complain) { @@ -1727,16 +1731,9 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, /// Determine structural equivalence of two enums. static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2) { - - // Check for equivalent enum names. - IdentifierInfo *Name1 = D1->getIdentifier(); - if (!Name1 && D1->getTypedefNameForAnonDecl()) - Name1 = D1->getTypedefNameForAnonDecl()->getIdentifier(); - IdentifierInfo *Name2 = D2->getIdentifier(); - if (!Name2 && D2->getTypedefNameForAnonDecl()) - Name2 = D2->getTypedefNameForAnonDecl()->getIdentifier(); - if (!IsStructurallyEquivalent(Name1, Name2)) + if (!NameIsStructurallyEquivalent(*D1, *D2)) { return false; + } // Compare the definitions of these two enums. If either or both are // incomplete (i.e. forward declared), we assume that they are equivalent. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits