blob: 8e9811c5773ba92f0b5f9250f10cd016185803ae [file] [log] [blame]
/*
TEST_OUTPUT:
---
fail_compilation/test13537.d(31): Error: field `U.y` cannot modify fields in `@safe` code that overlap fields with other storage classes
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.z` cannot access pointers in `@safe` code that overlap other fields
fail_compilation/test13537.d(34): 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) { }