blob: 64602f875c2cae0c0e5704c2d4bdd3d3b2c39b06 [file] [log] [blame]
// REQUIRED_ARGS:
// PERMUTE_ARGS:
/***************************************************/
// immutable field
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(19): Error: immutable field 'v' initialized multiple times
---
+/
struct S1A
{
immutable int v;
this(int)
{
v = 1;
v = 2; // multiple initialization
}
}
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(37): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(42): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(47): Error: immutable field 'v' initialized multiple times
---
+/
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
}
}
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(65): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(70): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(75): Error: immutable field 'v' initialized multiple times
---
+/
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
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(98): Error: immutable field 'v' initialization is not allowed in loops or after labels
fail_compilation/fail9665a.d(103): Error: immutable field 'v' initialization is not allowed in loops or after labels
fail_compilation/fail9665a.d(108): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(113): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(118): Error: immutable field 'v' initialized multiple times
---
+/
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
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(139): Error: immutable field 'v' initialized multiple times
fail_compilation/fail9665a.d(143): Error: immutable field 'w' initialized multiple times
---
+/
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)
/+
TEST_OUTPUT:
---
fail_compilation/fail9665a.d(163): Error: static assert `__traits(compiles, this.v = 1)` is false
---
+/
struct S4
{
immutable int v;
this(int)
{
static assert(__traits(compiles, v = 1));
v = 1;
static assert(__traits(compiles, v = 1)); // multiple initialization
}
}