struct S 
{
  template <class T>
  void f(T (&i)[7])
    {}

  void g()
    {
      int i[] = {1, 2, 3, 4, 5, 6, 7};
      f(i);
      int j[7];
      f(j);
    }
};

struct foo {
  template <typename T, int N>
  static T* array_end(T(&array)[N]) { return &array[N]; }
};

struct X
{
  template <class T1>
  void f(const T1&) {}
};

main(int ac, char* av[]) {
  S s;
  s.g();
  int i[] = {1,2,3,4,5};
  int* e = foo::array_end(i);
  X x;
  x.f("hello");
}
 
