[cfe-commits] r97015 - in /cfe/trunk: lib/Sema/SemaType.cpp test/Sema/callingconv.c

Charles Davis cdavis at mines.edu
Tue Feb 23 18:27:18 PST 2010


Author: cdavis
Date: Tue Feb 23 20:27:18 2010
New Revision: 97015

URL: http://llvm.org/viewvc/llvm-project?rev=97015&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Sema/SemaType.cpp
    cfe/trunk/test/Sema/callingconv.c

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=97015&r1=97014&r2=97015&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Tue Feb 23 20:27:18 2010
@@ -72,6 +72,7 @@
 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 @@
   // 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 @@
 
     // 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 @@
   // 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 @@
 }
 
 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 @@
     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;
     }

Modified: cfe/trunk/test/Sema/callingconv.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv.c?rev=97015&r1=97014&r2=97015&view=diff
==============================================================================
--- cfe/trunk/test/Sema/callingconv.c (original)
+++ cfe/trunk/test/Sema/callingconv.c Tue Feb 23 20:27:18 2010
@@ -40,3 +40,7 @@
 void ctest3();
 void __attribute__((cdecl)) ctest3() {}
 
+// PR6408
+typedef __attribute__((stdcall)) void (*PROC)();
+PROC __attribute__((cdecl)) ctest4(const char *x) {}
+





More information about the cfe-commits mailing list