int&Function()
{
   static int x;

   return(x);
}

void foo1(int param1, int param2, char *param2);

void foo2(int  param1,
          int  param2,
          char *param2);

void foo3(int  param1,
          int  param2,                                       // comment
          char *param2
          );

struct whoopee *foo4(int param1, int param2, char *param2 /* comment */);

const struct snickers *
foo5(int param1, int param2, char *param2);


void foo(int param1, int param2, char *param2)
{
   printf ("boo!\n");
}

int classname::method();

int classname::method()
{
   foo();
}

int
classname::method2();

int
classname::method2()
{
   foo2();
}

const int& className::method1(void) const
{
   // stuff
}

const longtypename& className::method2(void) const
{
   // stuff
}

int&foo();

int&foo()
{
   list_for_each (a, b)
   {
      bar (a);
   }
   return(nuts);
}

void Foo::bar()
{
}

Foo::Foo()
{
}

Foo::~Foo()
{
}

void func(void)
{
   Directory dir ("arg");
}
