<p dir="ltr">On 21 Apr 2014 13:53, "Richard Smith" <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:<br>
><br>
> You don't seem to have any tests for the calling convention macros?</p>
<p dir="ltr">Oh, disregard that, misread your testcase update! LGTM</p>
<p dir="ltr">> On 21 Apr 2014 13:50, "Reid Kleckner" <<a href="mailto:rnk@google.com">rnk@google.com</a>> wrote:<br>
>><br>
>> Hi majnemer, asl,<br>
>><br>
>> This is for compatibility with GCC.<br>
>><br>
>> <a href="http://reviews.llvm.org/D3444">http://reviews.llvm.org/D3444</a><br>
>><br>
>> Files:<br>
>> lib/Basic/Targets.cpp<br>
>> test/SemaCXX/decl-microsoft-call-conv.cpp<br>
>><br>
>> Index: lib/Basic/Targets.cpp<br>
>> ===================================================================<br>
>> --- lib/Basic/Targets.cpp<br>
>> +++ lib/Basic/Targets.cpp<br>
>> @@ -3085,6 +3085,31 @@<br>
>> };<br>
>> } // end anonymous namespace<br>
>><br>
>> +static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {<br>
>> + Builder.defineMacro("__MSVCRT__");<br>
>> + Builder.defineMacro("__MINGW32__");<br>
>> +<br>
>> + // Mingw defines __declspec(a) to __attribute__((a)). Clang supports<br>
>> + // __declspec natively under -fms-extensions, but we define a no-op __declspec<br>
>> + // macro anyway for pre-processor compatibility.<br>
>> + if (Opts.MicrosoftExt)<br>
>> + Builder.defineMacro("__declspec", "__declspec");<br>
>> + else<br>
>> + Builder.defineMacro("__declspec(a)", "__attribute__((a))");<br>
>> +<br>
>> + if (!Opts.MicrosoftExt) {<br>
>> + // Provide macros for all the calling convention keywords. Provide both<br>
>> + // single and double underscore prefixed variants. These are available on<br>
>> + // x64 as well as x86, even though they have no effect.<br>
>> + const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};<br>
>> + for (const char *CC : CCs) {<br>
>> + Twine GCCSpelling = Twine("__attribute__((__") + CC + Twine("__))");<br>
>> + Builder.defineMacro(Twine("_") + CC, GCCSpelling);<br>
>> + Builder.defineMacro(Twine("__") + CC, GCCSpelling);<br>
>> + }<br>
>> + }<br>
>> +}<br>
>> +<br>
>> namespace {<br>
>> // x86-32 MinGW target<br>
>> class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {<br>
>> @@ -3097,17 +3122,7 @@<br>
>> DefineStd(Builder, "WIN32", Opts);<br>
>> DefineStd(Builder, "WINNT", Opts);<br>
>> Builder.defineMacro("_X86_");<br>
>> - Builder.defineMacro("__MSVCRT__");<br>
>> - Builder.defineMacro("__MINGW32__");<br>
>> -<br>
>> - // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).<br>
>> - // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.<br>
>> - if (Opts.MicrosoftExt)<br>
>> - // Provide "as-is" __declspec.<br>
>> - Builder.defineMacro("__declspec", "__declspec");<br>
>> - else<br>
>> - // Provide alias of __attribute__ like mingw32-gcc.<br>
>> - Builder.defineMacro("__declspec(a)", "__attribute__((a))");<br>
>> + addMinGWDefines(Opts, Builder);<br>
>> }<br>
>> };<br>
>> } // end anonymous namespace<br>
>> @@ -3327,18 +3342,8 @@<br>
>> MacroBuilder &Builder) const override {<br>
>> WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);<br>
>> DefineStd(Builder, "WIN64", Opts);<br>
>> - Builder.defineMacro("__MSVCRT__");<br>
>> - Builder.defineMacro("__MINGW32__");<br>
>> Builder.defineMacro("__MINGW64__");<br>
>> -<br>
>> - // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).<br>
>> - // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.<br>
>> - if (Opts.MicrosoftExt)<br>
>> - // Provide "as-is" __declspec.<br>
>> - Builder.defineMacro("__declspec", "__declspec");<br>
>> - else<br>
>> - // Provide alias of __attribute__ like mingw32-gcc.<br>
>> - Builder.defineMacro("__declspec(a)", "__attribute__((a))");<br>
>> + addMinGWDefines(Opts, Builder);<br>
>> }<br>
>> };<br>
>> } // end anonymous namespace<br>
>> Index: test/SemaCXX/decl-microsoft-call-conv.cpp<br>
>> ===================================================================<br>
>> --- test/SemaCXX/decl-microsoft-call-conv.cpp<br>
>> +++ test/SemaCXX/decl-microsoft-call-conv.cpp<br>
>> @@ -1,4 +1,6 @@<br>
>> // RUN: %clang_cc1 -triple i686-pc-win32 -fms-extensions -verify %s<br>
>> +// RUN: %clang_cc1 -triple i686-pc-mingw32 -verify %s<br>
>> +// RUN: %clang_cc1 -triple i686-pc-mingw32 -fms-extensions -verify %s<br>
>><br>
>> typedef void void_fun_t();<br>
>> typedef void __cdecl cdecl_fun_t();<br>
>><br>
>> _______________________________________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
>><br>
</p>