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