// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
// expected-no-diagnostics

// PR10087: Make sure that we don't conflate exception specifications
// from different functions in the canonical type system.
namespace std
{

template <class _Tp> _Tp&& declval() noexcept;

template <class _Tp, class... _Args>
struct _is_nothrow_constructible
{
  static const bool value = noexcept(_Tp(declval<_Args>()...));
};

template<class, class _Traits, class _Allocator>
class basic_string
{
public:
  typedef typename _Traits::char_type value_type;
  typedef _Allocator allocator_type;

  basic_string()
      noexcept(_is_nothrow_constructible<allocator_type>::value);
};

template <class, class, class _Compare>
struct __map_value_compare
{
public:
  __map_value_compare()
      noexcept(_is_nothrow_constructible<_Compare>::value);
};

struct less
{
};

struct map
{
  typedef __map_value_compare<int, short, less> __vc;
  __vc vc_;
};


template<class T, class _Traits, class _Allocator>
basic_string<T, _Traits, _Allocator>::basic_string() noexcept(_is_nothrow_constructible<allocator_type>::value) {}

template <class T, class Value, class _Compare>
__map_value_compare<T, Value, _Compare>::__map_value_compare()
  noexcept(_is_nothrow_constructible<_Compare>::value) {}

}  // std
