// for D 2.0 only

class C { }

void foo(const C c, const(char)[] s, const int* q, const (int*) p)
{
}

void bar(in void *p)
{
}

void f(void function() f2);

class C2;
void foo2(const C2 c);

struct Foo3
{
   int k;
   ~this() @trusted @disable @nogc @live { k = 1; }
   this(this) { k = 2; }
}


class C3 { @property int get() { return 0; } }

T foo3(T)() {}

struct S4A(T)
{
   T x;
   ~this() @safe {}
}

struct S4B(T) if (1)
{
   T x;
}

union U4A(T)
{
    T x;
}

union U4B(T) if (2*4 == 8)
{
   T x;
}

class C4A(T)
{
  T x;
}

class C4B(T) if (true) { T x; }

class C4C(T) : C4A!int if (!false)
{
  T x;
}

class C4D(T) if (!false) : C4B!long, C4C!(int[])
{
    T x;
}

interface I4(T) if ((int[1]).length == 1) { T x; }

// eponymous template case
template MyClass4(T)
    if (is(typeof(T.subtype)))
{
    alias HelperSymbol = T.subtype;
    class MyClass4 {}
}

enum isInt(T) = is(T == int);
enum bool isString(T) = is(T == string);
static immutable typeName(T) = T.stringof;
int storageFor(T) = 0;

template templateVariableFoo(T)
{
    enum int templateVariableFoo = T.stringof.length;
}
template templateVariableBar(T) if (is(T == int))
{
    enum int templateVariableBar = T.stringof.length;
}

auto flit = 3 / 2.0;

// https://issues.dlang.org/show_bug.cgi?id=11217
void foo11217()(    const int[] arr) {}
void foo11217()(immutable int[] arr) {}
void foo11217()(      ref int[] arr) {}
void foo11217()(     lazy int[] arr) {}
void foo11217()( auto ref int[] arr) {}
void foo11217()(    scope int[] arr) {}
void foo11217()(       in int[] arr) {}
void foo11217()(    inout int[] arr) {}

// https://issues.dlang.org/show_bug.cgi?id=13275
void test13275()
{
    if (        auto n = 1) {}
    if (       const n = 1) {}
    if (   immutable n = 1) {}
    if (shared       n = 1) {}
    if (shared const n = 1) {}

    if (             int  n = 1) {}

    if (       const int  n = 1) {}
    if (   immutable int  n = 1) {}
    if (shared       int  n = 1) {}
    if (shared const int  n = 1) {}

    if (       const(int) n = 1) {}
    if (   immutable(int) n = 1) {}
    if (shared      (int) n = 1) {}
    if (shared const(int) n = 1) {}

    foreach (             e; [1,2]) {}
    foreach (       const e; [1,2]) {}
    foreach (   immutable e; [1,2]) {}
    foreach (shared       e; [1,2]) {}
    foreach (shared const e; [1,2]) {}

    foreach (             int e; [1,2]) {}
    foreach (       const int e; [1,2]) {}
    foreach (   immutable int e; [1,2]) {}
    foreach (shared       int e; [1,2]) {}
    foreach (shared const int e; [1,2]) {}

    foreach (             int e; [1,2]) {}
    foreach (       const(int) e; [1,2]) {}
    foreach (   immutable(int) e; [1,2]) {}
    foreach (shared      (int) e; [1,2]) {}
    foreach (shared const(int) e; [1,2]) {}
}

// https://issues.dlang.org/show_bug.cgi?id=9766
align (1) struct S9766
{
align {}
align (true ? 2 : 3):
    int var1;

align:
    int var2;
}

align(2) struct S12200_1
{
align:
}

align(2) struct S12200_2
{
align(1):
}

// https://issues.dlang.org/show_bug.cgi?id=16140
void gun()()
{
    int[] res;
    while (auto va = fun()) {}  // expression expected, not 'auto'

    while (true)
        if (auto va = fun()) {}
        else break;
}

// https://issues.dlang.org/show_bug.cgi?id=16649
void leFoo()()
{
    sign = a == 2 ? false : (y < 0) ^ sign;
    sign = a == 2 ? false : sign ^ (y < 0);
    sign = 2 + 3 | 7 + 5;
}

// https://issues.dlang.org/show_bug.cgi?id=17371
interface LeInterface
{}
class LeClass
{
    this()
    {
        auto foo = new class () LeInterface {};
    }
}
const levar = new class LeClass, LeInterface {};

// https://issues.dlang.org/show_bug.cgi?id=20074
class CC
{
    void fun()() @safe
    {
        () @trusted pure
        {
        } ();
    }
}

// https://issues.dlang.org/show_bug.cgi?id=17663
private:
public struct Export {}
