[PATCH] D149981: [clang][AST][NFC] Factor out check for structural equivalence of names.
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG94252713f9a7: [clang][AST][NFC] Factor out check for structural equivalence of names. (authored by davidstone, committed by aaron.ballman). Changed prior to commit: https://reviews.llvm.org/D149981?vs=519945&id=520434#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D149981/new/ https://reviews.llvm.org/D149981 Files: clang/lib/AST/ASTStructuralEquivalence.cpp Index: clang/lib/AST/ASTStructuralEquivalence.cpp === --- clang/lib/AST/ASTStructuralEquivalence.cpp +++ clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1453,19 +1453,23 @@ 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 @@ /// 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. Index: clang/lib/AST/ASTStructuralEquivalence.cpp === --- clang/lib/AST/ASTStructuralEquivalence.cpp +++ clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1453,19 +1453,23 @@ 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 @@ /// 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 (!Nam
[PATCH] D149981: [clang][AST][NFC] Factor out check for structural equivalence of names.
aaron.ballman accepted this revision. aaron.ballman added a comment. This revision is now accepted and ready to land. LGTM! I'll fix up the nits when I land on your behalf. Comment at: clang/lib/AST/ASTStructuralEquivalence.cpp:1456-1467 +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(); Minor nits for our weird coding style. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D149981/new/ https://reviews.llvm.org/D149981 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D149981: [clang][AST][NFC] Factor out check for structural equivalence of names.
davidstone created this revision. Herald added a subscriber: martong. Herald added a project: All. davidstone requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. 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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D149981 Files: clang/lib/AST/ASTStructuralEquivalence.cpp Index: clang/lib/AST/ASTStructuralEquivalence.cpp === --- clang/lib/AST/ASTStructuralEquivalence.cpp +++ clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1453,19 +1453,25 @@ 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 +1733,9 @@ /// 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. Index: clang/lib/AST/ASTStructuralEquivalence.cpp === --- clang/lib/AST/ASTStructuralEquivalence.cpp +++ clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1453,19 +1453,25 @@ 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 +1733,9 @@ /// 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()->getId