<div dir="ltr">Hello Florian,<br><br>This commit broke build step on one of our builders:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/10903/steps/build-unified-tree/logs/stdio">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/10903/steps/build-unified-tree/logs/stdio</a><br><br>. . .<br>FAILED: unittests/ADT/CMakeFiles/ADTTests.dir/SmallSetTest.cpp.obj <br>C:\PROGRA~2\MICROS~1.0\VC\bin\amd64\cl.exe /nologo /TP -DEXPENSIVE_CHECKS -DGTEST_HAS_RTTI=0 -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_LANG_CXX11=1 -DUNICODE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_GLIBCXX_DEBUG -D_HAS_EXCEPTIONS=0 -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Iunittests\ADT -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\unittests\ADT -Iinclude -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\include -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\utils\unittest\googletest\include -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\utils\unittest\googlemock\include /DWIN32 /D_WINDOWS /Zc:inline /Zc:strictStrings /Oi /Zc:rvalueCast /W4 -wd4141 -wd4146 -wd4180 -wd4244 -wd4258 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -wd4456 -wd4457 -wd4458 -wd4459 -wd4503 -wd4624 -wd4722 -wd4800 -wd4100 -wd4127 -wd4512 -wd4505 -wd4610 -wd4510 -wd4702 -wd4245 -wd4706 -wd4310 -wd4701 -wd4703 -wd4389 -wd4611 -wd4805 -wd4204 -wd4577 -wd4091 -wd4592 -wd4319 -wd4324 -w14062 -we4238 /MDd /Zi /Ob0 /Od /RTC1 /EHs-c- /GR- /showIncludes /Founittests\ADT\CMakeFiles\ADTTests.dir\SmallSetTest.cpp.obj /Fdunittests\ADT\CMakeFiles\ADTTests.dir\ /FS -c C:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\unittests\ADT\SmallSetTest.cpp<br>C:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\unittests\ADT\SmallSetTest.cpp(80): error C2280: 'llvm::SmallSetIterator<T,4,C>::SmallSetIterator(const llvm::SmallSetIterator<T,4,C> &)': attempting to reference a deleted function<br> with<br> [<br> T=int,<br> C=std::less<int><br> ]<br>C:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\include\llvm/ADT/SmallSet.h(80): note: compiler has generated 'llvm::SmallSetIterator<T,4,C>::SmallSetIterator' here<br> with<br> [<br> T=int,<br> C=std::less<int><br> ]<br><br><br>Please have a look?<br>The builder was already red and did not send notifications.<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 11, 2018 at 6:39 AM, Florian Hahn via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fhahn<br>
Date: Wed Jul 11 06:39:59 2018<br>
New Revision: 336805<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=336805&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=336805&view=rev</a><br>
Log:<br>
Recommit r334887: [SmallSet] Add SmallSetIterator.<br>
<br>
This version now uses the subset of is_trivially_XXX provided by<br>
GCC 4.8 and llvm/Support/type_traits.h<br>
<br>
Modified:<br>
llvm/trunk/include/llvm/ADT/<wbr>SmallSet.h<br>
llvm/trunk/unittests/ADT/<wbr>SmallSetTest.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/<wbr>SmallSet.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallSet.h?rev=336805&r1=336804&r2=336805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/ADT/SmallSet.h?rev=<wbr>336805&r1=336804&r2=336805&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/ADT/<wbr>SmallSet.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/<wbr>SmallSet.h Wed Jul 11 06:39:59 2018<br>
@@ -17,14 +17,68 @@<br>
#include "llvm/ADT/None.h"<br>
#include "llvm/ADT/SmallPtrSet.h"<br>
#include "llvm/ADT/SmallVector.h"<br>
+#include "llvm/ADT/iterator.h"<br>
#include "llvm/Support/Compiler.h"<br>
+#include "llvm/Support/type_traits.h"<br>
#include <cstddef><br>
#include <functional><br>
#include <set><br>
+#include <type_traits><br>
#include <utility><br>
<br>
namespace llvm {<br>
<br>
+/// SmallSetIterator - This class implements a const_iterator for SmallSet by<br>
+/// delegating to the underlying SmallVector or Set iterators.<br>
+template <typename T, unsigned N, typename C><br>
+class SmallSetIterator<br>
+ : public iterator_facade_base<<wbr>SmallSetIterator<T, N, C>,<br>
+ std::forward_iterator_tag, T> {<br>
+private:<br>
+ using SetIterTy = typename std::set<T, C>::const_iterator;<br>
+ using VecIterTy = typename SmallVector<T, N>::const_iterator;<br>
+ using SelfTy = SmallSetIterator<T, N, C>;<br>
+<br>
+ /// Iterators to the parts of the SmallSet containing the data. They are set<br>
+ /// depending on isSmall.<br>
+ union {<br>
+ SetIterTy SetIter;<br>
+ VecIterTy VecIter;<br>
+ };<br>
+<br>
+ bool isSmall;<br>
+<br>
+public:<br>
+ SmallSetIterator(SetIterTy SetIter) : SetIter(SetIter), isSmall(false) {<br>
+ // Use static_assert here, as the SmallSetIterator type is incomplete in the<br>
+ // class scope.<br>
+ static_assert(std::is_<wbr>trivially_destructible<SelfTy><wbr>() &&<br>
+ llvm::is_trivially_copy_<wbr>constructible<SelfTy>() &&<br>
+ llvm::is_trivially_move_<wbr>constructible<SelfTy>(),<br>
+ "SelfTy needs to by trivially constructible and destructible");<br>
+ }<br>
+<br>
+ SmallSetIterator(VecIterTy VecIter) : VecIter(VecIter), isSmall(true) {}<br>
+<br>
+ bool operator==(const SmallSetIterator &RHS) const {<br>
+ if (isSmall != RHS.isSmall)<br>
+ return false;<br>
+ if (isSmall)<br>
+ return VecIter == RHS.VecIter;<br>
+ return SetIter == RHS.SetIter;<br>
+ }<br>
+<br>
+ SmallSetIterator &operator++() { // Preincrement<br>
+ if (isSmall)<br>
+ VecIter++;<br>
+ else<br>
+ SetIter++;<br>
+ return *this;<br>
+ }<br>
+<br>
+ const T &operator*() const { return isSmall ? *VecIter : *SetIter; }<br>
+};<br>
+<br>
/// SmallSet - This maintains a set of unique values, optimizing for the case<br>
/// when the set is small (less than N). In this case, the set can be<br>
/// maintained with no mallocs. If the set gets large, we expand to using an<br>
@@ -50,6 +104,7 @@ class SmallSet {<br>
<br>
public:<br>
using size_type = size_t;<br>
+ using const_iterator = SmallSetIterator<T, N, C>;<br>
<br>
SmallSet() = default;<br>
<br>
@@ -121,6 +176,18 @@ public:<br>
Set.clear();<br>
}<br>
<br>
+ const_iterator begin() const {<br>
+ if (isSmall())<br>
+ return {Vector.begin()};<br>
+ return {Set.begin()};<br>
+ }<br>
+<br>
+ const_iterator end() const {<br>
+ if (isSmall())<br>
+ return {Vector.end()};<br>
+ return {Set.end()};<br>
+ }<br>
+<br>
private:<br>
bool isSmall() const { return Set.empty(); }<br>
<br>
<br>
Modified: llvm/trunk/unittests/ADT/<wbr>SmallSetTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallSetTest.cpp?rev=336805&r1=336804&r2=336805&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>ADT/SmallSetTest.cpp?rev=<wbr>336805&r1=336804&r2=336805&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/ADT/<wbr>SmallSetTest.cpp (original)<br>
+++ llvm/trunk/unittests/ADT/<wbr>SmallSetTest.cpp Wed Jul 11 06:39:59 2018<br>
@@ -13,6 +13,7 @@<br>
<br>
#include "llvm/ADT/SmallSet.h"<br>
#include "gtest/gtest.h"<br>
+#include <string><br>
<br>
using namespace llvm;<br>
<br>
@@ -68,3 +69,57 @@ TEST(SmallSetTest, Erase) {<br>
<br>
EXPECT_EQ(0u, s1.count(8));<br>
}<br>
+<br>
+TEST(SmallSetTest, IteratorInt) {<br>
+ SmallSet<int, 4> s1;<br>
+<br>
+ // Test the 'small' case.<br>
+ for (int i = 0; i < 3; i++)<br>
+ s1.insert(i);<br>
+<br>
+ std::vector<int> V(s1.begin(), s1.end());<br>
+ // Make sure the elements are in the expected order.<br>
+ std::sort(V.begin(), V.end());<br>
+ for (int i = 0; i < 3; i++)<br>
+ EXPECT_EQ(i, V[i]);<br>
+<br>
+ // Test the 'big' case by adding a few more elements to switch to std::set<br>
+ // internally.<br>
+ for (int i = 3; i < 6; i++)<br>
+ s1.insert(i);<br>
+<br>
+ V.assign(s1.begin(), s1.end());<br>
+ // Make sure the elements are in the expected order.<br>
+ std::sort(V.begin(), V.end());<br>
+ for (int i = 0; i < 6; i++)<br>
+ EXPECT_EQ(i, V[i]);<br>
+}<br>
+<br>
+TEST(SmallSetTest, IteratorString) {<br>
+ // Test SmallSetIterator for SmallSet with a type with non-trivial<br>
+ // ctors/dtors.<br>
+ SmallSet<std::string, 2> s1;<br>
+<br>
+ s1.insert("str 1");<br>
+ s1.insert("str 2");<br>
+ s1.insert("str 1");<br>
+<br>
+ std::vector<std::string> V(s1.begin(), s1.end());<br>
+ std::sort(V.begin(), V.end());<br>
+ EXPECT_EQ(2u, s1.size());<br>
+ EXPECT_EQ("str 1", V[0]);<br>
+ EXPECT_EQ("str 2", V[1]);<br>
+<br>
+ s1.insert("str 4");<br>
+ s1.insert("str 0");<br>
+ s1.insert("str 4");<br>
+<br>
+ V.assign(s1.begin(), s1.end());<br>
+ // Make sure the elements are in the expected order.<br>
+ std::sort(V.begin(), V.end());<br>
+ EXPECT_EQ(4u, s1.size());<br>
+ EXPECT_EQ("str 0", V[0]);<br>
+ EXPECT_EQ("str 1", V[1]);<br>
+ EXPECT_EQ("str 2", V[2]);<br>
+ EXPECT_EQ("str 4", V[3]);<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>