diff options
author | Charles Davis <cdavis@mines.edu> | 2010-02-24 02:27:18 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2010-02-24 02:27:18 +0000 |
commit | 328ce34c7d0c4e8696d352853b48b385dec1fef4 (patch) | |
tree | 14ff6b20de58b24c765b797c081fb1870266ca4f /lib/Sema/SemaType.cpp | |
parent | 910716678e8af41432f3dfb16b340168597f8c45 (diff) |
When we encounter a function-specific attribute in a declaration specifier,
apply it only to the function itself, and never to the return type. Fixes part
of PR6408.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97015 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaType.cpp')
-rw-r--r-- | lib/Sema/SemaType.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index f5e6bef719..2fb5c84ac9 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -72,6 +72,7 @@ typedef std::pair<const AttributeList*,QualType> DelayedAttribute; typedef llvm::SmallVectorImpl<DelayedAttribute> DelayedAttributeSet; static void ProcessTypeAttributeList(Sema &S, QualType &Type, + bool IsDeclSpec, const AttributeList *Attrs, DelayedAttributeSet &DelayedFnAttrs); static bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr); @@ -385,7 +386,7 @@ static QualType ConvertDeclSpecToType(Sema &TheSema, // See if there are any attributes on the declspec that apply to the type (as // opposed to the decl). if (const AttributeList *AL = DS.getAttributes()) - ProcessTypeAttributeList(TheSema, Result, AL, Delayed); + ProcessTypeAttributeList(TheSema, Result, true, AL, Delayed); // Apply const/volatile/restrict qualifiers to T. if (unsigned TypeQuals = DS.getTypeQualifiers()) { @@ -1297,7 +1298,7 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, // See if there are any attributes on this declarator chunk. if (const AttributeList *AL = DeclType.getAttrs()) - ProcessTypeAttributeList(*this, T, AL, FnAttrsFromPreviousChunk); + ProcessTypeAttributeList(*this, T, false, AL, FnAttrsFromPreviousChunk); } if (getLangOptions().CPlusPlus && T->isFunctionType()) { @@ -1337,7 +1338,8 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, // block-literal expressions, which are parsed wierdly. if (D.getContext() != Declarator::BlockLiteralContext) if (const AttributeList *Attrs = D.getAttributes()) - ProcessTypeAttributeList(*this, T, Attrs, FnAttrsFromPreviousChunk); + ProcessTypeAttributeList(*this, T, false, Attrs, + FnAttrsFromPreviousChunk); DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk); @@ -1834,7 +1836,7 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr, S } void ProcessTypeAttributeList(Sema &S, QualType &Result, - const AttributeList *AL, + bool IsDeclSpec, const AttributeList *AL, DelayedAttributeSet &FnAttrs) { // Scan through and apply attributes to this type where it makes sense. Some // attributes (such as __address_space__, __vector_size__, etc) apply to the @@ -1860,7 +1862,9 @@ void ProcessTypeAttributeList(Sema &S, QualType &Result, case AttributeList::AT_cdecl: case AttributeList::AT_fastcall: case AttributeList::AT_stdcall: - if (ProcessFnAttr(S, Result, *AL)) + // Don't process these on the DeclSpec. + if (IsDeclSpec || + ProcessFnAttr(S, Result, *AL)) FnAttrs.push_back(DelayedAttribute(AL, Result)); break; } |