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