diff options
| author | Erik Verbruggen <erikjv@me.com> | 2011-10-13 09:41:32 +0000 |
|---|---|---|
| committer | Erik Verbruggen <erikjv@me.com> | 2011-10-13 09:41:32 +0000 |
| commit | ca98f2a63f94d83860b264c365cf5c5d3f64678b (patch) | |
| tree | b0fda2fa66f0d4922a93be6328ed2cb1401efc4e /clang/lib/Sema | |
| parent | 25f6d3e32186fde2e89ed278c94c05ad82e563eb (diff) | |
| download | bcm5719-llvm-ca98f2a63f94d83860b264c365cf5c5d3f64678b.tar.gz bcm5719-llvm-ca98f2a63f94d83860b264c365cf5c5d3f64678b.zip | |
Allow for annotate attributes after access specifiers. When such
attributes are found, propagate them to subsequent declarations.
llvm-svn: 141861
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 9 |
2 files changed, 21 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index f76bb5879ac..69baf79ad0f 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3743,6 +3743,22 @@ void Sema::ProcessDeclAttributeList(Scope *S, Decl *D, } } +// Annotation attributes are the only attributes allowed after an access +// specifier. +bool Sema::ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, + const AttributeList *AttrList) { + for (const AttributeList* l = AttrList; l; l = l->getNext()) { + if (l->getKind() == AttributeList::AT_annotate) { + handleAnnotateAttr(*this, ASDecl, *l); + } else { + Diag(l->getLoc(), diag::err_only_annotate_after_access_spec); + return true; + } + } + + return false; +} + /// checkUnusedDeclAttributes - Check a list of attributes to see if it /// contains any decl attributes that we should warn about. static void checkUnusedDeclAttributes(Sema &S, const AttributeList *A) { diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 32da8cbb108..a39584a107a 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1376,14 +1376,15 @@ std::string Sema::getAmbiguousPathsDisplayString(CXXBasePaths &Paths) { //===----------------------------------------------------------------------===// /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon. -Decl *Sema::ActOnAccessSpecifier(AccessSpecifier Access, - SourceLocation ASLoc, - SourceLocation ColonLoc) { +bool Sema::ActOnAccessSpecifier(AccessSpecifier Access, + SourceLocation ASLoc, + SourceLocation ColonLoc, + AttributeList *Attrs) { assert(Access != AS_none && "Invalid kind for syntactic access specifier!"); AccessSpecDecl *ASDecl = AccessSpecDecl::Create(Context, Access, CurContext, ASLoc, ColonLoc); CurContext->addHiddenDecl(ASDecl); - return ASDecl; + return ProcessAccessDeclAttributeList(ASDecl, Attrs); } /// CheckOverrideControl - Check C++0x override control semantics. |

