forked from OSchip/llvm-project
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. llvm-svn: 97015
This commit is contained in:
parent
a396e617b5
commit
2996796972
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -40,3 +40,7 @@ Handler H = foo;
|
|||
void ctest3();
|
||||
void __attribute__((cdecl)) ctest3() {}
|
||||
|
||||
// PR6408
|
||||
typedef __attribute__((stdcall)) void (*PROC)();
|
||||
PROC __attribute__((cdecl)) ctest4(const char *x) {}
|
||||
|
||||
|
|
Loading…
Reference in New Issue