// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

template <class T>
struct only
{
    only(T) {}

    template <class U>
    only(U)
    {
        static_assert(sizeof(U) == 0, "expected type failure");
    }
};

auto f() -> int
{
    return 0;
}

auto g(); // expected-error{{return without trailing return type; deduced return types are a C++14 extension}}
decltype(auto) g2(); // expected-warning{{extension}} expected-error-re{{{{^}}deduced return types are a C++14 extension}}
auto badness = g2();

int h() -> int; // expected-error{{trailing return type must specify return type 'auto', not 'int'}}

int i();
auto i() -> int;
int i() {}

using T = auto (int) -> auto (*)(char) -> void; // expected-note {{previous}}
using T = void; // expected-error {{type alias redefinition with different types ('void' vs 'auto (int) -> auto (*)(char) -> void')}}

using U = auto (int) -> auto (*)(char) -> void;
using U = void (*(int))(char); // ok

int x;

template <class T>
auto i(T x) -> decltype(x)
{
    return x;
}

only<double> p1 = i(1.0);

template <class T>
struct X
{
    auto f(T x) -> T { return x; }

    template <class U>
    auto g(T x, U y) -> decltype(x + y)
    {
        return x + y;
    }

  template<typename U>
  struct nested {
    template <class V>
    auto h(T x, U y, V z) -> decltype(x + y + z)
    {
        return x + y + z;
    }
  };

  template<typename U>
  nested<U> get_nested();
};

X<int> xx;
only<int> p2 = xx.f(0L);
only<double> p3 = xx.g(0L, 1.0);
only<double> p4 = xx.get_nested<double>().h(0L, 1.0, 3.14f);

namespace PR12053 {
  template <typename T>
  auto f1(T t) -> decltype(f1(t)) {} // expected-note{{candidate template ignored}}

  void test_f1() {
    f1(0); // expected-error{{no matching function for call to 'f1'}}
  }

  template <typename T>
  auto f2(T t) -> decltype(f2(&t)) {} // expected-note{{candidate template ignored}}

  void test_f2() {
    f2(0); // expected-error{{no matching function for call to 'f2'}}
  }
}

namespace DR1608 {
  struct S {
    void operator+();
    int operator[](int);
    auto f() -> decltype(+*this); // expected-note {{here}}
    auto f() -> decltype((*this)[0]); // expected-error {{cannot be overloaded}}
  };
}

namespace PR16273 {
  struct A {
    template <int N> void f();
    auto g()->decltype(this->f<0>());
  };
}

