mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
158 lines
2.5 KiB
D
158 lines
2.5 KiB
D
/* REQUIRED_ARGS: -preview=nosharedaccess
|
|
TEST_OUTPUT:
|
|
---
|
|
pure nothrow @nogc ref @safe shared(C1)(return ref shared(C1) c)
|
|
pure nothrow @nogc ref @safe shared(int)(return ref shared(C3) c)
|
|
---
|
|
*/
|
|
ref shared(int) f(return shared ref int y)
|
|
{
|
|
return 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;
|
|
|
|
ref shared(int) fun()
|
|
{
|
|
static shared(int) val;
|
|
|
|
// return by reference
|
|
return val;
|
|
}
|
|
|
|
ref shared(int) fun2()
|
|
{
|
|
static shared(int)* val;
|
|
|
|
// transfer pointer to reference
|
|
return *val;
|
|
}
|
|
|
|
ref shared(int) fun3()
|
|
{
|
|
static shared(int)*** val;
|
|
|
|
// Multiple indirections
|
|
return ***val;
|
|
}
|
|
|
|
shared S s;
|
|
shared U u;
|
|
}
|
|
|
|
// Simple tests for `DotVarExp`
|
|
// A `DotVarExp` is `a.b`. If `a` is a `shared ref`,
|
|
// it is of type `shared(T)*` (as opposed to `shared(T*)`).
|
|
// We should allow arbitrarily nested `DotVarExp` as long
|
|
// as no shared memory is read, as in the case above
|
|
// (we're just offsetting a pointer).
|
|
struct C1
|
|
{
|
|
int value;
|
|
}
|
|
|
|
struct C2
|
|
{
|
|
C1 c1;
|
|
}
|
|
|
|
struct C3
|
|
{
|
|
C2 c1;
|
|
C2 c2;
|
|
}
|
|
|
|
ref shared(int) test_dotvarexp_1(return ref shared C1 c)
|
|
{
|
|
return c.value;
|
|
}
|
|
|
|
shared(int)* test_dotvarexp_2(return ref shared C1 c)
|
|
{
|
|
return &c.value;
|
|
}
|
|
|
|
shared(C2)* test_dotvarexp_3(return ref shared C3 c)
|
|
{
|
|
return &c.c1;
|
|
}
|
|
|
|
shared(C2)* test_dotvarexp_4(return ref shared C3 c)
|
|
{
|
|
return &c.c2;
|
|
}
|
|
|
|
ref shared(int) test_dotvarexp_5(return shared ref C3 c)
|
|
{
|
|
return c.c1.c1.value;
|
|
}
|
|
|
|
ref shared(int) test_dotvarexp_5(return ref shared(C3)[] c)
|
|
{
|
|
return c[0].c1.c1.value;
|
|
}
|
|
|
|
// Test `auto` inference
|
|
auto ref test_inference_1(return ref shared C1 c)
|
|
{
|
|
return c;
|
|
}
|
|
|
|
pragma(msg, typeof(test_inference_1));
|
|
|
|
auto ref test_inference_2(return ref shared C3 c)
|
|
{
|
|
return c.c2.c1.value;
|
|
}
|
|
|
|
pragma(msg, typeof(test_inference_2));
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=21793
|
|
|
|
struct Child
|
|
{
|
|
this(int) shared {}
|
|
}
|
|
|
|
struct Parent
|
|
{
|
|
shared Child ch;
|
|
this(int i) shared
|
|
{
|
|
ch = shared Child(i);
|
|
}
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=23732
|
|
class Class {}
|
|
void main()
|
|
{
|
|
auto b = new shared Class();
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=23790
|
|
bool cas(shared bool*, bool, bool) { return true; }
|
|
|
|
struct Argh
|
|
{
|
|
bool locked;
|
|
void lock() shared
|
|
{
|
|
while(!cas(&locked, false, true)) {}
|
|
}
|
|
}
|