diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 26 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 6 |
2 files changed, 30 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 8b0ccd71460..8198856547c 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6456,7 +6456,9 @@ Decl *Sema::ActOnUsingDirective(Scope *S, Diag(IdentLoc, diag::err_expected_namespace_name) << SS.getRange(); } - // FIXME: We ignore attributes for now. + if (UDir) + ProcessDeclAttributeList(S, UDir, AttrList); + return UDir; } @@ -7172,6 +7174,7 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, MultiTemplateParamsArg TemplateParamLists, SourceLocation UsingLoc, UnqualifiedId &Name, + AttributeList *AttrList, TypeResult Type) { // Skip up to the relevant declaration scope. while (S->getFlags() & Scope::TemplateParamScope) @@ -7218,6 +7221,8 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, if (Invalid) NewTD->setInvalidDecl(); + ProcessDeclAttributeList(S, NewTD, AttrList); + CheckTypedefForVariablyModifiedType(S, NewTD); Invalid |= NewTD->isInvalidDecl(); @@ -10080,6 +10085,25 @@ Decl *Sema::ActOnFinishLinkageSpecification(Scope *S, return LinkageSpec; } +/// \brief Perform semantic checks on a C++11 attribute-declaration. +void Sema::ActOnAttributeDeclaration(AttributeList *AttrList) { + // FIXME: Build an AST node for an attribute declaration and return it. + + // Since we do not support any attributes which can be used in an attribute + // declaration, just diagnose standard and unknown attributes appropriately. + for (/**/; AttrList; AttrList = AttrList->getNext()) { + if (AttrList->getKind() == AttributeList::IgnoredAttribute || + AttrList->isInvalid()) + continue; + + Diag(AttrList->getLoc(), + AttrList->getKind() == AttributeList::UnknownAttribute + ? diag::warn_unknown_attribute_ignored + : diag::err_attribute_declaration) + << AttrList->getName(); + } +} + /// \brief Perform semantic analysis for the variable declaration that /// occurs within a C++ catch clause, returning the newly-created /// variable. diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index dcbaa5143cf..6d2ddd11d39 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3497,7 +3497,11 @@ TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) { // Make sure there are no unused decl attributes on the declarator. // We don't want to do this for ObjC parameters because we're going // to apply them to the actual parameter declaration. - if (D.getContext() != Declarator::ObjCParameterContext) + // Likewise, we don't want to do this for alias declarations, because + // we are actually going to build a declaration from this eventually. + if (D.getContext() != Declarator::ObjCParameterContext && + D.getContext() != Declarator::AliasDeclContext && + D.getContext() != Declarator::AliasTemplateContext) checkUnusedDeclAttributes(D); if (getLangOpts().CPlusPlus) { |