From 2588905bfe9fc131e1bb21dd5f6b78fd64031e06 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 21 Mar 2016 16:08:49 +0000 Subject: [PATCH] clang-cl: support __cdecl-on-struct anachronism Summary: The Microsoft compiler emits warning C4229: anachronism used : modifiers on data are ignored for struct {} __cdecl s; but ICU's gendict can generate such (and does when building LibreOffice), so accepting this in clang-cl too would be useful. Reviewers: rnk Patch by Stephan Bergmann Differential Revision: http://reviews.llvm.org/D16628 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@263947 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseDeclCXX.cpp | 9 +++++++++ test/Parser/ms-anachronism.c | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 test/Parser/ms-anachronism.c diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 8a28f65dfe..9d8106361e 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1103,6 +1103,15 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { return true; case tok::colon: return CouldBeBitfield; // enum E { ... } : 2; + // Microsoft compatibility + case tok::kw___cdecl: // struct foo {...} __cdecl x; + case tok::kw___fastcall: // struct foo {...} __fastcall x; + case tok::kw___stdcall: // struct foo {...} __stdcall x; + case tok::kw___thiscall: // struct foo {...} __thiscall x; + case tok::kw___vectorcall: // struct foo {...} __vectorcall x; + // We will diagnose these calling-convention specifiers on non-function + // declarations later, so claim they are valid after a type specifier. + return getLangOpts().MicrosoftExt; // Type qualifiers case tok::kw_const: // struct foo {...} const x; case tok::kw_volatile: // struct foo {...} volatile x; diff --git a/test/Parser/ms-anachronism.c b/test/Parser/ms-anachronism.c new file mode 100644 index 0000000000..3767639787 --- /dev/null +++ b/test/Parser/ms-anachronism.c @@ -0,0 +1,3 @@ +// RUN: %clang_cc1 -triple i686-windows-msvc -fms-extensions -fsyntax-only -verify %s + +struct {} __cdecl s; // expected-warning {{'__cdecl' only applies to function types; type here is 'struct}} -- 2.40.0