Fix Bug 38644: multimap::clear() missing exception specifier. Add noexcept tests...
authorMarshall Clow <mclow.lists@gmail.com>
Wed, 22 Aug 2018 04:28:43 +0000 (04:28 +0000)
committerMarshall Clow <mclow.lists@gmail.com>
Wed, 22 Aug 2018 04:28:43 +0000 (04:28 +0000)
llvm-svn: 340385

13 files changed:
libcxx/include/map
libcxx/test/std/containers/associative/map/map.modifiers/clear.pass.cpp
libcxx/test/std/containers/associative/multimap/multimap.modifiers/clear.pass.cpp
libcxx/test/std/containers/associative/multiset/clear.pass.cpp
libcxx/test/std/containers/associative/set/clear.pass.cpp
libcxx/test/std/containers/sequences/deque/deque.modifiers/clear.pass.cpp [new file with mode: 0644]
libcxx/test/std/containers/sequences/forwardlist/forwardlist.modifiers/clear.pass.cpp
libcxx/test/std/containers/sequences/list/list.modifiers/clear.pass.cpp
libcxx/test/std/containers/sequences/vector/vector.modifiers/clear.pass.cpp
libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/clear.pass.cpp
libcxx/test/std/containers/unord/unord.multimap/unord.multimap.modifiers/clear.pass.cpp
libcxx/test/std/containers/unord/unord.multiset/clear.pass.cpp
libcxx/test/std/containers/unord/unord.set/clear.pass.cpp

index 559ec484aca052015b1db3a62fa0f5df626ca839..4700a09eda29c5304076b5ca16ac4beb5f0937fe 100644 (file)
@@ -1884,7 +1884,7 @@ public:
 #endif
 
     _LIBCPP_INLINE_VISIBILITY
-    void clear() {__tree_.clear();}
+    void clear() _NOEXCEPT {__tree_.clear();}
 
     _LIBCPP_INLINE_VISIBILITY
     void swap(multimap& __m)
index 1f36a6f10cb0b3c5da0f9eee52dcda8b9871fc5a..ab4642fa88e6895f0e5de7bf765dcde4d6039514 100644 (file)
 
 // class map
 
-// void clear();
+// void clear() noexcept;
 
 #include <map>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
@@ -56,6 +58,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
index 321f4d0bd000ca23a8febc9be75cd7ad932daf86..546a406fe1bf6f38051b3544fe669ded8da707a8 100644 (file)
 
 // class multimap
 
-// void clear();
+// void clear() noexcept;
 
 #include <map>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
@@ -56,6 +58,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
index f762ef7d350440918904d8edc76849d79a06c9b6..59ee02ece1d20d297ebf4b501ce0e940185a3423 100644 (file)
 
 // class multiset
 
-// void clear();
+// void clear() noexcept;
 
 #include <set>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
@@ -56,6 +58,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
index 7a5bf4b14a71ab074c8229656271ca44c1e2c735..1be3ed2b887732cc50de9b7b972d7cddd6c72402 100644 (file)
 
 // class set
 
-// void clear();
+// void clear() noexcept;
 
 #include <set>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
@@ -56,6 +58,7 @@ int main()
         };
         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
         assert(m.size() == 8);
+        ASSERT_NOEXCEPT(m.clear());
         m.clear();
         assert(m.size() == 0);
     }
diff --git a/libcxx/test/std/containers/sequences/deque/deque.modifiers/clear.pass.cpp b/libcxx/test/std/containers/sequences/deque/deque.modifiers/clear.pass.cpp
new file mode 100644 (file)
index 0000000..943b6e8
--- /dev/null
@@ -0,0 +1,67 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <deque>
+
+// void clear() noexcept;
+
+#include <deque>
+#include <cassert>
+
+#include "test_macros.h"
+#include "../../../NotConstructible.h"
+#include "min_allocator.h"
+
+int main()
+{
+    {
+        typedef NotConstructible T;
+        typedef std::deque<T> C;
+        C c;
+        ASSERT_NOEXCEPT(c.clear());
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+    }
+    {
+        typedef int T;
+        typedef std::deque<T> C;
+        const T t[] = {0, 1, 2, 3, 4};
+        C c(std::begin(t), std::end(t));
+
+        ASSERT_NOEXCEPT(c.clear());
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+    }
+#if TEST_STD_VER >= 11
+    {
+        typedef NotConstructible T;
+        typedef std::deque<T, min_allocator<T>> C;
+        C c;
+        ASSERT_NOEXCEPT(c.clear());
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+    }
+    {
+        typedef int T;
+        typedef std::deque<T, min_allocator<T>> C;
+        const T t[] = {0, 1, 2, 3, 4};
+        C c(std::begin(t), std::end(t));
+
+        ASSERT_NOEXCEPT(c.clear());
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+
+        c.clear();
+        assert(distance(c.begin(), c.end()) == 0);
+    }
+#endif
+}
index 0e625ac76a02c795cdde122b29ed8eca8e9d3a9a..6cdf8d57ace3564176727a60ca46b3a84d22c99b 100644 (file)
@@ -9,11 +9,12 @@
 
 // <forward_list>
 
