Index: include/__hash_table
===================================================================
--- include/__hash_table	(revision 187794)
+++ include/__hash_table	(working copy)
@@ -112,6 +112,9 @@
                                                          pointer;
 
     _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT
+#if _LIBCPP_STD_VER > 11
+	: __node_(nullptr)
+#endif
     {
 #if _LIBCPP_DEBUG_LEVEL >= 2
         __get_db()->__insert_i(this);
@@ -248,6 +251,9 @@
     typedef __hash_iterator<__non_const_node_pointer> __non_const_iterator;
 
     _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT
+#if _LIBCPP_STD_VER > 11
+	: __node_(nullptr)
+#endif
     {
 #if _LIBCPP_DEBUG_LEVEL >= 2
         __get_db()->__insert_i(this);
Index: include/unordered_map
===================================================================
--- include/unordered_map	(revision 187794)
+++ include/unordered_map	(working copy)
@@ -515,7 +515,11 @@
                                                                  pointer;
 
     _LIBCPP_INLINE_VISIBILITY
-    __hash_map_iterator() _NOEXCEPT {}
+    __hash_map_iterator() _NOEXCEPT
+#if _LIBCPP_STD_VER > 11
+	: __i_()
+#endif
+    {}
 
     _LIBCPP_INLINE_VISIBILITY
     __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
@@ -571,7 +575,11 @@
                                                                  pointer;
 
     _LIBCPP_INLINE_VISIBILITY
-    __hash_map_const_iterator() _NOEXCEPT {}
+    __hash_map_const_iterator() _NOEXCEPT
+#if _LIBCPP_STD_VER > 11
+	: __i_()
+#endif
+    {}
 
     _LIBCPP_INLINE_VISIBILITY
     __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Index: test/containers/unord/unord.set/iterators.pass.cpp
===================================================================
--- test/containers/unord/unord.set/iterators.pass.cpp	(revision 187794)
+++ test/containers/unord/unord.set/iterators.pass.cpp	(working copy)
@@ -107,4 +107,24 @@
         C::const_iterator i;
     }
 #endif
+#if _LIBCPP_STD_VER > 11
+    { // N3664 testing
+    	typedef std::unordered_set<int> C;
+        C::iterator ii1{}, ii2{};
+        C::iterator ii4 = ii1;
+        C::const_iterator cii{};
+        assert ( ii1 == ii2 );
+        assert ( ii1 == ii4 );
+        assert ( ii1 == cii );
+
+        assert ( !(ii1 != ii2 ));
+        assert ( !(ii1 != cii ));
+
+//         C c;
+//         assert ( ii1 != c.cbegin());
+//         assert ( cii != c.begin());
+//         assert ( cii != c.cend());
+//         assert ( ii1 != c.end());
+    }
+#endif
 }
Index: test/containers/unord/unord.map/iterators.pass.cpp
===================================================================
--- test/containers/unord/unord.map/iterators.pass.cpp	(revision 187794)
+++ test/containers/unord/unord.map/iterators.pass.cpp	(working copy)
@@ -108,4 +108,25 @@
         C::const_iterator i;
     }
 #endif
+#if _LIBCPP_STD_VER > 11
+    { // N3664 testing
+        typedef std::unordered_map<int,double> C;
+        C::iterator ii1{}, ii2{};
+        C::iterator ii3;
+        C::iterator ii4 = ii1;
+        C::const_iterator cii{};
+        assert ( ii1 == ii2 );
+        assert ( ii1 == ii3 );
+        assert ( ii1 == ii4 );
+        
+//         C c;
+//         assert ( ii1 != c.cbegin());
+//         assert ( cii != c.begin());
+//         assert ( !(ii2 == c.end()));
+        
+        assert ( ii1 == cii );
+        assert ( !(ii1 != ii2 ));
+        assert ( !(ii1 != cii ));
+    }
+#endif
 }
Index: test/containers/unord/unord.multiset/iterators.pass.cpp
===================================================================
--- test/containers/unord/unord.multiset/iterators.pass.cpp	(revision 187794)
+++ test/containers/unord/unord.multiset/iterators.pass.cpp	(working copy)
@@ -107,4 +107,24 @@
         C::const_iterator i;
     }
 #endif
+#if _LIBCPP_STD_VER > 11
+    { // N3664 testing
+    	typedef std::unordered_multiset<int> C;
+        C::iterator ii1{}, ii2{};
+        C::iterator ii4 = ii1;
+        C::const_iterator cii{};
+        assert ( ii1 == ii2 );
+        assert ( ii1 == ii4 );
+        assert ( ii1 == cii );
+
+        assert ( !(ii1 != ii2 ));
+        assert ( !(ii1 != cii ));
+
+//         C c;
+//         assert ( ii1 != c.cbegin());
+//         assert ( cii != c.begin());
+//         assert ( cii != c.cend());
+//         assert ( ii1 != c.end());
+    }
+#endif
 }
Index: test/containers/unord/unord.multimap/iterators.pass.cpp
===================================================================
--- test/containers/unord/unord.multimap/iterators.pass.cpp	(revision 187794)
+++ test/containers/unord/unord.multimap/iterators.pass.cpp	(working copy)
@@ -114,4 +114,25 @@
         C::const_iterator i;
     }
 #endif
+#if _LIBCPP_STD_VER > 11
+    { // N3664 testing
+        typedef std::unordered_multimap<int,double> C;
+        C::iterator ii1{}, ii2{};
+        C::iterator ii3;
+        C::iterator ii4 = ii1;
+        C::const_iterator cii{};
+        assert ( ii1 == ii2 );
+        assert ( ii1 == ii3 );
+        assert ( ii1 == ii4 );
+        
+//         C c;
+//         assert ( ii1 != c.cbegin());
+//         assert ( cii != c.begin());
+//         assert ( !(ii2 == c.end()));
+        
+        assert ( ii1 == cii );
+        assert ( !(ii1 != ii2 ));
+        assert ( !(ii1 != cii ));
+    }
+#endif
 }
