diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2018-03-08 07:34:40 +0000 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2018-03-08 07:34:40 +0000 |
commit | 0feb0b9059792596e8386d030fa3d0aed9527798 (patch) | |
tree | 320adaa17876e2c69cec839e128cb7937e4c3010 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 5bbcca6967acfdfd845cddeec4123ea0be3388e0 (diff) | |
download | bcm5719-llvm-0feb0b9059792596e8386d030fa3d0aed9527798.tar.gz bcm5719-llvm-0feb0b9059792596e8386d030fa3d0aed9527798.zip |
Propagate DLLAttr to friend re-declarations of member functions
...that have already been constructed (e.g., in inner classes) while parsing the
class definition. They would otherwise lack any DLLAttr inherited from the
class, which are only set here (called from Sema::CheckCompletedClass) after the
class definition has been parsed completely.
Differential revision: https://reviews.llvm.org/D16632
llvm-svn: 326990
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 51ba96fb1e8..9e3647548be 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5685,6 +5685,21 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) { cast<InheritableAttr>(ClassAttr->clone(getASTContext())); NewAttr->setInherited(true); Member->addAttr(NewAttr); + + if (MD) { + // Propagate DLLAttr to friend re-declarations of MD that have already + // been constructed. + for (FunctionDecl *FD = MD->getMostRecentDecl(); FD; + FD = FD->getPreviousDecl()) { + if (FD->getFriendObjectKind() == Decl::FOK_None) + continue; + assert(!getDLLAttr(FD) && + "friend re-decl should not already have a DLLAttr"); + NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext())); + NewAttr->setInherited(true); + FD->addAttr(NewAttr); + } + } } } |