-// void clear();
+// void clear() noexcept;
 
 #include <forward_list>
 #include <cassert>
 
+#include "test_macros.h"
 #include "../../../NotConstructible.h"
 #include "min_allocator.h"
 
@@ -23,6 +24,7 @@ int main()
         typedef NotConstructible T;
         typedef std::forward_list<T> C;
         C c;
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(distance(c.begin(), c.end()) == 0);
     }
@@ -32,6 +34,7 @@ int main()
         const T t[] = {0, 1, 2, 3, 4};
         C c(std::begin(t), std::end(t));
 
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(distance(c.begin(), c.end()) == 0);
 
@@ -43,6 +46,7 @@ int main()
         typedef NotConstructible T;
         typedef std::forward_list<T, min_allocator<T>> C;
         C c;
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(distance(c.begin(), c.end()) == 0);
     }
@@ -52,6 +56,7 @@ int main()
         const T t[] = {0, 1, 2, 3, 4};
         C c(std::begin(t), std::end(t));
 
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(distance(c.begin(), c.end()) == 0);
 
index 5d8c41fa19764ff578059fb9f54240317517d15c..1d7cb80eb65b88c37ce94000c4f6ef10ef633595 100644 (file)
@@ -9,11 +9,12 @@
 
 // <list>
 
-// void clear();
+// void clear() noexcept;
 
 #include <list>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -21,6 +22,7 @@ int main()
     {
     int a[] = {1, 2, 3};
     std::list<int> c(a, a+3);
+    ASSERT_NOEXCEPT(c.clear());
     c.clear();
     assert(c.empty());
     }
@@ -28,6 +30,7 @@ int main()
     {
     int a[] = {1, 2, 3};
     std::list<int, min_allocator<int>> c(a, a+3);
+    ASSERT_NOEXCEPT(c.clear());
     c.clear();
     assert(c.empty());
     }
index 5f053eb8565a79b35d3b547f2761c0bbdda8d434..5357ba4cb28410bdc0adad0ec6fe35edb8aa87f9 100644 (file)
@@ -9,11 +9,12 @@
 
 // <vector>
 
-// void clear();
+// void clear() noexcept;
 
 #include <vector>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 #include "asan_testing.h"
 
@@ -22,6 +23,7 @@ int main()
     {
     int a[] = {1, 2, 3};
     std::vector<int> c(a, a+3);
+    ASSERT_NOEXCEPT(c.clear());
     c.clear();
     assert(c.empty());
     LIBCPP_ASSERT(c.__invariants());
@@ -31,6 +33,7 @@ int main()
     {
     int a[] = {1, 2, 3};
     std::vector<int, min_allocator<int>> c(a, a+3);
+    ASSERT_NOEXCEPT(c.clear());
     c.clear();
     assert(c.empty());
     LIBCPP_ASSERT(c.__invariants());
index 106423ebfbe929fe7b4f7299024f70497250ac8a..9212a5e3def3298c98dd46d779cd791f46b7b71f 100644 (file)
 //           class Alloc = allocator<pair<const Key, T>>>
 // class unordered_map
 
-// void clear()
+// void clear() noexcept;
 
 #include <unordered_map>
 #include <string>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
             P(2, "four"),
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
@@ -54,6 +56,7 @@ int main()
             P(2, "four"),
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
index 891d44911eb05d6046b86e3f20f531e8945afe4a..15c78208a6160976b4af9286981d4547035cd6e6 100644 (file)
 //           class Alloc = allocator<pair<const Key, T>>>
 // class unordered_multimap
 
-// void clear()
+// void clear() noexcept;
 
 #include <unordered_map>
 #include <string>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -36,6 +37,7 @@ int main()
             P(2, "four"),
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
@@ -54,6 +56,7 @@ int main()
             P(2, "four"),
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
index 57dbb8b1faaa129f1b8a32dcf538a34b81a0f24e..b699d0624ddd5021ed50a077a9dabb52e04d8111 100644 (file)
 //           class Alloc = allocator<Value>>
 // class unordered_multiset
 
-// void clear()
+// void clear() noexcept;
 
 #include <unordered_set>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -35,6 +36,7 @@ int main()
             P(2)
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
@@ -53,6 +55,7 @@ int main()
             P(2)
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
index 8ebf748eb8dac6a2c08a4d6c9452caad1008eb92..2f22391297c45e78c7aae5571885c18a9e80c1bd 100644 (file)
 //           class Alloc = allocator<Value>>
 // class unordered_set
 
-// void clear()
+// void clear() noexcept;
 
 #include <unordered_set>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 int main()
@@ -35,6 +36,7 @@ int main()
             P(2)
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }
@@ -52,6 +54,7 @@ int main()
             P(2)
         };
         C c(a, a + sizeof(a)/sizeof(a[0]));
+        ASSERT_NOEXCEPT(c.clear());
         c.clear();
         assert(c.size() == 0);
     }