| /+ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/fail9665a.d(43): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(42): Previous initialization is here. |
| fail_compilation/fail9665a.d(53): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(52): Previous initialization is here. |
| fail_compilation/fail9665a.d(58): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(57): Previous initialization is here. |
| fail_compilation/fail9665a.d(63): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(62): Previous initialization is here. |
| fail_compilation/fail9665a.d(73): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(72): Previous initialization is here. |
| fail_compilation/fail9665a.d(78): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(77): Previous initialization is here. |
| fail_compilation/fail9665a.d(83): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(82): Previous initialization is here. |
| fail_compilation/fail9665a.d(96): Error: immutable field `v` initialization is not allowed in loops or after labels |
| fail_compilation/fail9665a.d(101): Error: immutable field `v` initialization is not allowed in loops or after labels |
| fail_compilation/fail9665a.d(106): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(105): Previous initialization is here. |
| fail_compilation/fail9665a.d(111): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(110): Previous initialization is here. |
| fail_compilation/fail9665a.d(116): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(115): Previous initialization is here. |
| fail_compilation/fail9665a.d(130): Error: immutable field `v` initialized multiple times |
| fail_compilation/fail9665a.d(129): Previous initialization is here. |
| fail_compilation/fail9665a.d(134): Error: immutable field `w` initialized multiple times |
| fail_compilation/fail9665a.d(133): Previous initialization is here. |
| fail_compilation/fail9665a.d(148): Error: static assert: `__traits(compiles, this.v = 1)` is false |
| --- |
| +/ |
| |
| /***************************************************/ |
| // immutable field |
| |
| struct S1A |
| { |
| immutable int v; |
| this(int) |
| { |
| v = 1; |
| v = 2; // multiple initialization |
| } |
| } |
| |
| struct S1B |
| { |
| immutable int v; |
| this(int) |
| { |
| if (true) v = 1; else v = 2; |
| v = 3; // multiple initialization |
| } |
| this(long) |
| { |
| if (true) v = 1; |
| v = 3; // multiple initialization |
| } |
| this(string) |
| { |
| if (true) {} else v = 2; |
| v = 3; // multiple initialization |
| } |
| } |
| |
| struct S1C |
| { |
| immutable int v; |
| this(int) |
| { |
| true ? (v = 1) : (v = 2); |
| v = 3; // multiple initialization |
| } |
| this(long) |
| { |
| auto x = true ? (v = 1) : 2; |
| v = 3; // multiple initialization |
| } |
| this(string) |
| { |
| auto x = true ? 1 : (v = 2); |
| v = 3; // multiple initialization |
| } |
| } |
| |
| /***************************************************/ |
| // with control flow |
| |
| struct S2 |
| { |
| immutable int v; |
| this(int) |
| { |
| L: |
| v = 1; // after labels |
| } |
| this(long) |
| { |
| foreach (i; 0..1) |
| v = 1; // in loops |
| } |
| this(string) |
| { |
| v = 1; // initialization |
| L: v = 2; // assignment after labels |
| } |
| this(wstring) |
| { |
| v = 1; // initialization |
| foreach (i; 0..1) v = 2; // assignment in loops |
| } |
| this(dstring) |
| { |
| v = 1; return; |
| v = 2; // multiple initialization |
| } |
| } |
| |
| /***************************************************/ |
| // with immutable constructor |
| |
| struct S3 |
| { |
| int v; |
| int w; |
| this(int) immutable |
| { |
| v = 1; |
| v = 2; // multiple initialization |
| |
| if (true) |
| w = 1; |
| w = 2; // multiple initialization |
| } |
| } |
| |
| /***************************************************/ |
| // in __traits(compiles) |
| |
| struct S4 |
| { |
| immutable int v; |
| this(int) |
| { |
| static assert(__traits(compiles, v = 1)); |
| v = 1; |
| static assert(__traits(compiles, v = 1)); // multiple initialization |
| } |
| } |