Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -5292,17 +5292,29 @@ // Attributes should be placed after tag to apply to type declaration. if (!DS.getAttributes().empty() || !DeclAttrs.empty()) { DeclSpec::TST TypeSpecType = DS.getTypeSpecType(); + auto WarnAttributeIgnored = [this, TypeSpecType](const ParsedAttr &AL) { + if (AL.isAlignasAttribute()) { + // Don't use the message with placement with _Alignas. + // This is because C doesnt let you use _Alignas on type declarations. + Diag(AL.getLoc(), diag::warn_attribute_ignored) + << GetDiagnosticTypeSpecifierID(TypeSpecType); + } else { + Diag(AL.getLoc(), diag::warn_declspec_attribute_ignored) + << AL << GetDiagnosticTypeSpecifierID(TypeSpecType); + } + }; + if (TypeSpecType == DeclSpec::TST_class || TypeSpecType == DeclSpec::TST_struct || TypeSpecType == DeclSpec::TST_interface || TypeSpecType == DeclSpec::TST_union || TypeSpecType == DeclSpec::TST_enum) { - for (const ParsedAttr &AL : DS.getAttributes()) - Diag(AL.getLoc(), diag::warn_declspec_attribute_ignored) - << AL << GetDiagnosticTypeSpecifierID(TypeSpecType); - for (const ParsedAttr &AL : DeclAttrs) - Diag(AL.getLoc(), diag::warn_declspec_attribute_ignored) - << AL << GetDiagnosticTypeSpecifierID(TypeSpecType); + for (const ParsedAttr &AL : DS.getAttributes()) { + WarnAttributeIgnored(AL); + } + for (const ParsedAttr &AL : DeclAttrs) { + WarnAttributeIgnored(AL); + } } } Index: clang/test/C/drs/dr4xx.c =================================================================== --- clang/test/C/drs/dr4xx.c +++ clang/test/C/drs/dr4xx.c @@ -164,11 +164,7 @@ /* FIXME: This should be accepted as per this DR. */ int j = (_Alignas(int) int){12}; /* expected-error {{expected expression}} */ - /* FIXME: The diagnostic in this case is really bad; moving the specifier to - * where the diagnostic recommends causes a different, more inscrutable error - * about anonymous structures. - */ - _Alignas(int) struct T { /* expected-warning {{attribute '_Alignas' is ignored, place it after "struct" to apply attribute to type declaration}} */ + _Alignas(int) struct T { /* expected-warning {{1 attribute ignored}} */ int i; }; Index: clang/test/Parser/c1x-alignas.c =================================================================== --- clang/test/Parser/c1x-alignas.c +++ clang/test/Parser/c1x-alignas.c @@ -9,5 +9,7 @@ char _Alignas(_Alignof(int)) c5; +_Alignas(int) struct c6; // expected-warning {{1 attribute ignored}} + // CHECK-EXT: '_Alignas' is a C11 extension // CHECK-EXT: '_Alignof' is a C11 extension