[PATCH] Recognize __unaligned in more cases

Nico Rieck nico.rieck at gmail.com
Mon Nov 24 13:57:42 PST 2014


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
-------------- next part --------------
From bc4acc23a156622addafc3fc824181bfe8f9680d Mon Sep 17 00:00:00 2001
From: Nico Rieck <nico.rieck at gmail.com>
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

-------------- next part --------------
From bbd0ac5b77ec8a9e62458345cd3598c7950c2e07 Mon Sep 17 00:00:00 2001
From: Nico Rieck <nico.rieck at gmail.com>
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



More information about the cfe-commits mailing list