// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++98 -Wno-c++11-extensions -Wc++11-compat 
void f() {
  auto a = a; // expected-error{{variable 'a' declared with 'auto' type cannot appear in its own initializer}}
  auto *b = b; // expected-error{{variable 'b' declared with 'auto' type cannot appear in its own initializer}}
  const auto c = c; // expected-error{{variable 'c' declared with 'auto' type cannot appear in its own initializer}}
  if (auto d = d) {} // expected-error {{variable 'd' declared with 'auto' type cannot appear in its own initializer}}
  auto e = ({ auto f = e; 0; }); // expected-error {{variable 'e' declared with 'auto' type cannot appear in its own initializer}}
}

void g() {
  auto a; // expected-error{{declaration of variable 'a' with type 'auto' requires an initializer}}
  
  auto *b; // expected-error{{declaration of variable 'b' with type 'auto *' requires an initializer}}

  if (auto b) {} // expected-error {{must have an initializer}}
  for (;auto b;) {} // expected-error {{must have an initializer}}
  while (auto b) {} // expected-error {{must have an initializer}}
  if (auto b = true) { (void)b; }
}

auto n(1,2,3); // expected-error{{initializer for variable 'n' with type 'auto' contains multiple expressions}}

namespace N
{
  auto a = "const char [16]", *p = &a;
}

void h() {
  auto b = 42ULL;

  for (auto c = 0; c < b; ++c) {
  }
}

template<typename T, typename U> struct same;
template<typename T> struct same<T, T> {};

void p3example() {
  auto x = 5;
  const auto *v = &x, u = 6;
  static auto y = 0.0;
  // In C++98: 'auto' storage class specifier is redundant and incompatible with C++0x
  // In C++0x: 'auto' storage class specifier is not permitted in C++0x, and will not be supported in future releases
  auto int r; // expected-warning {{'auto' storage class specifier}}

  same<__typeof(x), int> xHasTypeInt;
  same<__typeof(v), const int*> vHasTypeConstIntPtr;
  same<__typeof(u), const int> uHasTypeConstInt;
  same<__typeof(y), double> yHasTypeDouble;
}

#if __cplusplus >= 201103L
namespace PR13293 {
  // Ensure that dependent declarators have their deduction delayed.
  int f(char);
  double f(short);
  template<typename T> struct S {
    static constexpr auto (*p)(T) = &f;
  };

  constexpr int (*f1)(char) = &f;
  constexpr double (*f2)(short) = &f;
  static_assert(S<char>::p == f1, "");
  static_assert(S<short>::p == f2, "");

  struct K { int n; };
  template<typename T> struct U {
    static constexpr auto (T::*p) = &K::n;
  };
  static_assert(U<K>::p == &K::n, "");

  template<typename T>
  using X = auto(int) -> auto(*)(T) -> auto(*)(char) -> long;
  X<double> x;
  template<typename T> struct V {
    //static constexpr auto (*p)(int) -> auto(*)(T) -> auto(*)(char) = &x; // ill-formed
    static constexpr auto (*(*(*p)(int))(T))(char) = &x; // ok
  };
  V<double> v;

  int *g(double);
  template<typename T> void h() {
    new (auto(*)(T)) (&g);
  }
  template void h<double>();
}
#endif

auto fail((unknown)); // expected-error{{use of undeclared identifier 'unknown'}}
int& crash = fail;
