1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor
4136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregornamespace PR10622 {
5136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor  struct foo {
6136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor    const int first;
7136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor    foo(const foo&) = default;
8136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor  };
9136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor  void find_or_insert(const foo& __obj) {
10136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor    foo x(__obj);
11136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor  }
12036e81c79805364d984af2be06be62562e08c980Douglas Gregor
13036e81c79805364d984af2be06be62562e08c980Douglas Gregor  struct bar : foo {
14036e81c79805364d984af2be06be62562e08c980Douglas Gregor    bar(const bar&) = default;
15036e81c79805364d984af2be06be62562e08c980Douglas Gregor  };
16036e81c79805364d984af2be06be62562e08c980Douglas Gregor  void test_bar(const bar &obj) {
17036e81c79805364d984af2be06be62562e08c980Douglas Gregor    bar obj2(obj);
18036e81c79805364d984af2be06be62562e08c980Douglas Gregor  }
19136da1c4320156fe8924139f58fbeed2e32cc6e8Douglas Gregor}
20f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor
21f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregornamespace PR11418 {
22f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  template<typename T>
23f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  T may_throw() {
24f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor    return T();
25f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  }
26f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor
27f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  template<typename T> T &&declval() noexcept;
28f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor
29f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  struct NonPOD {
30f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor    NonPOD();
31f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor    NonPOD(const NonPOD &) noexcept;
32f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor    NonPOD(NonPOD &&) noexcept;
33f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  };
34f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor
35f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  struct X {
36f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor    NonPOD np = may_throw<NonPOD>();
37f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  };
38f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor
39f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  static_assert(noexcept(declval<X>()), "noexcept isn't working at all");
40f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  static_assert(noexcept(X(declval<X&>())), "copy constructor can't throw");
41f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor  static_assert(noexcept(X(declval<X>())), "move constructor can't throw");
42f48538897ccd6726e87485267495a62fdfd0b369Douglas Gregor}
43