diff --git a/clang/lib/Sema/TargetAttributesSema.cpp b/clang/lib/Sema/TargetAttributesSema.cpp index 1ea029910345..35e42fb696b7 100644 --- a/clang/lib/Sema/TargetAttributesSema.cpp +++ b/clang/lib/Sema/TargetAttributesSema.cpp @@ -87,7 +87,8 @@ static void HandleX86ForceAlignArgPointerAttr(Decl *D, return; // Also don't warn on function pointer typedefs. TypedefDecl *TD = dyn_cast(D); - if (TD && TD->getUnderlyingType()->isFunctionPointerType()) + if (TD && (TD->getUnderlyingType()->isFunctionPointerType() || + TD->getUnderlyingType()->isFunctionType())) return; // Attribute can only be applied to function types. if (!isa(D)) { diff --git a/clang/test/Sema/x86-attr-force-align-arg-pointer.c b/clang/test/Sema/x86-attr-force-align-arg-pointer.c index 5c7582fe0fac..b406a77e044c 100644 --- a/clang/test/Sema/x86-attr-force-align-arg-pointer.c +++ b/clang/test/Sema/x86-attr-force-align-arg-pointer.c @@ -16,4 +16,6 @@ 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)(); +// Attribute is also ignored on function typedefs. +typedef void __attribute__((force_align_arg_pointer)) e(void);