// Positive test for auto
// { dg-do run }
// { dg-options "-std=c++0x" }

#include <typeinfo>
extern "C" void abort();

int f() {}

struct A
{
  int i;
  int f() {}
  A operator+(A a) { return a; }
};

template <class T>
void g(T t)
{
  auto x = t+t;
  if (typeid(x) != typeid(t+t))
    abort();

  auto p = new auto(&t);
  if (typeid(p) != typeid(T**))
    abort();
}

int main()
{
  auto i = 42;
  if (typeid (i) != typeid (int))
    abort();

  auto *p = &i;
  if (typeid (p) != typeid (int*))
    abort();

  auto *p2 = &p;
  if (typeid (p2) != typeid (int**))
    abort();

  auto (*fp)() = f;
  if (typeid (fp) != typeid (int (*)()))
    abort();

  auto A::* pm = &A::i;
  if (typeid (pm) != typeid (int A::*))
    abort();

  auto (A::*pmf)() = &A::f;
  if (typeid (pmf) != typeid (int (A::*)()))
    abort();

  g(42);
  g(10.f);
  g(A());

  auto *p3 = new auto (i);
  if (typeid (p3) != typeid (int*))
    abort();

  for (auto idx = i; idx != 0; idx = 0);
  while (auto idx = 0);
  if (auto idx = 1);

  switch (auto s = i)
    {
    case 42:
      break;
    }

  auto j = 42, k = 24;
}
