From 59b7991a3e1a927a14d57ddb70cd517a6713f1c9 Mon Sep 17 00:00:00 2001 From: Nico Rieck Date: Thu, 4 Dec 2014 23:30:25 +0000 Subject: [PATCH] Recognize __unaligned keyword after type specifier The __unaligned keyword can appear after a struct definition: struct foo {...} __unaligned *x; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223412 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 79ae878520..85f6303970 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 ec3dfce52c..57d6f0d6be 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 void h1(T (__stdcall M::* const )()) { } -- 2.40.0