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];

