Martin Pelikán via llvm-dev
2017-Apr-16 09:54 UTC
[llvm-dev] [broken rL203058] llvm/IR/Metadata.h NamedMDNode iterator broke Mesa with libcxx
Hi, I've been unable to compile Mesa on my Gentoo box with LLVM and libcxx for some time, and only now got the time to hunt down the bug: TL;DR: rL203058 mentions your review which isn't linked in Phabricator, and it makes NamedMDNode's iterator template<T1,T2> for a reason unknown to me. This breaks Mesa which wants to use this iterator to construct vector<const MDNode *> from {op_begin, op_end}. If you believe this is Mesa's fault, I'd like to know why (and why does LLVM bother exporting an std::iterator if people aren't supposed to use it). See the following URLs for the interaction: https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/state_trackers/clover/llvm/metadata.hpp#n41 https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Metadata.h#L1293 Facts: - C++11 has some special cases for std::vector<> with forward iterators, which GCC doesn't implement. This makes Mesa's build succeed against stdc++ (tested GCC 6.3.0). - §23.2.3, table 100 wants vector<const MDNode*> to be EmplaceConstructible from NamedMDNode::const_op_iterator::operator *, which it is. - However, libcxx's specialisation of this constructor wants is_constructible<const MDNode *, iterator_traits<const_op_iterator>::reference>. Due to your change in rL203058, that reference is "T2 = MDNode" because the iterator inherits from std::iterator<bidi_tag, T2>. const* type is not constructible from the value type (I haven't seen in 14882:2011(E) why it should), so the build fails. What I want to know is why did you introduce T2 only to pass it into the parent std::iterator<> class and not anywhere else. Changing the inheritance to "T1 = const MDNode*" makes it all work again. Thanks! -- Martin Pelikan