On 24.11.2014 20:21, Aaron Ballman wrote: > When I compile with MSVC 2013, this example gives me: > > main.cpp(5): warning C4228: nonstandard extension used : qualifiers > after comma in declarator list are ignored
I've noticed the SDK headers explicitly silence this warning, so this shouldn't actually add any attributes. > Why not handle other type qualifiers that Microsoft supports? Does > that turn out to be messy for some reason? It seems like we could just > call Parser::ParseMicrosoftTypeAttributes? I've looked further into this. MSVC also accepts const and volatile there and these keywords should just be ignored. So ParseMicrosoftTypeAttributes doesn't quite fit. This also deserves a warning. I've updated the patch accordingly and split this extension into a separate commit. --Nico
From bc4acc23a156622addafc3fc824181bfe8f9680d Mon Sep 17 00:00:00 2001 From: Nico Rieck <[email protected]> Date: Mon, 24 Nov 2014 22:35:13 +0100 Subject: [PATCH] Recognize __unaligned keyword after type specifier The __unaligned keyword can appear after a struct definition: struct foo {...} __unaligned *x; --- lib/Parse/ParseDeclCXX.cpp | 1 + test/SemaCXX/MicrosoftExtensions.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 79ae878..85f6303 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1095,6 +1095,7 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { case tok::kw_volatile: // struct foo {...} volatile x; case tok::kw_restrict: // struct foo {...} restrict x; case tok::kw__Atomic: // struct foo {...} _Atomic x; + case tok::kw___unaligned: // struct foo {...} __unaligned *x; // Function specifiers // Note, no 'explicit'. An explicit function must be either a conversion // operator or a constructor. Either way, it can't have a return type. diff --git a/test/SemaCXX/MicrosoftExtensions.cpp b/test/SemaCXX/MicrosoftExtensions.cpp index ec3dfce..57d6f0d 100644 --- a/test/SemaCXX/MicrosoftExtensions.cpp +++ b/test/SemaCXX/MicrosoftExtensions.cpp @@ -79,6 +79,7 @@ struct M { // __unaligned handling typedef char __unaligned *aligned_type; +typedef struct UnalignedTag { int f; } __unaligned *aligned_type2; template<typename T> void h1(T (__stdcall M::* const )()) { } -- 1.9.4.msysgit.2
From bbd0ac5b77ec8a9e62458345cd3598c7950c2e07 Mon Sep 17 00:00:00 2001 From: Nico Rieck <[email protected]> Date: Mon, 24 Nov 2014 22:53:19 +0100 Subject: [PATCH] Parse qualifiers after comma in declarator lists as a Microsoft extension MSVC parses and ignores these with a warning. --- include/clang/Basic/DiagnosticParseKinds.td | 2 ++ include/clang/Parse/Parser.h | 1 + lib/Parse/ParseDecl.cpp | 28 ++++++++++++++++++++++++++++ test/Parser/MicrosoftExtensions.c | 8 ++++++++ test/Parser/MicrosoftExtensions.cpp | 8 ++++++++ 5 files changed, 47 insertions(+) diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 6bf1910..106b716 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -108,6 +108,8 @@ def ext_alignof_expr : ExtWarn< def warn_microsoft_dependent_exists : Warning< "dependent %select{__if_not_exists|__if_exists}0 declarations are ignored">, InGroup<DiagGroup<"microsoft-exists">>; +def warn_microsoft_qualifiers_ignored : Warning< + "qualifiers after comma in declarator list are ignored">; def ext_c11_generic_selection : Extension< "generic selections are a C11-specific feature">, InGroup<C11>; diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 38073c3..d33d4c5 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -2094,6 +2094,7 @@ private: SourceLocation AttrNameLoc, ParsedAttributes &Attrs); void ParseMicrosoftTypeAttributes(ParsedAttributes &attrs); + void SkipMicrosoftTypeAttributes(); void ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs); void ParseBorlandTypeAttributes(ParsedAttributes &attrs); void ParseOpenCLAttributes(ParsedAttributes &attrs); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index fbf3337..5e87705 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -614,6 +614,30 @@ void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) { } } +void Parser::SkipMicrosoftTypeAttributes() { + while (true) { + switch (Tok.getKind()) { + case tok::kw_const: + case tok::kw_volatile: + case tok::kw___fastcall: + case tok::kw___stdcall: + case tok::kw___thiscall: + case tok::kw___cdecl: + case tok::kw___vectorcall: + case tok::kw___ptr32: + case tok::kw___ptr64: + case tok::kw___w64: + case tok::kw___unaligned: + case tok::kw___sptr: + case tok::kw___uptr: + Diag(ConsumeToken(), diag::warn_microsoft_qualifiers_ignored); + break; + default: + return; + } + } +} + void Parser::ParseBorlandTypeAttributes(ParsedAttributes &attrs) { // Treat these like attributes while (Tok.is(tok::kw___pascal)) { @@ -1732,6 +1756,10 @@ Parser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS, // short x, __attribute__((common)) var; -> declarator MaybeParseGNUAttributes(D); + // MSVC parses but ignores qualifiers after the comma as an extensions. + if (getLangOpts().MicrosoftExt) + SkipMicrosoftTypeAttributes(); + ParseDeclarator(D); if (!D.isInvalidType()) { Decl *ThisDecl = ParseDeclarationAfterDeclarator(D); diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index d7ea20b..fb09a1f 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -85,3 +85,11 @@ int * __uptr __ptr64 pup64; /* Legal to have nested pointer attributes */ int * __sptr * __ptr32 ppsp32; + +// Ignored type qualifiers after comma in declarator lists +typedef int ignored_quals_dummy1, const volatile __ptr32 __ptr64 __w64 __unaligned __sptr __uptr ignored_quals1; // expected-warning 8 {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy2)(), __fastcall ignored_quals2; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy3)(), __stdcall ignored_quals3; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy4)(), __thiscall ignored_quals4; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy5)(), __cdecl ignored_quals5; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy6)(), __vectorcall ignored_quals6; // expected-warning {{qualifiers after comma in declarator list are ignored}} diff --git a/test/Parser/MicrosoftExtensions.cpp b/test/Parser/MicrosoftExtensions.cpp index 85ccdc5..96fdf44 100644 --- a/test/Parser/MicrosoftExtensions.cpp +++ b/test/Parser/MicrosoftExtensions.cpp @@ -366,3 +366,11 @@ void foo(void) { template <int *> struct NullptrArg {}; NullptrArg<nullptr> a; + +// Ignored type qualifiers after comma in declarator lists +typedef int ignored_quals_dummy1, const volatile __ptr32 __ptr64 __w64 __unaligned __sptr __uptr ignored_quals1; // expected-warning 8 {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy2)(), __fastcall ignored_quals2; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy3)(), __stdcall ignored_quals3; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy4)(), __thiscall ignored_quals4; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy5)(), __cdecl ignored_quals5; // expected-warning {{qualifiers after comma in declarator list are ignored}} +typedef void(*ignored_quals_dummy6)(), __vectorcall ignored_quals6; // expected-warning {{qualifiers after comma in declarator list are ignored}} -- 1.9.4.msysgit.2
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
