Author: Reid Kleckner Date: 2021-08-11T11:42:20-07:00 New Revision: 718c63258202e8e674c47c9ece16f396065e7c2a
URL: https://github.com/llvm/llvm-project/commit/718c63258202e8e674c47c9ece16f396065e7c2a DIFF: https://github.com/llvm/llvm-project/commit/718c63258202e8e674c47c9ece16f396065e7c2a.diff LOG: Simplify dllexport class member code, NFC We can hoist the check for the dllexport attribute to before the check if this is a static data member or method. Added: Modified: clang/lib/Sema/SemaDeclCXX.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 112722be2fa1..38f21c8ec47c 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5983,11 +5983,14 @@ static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) { S.MarkVTableUsed(Class->getLocation(), Class, true); for (Decl *Member : Class->decls()) { + // Skip members that were not marked exported. + if (!Member->hasAttr<DLLExportAttr>()) + continue; + // Defined static variables that are members of an exported base // class must be marked export too. auto *VD = dyn_cast<VarDecl>(Member); - if (VD && Member->getAttr<DLLExportAttr>() && - VD->getStorageClass() == SC_Static && + if (VD && VD->getStorageClass() == SC_Static && TSK == TSK_ImplicitInstantiation) S.MarkVariableReferenced(VD->getLocation(), VD); @@ -5995,40 +5998,38 @@ static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) { if (!MD) continue; - if (Member->getAttr<DLLExportAttr>()) { - if (MD->isUserProvided()) { - // Instantiate non-default class member functions ... + if (MD->isUserProvided()) { + // Instantiate non-default class member functions ... - // .. except for certain kinds of template specializations. - if (TSK == TSK_ImplicitInstantiation && !ClassAttr->isInherited()) - continue; + // .. except for certain kinds of template specializations. + if (TSK == TSK_ImplicitInstantiation && !ClassAttr->isInherited()) + continue; - S.MarkFunctionReferenced(Class->getLocation(), MD); + S.MarkFunctionReferenced(Class->getLocation(), MD); - // The function will be passed to the consumer when its definition is - // encountered. - } else if (MD->isExplicitlyDefaulted()) { - // Synthesize and instantiate explicitly defaulted methods. - S.MarkFunctionReferenced(Class->getLocation(), MD); + // The function will be passed to the consumer when its definition is + // encountered. + } else if (MD->isExplicitlyDefaulted()) { + // Synthesize and instantiate explicitly defaulted methods. + S.MarkFunctionReferenced(Class->getLocation(), MD); - if (TSK != TSK_ExplicitInstantiationDefinition) { - // Except for explicit instantiation defs, we will not see the - // definition again later, so pass it to the consumer now. - S.Consumer.HandleTopLevelDecl(DeclGroupRef(MD)); - } - } else if (!MD->isTrivial() || - MD->isCopyAssignmentOperator() || - MD->isMoveAssignmentOperator()) { - // Synthesize and instantiate non-trivial implicit methods, and the copy - // and move assignment operators. The latter are exported even if they - // are trivial, because the address of an operator can be taken and - // should compare equal across libraries. - S.MarkFunctionReferenced(Class->getLocation(), MD); - - // There is no later point when we will see the definition of this - // function, so pass it to the consumer now. + if (TSK != TSK_ExplicitInstantiationDefinition) { + // Except for explicit instantiation defs, we will not see the + // definition again later, so pass it to the consumer now. S.Consumer.HandleTopLevelDecl(DeclGroupRef(MD)); } + } else if (!MD->isTrivial() || + MD->isCopyAssignmentOperator() || + MD->isMoveAssignmentOperator()) { + // Synthesize and instantiate non-trivial implicit methods, and the copy + // and move assignment operators. The latter are exported even if they + // are trivial, because the address of an operator can be taken and + // should compare equal across libraries. + S.MarkFunctionReferenced(Class->getLocation(), MD); + + // There is no later point when we will see the definition of this + // function, so pass it to the consumer now. + S.Consumer.HandleTopLevelDecl(DeclGroupRef(MD)); } } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits