From a42760b00e35290174587ffb16fcd486bd00a788 Mon Sep 17 00:00:00 2001 From: Geod24 Date: Mon, 7 Jan 2019 11:24:02 +0900 Subject: [PATCH 1/3] testsuite: Avoid mangling when there are C++ files When it comes to C++ interop, many bugs are mangling related. As we add more and more tests involving the STL, the linker errors become more advance and subtle, and getting those on a platform one does not have access to (e.g. FreeBSD) is usually hard to debug, as we deal with different compiler/stdlib versions. --- test/tools/d_do_test.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tools/d_do_test.d b/test/tools/d_do_test.d index 70ba224e49dd..992a137d0a52 100755 --- a/test/tools/d_do_test.d +++ b/test/tools/d_do_test.d @@ -634,13 +634,13 @@ int tryMain(string[] args) { case "dmd": if(envData.os != "win32" && envData.os != "win64") - testArgs.requiredArgs ~= " -L-lstdc++"; + testArgs.requiredArgs ~= " -L-lstdc++ -L--no-demangle"; break; case "ldc": - testArgs.requiredArgs ~= " -L-lstdc++"; + testArgs.requiredArgs ~= " -L-lstdc++ -L--no-demangle"; break; case "gdc": - testArgs.requiredArgs ~= "-Xlinker -lstdc++"; + testArgs.requiredArgs ~= "-Xlinker -lstdc++ -Xlinker --no-demangle"; break; default: writeln("unknown compiler: "~envData.compiler); From 19783a16d21f386ce053ac282632336684c17172 Mon Sep 17 00:00:00 2001 From: Geod24 Date: Sat, 5 Jan 2019 09:41:17 +0900 Subject: [PATCH 2/3] cppmanglewin: Use backreference for nullptr_t too Suggested by `@rainers` --- src/dmd/cppmanglewin.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dmd/cppmanglewin.d b/src/dmd/cppmanglewin.d index 67b3ab1138e4..62924dacff54 100644 --- a/src/dmd/cppmanglewin.d +++ b/src/dmd/cppmanglewin.d @@ -137,6 +137,8 @@ public: { if (checkImmutableShared(type)) return; + if (checkTypeSaved(type)) + return; buf.writestring("$$T"); flags &= ~IS_NOT_TOP_TYPE; From 73715e26e0f9f2abe069e5eba88ae71b9f9a988a Mon Sep 17 00:00:00 2001 From: Geod24 Date: Thu, 3 Jan 2019 09:13:41 +0900 Subject: [PATCH 3/3] Split C++11-specific tests in their own file --- test/runnable/cpp11.d | 34 +++++++++++++++++++++++++++++ test/runnable/cppa.d | 17 +-------------- test/runnable/extra-files/cpp11.cpp | 13 +++++++++++ test/runnable/extra-files/cppb.cpp | 14 ------------ 4 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 test/runnable/cpp11.d create mode 100644 test/runnable/extra-files/cpp11.cpp diff --git a/test/runnable/cpp11.d b/test/runnable/cpp11.d new file mode 100644 index 000000000000..a951fe5586ea --- /dev/null +++ b/test/runnable/cpp11.d @@ -0,0 +1,34 @@ +// DISABLED: win32 +// REQUIRED_ARGS: -stdc++=c++11 +// EXTRA_CPP_SOURCES: cpp11.cpp +// CXXFLAGS: -std=c++11 + +// Disabled on win32 because the compiler is too old + +/****************************************/ +alias nullptr_t = typeof(null); + +// Only run on OSX/Win64 because the compilers are too old +// and nullptr_t gets substituted +version (FreeBSD) + version = IgnoreNullptrTest; +version (linux) + version = IgnoreNullptrTest; + +version (IgnoreNullptrTest) { void test17() {} } +else +{ + extern (C++) void testnull(nullptr_t); + extern (C++) void testnullnull(nullptr_t, nullptr_t); + + void test17() + { + testnull(null); + testnullnull(null, null); + } +} + +void main() +{ + test17(); +} diff --git a/test/runnable/cppa.d b/test/runnable/cppa.d index 01de4b97dac8..6691e33f9433 100644 --- a/test/runnable/cppa.d +++ b/test/runnable/cppa.d @@ -727,20 +727,6 @@ void test16() static assert(0); } -/****************************************/ -/+ FIXME: Requires C++11 compiler. -alias nullptr_t = typeof(null); - -extern (C++) void testnull(nullptr_t); -extern (C++) void testnullnull(nullptr_t, nullptr_t); - -void test17() -{ - testnull(null); - testnullnull(null, null); -} -+/ - /****************************************/ struct S13707 @@ -1624,7 +1610,6 @@ void main() test13289(); test15(); test16(); - //test17(); func13707(); func13932(S13932!(-1)(0)); foo13337(S13337()); @@ -1650,6 +1635,6 @@ void main() test18966(); test19134(); test18955(); - + printf("Success\n"); } diff --git a/test/runnable/extra-files/cpp11.cpp b/test/runnable/extra-files/cpp11.cpp new file mode 100644 index 000000000000..af90d3b083fa --- /dev/null +++ b/test/runnable/extra-files/cpp11.cpp @@ -0,0 +1,13 @@ +#include +#include + +void testnull(std::nullptr_t n) +{ + assert(n == nullptr); +} + +void testnullnull(std::nullptr_t n1, std::nullptr_t n2) +{ + assert(n1 == nullptr); + assert(n2 == nullptr); +} diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp index 81b2b13c5498..550cd677d2dd 100644 --- a/test/runnable/extra-files/cppb.cpp +++ b/test/runnable/extra-files/cppb.cpp @@ -464,20 +464,6 @@ unsigned long testul(unsigned long ul) return ul + sizeof(unsigned long); } -/******************************************/ -/* FIXME: Requires C++11 compiler. -void testnull(nullptr_t n) -{ - assert(n == NULL); -} - -void testnullnull(nullptr_t n1, nullptr_t n2) -{ - assert(n1 == NULL); - assert(n2 == NULL); -} -*/ - /******************************************/ struct S13707