import std.stdio;

void foo()
{
    float  f = x % y;
    double d = x % y;
    real   r = x % y;

    result = (x < y);    // false if x or y is nan
    assert(e == 0);
    int array[ 17 ];
    array[] = value;
    int array[ 17 ];
    for (i = 0; i < array.length; i++)
        func(array[ i ]);
    int array[ 17 ];
    foreach (int value; array)
        func(value);
    int[] array;

    array.length              = array.length + 1;
    array[ array.length - 1 ] = x;
    char[] s1;
    char[] s2;
    char[] s;

    s = s1 ~ s2;
    s ~= "hello";


    writefln("Calling all cars %s times!", ntimes);
 Louter:
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            if (j == 3)
                break Louter;
            if (j == 4)
                continue Louter;
        }
    }
    // break Louter goes here
    typedef bit    bHandle;
    typedef int    iHandle = -1;
    typedef void   *Handle = cast(void *)(-1);
    Handle h;
    h = func();
    if (h != Handle.init)
        ;
    char[] string = "hello";

    if (string < "betty")
        ;
    int *p = address;

    volatile { i = *p; }

    char[] ml = "This text spans
multiple
lines
";
}

void dostring(char[] s)
{
    switch (s)
    {
    case "hello":;

    case "goodbye":;

    case "maybe":;

    default:;
    }
}

struct ABC
{
    int           z;    // z is aligned to the default

    align (1) int x;    // x is byte aligned
    align (4)
    {
        ...             // declarations in {} are dword aligned
    }
    align (2) :         // switch to word alignment from here on

    int y;              // y is word aligned
}

struct Foo
{
    int i;
    union
    {
        struct { int x; long y; }
        char *p;
    }
}

struct Foo { int x; int y; }    // note there is no terminating ;
Foo foo;


struct Foo { int x; int y; }

off = Foo.y.offsetof;

union U { int a; long b; }
U x = { a:5 };

struct S { int a; int b; }
S x = { b:3, a:5 };

int[ 3 ] a = [ 3, 2, 0 ];
int[ 3 ] a = [ 3, 2 ];            // unsupplied initializers are 0, just like in C
int[ 3 ] a = [ 2:0, 0:3, 1:2 ];
int[ 3 ] a = [ 2:0, 0:3, 2 ];     // if not supplied, the index is the
                                  // previous one plus one.

enum color { black, red, green }
int[ 3 ] c = [ black:3, green:2, red:5 ];

char[]  file        = `c:\root\file.c`;
char[]  quoteString = \"  r"[^\\]*(\\.[^\\]*)*"  \";

char[]  hello       = "hello world" \n;
char[]  foo_ascii   = "hello";     // string is taken to be ascii
wchar[] foo_wchar   = "hello";     // string is taken to be wchar

enum COLORS { red, blue, green };

char[][ COLORS.max + 1 ] cstring =
[
    COLORS.red:"red",
    COLORS.blue:"blue",
    COLORS.green:"green",
];

const ushort table1[ 16 ] =
[
    0x00A7, 0x0322, 0x07AD, 0x0428,
    0x0536, 0x06B3, 0x023C, 0x01B9
];

const ushort table2[ 16 ] =
[
    0x0000, 0x0385, 0x070A, 0x048F,
    0x0536, 0x06B3, 0x023C, 0x01B9
];

