blob: 0e087dd5640929580d504698409fd701e76bd5cc [file] [log] [blame]
/*
PERMUTE_ARGS:
TEST_OUTPUT:
---
fail_compilation/test13537.d(32): Error: field U.y cannot modify fields in @safe code that overlap fields with other storage classes
fail_compilation/test13537.d(33): Error: field U.y cannot modify fields in @safe code that overlap fields with other storage classes
fail_compilation/test13537.d(34): Error: field U.z cannot access pointers in @safe code that overlap other fields
fail_compilation/test13537.d(35): Error: field U.y cannot modify fields in @safe code that overlap fields with other storage classes
---
*/
// https://issues.dlang.org/show_bug.cgi?id=13537
union U
{
immutable int x;
int y;
int* z;
}
union V
{
immutable int x;
const int y;
}
void fun() @safe
{
U u;
// errors
u.y = 1;
int* p = &u.y;
int** q = &u.z;
abc(u.y);
// read access is allowed
int a = u.x;
a = u.y;
def(u.y);
// Overlapping const/immutable is allowed
auto v = V(1);
assert(v.y == 1);
}
void gun() @system
{
U u;
// allowed because system code
u.y = 1;
int* p = &u.y;
int** q = &u.z;
abc(u.y);
}
@safe:
void abc(ref int x) { }
void def(const ref int x) { }