1274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// expected-no-diagnostics
3274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
4274b20863a728cc6a31ee75c670e3733600c1531Ted Kremeneknamespace PR10622 {
5274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  struct foo {
6274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek    const int first;
7274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek    foo(const foo&) = default;
8274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  };
9274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  void find_or_insert(const foo& __obj) {
10274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek    foo x(__obj);
11274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  }
12274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
13274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  struct bar : foo {
140c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek    bar(const bar&) = default;
150c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  };
160c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  void test_bar(const bar &obj) {
17274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek    bar obj2(obj);
18274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  }
190c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek}
200c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
210c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremeneknamespace PR11418 {
220c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  template<typename T>
230c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  T may_throw() {
240c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek    return T();
250c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  }
26274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
27274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  template<typename T> T &&declval() noexcept;
287b78b7c6d96deb1e63f8d0655ee6fa53de0b65efTed Kremenek
29268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  struct NonPOD {
30e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    NonPOD();
31e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    NonPOD(const NonPOD &) noexcept;
32e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    NonPOD(NonPOD &&) noexcept;
33e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek  };
345ff4317536dbd7f03332bb250c8b35ec04a6f5dbChris Lattner
35da9d61c96c412f6babc7f824152609562f302388Chris Lattner  struct X {
36da9d61c96c412f6babc7f824152609562f302388Chris Lattner    NonPOD np = may_throw<NonPOD>();
37da9d61c96c412f6babc7f824152609562f302388Chris Lattner  };
38da9d61c96c412f6babc7f824152609562f302388Chris Lattner
39da9d61c96c412f6babc7f824152609562f302388Chris Lattner  static_assert(noexcept(declval<X>()), "noexcept isn't working at all");
40da9d61c96c412f6babc7f824152609562f302388Chris Lattner  static_assert(noexcept(X(declval<X&>())), "copy constructor can't throw");
415ff4317536dbd7f03332bb250c8b35ec04a6f5dbChris Lattner  static_assert(noexcept(X(declval<X>())), "move constructor can't throw");
42f15674c680730c652a37a16a5d3f3ff429b0c308Chris Lattner}
43f15674c680730c652a37a16a5d3f3ff429b0c308Chris Lattner