Issue 4463 - [AA] double.init in associative array seems 0.0
Summary: [AA] double.init in associative array seems 0.0
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: druntime (show other issues)
Version: D2
Hardware: x86 All
: P3 normal
Assignee: Sean Kelly
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-07-15 04:24 UTC by bearophile_hugs
Modified: 2024-12-07 13:31 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2010-07-15 04:24:09 UTC
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);
}
Comment 1 hsteoh 2012-12-21 07:45:21 UTC
Seems to be related to bug 3825.
Comment 2 MichaelZ 2016-08-18 08:22:24 UTC
@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  :-|
Comment 3 MichaelZ 2016-08-18 08:30:29 UTC
... 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.
Comment 4 Stanislav Blinov 2018-11-22 18:09:24 UTC
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.
Comment 5 Berni 2019-08-27 18:34:04 UTC
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".)
Comment 6 dlangBugzillaToGithub 2024-12-07 13:31:04 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/dmd/issues/17227

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB