D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 6080 - Statically constructed Structs - Constructor/Initialization ambiguity
Summary: Statically constructed Structs - Constructor/Initialization ambiguity
Status: RESOLVED WORKSFORME
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: x86_64 Linux
: P2 major
Assignee: No Owner
URL: http://stackoverflow.com/questions/61...
Keywords:
Depends on:
Blocks:
 
Reported: 2011-05-31 02:24 UTC by daniel
Modified: 2022-12-06 13:45 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 daniel 2011-05-31 02:24:08 UTC
SO Question: http://stackoverflow.com/questions/6184422/ambiguous-struct-constructors-in-d
Source example: http://www.pastie.org/1997238
Actual Output: 5,3 2,8 2,10
Expected Output: 2,10 2,8 2,10

If the above doesn't provide all the information, then I'll summarize:

Statically constructed structs are defaulting to the parameter list initialization instead of using a constructor.

I'm to assume this is a bug, and possibly a flaw in ambiguity, at least a warning should be displayed.
Comment 1 daniel 2011-05-31 02:24:56 UTC
And, it should be consistent between statically defined and locally defined structs?
Comment 2 Andrej Mitrovic 2011-05-31 03:07:51 UTC
A similar bug, but for enums, is reported in issue 5460.
Comment 3 bearophile_hugs 2011-05-31 04:13:00 UTC
Please, don't link code that's in external paste sites, because their pages are often ephemeral. The code, with small changes:


import core.stdc.stdio: printf;

struct Foo {
    int a = 2;
    int b = 3;

    this(int c) {
        a = c / 2;
        b = c * 2;
    }

    this(float c) {
        a = cast(int) c / 2;
        b = cast(int) c * 2;
    }

    static Foo F1 = Foo(4.3);
    static Foo F2 = Foo(5);
}

void main() {
    printf("%d %d\n", Foo.F1.a, Foo.F1.b); // 2 8
    printf("%d %d\n", Foo.F2.a, Foo.F2.b); // 5 3

    Foo F3 = Foo(5);
    printf("%d %d\n", F3.a, F3.b); // 2 10
}
Comment 4 daniel 2011-05-31 16:32:01 UTC
Thanks for simplifying it mate.
Comment 5 RazvanN 2022-12-06 13:45:15 UTC
I cannot reproduce this. When I run the code presented in https://issues.dlang.org/show_bug.cgi?id=6080#c3 , I am getting:

2 8
2 10
2 10

Which is the correct result.