]> granicus.if.org Git - clang/commitdiff
Two fixes related to force_align_arg_pointer:
authorCharles Davis <cdavis@mines.edu>
Thu, 18 Feb 2010 04:39:19 +0000 (04:39 +0000)
committerCharles Davis <cdavis@mines.edu>
Thu, 18 Feb 2010 04:39:19 +0000 (04:39 +0000)
- Also recognize __force_align_arg_pointer__.
- Don't warn if it's used on a function pointer typedef.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96568 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TargetAttributesSema.cpp
test/Sema/x86-attr-force-align-arg-pointer.c

index 76cff1f31518aab11e748e55767da4f77ea0e6aa..1ea0299103457569e1c1b08f44883a11d920d17a 100644 (file)
@@ -82,9 +82,13 @@ static void HandleX86ForceAlignArgPointerAttr(Decl *D,
   // If we try to apply it to a function pointer, don't warn, but don't
   // do anything, either. It doesn't matter anyway, because there's nothing
   // special about calling a force_align_arg_pointer function.
-  ValueDeclVD = dyn_cast<ValueDecl>(D);
+  ValueDecl *VD = dyn_cast<ValueDecl>(D);
   if (VD && VD->getType()->isFunctionPointerType())
     return;
+  // Also don't warn on function pointer typedefs.
+  TypedefDecl *TD = dyn_cast<TypedefDecl>(D);
+  if (TD && TD->getUnderlyingType()->isFunctionPointerType())
+    return;
   // Attribute can only be applied to function types.
   if (!isa<FunctionDecl>(D)) {
     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
@@ -189,7 +193,8 @@ namespace {
         default:                          break;
         }
       }
-      if (Attr.getName()->getName() == "force_align_arg_pointer") {
+      if (Attr.getName()->getName() == "force_align_arg_pointer" ||
+          Attr.getName()->getName() == "__force_align_arg_pointer__") {
         HandleX86ForceAlignArgPointerAttr(D, Attr, S);
         return true;
       }
index 1470544a69719fc95a8123768eb71612a102a37e..5c7582fe0fac9ab3c5a8087979c388eb361c8265 100644 (file)
@@ -15,4 +15,5 @@ void __attribute__((force_align_arg_pointer)) d(void) {}
 
 // Attribute is ignored on function pointer types.
 void (__attribute__((force_align_arg_pointer)) *p)();
+typedef void (__attribute__((__force_align_arg_pointer__)) *p2)();