From bfbe97811bca316b63f61e7bee77921d990846f6 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Wed, 2 Sep 2020 22:46:54 -0700 Subject: [PATCH] fix Issue 14203 - Return of floating point values from extern(C++) member functions does not match dmc --- src/dmd/target.d | 10 ++++++++++ test/runnable_cxx/extra-files/c14203.cpp | 2 ++ test/runnable_cxx/test14203.d | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 test/runnable_cxx/extra-files/c14203.cpp create mode 100644 test/runnable_cxx/test14203.d diff --git a/src/dmd/target.d b/src/dmd/target.d index 8e7bc0bc9c..e19e7f3593 100644 --- a/src/dmd/target.d +++ b/src/dmd/target.d @@ -715,6 +715,16 @@ extern (C++) struct Target else return true; } + else if (global.params.isWindows && + !global.params.is64bit && + (tf.linkage == LINK.cpp || tf.linkage == LINK.pascal) && + tf.isfloating()) + { + /* See DMC++ function exp2_retmethod() + * https://github.com/DigitalMars/Compiler/blob/master/dm/src/dmc/dexp2.d#L149 + */ + return true; + } else { //assert(sz <= 16); diff --git a/test/runnable_cxx/extra-files/c14203.cpp b/test/runnable_cxx/extra-files/c14203.cpp new file mode 100644 index 0000000000..059d0eeff5 --- /dev/null +++ b/test/runnable_cxx/extra-files/c14203.cpp @@ -0,0 +1,2 @@ + +float func1() { return 73; } diff --git a/test/runnable_cxx/test14203.d b/test/runnable_cxx/test14203.d new file mode 100644 index 0000000000..3b29c66203 --- /dev/null +++ b/test/runnable_cxx/test14203.d @@ -0,0 +1,22 @@ +// EXTRA_CPP_SOURCES: c14203.cpp + + +/************************************************/ + +// https://issues.dlang.org/show_bug.cgi?id=14203 + +extern (C++) float func1(); + +void test14203() +{ + assert(func1() == 73); +} + +/************************************************/ + +int main() +{ + test14203(); + + return 0; +}