[Issue 17087] New: [REG2.072] Wrong generated with cfloat and creal when casting from int
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Jan 13 10:52:59 PST 2017
https://issues.dlang.org/show_bug.cgi?id=17087
Issue ID: 17087
Summary: [REG2.072] Wrong generated with cfloat and creal when
casting from int
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: critical
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: petar.p.kirov at gmail.com
//Minimal test case
void main()
{
cfloat toComplex(int x) { return cast(cfloat)x; }
auto a = toComplex(1);
auto b = cast(creal)1;
assert (a == b);
}
Output:
core.exception.AssertError@/tmp/test.d(6): Assertion failure
//Longer test case
D toComplex(D, S)(S val)
{
return cast(D) val;
}
alias Seq(T...) = T;
enum isComplex(T) = is(T == cfloat) || is(T == cdouble) || is(T == creal);
void main()
{
bool hasErrors;
foreach (OriginalType; Seq!(byte, short, int, long, float, double, real,
cfloat, cdouble, creal))
foreach (DestType; Seq!(byte, short, int, long, float, double, real,
cfloat, cdouble, creal))
{
import std.stdio;
static if (isComplex!OriginalType)
enum orig = OriginalType(1 + 0i);
else
enum orig = OriginalType(1);
auto a = toComplex!DestType(orig);
auto b = cast(DestType)orig;
if (orig != a)
{
hasErrors = true;
"Error: orig != a when converting from %s to %s {orig(%s) !=
a(%s)}"
.writefln(OriginalType.stringof, DestType.stringof, orig, a,
b);
}
if (orig != b)
{
hasErrors = true;
"Error: orig != b when converting from %s to %s {orig(%s) !=
b(%s)}"
.writefln(OriginalType.stringof, DestType.stringof, orig, a,
b);
}
if (a != b)
{
hasErrors = true;
"Error: a != b when converting from %s to %s {orig(%s) a(%s) !=
b(%s)}"
.writefln(OriginalType.stringof, DestType.stringof, orig, a,
b);
}
}
!hasErrors || assert(0);
}
Output:
Error: orig != a when converting from byte to cfloat {orig(1) != a(0+0i)}
Error: a != b when converting from byte to cfloat {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from byte to creal {orig(1) != a(0+0i)}
Error: a != b when converting from byte to creal {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from short to cfloat {orig(1) != a(0+0i)}
Error: a != b when converting from short to cfloat {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from short to creal {orig(1) != a(0+0i)}
Error: a != b when converting from short to creal {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from int to cfloat {orig(1) != a(0+0i)}
Error: a != b when converting from int to cfloat {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from int to creal {orig(1) != a(0+0i)}
Error: a != b when converting from int to creal {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from long to cfloat {orig(1) != a(0+0i)}
Error: a != b when converting from long to cfloat {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from long to creal {orig(1) != a(0+0i)}
Error: a != b when converting from long to creal {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from double to cfloat {orig(1) != a(0+0i)}
Error: a != b when converting from double to cfloat {orig(1) a(0+0i) !=
b(1+0i)}
Error: orig != a when converting from double to creal {orig(1) != a(0+0i)}
Error: a != b when converting from double to creal {orig(1) a(0+0i) != b(1+0i)}
Error: orig != a when converting from cfloat to double {orig(1+0i) != a(1)}
Error: orig != b when converting from cfloat to double {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to byte {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to byte {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to short {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to short {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to int {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to int {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to long {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to long {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to float {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to float {orig(1+0i) != b(1)}
Error: orig != a when converting from cdouble to double {orig(1+0i) != a(1)}
Error: orig != b when converting from cdouble to double {orig(1+0i) != b(1)}
core.exception.AssertError@/tmp/test.d(49): Assertion failure
--
More information about the Digitalmars-d-bugs
mailing list