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

// rdar://12240916 stack overflow.
namespace rdar12240916 {

struct S2 {
  S2(const S2&);
  S2();
};

struct S { // expected-note {{not complete}}
  S x; // expected-error {{incomplete type}}
  S2 y;
};

S foo() {
  S s;
  return s;
}

struct S3; // expected-note {{forward declaration}}

struct S4 {
  S3 x; // expected-error {{incomplete type}}
  S2 y;
};

struct S3 {
  S4 x;
  S2 y;
};

S4 foo2() {
  S4 s;
  return s;
}

}

// rdar://12542261 stack overflow.
namespace rdar12542261 {

template <class _Tp>
struct check_complete
{
  static_assert(sizeof(_Tp) > 0, "Type must be complete.");
};


template<class _Rp>
class function // expected-note 2 {{candidate}}
{
public:
  template<class _Fp>
  function(_Fp, typename check_complete<_Fp>::type* = 0);  // expected-note {{candidate}}
};

void foobar()
{
  auto LeftCanvas = new Canvas(); // expected-error {{unknown type name}}
  function<void()> m_OnChange = [&, LeftCanvas]() { }; // expected-error {{no viable conversion}}
}

}

namespace b6981007 {
  struct S {}; // expected-note 3{{candidate}}
  void f() {
    S s(1, 2, 3); // expected-error {{no matching}}
    for (auto x : s) {
      // We used to attempt to evaluate the initializer of this variable,
      // and crash because it has an undeduced type.
      const int &n(x);
    }
  }
}

namespace incorrect_auto_type_deduction_for_typo {
struct S {
  template <typename T> S(T t) {
    (void)sizeof(t);
    (void)new auto(t);
  }
};

void Foo(S);

void test(int some_number) {  // expected-note {{'some_number' declared here}}
  auto x = sum_number;  // expected-error {{use of undeclared identifier 'sum_number'; did you mean 'some_number'?}}
  auto lambda = [x] {};
  Foo(lambda);
}
}

namespace pr29091 {
  struct X{ X(const X &x); };
  struct Y: X { using X::X; };
  bool foo() { return __has_nothrow_constructor(Y); }
  bool bar() { return __has_nothrow_copy(Y); }

  struct A { template <typename T> A(); };
  struct B : A { using A::A; };
  bool baz() { return __has_nothrow_constructor(B); }
  bool qux() { return __has_nothrow_copy(B); }
}
