From: Duncan P. N. Exon Smith Date: Sat, 7 Nov 2015 00:02:32 +0000 (+0000) Subject: ADT: Require explicit ilist iterator/pointer conversions X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=84cb8974bde802f860313fc7001d60ed674700ae ADT: Require explicit ilist iterator/pointer conversions Disallow implicit conversions between ilist iterators and element points. Explicit conversions still work of course. This is the first step toward removing the undefined behaviour in `ilist` and `iplist`: http://lists.llvm.org/pipermail/llvm-dev/2015-October/091115.html The motivation for removing the implicit iterators is that I came across real bugs (that were *really* getting lucky). More details and some brief discussion later in that thread: http://lists.llvm.org/pipermail/llvm-dev/2015-October/091617.html Note: if you have out-of-tree code, it should be fairly easy to revert this patch downstream while you update your out-of-tree call sites. Note that these conversions are occasionally latent bugs (that may happen to "work" now, but only because of getting lucky with UB; follow-ups will change your luck). When they are valid, I suggest using `->getIterator()` to go from pointer to iterator, and `&*` to go from iterator to pointer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252372 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/ilist.h b/include/llvm/ADT/ilist.h index 371518a04ca..c34434a1f76 100644 --- a/include/llvm/ADT/ilist.h +++ b/include/llvm/ADT/ilist.h @@ -220,8 +220,8 @@ private: template void operator-(T) const; public: - ilist_iterator(pointer NP) : NodePtr(NP) {} - ilist_iterator(reference NR) : NodePtr(&NR) {} + explicit ilist_iterator(pointer NP) : NodePtr(NP) {} + explicit ilist_iterator(reference NR) : NodePtr(&NR) {} ilist_iterator() : NodePtr(nullptr) {} // This is templated so that we can allow constructing a const iterator from @@ -241,7 +241,7 @@ public: void reset(pointer NP) { NodePtr = NP; } // Accessors... - operator pointer() const { + explicit operator pointer() const { return NodePtr; }