1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 // expected-no-diagnostics 3 4 // PR10087: Make sure that we don't conflate exception specifications 5 // from different functions in the canonical type system. 6 namespace std 7 { 8 9 template <class _Tp> _Tp&& declval() noexcept; 10 11 template <class _Tp, class... _Args> 12 struct __is_nothrow_constructible 13 { 14 static const bool value = noexcept(_Tp(declval<_Args>()...)); 15 }; 16 17 template<class, class _Traits, class _Allocator> 18 class basic_string 19 { 20 public: 21 typedef typename _Traits::char_type value_type; 22 typedef _Allocator allocator_type; 23 24 basic_string() 25 noexcept(__is_nothrow_constructible<allocator_type>::value); 26 }; 27 28 template <class, class, class _Compare> 29 struct __map_value_compare 30 { 31 public: 32 __map_value_compare() 33 noexcept(__is_nothrow_constructible<_Compare>::value); 34 }; 35 36 struct less 37 { 38 }; 39 40 struct map 41 { 42 typedef __map_value_compare<int, short, less> __vc; 43 __vc vc_; 44 }; 45 46 47 template<class T, class _Traits, class _Allocator> 48 basic_string<T, _Traits, _Allocator>::basic_string() noexcept(__is_nothrow_constructible<allocator_type>::value) {} 49 50 template <class T, class Value, class _Compare> 51 __map_value_compare<T, Value, _Compare>::__map_value_compare() 52 noexcept(__is_nothrow_constructible<_Compare>::value) {} 53 54 } // std 55