[llvm-dev] [broken rL203058] llvm/IR/Metadata.h NamedMDNode iterator broke Mesa with libcxx (original) (raw)
Martin Pelikán via llvm-dev llvm-dev at lists.llvm.org
Sun Apr 16 02:54:33 PDT 2017
- Previous message: [llvm-dev] [LLVMdev] Moving towards a singular pointer type
- Next message: [llvm-dev] LLVM Social - Paris: April 18th, 2017
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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::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
- Previous message: [llvm-dev] [LLVMdev] Moving towards a singular pointer type
- Next message: [llvm-dev] LLVM Social - Paris: April 18th, 2017
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]