blob: 285365eea82e36b53254a724e6a9a63f49dccbd3 [file] [log] [blame]
/* PERMUTE_ARGS: -preview=dip1000
*/
// https://issues.dlang.org/show_bug.cgi?id=15624
struct Foo {
int x;
int opApply(int delegate(int, string, string) @safe dg) @safe {
x = 1;
return 0;
}
int opApply(int delegate(int, string, string) @system dg) @system {
x = 2;
return 0;
}
}
void testSafe() @safe {
Foo foo;
foreach (i, k, v; foo) {
}
assert(foo.x == 1);
}
void testSystem() @system {
Foo foo;
foreach (i, k, v; foo) {
}
assert(foo.x == 2);
}
void test() @system
{
Foo f;
int dgsafe (int x, string s, string t) @safe { return 1; }
int dgsystem(int x, string s, string t) @system { return 1; }
f.opApply(&dgsafe);
assert(f.x == 1);
f.opApply(&dgsystem);
assert(f.x == 2);
}
int main()
{
testSafe();
testSystem();
test();
testDifferentTypes();
testSameAttributes();
testInverseAttributes();
return 0;
}
void testDifferentTypes()
{
static struct DifferentTypes
{
int x;
int opApply(int delegate(int) dg) @safe {
x = 1;
return 0;
}
int opApply(int delegate(long) dg) @safe {
x = 2;
return 0;
}
}
DifferentTypes dt;
foreach (int i; dt) {}
assert(dt.x == 1);
foreach (long i; dt) {}
assert(dt.x == 2);
}
void testSameAttributes()
{
static struct SameAttributes
{
int x;
int opApply(int delegate(int) @system dg) @safe {
x = 1;
return 0;
}
int opApply(int delegate(int) @safe dg) @safe {
x = 2;
return 0;
}
}
static void safe() @safe
{
SameAttributes sa;
foreach (i; sa) {}
assert(sa.x == 2);
}
safe();
static void system() @system
{
SameAttributes sa;
foreach (i; sa) {}
assert(sa.x == 1);
}
system();
}
// Not useful but enabled by the associated patch
void testInverseAttributes()
{
static struct InverseAttributes
{
int x;
int opApply(int delegate(int) @system dg) @safe {
x = 1;
return 0;
}
int opApply(int delegate(int) @safe dg) @system {
x = 2;
return 0;
}
}
static void system() @system
{
InverseAttributes sa;
foreach (i; sa) {}
assert(sa.x == 1);
}
system();
static void safe() @safe
{
InverseAttributes sa;
(() @trusted { foreach (i; sa) {} })();
assert(sa.x == 2);
}
safe();
}
// https://issues.dlang.org/show_bug.cgi?id=20907
Lockstep!() lockstep()
{
return Lockstep!()();
}
struct Lockstep()
{
int opApply(int delegate(int) callback) @system
{
return 0;
}
int opApply(int delegate(int) pure nothrow @nogc @safe callback) pure nothrow @nogc @safe
{
return 0;
}
}
void foo0()
{
foreach (x; lockstep()) {}
}
void foo1()
{
foreach (x; lockstep()) {}
}