[clang] 718c632 - Simplify dllexport class member code, NFC
Reid Kleckner via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 11 11:48:39 PDT 2021
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));
}
}
}
More information about the cfe-commits
mailing list