dmd icon indicating copy to clipboard operation
dmd copied to clipboard

[AA] double.init in associative array seems 0.0

Open dlangBugzillaToGithub opened this issue 15 years ago • 6 comments

bearophile_hugs reported this on 2010-07-15T04:24:09Z

Transferred from https://issues.dlang.org/show_bug.cgi?id=4463

CC List

  • MichaelZ
  • Berni (@Vild)
  • Stanislav Blinov

Description

With dmd 2.047 this code doesn't assert at runtime (aa[0] has to be nan):


void main() {
    double[int] aa;
    aa[0]++;
    assert(aa[0] == 1.0);
}

dlangBugzillaToGithub avatar Jul 15 '10 04:07 dlangBugzillaToGithub

hsteoh commented on 2012-12-21T07:45:21Z

Seems to be related to bug 3825.

dlangBugzillaToGithub avatar Dec 21 '12 07:12 dlangBugzillaToGithub

dlang.org commented on 2016-08-18T08:22:24Z

@hsteoh: I don't believe it is related to 3825; 3825 has been apparently fixed (for d2) in 2013 (q.v.), but the behaviour described by bearophile_hugs is still present in dmd 2.071.0  :-|

dlangBugzillaToGithub avatar Aug 18 '16 08:08 dlangBugzillaToGithub

dlang.org commented on 2016-08-18T08:30:29Z

... having said that, the double behaviour is explicitly brought up in the pull request discussion pertaining to 3825: see quickfur's first comment on https://github.com/dlang/dmd/pull/1465.

dlangBugzillaToGithub avatar Aug 18 '16 08:08 dlangBugzillaToGithub

stanislav.blinov commented on 2018-11-22T18:09:24Z

Now that we have an .update() for AAs, this needs to be resolved. This test should pass:

unittest {
    double[int] aa;
    aa[0]++;
    import std.math;
    assert(aa[0].isNaN);
}

The appropriate create/modify for non-zero-initialized types is:

unittest {
    double[int] aa;
    aa.update(0, { return 0.0; }, (ref double d) { d++; return d; });
    assert(aa[0] == 1.0);
}

Let's not let convenience defeat the type system, please.

dlangBugzillaToGithub avatar Nov 22 '18 18:11 dlangBugzillaToGithub

dlang (@Vild) commented on 2019-08-27T18:34:04Z

In my oppinion aa[0]++ should behave exactly the same as aa[0] = aa[0]+1. Therefore in my oppinion a correct unittest would be:

unittest 
{
    import std.exception: assertThrown;
    import core.exception: RangeError;

    double[int] aa;
    assertThrown!RangeError(aa[0]++);
}

(At the moment with dmd v2.082.0 this leads to a segmentation fault, while
with ldc2 1.12.0 and gdc 8.3.0 I get the expected "assertThrown failed".)

dlangBugzillaToGithub avatar Aug 27 '19 18:08 dlangBugzillaToGithub

It's even inconsistent between CTFE and runtime:

double test()
{
    double[int] aa;
    return ++aa[0];
}

enum res = test();

void main()
{
	assert(test() == res); // [email protected](11): 1 != nan
}

rainers avatar Jun 14 '25 09:06 rainers