summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2014-05-31 02:08:49 +0000
committerHans Wennborg <hans@hanshq.net>2014-05-31 02:08:49 +0000
commit496524b4484bce312c7885dab25846e69498727f (patch)
tree72b6c2b4c9090368acb1e72ffb6768318f3ef97c /clang/lib/Sema/SemaDeclCXX.cpp
parent228166a4ca07bc5bb87b2097fc947e1c262b06a5 (diff)
downloadbcm5719-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.cpp23
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) {
OpenPOWER on IntegriCloud