Fix Issue 20908 - -preview=nosharedaccess requires zero-initializion for aggregates (#15023)

This commit is contained in:
Razvan Nitu 2023-03-22 23:37:15 +08:00 committed by GitHub
parent 270845e426
commit ec07137001
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 20 deletions

View file

@ -13375,6 +13375,12 @@ bool checkSharedAccess(Expression e, Scope* sc, bool returnRef = false)
bool visitVar(VarExp e)
{
// https://issues.dlang.org/show_bug.cgi?id=20908
// direct access to init symbols is ok as they
// cannot be modified.
if (e.var.isSymbolDeclaration())
return false;
// https://issues.dlang.org/show_bug.cgi?id=22626
// Synchronized functions don't need to use core.atomic
// when accessing `this`.

View file

@ -11,34 +11,48 @@ ref shared(int) f(return shared ref int y)
}
// https://issues.dlang.org/show_bug.cgi?id=20908
struct S
{
int i = 2;
}
union U
{
int i = 1;
bool b;
}
void test20908()
{
// shared locals (or struct members) should be able to be initialised:
shared int x;
// shared locals (or struct members) should be able to be initialised:
shared int x;
ref shared(int) fun()
{
static shared(int) val;
ref shared(int) fun()
{
static shared(int) val;
// return by reference
return val;
}
// return by reference
return val;
}
ref shared(int) fun2()
{
static shared(int)* val;
ref shared(int) fun2()
{
static shared(int)* val;
// transfer pointer to reference
return *val;
}
// transfer pointer to reference
return *val;
}
ref shared(int) fun3()
{
static shared(int)*** val;
ref shared(int) fun3()
{
static shared(int)*** val;
// Multiple indirections
return ***val;
}
// Multiple indirections
return ***val;
}
shared S s;
shared U u;
}
// Simple tests for `DotVarExp`