digitalmars.D.bugs - [Issue 16576] New: Strange behavior using static enum in struct
- via Digitalmars-d-bugs (72/72) Oct 02 2016 https://issues.dlang.org/show_bug.cgi?id=16576
https://issues.dlang.org/show_bug.cgi?id=16576 Issue ID: 16576 Summary: Strange behavior using static enum in struct Product: D Version: D2 Hardware: x86 OS: Windows Status: NEW Severity: major Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: meapineapple gmail.com Using DMD32 D Compiler v2.071.2-b6 32bit on Win7 results in this example having an access violation: import std.stdio; struct Thing{ static enum Instance = Thing([0, 1, 2, 3]); int[] array; void iter(in string str) const{ foreach(tup; this.array) tup.writeln; } } unittest{ auto test(in string str){return Thing.Instance.iter(str);} test("?"); } When I first encountered this bug, it appeared that the `array` attribute in the code I was working on was junk bytes. This example, with the string arg removed, does not get an access violation but results in incorrect behavior - the program should print out the numbers 0 through 3 but instead prints nothing: import std.stdio; struct Thing{ static enum Instance = Thing([0, 1, 2, 3]); int[] array; void iter() const{ foreach(tup; this.array) tup.writeln; } } unittest{ auto test(){return Thing.Instance.iter();} test(); } This example, using `static immutable` instead of `static enum` on the third line, behaves as expected: import std.stdio; struct Thing{ static immutable Instance = Thing([0, 1, 2, 3]); int[] array; void iter(in string str) const{ foreach(tup; this.array) tup.writeln; } } unittest{ auto test(in string str){return Thing.Instance.iter(str);} test("?"); } This example, calling the `iter` method directly instead of via `test`, behaves as expected: import std.stdio; struct Thing{ static enum Instance = Thing([0, 1, 2, 3]); int[] array; void iter(in string str) const{ foreach(tup; this.array) tup.writeln; } } unittest{ Thing.Instance.iter("?"); } --
Oct 02 2016