diff --git a/include/set b/include/set
index 4574f69..79e8f29 100644
--- a/include/set
+++ b/include/set
@@ -446,7 +446,7 @@
     typedef key_type                                 value_type;
     typedef _Compare                                 key_compare;
     typedef key_compare                              value_compare;
-    typedef _Allocator                               allocator_type;
+    typedef typename __identity<_Allocator>::type    allocator_type;
     typedef value_type&                              reference;
     typedef const value_type&                        const_reference;
 
@@ -840,6 +840,34 @@
 #endif
 };
 
+#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
+template<class _InputIterator,
+         class _Compare = less<typename iterator_traits<_InputIterator>::value_type>,
+         class _Allocator = allocator<typename iterator_traits<_InputIterator>::value_type>,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type,
+         class = typename enable_if<!__is_allocator<_Compare>::value, void>::type>
+set(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
+  -> set<typename iterator_traits<_InputIterator>::value_type, _Compare, _Allocator>;
+
+template<class _Key, class _Compare = less<_Key>,
+         class _Allocator = allocator<_Key>,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type,
+         class = typename enable_if<!__is_allocator<_Compare>::value, void>::type>
+set(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
+  -> set<_Key, _Compare, _Allocator>;
+
+template<class _InputIterator, class _Allocator,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type>
+set(_InputIterator, _InputIterator, _Allocator)
+  -> set<typename iterator_traits<_InputIterator>::value_type,
+         less<typename iterator_traits<_InputIterator>::value_type>, _Allocator>;
+
+template<class _Key, class _Allocator,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type>
+set(initializer_list<_Key>, _Allocator)
+  -> set<_Key, less<_Key>, _Allocator>;
+#endif
+
 #ifndef _LIBCPP_CXX03_LANG
 
 template <class _Key, class _Compare, class _Allocator>
@@ -938,7 +966,7 @@
     typedef key_type                                 value_type;
     typedef _Compare                                  key_compare;
     typedef key_compare                              value_compare;
-    typedef _Allocator                                allocator_type;
+    typedef typename __identity<_Allocator>::type    allocator_type;
     typedef value_type&                              reference;
     typedef const value_type&                        const_reference;
 
@@ -1332,6 +1360,34 @@
 #endif
 };
 
+#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
+template<class _InputIterator,
+         class _Compare = less<typename iterator_traits<_InputIterator>::value_type>,
+         class _Allocator = allocator<typename iterator_traits<_InputIterator>::value_type>,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type,
+         class = typename enable_if<!__is_allocator<_Compare>::value, void>::type>
+multiset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
+  -> multiset<typename iterator_traits<_InputIterator>::value_type, _Compare, _Allocator>;
+
+template<class _Key, class _Compare = less<_Key>,
+         class _Allocator = allocator<_Key>,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type,
+         class = typename enable_if<!__is_allocator<_Compare>::value, void>::type>
+multiset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
+  -> multiset<_Key, _Compare, _Allocator>;
+
+template<class _InputIterator, class _Allocator,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type>
+multiset(_InputIterator, _InputIterator, _Allocator)
+  -> multiset<typename iterator_traits<_InputIterator>::value_type,
+         less<typename iterator_traits<_InputIterator>::value_type>, _Allocator>;
+
+template<class _Key, class _Allocator,
+         class = typename enable_if<__is_allocator<_Allocator>::value, void>::type>
+multiset(initializer_list<_Key>, _Allocator)
+  -> multiset<_Key, less<_Key>, _Allocator>;
+#endif
+
 #ifndef _LIBCPP_CXX03_LANG
 
 template <class _Key, class _Compare, class _Allocator>
diff --git a/test/std/containers/associative/multiset/multiset.cons/deduct.fail.cpp b/test/std/containers/associative/multiset/multiset.cons/deduct.fail.cpp
new file mode 100644
index 0000000..3b5b0db
--- /dev/null
+++ b/test/std/containers/associative/multiset/multiset.cons/deduct.fail.cpp
@@ -0,0 +1,69 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+// UNSUPPORTED: libcpp-no-deduction-guides
+
+// template<class InputIterator,
+//          class Compare = less<iter-value-type<InputIterator>>,
+//          class Allocator = allocator<iter-value-type<InputIterator>>>
+// multiset(InputIterator, InputIterator,
+//          Compare = Compare(), Allocator = Allocator())
+//   -> multiset<iter-value-type<InputIterator>, Compare, Allocator>;
+// template<class Key, class Compare = less<Key>,
+//          class Allocator = allocator<Key>>
+// multiset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
+//   -> multiset<Key, Compare, Allocator>;
+// template<class InputIterator, class Allocator>
+// multiset(InputIterator, InputIterator, Allocator)
+//   -> multiset<iter-value-type<InputIterator>,
+//               less<iter-value-type<InputIterator>>, Allocator>;
+// template<class Key, class Allocator>
+// multiset(initializer_list<Key>, Allocator)
+//   -> multiset<Key, less<Key>, Allocator>;
+
+#include <functional>
+#include <set>
+#include <type_traits>
+
+struct NotAnAllocator {
+  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
+};
+
+int main(int, char **) {
+  {
+    // cannot deduce Key from nothing
+    std::multiset s;
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'multiset'}}
+  }
+  {
+    // cannot deduce Key from just (Compare)
+    std::multiset s(std::less<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'multiset'}}
+  }
+  {
+    // cannot deduce Key from just (Compare, Allocator)
+    std::multiset s(std::less<int>{}, std::allocator<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'multiset'}}
+  }
+  {
+    // cannot deduce Key from multiset(Allocator)
+    std::multiset s(std::allocator<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'multiset'}}
+  }
+  {
+    // since we have parens, not braces, this deliberately does not find the
+    // initializer_list constructor
+    NotAnAllocator a;
+    std::multiset s(a);
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'multiset'}}
+  }
+
+  return 0;
+}
diff --git a/test/std/containers/associative/multiset/multiset.cons/deduct.pass.cpp b/test/std/containers/associative/multiset/multiset.cons/deduct.pass.cpp
new file mode 100644
index 0000000..22db3df
--- /dev/null
+++ b/test/std/containers/associative/multiset/multiset.cons/deduct.pass.cpp
@@ -0,0 +1,190 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+// UNSUPPORTED: libcpp-no-deduction-guides
+
+// template<class InputIterator,
+//          class Compare = less<iter-value-type<InputIterator>>,
+//          class Allocator = allocator<iter-value-type<InputIterator>>>
+// multiset(InputIterator, InputIterator,
+//          Compare = Compare(), Allocator = Allocator())
+//   -> multiset<iter-value-type<InputIterator>, Compare, Allocator>;
+// template<class Key, class Compare = less<Key>,
+//          class Allocator = allocator<Key>>
+// multiset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
+//   -> multiset<Key, Compare, Allocator>;
+// template<class InputIterator, class Allocator>
+// multiset(InputIterator, InputIterator, Allocator)
+//   -> multiset<iter-value-type<InputIterator>,
+//               less<iter-value-type<InputIterator>>, Allocator>;
+// template<class Key, class Allocator>
+// multiset(initializer_list<Key>, Allocator)
+//   -> multiset<Key, less<Key>, Allocator>;
+
+#include <algorithm> // std::equal
+#include <cassert>
+#include <climits> // INT_MAX
+#include <functional>
+#include <set>
+#include <type_traits>
+
+#include "test_allocator.h"
+
+struct NotAnAllocator {
+  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
+};
+
+int main(int, char **) {
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::multiset s(std::begin(arr), std::end(arr));
+
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);
+    const int expected_s[] = { 1, 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::multiset s(std::begin(arr), std::end(arr), std::greater<int>());
+
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::multiset s(std::begin(arr), std::end(arr), std::greater<int>(),
+                    test_allocator<int>(0, 42));
+
+    ASSERT_SAME_TYPE(
+        decltype(s),
+        std::multiset<int, std::greater<int>, test_allocator<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 42);
+  }
+
+  {
+    std::multiset<long> source;
+    std::multiset s(source);
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::multiset<long> source;
+    std::multiset s{ source };  // braces instead of parens
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::multiset<long> source;
+    std::multiset s(source, std::multiset<long>::allocator_type());
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::multiset s{ 1, 2, 1, INT_MAX, 3 };
+
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);
+    const int expected_s[] = { 1, 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    std::multiset s({ 1, 2, 1, INT_MAX, 3 }, std::greater<int>());
+
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int, std::greater<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    std::multiset s({ 1, 2, 1, INT_MAX, 3 }, std::greater<int>(),
+                    test_allocator<int>(0, 43));
+
+    ASSERT_SAME_TYPE(
+        decltype(s),
+        std::multiset<int, std::greater<int>, test_allocator<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 43);
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::multiset s(std::begin(arr), std::end(arr), test_allocator<int>(0, 44));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::multiset<int, std::less<int>, test_allocator<int> >);
+    const int expected_s[] = { 1, 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 44);
+  }
+
+  {
+    std::multiset s({ 1, 2, 1, INT_MAX, 3 }, test_allocator<int>(0, 45));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::multiset<int, std::less<int>, test_allocator<int> >);
+    const int expected_s[] = { 1, 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 45);
+  }
+
+  {
+    NotAnAllocator a;
+    std::multiset s{ a }; // multiset(initializer_list<NotAnAllocator>)
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<NotAnAllocator>);
+    assert(s.size() == 1);
+  }
+
+  {
+    std::multiset<long> source;
+    std::multiset s{ source, source }; // multiset(initializer_list<multiset<long>>)
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<std::multiset<long> >);
+    assert(s.size() == 2);
+  }
+
+  {
+    NotAnAllocator a;
+    std::multiset s{ a, a }; // multiset(initializer_list<NotAnAllocator>)
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<NotAnAllocator>);
+    assert(s.size() == 2);
+  }
+
+  {
+    int source[3] = { 3, 4, 5 };
+    std::multiset s(source, source + 3); // multiset(InputIterator, InputIterator)
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int>);
+    assert(s.size() == 3);
+  }
+
+  {
+    int source[3] = { 3, 4, 5 };
+    std::multiset s{ source, source + 3 }; // multiset(initializer_list<int*>)
+    ASSERT_SAME_TYPE(decltype(s), std::multiset<int *>);
+    assert(s.size() == 2);
+  }
+
+  return 0;
+}
diff --git a/test/std/containers/associative/set/set.cons/deduct.fail.cpp b/test/std/containers/associative/set/set.cons/deduct.fail.cpp
new file mode 100644
index 0000000..861339b
--- /dev/null
+++ b/test/std/containers/associative/set/set.cons/deduct.fail.cpp
@@ -0,0 +1,69 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+// UNSUPPORTED: libcpp-no-deduction-guides
+
+// template<class InputIterator,
+//          class Compare = less<iter-value-type<InputIterator>>,
+//          class Allocator = allocator<iter-value-type<InputIterator>>>
+// set(InputIterator, InputIterator,
+//     Compare = Compare(), Allocator = Allocator())
+//   -> set<iter-value-type<InputIterator>, Compare, Allocator>;
+// template<class Key, class Compare = less<Key>,
+//          class Allocator = allocator<Key>>
+// set(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
+//   -> set<Key, Compare, Allocator>;
+// template<class InputIterator, class Allocator>
+// set(InputIterator, InputIterator, Allocator)
+//   -> set<iter-value-type<InputIterator>,
+//          less<iter-value-type<InputIterator>>, Allocator>;
+// template<class Key, class Allocator>
+// set(initializer_list<Key>, Allocator)
+//   -> set<Key, less<Key>, Allocator>;
+
+#include <functional>
+#include <set>
+#include <type_traits>
+
+struct NotAnAllocator {
+  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
+};
+
+int main(int, char **) {
+  {
+    // cannot deduce Key from nothing
+    std::set s;
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}}
+  }
+  {
+    // cannot deduce Key from just (Compare)
+    std::set s(std::less<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}}
+  }
+  {
+    // cannot deduce Key from just (Compare, Allocator)
+    std::set s(std::less<int>{}, std::allocator<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}}
+  }
+  {
+    // cannot deduce Key from just (Allocator)
+    std::set s(std::allocator<int>{});
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}}
+  }
+  {
+    // since we have parens, not braces, this deliberately does not find the
+    // initializer_list constructor
+    NotAnAllocator a;
+    std::set s(a);
+    // expected-error@-1{{no viable constructor or deduction guide for deduction of template arguments of 'set'}}
+  }
+
+  return 0;
+}
diff --git a/test/std/containers/associative/set/set.cons/deduct.pass.cpp b/test/std/containers/associative/set/set.cons/deduct.pass.cpp
new file mode 100644
index 0000000..019ca61
--- /dev/null
+++ b/test/std/containers/associative/set/set.cons/deduct.pass.cpp
@@ -0,0 +1,188 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+// UNSUPPORTED: libcpp-no-deduction-guides
+
+// template<class InputIterator,
+//          class Compare = less<iter-value-type<InputIterator>>,
+//          class Allocator = allocator<iter-value-type<InputIterator>>>
+// set(InputIterator, InputIterator,
+//     Compare = Compare(), Allocator = Allocator())
+//   -> set<iter-value-type<InputIterator>, Compare, Allocator>;
+// template<class Key, class Compare = less<Key>,
+//          class Allocator = allocator<Key>>
+// set(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
+//   -> set<Key, Compare, Allocator>;
+// template<class InputIterator, class Allocator>
+// set(InputIterator, InputIterator, Allocator)
+//   -> set<iter-value-type<InputIterator>,
+//          less<iter-value-type<InputIterator>>, Allocator>;
+// template<class Key, class Allocator>
+// set(initializer_list<Key>, Allocator)
+//   -> set<Key, less<Key>, Allocator>;
+
+#include <algorithm> // std::equal
+#include <cassert>
+#include <climits> // INT_MAX
+#include <functional>
+#include <set>
+#include <type_traits>
+
+#include "test_allocator.h"
+
+struct NotAnAllocator {
+  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }
+};
+
+int main(int, char **) {
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::set s(std::begin(arr), std::end(arr));
+
+    ASSERT_SAME_TYPE(decltype(s), std::set<int>);
+    const int expected_s[] = { 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::set s(std::begin(arr), std::end(arr), std::greater<int>());
+
+    ASSERT_SAME_TYPE(decltype(s), std::set<int, std::greater<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::set s(std::begin(arr), std::end(arr), std::greater<int>(),
+               test_allocator<int>(0, 42));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::set<int, std::greater<int>, test_allocator<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 42);
+  }
+
+  {
+    std::set<long> source;
+    std::set s(source);
+    ASSERT_SAME_TYPE(decltype(s), std::set<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::set<long> source;
+    std::set s{ source };  // braces instead of parens
+    ASSERT_SAME_TYPE(decltype(s), std::set<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::set<long> source;
+    std::set s(source, std::set<long>::allocator_type());
+    ASSERT_SAME_TYPE(decltype(s), std::set<long>);
+    assert(s.size() == 0);
+  }
+
+  {
+    std::set s{ 1, 2, 1, INT_MAX, 3 };
+
+    ASSERT_SAME_TYPE(decltype(s), std::set<int>);
+    const int expected_s[] = { 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    std::set s({ 1, 2, 1, INT_MAX, 3 }, std::greater<int>());
+
+    ASSERT_SAME_TYPE(decltype(s), std::set<int, std::greater<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+  }
+
+  {
+    std::set s({ 1, 2, 1, INT_MAX, 3 }, std::greater<int>(),
+               test_allocator<int>(0, 43));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::set<int, std::greater<int>, test_allocator<int> >);
+    const int expected_s[] = { INT_MAX, 3, 2, 1 };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 43);
+  }
+
+  {
+    const int arr[] = { 1, 2, 1, INT_MAX, 3 };
+    std::set s(std::begin(arr), std::end(arr), test_allocator<int>(0, 44));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::set<int, std::less<int>, test_allocator<int> >);
+    const int expected_s[] = { 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 44);
+  }
+
+  {
+    std::set s({ 1, 2, 1, INT_MAX, 3 }, test_allocator<int>(0, 45));
+
+    ASSERT_SAME_TYPE(decltype(s),
+                     std::set<int, std::less<int>, test_allocator<int> >);
+    const int expected_s[] = { 1, 2, 3, INT_MAX };
+    assert(std::equal(s.begin(), s.end(), std::begin(expected_s),
+                      std::end(expected_s)));
+    assert(s.get_allocator().get_id() == 45);
+  }
+
+  {
+    NotAnAllocator a;
+    std::set s{ a }; // set(initializer_list<NotAnAllocator>)
+    ASSERT_SAME_TYPE(decltype(s), std::set<NotAnAllocator>);
+    assert(s.size() == 1);
+  }
+
+  {
+    std::set<long> source;
+    std::set s{ source, source }; // set(initializer_list<set<long>>)
+    ASSERT_SAME_TYPE(decltype(s), std::set<std::set<long> >);
+    assert(s.size() == 1);
+  }
+
+  {
+    NotAnAllocator a;
+    std::set s{ a, a }; // set(initializer_list<NotAnAllocator>)
+    ASSERT_SAME_TYPE(decltype(s), std::set<NotAnAllocator>);
+    assert(s.size() == 1);
+  }
+
+  {
+    int source[3] = { 3, 4, 5 };
+    std::set s(source, source + 3); // set(InputIterator, InputIterator)
+    ASSERT_SAME_TYPE(decltype(s), std::set<int>);
+    assert(s.size() == 3);
+  }
+
+  {
+    int source[3] = { 3, 4, 5 };
+    std::set s{ source, source + 3 }; // set(initializer_list<int*>)
+    ASSERT_SAME_TYPE(decltype(s), std::set<int *>);
+    assert(s.size() == 2);
+  }
+
+  return 0;
+}
