diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-05-31 02:08:49 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-05-31 02:08:49 +0000 |
commit | 496524b4484bce312c7885dab25846e69498727f (patch) | |
tree | 72b6c2b4c9090368acb1e72ffb6768318f3ef97c /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 228166a4ca07bc5bb87b2097fc947e1c262b06a5 (diff) | |
download | bcm5719-llvm-496524b4484bce312c7885dab25846e69498727f.tar.gz bcm5719-llvm-496524b4484bce312c7885dab25846e69498727f.zip |
Diagnose dll attribute on member of class that already has a dll attribute
Differential Revision: http://reviews.llvm.org/D3973
llvm-svn: 209954
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 48c2c5d3559..8a40a2e15a8 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4377,16 +4377,25 @@ static void checkDLLAttribute(Sema &S, CXXRecordDecl *Class) { // specialization bases. for (Decl *Member : Class->decls()) { - if (getDLLAttr(Member)) { - // FIXME: Error about importing/exporting individual members. - } - if (!isa<CXXMethodDecl>(Member) && !isa<VarDecl>(Member)) continue; - auto *NewAttr = cast<InheritableAttr>(ClassAttr->clone(S.getASTContext())); - NewAttr->setInherited(true); - Member->addAttr(NewAttr); + if (InheritableAttr *MemberAttr = getDLLAttr(Member)) { + if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() && + !MemberAttr->isInherited()) { + S.Diag(MemberAttr->getLocation(), + diag::err_attribute_dll_member_of_dll_class) + << MemberAttr << ClassAttr; + S.Diag(ClassAttr->getLocation(), diag::note_previous_attribute); + Member->setInvalidDecl(); + continue; + } + } else { + auto *NewAttr = + cast<InheritableAttr>(ClassAttr->clone(S.getASTContext())); + NewAttr->setInherited(true); + Member->addAttr(NewAttr); + } if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member)) { if (ClassExported) { |