// Build don't link: 
// GROUPS passed error-reporting
template <char C>
class badoo
{
};

template <int (*F) (int)>
class doowop
{
};

struct A
{
  int a;
  ~A () { a = 0; }
  operator int () { return a; }
};

extern "C" int atoi (char *);

int (*fee)(char *) = atoi;
int (**bar)(char *) = &fee;

char *s = "4";
char **sp = &s;
char ***spp = &sp;

int foo (int a = (**bar) (s))
{
   return doowop<foo>::bar; // ERROR - not a member
} // ERROR - non-void

int foo2 (int (*a)(int) = &foo)
{
   undef4 (1); // ERROR - implicit declaration
  return 1;
}

class X{
  class Y{};
};

typedef int const * bart ();
typedef bart const * const * bar2;

bar2 baz (X::Y y)
{
  X::Y f;
  bar2 wa [5];
  wa[0] = baz(f);
  undef2 (1); // ERROR - implicit declaration
} // ERROR - non-void

int ninny ()
{
  struct A
    {
	  static int ninny2 () { return badoo<'\001'>::foo; } // ERROR - not a member
    };

  return A::ninny2();
}

int darg (char X::*p)
{
   undef3 (1); // ERROR - implicit declaration
} // ERROR - non-void
