From 7899f891d3edf1623c3ffcdef13b2b0f29fc222e Mon Sep 17 00:00:00 2001 From: Manu Evans Date: Fri, 8 Jun 2018 00:52:43 -0700 Subject: [PATCH 01/13] Fix Issue 18958 - extern(C++) wchar, dchar mangling not correct --- src/dmd/cppmangle.d | 4 ++-- src/dmd/cppmanglewin.d | 24 ++++++++++-------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/dmd/cppmangle.d b/src/dmd/cppmangle.d index 6f4cffc32069..fbc9bb8e6239 100644 --- a/src/dmd/cppmangle.d +++ b/src/dmd/cppmangle.d @@ -1334,8 +1334,8 @@ extern(C++): case Tfloat80: c = 'e'; break; case Tbool: c = 'b'; break; case Tchar: c = 'c'; break; - case Twchar: c = 't'; break; // unsigned short (perhaps use 'Ds' ? - case Tdchar: c = 'w'; break; // wchar_t (UTF-32) (perhaps use 'Di' ? + case Twchar: p = 'D'; c = 's'; break; // since C++11 + case Tdchar: p = 'D'; c = 'i'; break; // since C++11 case Timaginary32: p = 'G'; c = 'f'; break; // 'G' means imaginary case Timaginary64: p = 'G'; c = 'd'; break; case Timaginary80: p = 'G'; c = 'e'; break; diff --git a/src/dmd/cppmanglewin.d b/src/dmd/cppmanglewin.d index 5c30d6bb17f5..19046e6887e4 100644 --- a/src/dmd/cppmanglewin.d +++ b/src/dmd/cppmanglewin.d @@ -220,27 +220,23 @@ public: case Tfloat64: buf.writeByte('N'); break; - case Tbool: - buf.writestring("_N"); - break; - case Tchar: - buf.writeByte('D'); - break; - case Tdchar: - buf.writeByte('I'); - break; - // unsigned int case Tfloat80: if (flags & IS_DMC) buf.writestring("_Z"); // DigitalMars long double else buf.writestring("_T"); // Intel long double break; + case Tbool: + buf.writestring("_N"); + break; + case Tchar: + buf.writeByte('D'); + break; case Twchar: - if (flags & IS_DMC) - buf.writestring("_Y"); // DigitalMars wchar_t - else - buf.writestring("_W"); // Visual C++ wchar_t + buf.writestring("_S"); // Visual C++ char16_t (since C++11) + break; + case Tdchar: + buf.writestring("_U"); // Visual C++ char32_t (since C++11) break; default: visit(cast(Type)type); From 02cde82c9aaf8393aa056b8f281b6c707c75448e Mon Sep 17 00:00:00 2001 From: Manu Evans Date: Mon, 12 Nov 2018 20:53:28 -0800 Subject: [PATCH 02/13] Update tests --- test/compilable/cppmangle.d | 19 +++++++++++ test/runnable/cpp_abi_tests.d | 17 ++++++++- test/runnable/cppa.d | 9 ++--- test/runnable/extra-files/cpp_abi_tests.cpp | 6 ++++ test/runnable/extra-files/cppb.cpp | 38 +++++---------------- 5 files changed, 54 insertions(+), 35 deletions(-) diff --git a/test/compilable/cppmangle.d b/test/compilable/cppmangle.d index b5f315d4524c..0c5d3a89b71e 100644 --- a/test/compilable/cppmangle.d +++ b/test/compilable/cppmangle.d @@ -976,3 +976,22 @@ else version(Posix) static assert(test19278_4.mangleof == "_ZN5hello5world3yay11test19278_4Ev"); static assert(test19278_var.mangleof == "_ZN5hello5world13test19278_varE"); } + +/**************************************/ +// https://issues.dlang.org/show_bug.cgi?id=18958 +// Issue 18958 - extern(C++) wchar, dchar mangling not correct + +version(Posix) + enum __c_wchar_t : dchar; +else version(Windows) + enum __c_wchar_t : wchar; +alias wchar_t = __c_wchar_t; +extern (C++) void test_char_mangling(char, wchar, dchar, wchar_t); +version (Posix) +{ + static assert(test_char_mangling.mangleof == "_Z18test_char_manglingcDsDiw"); +} +version (Win64) +{ + static assert(test_char_mangling.mangleof == "?test_char_mangling@@YAXD_S_U_W@Z"); +} diff --git a/test/runnable/cpp_abi_tests.d b/test/runnable/cpp_abi_tests.d index 67279bfbb9af..6b258dd3e06a 100644 --- a/test/runnable/cpp_abi_tests.d +++ b/test/runnable/cpp_abi_tests.d @@ -1,4 +1,11 @@ // EXTRA_CPP_SOURCES: cpp_abi_tests.cpp +// CXXFLAGS: -std=c++11 + +version(Posix) + enum __c_wchar_t : dchar; +else version(Windows) + enum __c_wchar_t : wchar; +alias wchar_t = __c_wchar_t; extern(C++) { @@ -16,7 +23,9 @@ bool passthrough(bool value); byte passthrough(byte value); ubyte passthrough(ubyte value); char passthrough(char value); +wchar passthrough(wchar value); dchar passthrough(dchar value); +wchar_t passthrough(wchar_t value); short passthrough(short value); ushort passthrough(ushort value); int passthrough(int value); @@ -32,7 +41,9 @@ bool passthrough_ptr(bool *value); byte passthrough_ptr(byte *value); ubyte passthrough_ptr(ubyte *value); char passthrough_ptr(char *value); +wchar passthrough_ptr(wchar *value); dchar passthrough_ptr(dchar *value); +wchar_t passthrough_ptr(wchar_t *value); short passthrough_ptr(short *value); ushort passthrough_ptr(ushort *value); int passthrough_ptr(int *value); @@ -48,7 +59,9 @@ bool passthrough_ref(ref bool value); byte passthrough_ref(ref byte value); ubyte passthrough_ref(ref ubyte value); char passthrough_ref(ref char value); +wchar passthrough_ref(ref wchar value); dchar passthrough_ref(ref dchar value); +wchar_t passthrough_ref(ref wchar_t value); short passthrough_ref(ref short value); ushort passthrough_ref(ref ushort value); int passthrough_ref(ref int value); @@ -94,7 +107,7 @@ template IsBoolean(T) template IsSomeChar(T) { - enum IsSomeChar = is(T==char) || is(T==dchar); + enum IsSomeChar = is(T==char) || is(T==wchar) || is(T==dchar) || is(T==wchar_t); } void check(T)(T actual, T expected) @@ -181,7 +194,9 @@ void main() foreach(byte val; values!byte()) check(val); foreach(ubyte val; values!ubyte()) check(val); foreach(char val; values!char()) check(val); + foreach(wchar val; values!wchar()) check(val); foreach(dchar val; values!dchar()) check(val); + foreach(wchar_t val; values!wchar_t()) check(val); foreach(short val; values!short()) check(val); foreach(ushort val; values!ushort()) check(val); foreach(int val; values!int()) check(val); diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index 6691e33f9433..ac375bd78e1a 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -1,5 +1,6 @@ // PERMUTE_ARGS: -g // EXTRA_CPP_SOURCES: cppb.cpp +// CXXFLAGS: -std=c++11 import core.stdc.stdio; import core.stdc.stdarg; @@ -915,13 +916,13 @@ void fuzz2() } //////// -extern(C++) void fuzz3_cppvararg(wchar arg10, wchar arg11, bool arg12); -extern(C++) void fuzz3_dvararg(wchar arg10, wchar arg11, bool arg12) +extern(C++) void fuzz3_cppvararg(wchar arg10, dchar arg11, bool arg12); +extern(C++) void fuzz3_dvararg(wchar arg10, dchar arg11, bool arg12) { fuzz2_checkValues(arg10, arg11, arg12); } -extern(C++) void fuzz3_checkValues(wchar arg10, wchar arg11, bool arg12) +extern(C++) void fuzz3_checkValues(wchar arg10, dchar arg11, bool arg12) { assert(arg10 == 103); assert(arg11 == 104); @@ -931,7 +932,7 @@ extern(C++) void fuzz3_checkValues(wchar arg10, wchar arg11, bool arg12) void fuzz3() { wchar arg10 = 103; - wchar arg11 = 104; + dchar arg11 = 104; bool arg12 = false; fuzz3_dvararg(arg10, arg11, arg12); fuzz3_cppvararg(arg10, arg11, arg12); diff --git a/test/runnable/extra-files/cpp_abi_tests.cpp b/test/runnable/extra-files/cpp_abi_tests.cpp index 64088aaf0b55..44b0bbed1785 100644 --- a/test/runnable/extra-files/cpp_abi_tests.cpp +++ b/test/runnable/extra-files/cpp_abi_tests.cpp @@ -13,6 +13,8 @@ bool passthrough(bool value) { return value; } signed char passthrough(signed char value) { return value; } unsigned char passthrough(unsigned char value) { return value; } char passthrough(char value) { return value; } +char16_t passthrough(char16_t value) { return value; } +char32_t passthrough(char32_t value) { return value; } wchar_t passthrough(wchar_t value) { return value; } short passthrough(short value) { return value; } unsigned short passthrough(unsigned short value) { return value; } @@ -31,6 +33,8 @@ bool passthrough_ptr(bool *value) { return *value; } signed char passthrough_ptr(signed char *value) { return *value; } unsigned char passthrough_ptr(unsigned char *value) { return *value; } char passthrough_ptr(char *value) { return *value; } +char16_t passthrough_ptr(char16_t *value) { return *value; } +char32_t passthrough_ptr(char32_t *value) { return *value; } wchar_t passthrough_ptr(wchar_t *value) { return *value; } short passthrough_ptr(short *value) { return *value; } unsigned short passthrough_ptr(unsigned short *value) { return *value; } @@ -49,6 +53,8 @@ bool passthrough_ref(bool &value) { return value; } signed char passthrough_ref(signed char &value) { return value; } unsigned char passthrough_ref(unsigned char &value) { return value; } char passthrough_ref(char &value) { return value; } +char16_t passthrough_ref(char16_t &value) { return value; } +char32_t passthrough_ref(char32_t &value) { return value; } wchar_t passthrough_ref(wchar_t &value) { return value; } short passthrough_ref(short &value) { return value; } unsigned short passthrough_ref(unsigned short &value) { return value; } diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index 0fa6767cf782..f26511c2ab16 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -407,35 +407,19 @@ wchar_t f13289_cpp_wchar_t(wchar_t ch) } } -#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __NetBSD__ || __DragonFly__ -unsigned short f13289_d_wchar(unsigned short ch); -wchar_t f13289_d_dchar(wchar_t ch); -#elif _WIN32 -wchar_t f13289_d_wchar(wchar_t ch); -unsigned int f13289_d_dchar(unsigned int ch); -#endif - +char16_t f13289_d_wchar(char16_t ch); +char32_t f13289_d_dchar(char32_t ch); wchar_t f13289_d_wchar_t(wchar_t ch); bool f13289_cpp_test() { if (!(f13289_d_wchar_t(L'e') == L'E')) return false; if (!(f13289_d_wchar_t(L'F') == L'F')) return false; -#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __NetBSD__ || __DragonFly__ - if (!(f13289_d_wchar((unsigned short)'c') == (unsigned short)'C')) return false; - if (!(f13289_d_wchar((unsigned short)'D') == (unsigned short)'D')) return false; - if (!(f13289_d_dchar(L'e') == L'E')) return false; - if (!(f13289_d_dchar(L'F') == L'F')) return false; + if (!(f13289_d_wchar(u'c') == u'C')) return false; + if (!(f13289_d_wchar(u'D') == u'D')) return false; + if (!(f13289_d_dchar(U'e') == U'E')) return false; + if (!(f13289_d_dchar(U'F') == U'F')) return false; return true; -#elif _WIN32 - if (!(f13289_d_wchar(L'c') == L'C')) return false; - if (!(f13289_d_wchar(L'D') == L'D')) return false; - if (!(f13289_d_dchar((unsigned int)'e') == (unsigned int)'E')) return false; - if (!(f13289_d_dchar((unsigned int)'F') == (unsigned int)'F')) return false; - return true; -#else - return false; -#endif } /******************************************/ @@ -593,14 +577,8 @@ void fuzz2_cppvararg(uint64_t arg10, uint64_t arg11, bool arg12) fuzz2_checkValues(arg10, arg11, arg12); } -#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __NetBSD__ || __DragonFly__ -#define wchar unsigned short -#elif _WIN32 -#define wchar wchar_t -#endif - -void fuzz3_checkValues(wchar arg10, wchar arg11, bool arg12); -void fuzz3_cppvararg(wchar arg10, wchar arg11, bool arg12) +void fuzz3_checkValues(char16_t arg10, char32_t arg11, bool arg12); +void fuzz3_cppvararg(char16_t arg10, char32_t arg11, bool arg12) { fuzz3_checkValues(arg10, arg11, arg12); } From 56217404f9338197c077df3989c14b9bfd9d552b Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 10:20:48 +0800 Subject: [PATCH 03/13] version out DMC incompatible tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it doesn’t support char16_t and char32_t --- test/runnable/cpp_abi_tests.d | 6 +++++- test/runnable/cppa.d | 13 +++++++++++-- test/runnable/extra-files/cpp_abi_tests.cpp | 6 ++++++ test/runnable/extra-files/cppb.cpp | 6 ++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/test/runnable/cpp_abi_tests.d b/test/runnable/cpp_abi_tests.d index 6b258dd3e06a..3987e6853a5a 100644 --- a/test/runnable/cpp_abi_tests.d +++ b/test/runnable/cpp_abi_tests.d @@ -1,5 +1,7 @@ // EXTRA_CPP_SOURCES: cpp_abi_tests.cpp -// CXXFLAGS: -std=c++11 +// CXXFLAGS(linux freebsd osx netbsd dragonflybsd): -std=c++11 + +// N.B MSVC doesn't have a C++11 switch, but it defaults to the latest fully-supported standard version(Posix) enum __c_wchar_t : dchar; @@ -194,8 +196,10 @@ void main() foreach(byte val; values!byte()) check(val); foreach(ubyte val; values!ubyte()) check(val); foreach(char val; values!char()) check(val); +version(CppRuntime_DigitalMars){} else { foreach(wchar val; values!wchar()) check(val); foreach(dchar val; values!dchar()) check(val); +} foreach(wchar_t val; values!wchar_t()) check(val); foreach(short val; values!short()) check(val); foreach(ushort val; values!ushort()) check(val); diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index ac375bd78e1a..d2a79577c6d7 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -1,6 +1,8 @@ // PERMUTE_ARGS: -g // EXTRA_CPP_SOURCES: cppb.cpp -// CXXFLAGS: -std=c++11 +// CXXFLAGS(linux freebsd osx netbsd dragonflybsd): -std=c++11 + +// N.B MSVC doesn't have a C++11 switch, but it defaults to the latest fully-supported standard import core.stdc.stdio; import core.stdc.stdarg; @@ -916,6 +918,12 @@ void fuzz2() } //////// +version(CppRuntime_DigitalMars) + enum NODMC = false; +else + enum NODMC = true; +static if (NODMC) +{ extern(C++) void fuzz3_cppvararg(wchar arg10, dchar arg11, bool arg12); extern(C++) void fuzz3_dvararg(wchar arg10, dchar arg11, bool arg12) { @@ -937,12 +945,13 @@ void fuzz3() fuzz3_dvararg(arg10, arg11, arg12); fuzz3_cppvararg(arg10, arg11, arg12); } +} void fuzz() { fuzz1(); fuzz2(); - fuzz3(); + static if (NODMC) fuzz3(); } /****************************************/ diff --git a/test/runnable/extra-files/cpp_abi_tests.cpp b/test/runnable/extra-files/cpp_abi_tests.cpp index 44b0bbed1785..8f5e284076a0 100644 --- a/test/runnable/extra-files/cpp_abi_tests.cpp +++ b/test/runnable/extra-files/cpp_abi_tests.cpp @@ -13,8 +13,10 @@ bool passthrough(bool value) { return value; } signed char passthrough(signed char value) { return value; } unsigned char passthrough(unsigned char value) { return value; } char passthrough(char value) { return value; } +#ifdef __DMC__ char16_t passthrough(char16_t value) { return value; } char32_t passthrough(char32_t value) { return value; } +#endif wchar_t passthrough(wchar_t value) { return value; } short passthrough(short value) { return value; } unsigned short passthrough(unsigned short value) { return value; } @@ -33,8 +35,10 @@ bool passthrough_ptr(bool *value) { return *value; } signed char passthrough_ptr(signed char *value) { return *value; } unsigned char passthrough_ptr(unsigned char *value) { return *value; } char passthrough_ptr(char *value) { return *value; } +#ifdef __DMC__ char16_t passthrough_ptr(char16_t *value) { return *value; } char32_t passthrough_ptr(char32_t *value) { return *value; } +#endif wchar_t passthrough_ptr(wchar_t *value) { return *value; } short passthrough_ptr(short *value) { return *value; } unsigned short passthrough_ptr(unsigned short *value) { return *value; } @@ -53,8 +57,10 @@ bool passthrough_ref(bool &value) { return value; } signed char passthrough_ref(signed char &value) { return value; } unsigned char passthrough_ref(unsigned char &value) { return value; } char passthrough_ref(char &value) { return value; } +#ifdef __DMC__ char16_t passthrough_ref(char16_t &value) { return value; } char32_t passthrough_ref(char32_t &value) { return value; } +#endif wchar_t passthrough_ref(wchar_t &value) { return value; } short passthrough_ref(short &value) { return value; } unsigned short passthrough_ref(unsigned short &value) { return value; } diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index f26511c2ab16..72086c76b130 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -407,18 +407,22 @@ wchar_t f13289_cpp_wchar_t(wchar_t ch) } } +#ifndef __DMC__ char16_t f13289_d_wchar(char16_t ch); char32_t f13289_d_dchar(char32_t ch); +#endif wchar_t f13289_d_wchar_t(wchar_t ch); bool f13289_cpp_test() { if (!(f13289_d_wchar_t(L'e') == L'E')) return false; if (!(f13289_d_wchar_t(L'F') == L'F')) return false; +#ifndef __DMC__ if (!(f13289_d_wchar(u'c') == u'C')) return false; if (!(f13289_d_wchar(u'D') == u'D')) return false; if (!(f13289_d_dchar(U'e') == U'E')) return false; if (!(f13289_d_dchar(U'F') == U'F')) return false; +#endif return true; } @@ -577,11 +581,13 @@ void fuzz2_cppvararg(uint64_t arg10, uint64_t arg11, bool arg12) fuzz2_checkValues(arg10, arg11, arg12); } +#ifndef __DMC__ void fuzz3_checkValues(char16_t arg10, char32_t arg11, bool arg12); void fuzz3_cppvararg(char16_t arg10, char32_t arg11, bool arg12) { fuzz3_checkValues(arg10, arg11, arg12); } +#endif /******************************************/ From 12d770581748f7c7cb0d9360fcbadd06847f56af Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 10:36:04 +0800 Subject: [PATCH 04/13] Correctly version out --- test/runnable/extra-files/cpp_abi_tests.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/runnable/extra-files/cpp_abi_tests.cpp b/test/runnable/extra-files/cpp_abi_tests.cpp index 8f5e284076a0..c47a3d658f9d 100644 --- a/test/runnable/extra-files/cpp_abi_tests.cpp +++ b/test/runnable/extra-files/cpp_abi_tests.cpp @@ -13,7 +13,7 @@ bool passthrough(bool value) { return value; } signed char passthrough(signed char value) { return value; } unsigned char passthrough(unsigned char value) { return value; } char passthrough(char value) { return value; } -#ifdef __DMC__ +#ifndef __DMC__ char16_t passthrough(char16_t value) { return value; } char32_t passthrough(char32_t value) { return value; } #endif @@ -35,7 +35,7 @@ bool passthrough_ptr(bool *value) { return *value; } signed char passthrough_ptr(signed char *value) { return *value; } unsigned char passthrough_ptr(unsigned char *value) { return *value; } char passthrough_ptr(char *value) { return *value; } -#ifdef __DMC__ +#ifndef __DMC__ char16_t passthrough_ptr(char16_t *value) { return *value; } char32_t passthrough_ptr(char32_t *value) { return *value; } #endif @@ -57,7 +57,7 @@ bool passthrough_ref(bool &value) { return value; } signed char passthrough_ref(signed char &value) { return value; } unsigned char passthrough_ref(unsigned char &value) { return value; } char passthrough_ref(char &value) { return value; } -#ifdef __DMC__ +#ifndef __DMC__ char16_t passthrough_ref(char16_t &value) { return value; } char32_t passthrough_ref(char32_t &value) { return value; } #endif From a7de979dc4ef685f9086f58b2a5d781902eefefb Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 12:01:35 +0800 Subject: [PATCH 05/13] MSVC2013 doesn't support char16_t/char32_t --- test/runnable/cpp_abi_tests.d | 9 ++++++++- test/runnable/extra-files/cpp_abi_tests.cpp | 13 ++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/test/runnable/cpp_abi_tests.d b/test/runnable/cpp_abi_tests.d index 3987e6853a5a..a3f39edcc0b1 100644 --- a/test/runnable/cpp_abi_tests.d +++ b/test/runnable/cpp_abi_tests.d @@ -2,6 +2,7 @@ // CXXFLAGS(linux freebsd osx netbsd dragonflybsd): -std=c++11 // N.B MSVC doesn't have a C++11 switch, but it defaults to the latest fully-supported standard +// N.B MSVC 2013 doesn't support char16_t/char32_t version(Posix) enum __c_wchar_t : dchar; @@ -196,7 +197,13 @@ void main() foreach(byte val; values!byte()) check(val); foreach(ubyte val; values!ubyte()) check(val); foreach(char val; values!char()) check(val); -version(CppRuntime_DigitalMars){} else { +version(CppRuntime_DigitalMars){} else +version(CppRuntime_Microsoft) +{ +// TODO: figure out how to detect VS2013 which doesn't support char16_t/char32_t +} +else +{ foreach(wchar val; values!wchar()) check(val); foreach(dchar val; values!dchar()) check(val); } diff --git a/test/runnable/extra-files/cpp_abi_tests.cpp b/test/runnable/extra-files/cpp_abi_tests.cpp index c47a3d658f9d..07cc09b2ee45 100644 --- a/test/runnable/extra-files/cpp_abi_tests.cpp +++ b/test/runnable/extra-files/cpp_abi_tests.cpp @@ -9,11 +9,18 @@ namespace std struct test19248 {int a;}; }; +#ifdef __DMC__ +// DMC doesn't support c++11 +#elif defined (_MSC_VER) && _MSC_VER <= 1800 +// MSVC2013 doesn't support char16_t/char32_t +#else +#define TEST_UNICODE +#endif bool passthrough(bool value) { return value; } signed char passthrough(signed char value) { return value; } unsigned char passthrough(unsigned char value) { return value; } char passthrough(char value) { return value; } -#ifndef __DMC__ +#ifdef TEST_UNICODE char16_t passthrough(char16_t value) { return value; } char32_t passthrough(char32_t value) { return value; } #endif @@ -35,7 +42,7 @@ bool passthrough_ptr(bool *value) { return *value; } signed char passthrough_ptr(signed char *value) { return *value; } unsigned char passthrough_ptr(unsigned char *value) { return *value; } char passthrough_ptr(char *value) { return *value; } -#ifndef __DMC__ +#ifdef TEST_UNICODE char16_t passthrough_ptr(char16_t *value) { return *value; } char32_t passthrough_ptr(char32_t *value) { return *value; } #endif @@ -57,7 +64,7 @@ bool passthrough_ref(bool &value) { return value; } signed char passthrough_ref(signed char &value) { return value; } unsigned char passthrough_ref(unsigned char &value) { return value; } char passthrough_ref(char &value) { return value; } -#ifndef __DMC__ +#ifdef TEST_UNICODE char16_t passthrough_ref(char16_t &value) { return value; } char32_t passthrough_ref(char32_t &value) { return value; } #endif From 76e01753a1d0816b89beaedd1954a3a0bdf61453 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 12:06:01 +0800 Subject: [PATCH 06/13] cppa --- test/runnable/cppa.d | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index d2a79577c6d7..253a8ab01b33 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -919,10 +919,13 @@ void fuzz2() //////// version(CppRuntime_DigitalMars) - enum NODMC = false; + enum UNICODE = false; +version(CppRuntime_Mocrosoft) + enum UNICODE = false; //VS2013 doesn't support them else - enum NODMC = true; -static if (NODMC) + enum UNICODE = true; + +static if (UNICODE) { extern(C++) void fuzz3_cppvararg(wchar arg10, dchar arg11, bool arg12); extern(C++) void fuzz3_dvararg(wchar arg10, dchar arg11, bool arg12) From 9607acfbd70616a9a6a7fc945185774434090916 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 12:13:52 +0800 Subject: [PATCH 07/13] cppa --- test/runnable/cppa.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index 253a8ab01b33..9425c275a048 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -954,7 +954,7 @@ void fuzz() { fuzz1(); fuzz2(); - static if (NODMC) fuzz3(); + static if (UNICODE) fuzz3(); } /****************************************/ From 169008de8d4c9fde084befac417ddb4fe8049f87 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 12:57:24 +0800 Subject: [PATCH 08/13] typo --- test/runnable/cppa.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index 9425c275a048..b1fee271d122 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -920,7 +920,7 @@ void fuzz2() //////// version(CppRuntime_DigitalMars) enum UNICODE = false; -version(CppRuntime_Mocrosoft) +version(CppRuntime_Microsoft) enum UNICODE = false; //VS2013 doesn't support them else enum UNICODE = true; From dab5b66028010608e703b90819a523a731c0b37f Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 13:29:35 +0800 Subject: [PATCH 09/13] more --- test/runnable/extra-files/cppb.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index 72086c76b130..a2a812ae0f56 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -406,8 +406,14 @@ wchar_t f13289_cpp_wchar_t(wchar_t ch) return ch; } } - -#ifndef __DMC__ +#ifdef __DMC__ +// DMC doesn't support c++11 +#elif defined (_MSC_VER) && _MSC_VER <= 1800 +// MSVC2013 doesn't support char16_t/char32_t +#else +#define TEST_UNICODE +#endif +#ifdef TEST_UNICODE char16_t f13289_d_wchar(char16_t ch); char32_t f13289_d_dchar(char32_t ch); #endif @@ -417,7 +423,7 @@ bool f13289_cpp_test() { if (!(f13289_d_wchar_t(L'e') == L'E')) return false; if (!(f13289_d_wchar_t(L'F') == L'F')) return false; -#ifndef __DMC__ +#ifdef TEST_UNICODE if (!(f13289_d_wchar(u'c') == u'C')) return false; if (!(f13289_d_wchar(u'D') == u'D')) return false; if (!(f13289_d_dchar(U'e') == U'E')) return false; From e417d3fbc71af4ca93803d915530ae804bcdac94 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 13:50:51 +0800 Subject: [PATCH 10/13] more --- test/runnable/extra-files/cppb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index a2a812ae0f56..06221388d3fe 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -587,7 +587,7 @@ void fuzz2_cppvararg(uint64_t arg10, uint64_t arg11, bool arg12) fuzz2_checkValues(arg10, arg11, arg12); } -#ifndef __DMC__ +#ifndef TEST_UNICODE void fuzz3_checkValues(char16_t arg10, char32_t arg11, bool arg12); void fuzz3_cppvararg(char16_t arg10, char32_t arg11, bool arg12) { From 17b0e0aba22e4d9266ebb36fa57cc400fbfcf6fa Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 13:51:56 +0800 Subject: [PATCH 11/13] more --- test/runnable/extra-files/cppb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index 06221388d3fe..1421e4b2bb09 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -408,7 +408,7 @@ wchar_t f13289_cpp_wchar_t(wchar_t ch) } #ifdef __DMC__ // DMC doesn't support c++11 -#elif defined (_MSC_VER) && _MSC_VER <= 1800 +#elif defined (_MSC_VER) //&& _MSC_VER <= 1800 // MSVC2013 doesn't support char16_t/char32_t #else #define TEST_UNICODE From 7989df31c2b16d1c5c91166bdec6be67094e7ce9 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 14:23:07 +0800 Subject: [PATCH 12/13] nutin' to see here --- test/runnable/extra-files/cppb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index 1421e4b2bb09..ab1ea0a5a551 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -587,7 +587,7 @@ void fuzz2_cppvararg(uint64_t arg10, uint64_t arg11, bool arg12) fuzz2_checkValues(arg10, arg11, arg12); } -#ifndef TEST_UNICODE +#ifdef TEST_UNICODE void fuzz3_checkValues(char16_t arg10, char32_t arg11, bool arg12); void fuzz3_cppvararg(char16_t arg10, char32_t arg11, bool arg12) { From 0240a9fccdaa41869f061c13356b7edf2f0c59c1 Mon Sep 17 00:00:00 2001 From: Nicholas Lindsay Wilson Date: Tue, 21 May 2019 15:32:11 +0800 Subject: [PATCH 13/13] *whistles* --- test/runnable/cppa.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index b1fee271d122..e1a7220a5594 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -920,7 +920,7 @@ void fuzz2() //////// version(CppRuntime_DigitalMars) enum UNICODE = false; -version(CppRuntime_Microsoft) +else version(CppRuntime_Microsoft) enum UNICODE = false; //VS2013 doesn't support them else enum UNICODE = true;