1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
31abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
41abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor// PR10087: Make sure that we don't conflate exception specifications
51abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor// from different functions in the canonical type system.
61abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregornamespace std
71abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
81abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
91abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate <class _Tp> _Tp&& declval() noexcept;
101abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
111abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate <class _Tp, class... _Args>
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct _is_nothrow_constructible
131abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
141abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  static const bool value = noexcept(_Tp(declval<_Args>()...));
151abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor};
161abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
171abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate<class, class _Traits, class _Allocator>
181abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorclass basic_string
191abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
201abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorpublic:
211abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  typedef typename _Traits::char_type value_type;
221abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  typedef _Allocator allocator_type;
231abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
241abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  basic_string()
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      noexcept(_is_nothrow_constructible<allocator_type>::value);
261abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor};
271abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
281abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate <class, class, class _Compare>
291abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorstruct __map_value_compare
301abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
311abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorpublic:
321abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  __map_value_compare()
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      noexcept(_is_nothrow_constructible<_Compare>::value);
341abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor};
351abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
361abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorstruct less
371abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
381abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor};
391abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
401abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregorstruct map
411abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor{
421abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  typedef __map_value_compare<int, short, less> __vc;
431abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor  __vc vc_;
441abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor};
451abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
461abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
471abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate<class T, class _Traits, class _Allocator>
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbasic_string<T, _Traits, _Allocator>::basic_string() noexcept(_is_nothrow_constructible<allocator_type>::value) {}
491abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
501abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregortemplate <class T, class Value, class _Compare>
511abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor__map_value_compare<T, Value, _Compare>::__map_value_compare()
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  noexcept(_is_nothrow_constructible<_Compare>::value) {}
531abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor
541abd35950bcb0761887dca0995c68b8a9dc8916fDouglas Gregor}  // std
55