Fix director_classes testcase failures on x86

Adjust the floating point constants to be 1.125 and 2.25 (which
can be exactly represented in base-2 floating point) instead of
1.1 and 2.2 (which can't).  This avoids problems on platforms where
floating point calculations suffer from excess precision, the most
commonly used of which is x86 when using 387 FP instructions.
This commit is contained in:
Olly Betts 2023-11-19 21:26:28 +13:00
parent f50cea31e0
commit 5f8b9135cc
5 changed files with 29 additions and 29 deletions

View File

@ -21,8 +21,8 @@ Base - FullyOverloaded(int 10)
Base - FullyOverloaded(bool 1) Base - FullyOverloaded(bool 1)
Base - SemiOverloaded(int -678) Base - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
Base - DefaultParms(10, 2.2) Base - DefaultParms(10, 2.25)
Base - DefaultParms(10, 1.1) Base - DefaultParms(10, 1.125)
-------------------------------- --------------------------------
Derived - Val(444.555) Derived - Val(444.555)
Derived - Ref(444.555) Derived - Ref(444.555)
@ -32,8 +32,8 @@ Derived - FullyOverloaded(int 10)
Derived - FullyOverloaded(bool 1) Derived - FullyOverloaded(bool 1)
Derived - SemiOverloaded(int -678) Derived - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
Derived - DefaultParms(10, 2.2) Derived - DefaultParms(10, 2.25)
Derived - DefaultParms(10, 1.1) Derived - DefaultParms(10, 1.125)
-------------------------------- --------------------------------
CSharpDerived - Val(444.555) CSharpDerived - Val(444.555)
CSharpDerived - Ref(444.555) CSharpDerived - Ref(444.555)
@ -43,8 +43,8 @@ CSharpDerived - FullyOverloaded(int 10)
CSharpDerived - FullyOverloaded(bool True) CSharpDerived - FullyOverloaded(bool True)
CSharpDerived - SemiOverloaded(-678) CSharpDerived - SemiOverloaded(-678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
CSharpDerived - DefaultParms(10, 2.2) CSharpDerived - DefaultParms(10, 2.25)
CSharpDerived - DefaultParms(10, 1.1) CSharpDerived - DefaultParms(10, 1.125)
------------ Finish ------------ ------------ Finish ------------
*/ */
@ -113,7 +113,7 @@ public class runme
if (myCaller.SemiOverloadedCall(true) != "Base" + "::SemiOverloaded(bool)") throw new Exception("failed"); if (myCaller.SemiOverloadedCall(true) != "Base" + "::SemiOverloaded(bool)") throw new Exception("failed");
// Default parameters methods test // Default parameters methods test
if (NAMESPACE + myCaller.DefaultParmsCall(10, 2.2) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed"); if (NAMESPACE + myCaller.DefaultParmsCall(10, 2.25) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
if (myBase.GetType() == typeof(CSharpDerived)) { // special handling for C# derived classes, there is no way to do this any other way if (myBase.GetType() == typeof(CSharpDerived)) { // special handling for C# derived classes, there is no way to do this any other way
if (NAMESPACE + myCaller.DefaultParmsCall(10) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed"); if (NAMESPACE + myCaller.DefaultParmsCall(10) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
} else { } else {
@ -182,7 +182,7 @@ public class CSharpDerived : Base
public override String DefaultParms(int x) public override String DefaultParms(int x)
{ {
if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - DefaultParms({0})", x); if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - DefaultParms({0})", x);
return DefaultParms(x, 1.1/*use C++ default here*/); return DefaultParms(x, 1.125/*use C++ default here*/);
} }
} }

View File

@ -23,8 +23,8 @@
* Base - FullyOverloaded(bool 1) * Base - FullyOverloaded(bool 1)
* Base - SemiOverloaded(int -678) * Base - SemiOverloaded(int -678)
* Base - SemiOverloaded(bool 1) * Base - SemiOverloaded(bool 1)
* Base - DefaultParms(10, 2.2) * Base - DefaultParms(10, 2.25)
* Base - DefaultParms(10, 1.1) * Base - DefaultParms(10, 1.125)
* -------------------------------- * --------------------------------
* Derived - Val(444.555) * Derived - Val(444.555)
* Derived - Ref(444.555) * Derived - Ref(444.555)
@ -34,8 +34,8 @@
* Derived - FullyOverloaded(bool 1) * Derived - FullyOverloaded(bool 1)
* Derived - SemiOverloaded(int -678) * Derived - SemiOverloaded(int -678)
* Base - SemiOverloaded(bool 1) * Base - SemiOverloaded(bool 1)
* Derived - DefaultParms(10, 2.2) * Derived - DefaultParms(10, 2.25)
* Derived - DefaultParms(10, 1.1) * Derived - DefaultParms(10, 1.125)
* -------------------------------- * --------------------------------
* DDerived - Val(444.555) * DDerived - Val(444.555)
* DDerived - Ref(444.555) * DDerived - Ref(444.555)
@ -45,8 +45,8 @@
* DDerived - FullyOverloaded(bool true) * DDerived - FullyOverloaded(bool true)
* DDerived - SemiOverloaded(-678) * DDerived - SemiOverloaded(-678)
* Base - SemiOverloaded(bool 1) * Base - SemiOverloaded(bool 1)
* DDerived - DefaultParms(10, 2.2) * DDerived - DefaultParms(10, 2.25)
* DDerived - DefaultParms(10, 1.1) * DDerived - DefaultParms(10, 1.125)
* ------------ Finish ------------ * ------------ Finish ------------
*/ */
module director_classes_runme; module director_classes_runme;
@ -111,7 +111,7 @@ void makeCalls(Caller myCaller, Base myBase) {
enforce(myCaller.SemiOverloadedCall(true) == "Base" ~ "::SemiOverloaded(bool)", "[7] failed"); enforce(myCaller.SemiOverloadedCall(true) == "Base" ~ "::SemiOverloaded(bool)", "[7] failed");
// Default parameters methods test // Default parameters methods test
enforce(myCaller.DefaultParmsCall(10, 2.2) == myBaseType ~ "::DefaultParms(int, double)", "[8] failed"); enforce(myCaller.DefaultParmsCall(10, 2.25) == myBaseType ~ "::DefaultParms(int, double)", "[8] failed");
if (myBase.classinfo == DDerived.classinfo) { // special handling for D derived classes, there is no other way to do this if (myBase.classinfo == DDerived.classinfo) { // special handling for D derived classes, there is no other way to do this
enforce(myCaller.DefaultParmsCall(10) == myBaseType ~ "::DefaultParms(int, double)", "[9] failed"); enforce(myCaller.DefaultParmsCall(10) == myBaseType ~ "::DefaultParms(int, double)", "[9] failed");
} else { } else {
@ -173,6 +173,6 @@ public class DDerived : Base {
// only here to ensure consistent behavior for calls from C++ and D code. // only here to ensure consistent behavior for calls from C++ and D code.
public override string DefaultParms(int x) { public override string DefaultParms(int x) {
if (PrintDebug) writefln("DDerived - DefaultParms(%s)", x); if (PrintDebug) writefln("DDerived - DefaultParms(%s)", x);
return DefaultParms(x, 1.1/*use C++ default here*/); return DefaultParms(x, 1.125/*use C++ default here*/);
} }
} }

View File

@ -56,10 +56,10 @@ public:
virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(int " << x << ")" << std::endl; return "Base::SemiOverloaded(int)"; } virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(int " << x << ")" << std::endl; return "Base::SemiOverloaded(int)"; }
virtual std::string SemiOverloaded(bool x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(bool " << x << ")" << std::endl; return "Base::SemiOverloaded(bool)"; } virtual std::string SemiOverloaded(bool x) { if (PrintDebug) std::cout << "Base - SemiOverloaded(bool " << x << ")" << std::endl; return "Base::SemiOverloaded(bool)"; }
virtual std::string DefaultParms(int x, double y = 1.1) { virtual std::string DefaultParms(int x, double y = 1.125) {
if (PrintDebug) std::cout << "Base - DefaultParms(" << x << ", " << y << ")" << std::endl; if (PrintDebug) std::cout << "Base - DefaultParms(" << x << ", " << y << ")" << std::endl;
std::string ret("Base::DefaultParms(int"); std::string ret("Base::DefaultParms(int");
if (y!=1.1) if (y!=1.125)
ret = ret + std::string(", double"); ret = ret + std::string(", double");
ret = ret + std::string(")"); ret = ret + std::string(")");
return ret; return ret;
@ -82,10 +82,10 @@ public:
virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Derived - SemiOverloaded(int " << x << ")" << std::endl; return "Derived::SemiOverloaded(int)"; } virtual std::string SemiOverloaded(int x) { if (PrintDebug) std::cout << "Derived - SemiOverloaded(int " << x << ")" << std::endl; return "Derived::SemiOverloaded(int)"; }
// No SemiOverloaded(bool x) // No SemiOverloaded(bool x)
virtual std::string DefaultParms(int x, double y = 1.1) { virtual std::string DefaultParms(int x, double y = 1.125) {
if (PrintDebug) std::cout << "Derived - DefaultParms(" << x << ", " << y << ")" << std::endl; if (PrintDebug) std::cout << "Derived - DefaultParms(" << x << ", " << y << ")" << std::endl;
std::string ret("Derived::DefaultParms(int"); std::string ret("Derived::DefaultParms(int");
if (y!=1.1) if (y!=1.125)
ret = ret + std::string(", double"); ret = ret + std::string(", double");
ret = ret + std::string(")"); ret = ret + std::string(")");
return ret; return ret;

View File

@ -21,8 +21,8 @@ Base - FullyOverloaded(int 10)
Base - FullyOverloaded(bool 1) Base - FullyOverloaded(bool 1)
Base - SemiOverloaded(int -678) Base - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
Base - DefaultParms(10, 2.2) Base - DefaultParms(10, 2.25)
Base - DefaultParms(10, 1.1) Base - DefaultParms(10, 1.125)
-------------------------------- --------------------------------
Derived - Val(444.555) Derived - Val(444.555)
Derived - Ref(444.555) Derived - Ref(444.555)
@ -32,8 +32,8 @@ Derived - FullyOverloaded(int 10)
Derived - FullyOverloaded(bool 1) Derived - FullyOverloaded(bool 1)
Derived - SemiOverloaded(int -678) Derived - SemiOverloaded(int -678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
Derived - DefaultParms(10, 2.2) Derived - DefaultParms(10, 2.25)
Derived - DefaultParms(10, 1.1) Derived - DefaultParms(10, 1.125)
-------------------------------- --------------------------------
JavaDerived - Val(444.555) JavaDerived - Val(444.555)
JavaDerived - Ref(444.555) JavaDerived - Ref(444.555)
@ -43,8 +43,8 @@ JavaDerived - FullyOverloaded(int 10)
JavaDerived - FullyOverloaded(bool True) JavaDerived - FullyOverloaded(bool True)
JavaDerived - SemiOverloaded(-678) JavaDerived - SemiOverloaded(-678)
Base - SemiOverloaded(bool 1) Base - SemiOverloaded(bool 1)
JavaDerived - DefaultParms(10, 2.2) JavaDerived - DefaultParms(10, 2.25)
JavaDerived - DefaultParms(10, 1.1) JavaDerived - DefaultParms(10, 1.125)
------------ Finish ------------ ------------ Finish ------------
*/ */
@ -128,7 +128,7 @@ public class director_classes_runme {
if (!myCaller.SemiOverloadedCall(true).equals("Base" + "::SemiOverloaded(bool)")) throw new RuntimeException("failed"); if (!myCaller.SemiOverloadedCall(true).equals("Base" + "::SemiOverloaded(bool)")) throw new RuntimeException("failed");
// Default parameters methods test // Default parameters methods test
if (!(myCaller.DefaultParmsCall(10, 2.2)).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed"); if (!(myCaller.DefaultParmsCall(10, 2.25)).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed");
if (myBase instanceof JavaDerived) { // special handling for Java derived classes, there is no way to do this any other way if (myBase instanceof JavaDerived) { // special handling for Java derived classes, there is no way to do this any other way
if (!myCaller.DefaultParmsCall(10).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed"); if (!myCaller.DefaultParmsCall(10).equals(baseSimpleName + "::DefaultParms(int, double)")) throw new RuntimeException("failed");
} else { } else {
@ -210,7 +210,7 @@ class JavaDerived extends Base
public String DefaultParms(int x) public String DefaultParms(int x)
{ {
if (director_classes.getPrintDebug()) System.out.println("JavaDerived - DefaultParms(" + x + ")"); if (director_classes.getPrintDebug()) System.out.println("JavaDerived - DefaultParms(" + x + ")");
return DefaultParms(x, 1.1/*use C++ default here*/); return DefaultParms(x, 1.125/*use C++ default here*/);
} }
} }

View File

@ -28,7 +28,7 @@ class PHPDerived extends Base {
$rv = preg_replace('/Base/', 'PHPDerived', $rv); $rv = preg_replace('/Base/', 'PHPDerived', $rv);
return $rv; return $rv;
} }
function DefaultParms(int $x, float $y = 1.1) { function DefaultParms(int $x, float $y = 1.125) {
$rv = parent::DefaultParms($x, $y); $rv = parent::DefaultParms($x, $y);
$rv = preg_replace('/Base/', 'PHPDerived', $rv); $rv = preg_replace('/Base/', 'PHPDerived', $rv);
return $rv; return $rv;