/+
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(27): Error: `testOpApply.SameAttr.opApply` called with argument types `(int delegate(int i) pure nothrow @nogc @safe)` matches both:
fail_compilation/testOpApply.d(13):     `testOpApply.SameAttr.opApply(int delegate(int) @system dg)`
and:
fail_compilation/testOpApply.d(18):     `testOpApply.SameAttr.opApply(int delegate(int) @system dg)`
---
+/
struct SameAttr
{
    int opApply(int delegate(int) @system dg) @system
    {
        return 0;
    }
    int opApply(int delegate(int) @system dg) @safe
    {
        return 0;
    }
}
void testSameAttr() @safe
{
    SameAttr sa;
    foreach (int i; sa) {}
}
/+
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(104): Error: `testOpApply.SameAttr.opApply` called with argument types `(int delegate(int i) pure nothrow @nogc @system)` matches both:
fail_compilation/testOpApply.d(13):     `testOpApply.SameAttr.opApply(int delegate(int) @system dg)`
and:
fail_compilation/testOpApply.d(18):     `testOpApply.SameAttr.opApply(int delegate(int) @system dg)`
---
+/
#line 100
void testSameAttr() @system
{
    SameAttr sa;
    foreach (int i; sa) {}
}
/+
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(217): Error: `sa.opApply` matches more than one declaration:
`fail_compilation/testOpApply.d(203)`:     `int(int delegate(int) dg)`
and:
`fail_compilation/testOpApply.d(208)`:     `int(int delegate(string) dg)`
fail_compilation/testOpApply.d(217): Error: cannot uniquely infer `foreach` argument types
---
+/
#line 200
struct DifferentTypes
{
    int opApply(int delegate(int) dg)
    {
        return 0;
    }
    int opApply(int delegate(string) dg)
    {
        return 0;
    }
}
void testDifferentTypes()
{
    DifferentTypes sa;
    foreach (i; sa) {}
}
/+
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(317): Error: `sa.opApply` matches more than one declaration:
`fail_compilation/testOpApply.d(303)`:     `int(int delegate(int) dg)`
and:
`fail_compilation/testOpApply.d(308)`:     `int(int delegate(long) dg)`
fail_compilation/testOpApply.d(317): Error: cannot uniquely infer `foreach` argument types
---
+/
#line 300
struct CovariantTypes
{
    int opApply(int delegate(int) dg)
    {
        return 0;
    }
    int opApply(int delegate(long) dg)
    {
        return 0;
    }
}
void testCovariantTypes()
{
    CovariantTypes sa;
    foreach (i; sa) {}
}
/+
See https://issues.dlang.org/show_bug.cgi?id=21683
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(420): Error: `sa.opApply` matches more than one declaration:
`fail_compilation/testOpApply.d(404)`:     `int(int delegate(int) dg)`
and:
`fail_compilation/testOpApply.d(410)`:     `int(int delegate(ref int) dg)`
fail_compilation/testOpApply.d(420): Error: cannot uniquely infer `foreach` argument types
---
+/
#line 400
struct DifferentQualifiers
{
    int x;
    int opApply(int delegate(int) dg)
    {
        x = 1;
        return 0;
    }
    int opApply(int delegate(ref int) dg)
    {
        x = 2;
        return 0;
    }
}
void testDifferentQualifiers()
{
    DifferentQualifiers sa;
    foreach (i; sa) {}
}
/+
TEST_OUTPUT:
---
fail_compilation/testOpApply.d(504): Error: `sa.opApply` matches more than one declaration:
`fail_compilation/testOpApply.d(404)`:     `int(int delegate(int) dg)`
and:
`fail_compilation/testOpApply.d(410)`:     `int(int delegate(ref int) dg)`
fail_compilation/testOpApply.d(504): Error: cannot uniquely infer `foreach` argument types
---
+/
#line 500
void testDifferentQualifiersRef()
{
    DifferentQualifiers sa;
    foreach (ref i; sa) {}
}