<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 29, 2015 at 1:22 PM, Pete Cooper <span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Jul 29, 2015, at 1:16 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br><div><br><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div class="gmail_quote" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">On Wed, Jul 29, 2015 at 1:04 PM, Pete Cooper<span> </span><span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span><span> </span>wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span><blockquote type="cite"><div>On Jul 28, 2015, at 8:40 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br><div><div dir="ltr">Oh, a couple of things - drop the 'inline' from the templates. That's just a hint to "inline harder" & usually isn't (shouldn't be) necessary. The implicit template specializations that come from the template will have the right linkonce_odr linkage & such that they'll be fine as-is.<br></div></div></blockquote></span>Good point.  Done.<span><br><blockquote type="cite"><div><div dir="ltr"><br>Also: probably not worth using auto/->decltype in make_reverse_iterator, I don't think? Looks like it'd be shorter to  just write the return type in the usual/old way?<br></div></div></blockquote></span>Yeah, also done.<span><br><blockquote type="cite"><div><div dir="ltr"><br>Oh, and you took the container by const ref in the rbegin/rend case, and non-const ref in the begin/end case - that seems strangely inconsistent?<br></div></div></blockquote></span>Yeah, that was a mistake on my part.  Fixed.</div><div><span><blockquote type="cite"><div><div dir="ltr"><br>I think /maybe/ you can take by rvalue ref and it'll do the right thing for const and non-const (would be good to test that - the current code should break for a const container that only has rbegin/rend, I think?)</div></div></blockquote></span>So i’ve managed to add an rvalue reference to the begin/end case, but I couldn’t add it to both as it turns out the const was contributing to overload resolution.</div></div></blockquote><div><br></div><div>This is probably where we need explicit SFINAE to make the begin/end version go away when the rbegin/rend version will kick in. I'll check the test cases & see what's missing/avoided/not working because of this absence.</div></div></div></blockquote></span>Thanks!</div><div><br></div><div>So i found this in clang.  I think we just need something similar, with appropriate enable_if on existence or not.  What do you think?</div><div><br></div><div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(144,45,208)">/// \brief Metafunction to determine if type T has a member called getDecl.</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)">template<span style="color:#000000"> <</span>typename<span style="color:#000000"> T> </span>struct<span style="color:#000000"> has_getDecl {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">  <span style="color:#bb2ca2">struct</span> Default { <span style="color:#bb2ca2">int</span> getDecl; };</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">  <span style="color:#bb2ca2">struct</span> Derived : T, <span style="color:#4f8187">Default</span> { };</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px"><br></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:#000000">  </span>template<span style="color:#000000"><</span>typename<span style="color:#000000"> C, C> </span>struct<span style="color:#000000"> CheckT;</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px"><br></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><span style="color:#000000">  </span>// If T::getDecl exists, an ambiguity arises and CheckT will</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><span style="color:#000000">  </span>// not be instantiable. This makes f(...) the only available</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><span style="color:#000000">  </span>// overload.</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:#000000">  </span>template<span style="color:#000000"><</span>typename<span style="color:#000000"> C></span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">  <span style="color:#bb2ca2">static</span> <span style="color:#bb2ca2">char</span> (&f(CheckT<<span style="color:#bb2ca2">int</span> Default::*, &C::getDecl>*))[<span style="color:#272ad8">1</span>];</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:#000000">  </span>template<span style="color:#000000"><</span>typename<span style="color:#000000"> C> </span>static<span style="color:#000000"> </span>char<span style="color:#000000"> (&f(...))[</span><span style="color:#272ad8">2</span><span style="color:#000000">];</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px"><br></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187,44,162)"><span style="color:#000000">  </span>static<span style="color:#000000"> </span>bool<span style="color:#000000"> </span>const<span style="color:#000000"> value = </span>sizeof<span style="color:#000000">(f<</span><span style="color:#4f8187">Derived</span><span style="color:#000000">>(</span>nullptr<span style="color:#000000">)) == </span><span style="color:#272ad8">2</span><span style="color:#000000">;</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">};</div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><br></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><div style="margin:0px;line-height:normal;color:rgb(187,44,162)"><span style="color:#000000">  </span>template<span style="color:#000000"> <</span>typename<span style="color:#000000"> U></span></div><div style="margin:0px;line-height:normal">  <span style="color:#bb2ca2">bool</span> matchesSpecialized(</div><div style="margin:0px;line-height:normal">      <span style="color:#bb2ca2">const</span> U &Node, <span style="color:#4f8187">ASTMatchFinder</span> *Finder, <span style="color:#4f8187">BoundNodesTreeBuilder</span> *Builder,</div><div style="margin:0px;line-height:normal">      <span style="color:#bb2ca2">typename</span> <span style="color:#703daa">std</span>::<span style="color:#703daa">enable_if</span><<span style="color:#4f8187">has_getDecl</span><U>::value, <span style="color:#bb2ca2">int</span>>::type = <span style="color:#272ad8">0</span>) <span style="color:#bb2ca2">const</span> {</div><div style="margin:0px;line-height:normal">    <span style="color:#bb2ca2">return</span> <span style="color:#31595d">matchesDecl</span>(Node.getDecl(), Finder, Builder);</div><div style="margin:0px;line-height:normal">  }</div></div></div></div></blockquote><div><br></div><div>Yep, something like that looks about right. I'm not sure if it can be generalized further so we can reuse some of the machinery for begin, end, rbegin, rend, getDecl, etc. You can probably just SFINAE on begin/rbegin and assume end/rend exist - but if we can get the SFINAE tidy enough it wouldn't hurt to test for both, I suppose.<br><br>btw, my change to the test that demonstrates the problem with using universal ref/lvalue ref distinction to differentiate is this: add "const ReverseOnlyVector/const BidirectionalVector" to the Types vector & you'll see failures in the existing implementation. Alternatively/in addition, could refactor out the body of the TrivialOperation test into a template, then instantiate that template with TypeParam and const TypeParam, so you don't have to list all of them as const/non-const in the list of types.<br><br>Also, I added this rvalue version:<br><br><div>template <typename T> struct RangeAdapterRValueTest : testing::Test {};</div><div><br></div><div>typedef ::testing::Types<std::vector<int>, std::list<int>, ReverseOnlyVector,</div><div>                         BidirectionalVector> RangeAdapterRValueTestTypes;</div><div>TYPED_TEST_CASE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);</div><div><br></div><div><br></div><div>template<typename R></div><div>void TestRev(const R& r) {</div><div>  int counter = 3;</div><div>  for (int i : r)</div><div>    EXPECT_EQ(i, counter--);</div><div>}</div><div><br></div><div>TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) {</div><div>  TestRev(reverse(TypeParam({0, 1, 2, 3})));</div><div>}</div></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div><div class="h5"><blockquote type="cite"><div><div class="gmail_quote" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div> My thinking for what we have now is that we are more likely to try call reverse on something like an iterator_range which only provides begin/end so it makes sense to put a preference on that one for the case where the source is a temporary rvalue.</div><div><br></div><div>If you aren’t happy with that choice, please let me know.</div><div><br></div><div>Anyway, committed with the LGTM as r243563.  Thanks for all the help on this.</div><div><br></div><div>Cheers,</div><div>Pete<div><div><br><blockquote type="cite"><div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 28, 2015 at 8:33 PM, David Blaikie<span> </span><span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span><span> </span>wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">LGTM, please commit.<br><br>One question for Richard Smith or someone else standards-y would be:<br><br>What's the right way to call non-member begin/end?<br><br>Should it be called unqualified, with a "using std::begin/end" like when we call std::swap? In which case, should we have some utility wrappers for this so it's easy to call in arbitrary contexts (llvm::adl_begin/end)?<br></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Tue, Jul 28, 2015 at 5:56 PM, Pete Cooper<span> </span><span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span><span> </span>wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div><div style="word-wrap:break-word">New patch attached.<div><br></div><div>I added the make_reverse_iterator method which definitely simplifies that version of reverse.</div><div><br></div><div>The unit test has also been updated to use the template mechanism (very cool btw!).  I had to keep 2 of the vector types i’d defined (to restrict whether they had begin() or begin() or both), but removed the const iterators and push_back.  They have a constructor from std::initializer_list so that I can share the test case with all the container types.</div><span><font color="#888888"><div><br></div><div>Pete</div><div><br></div><div></div></font></span></div><br></div></div><div><div><div style="word-wrap:break-word"><div><br><div><blockquote type="cite"><div>On Jul 28, 2015, at 5:27 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br><div><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 28, 2015 at 5:22 PM, Pete Cooper<span> </span><span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span><span> </span>wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span><blockquote type="cite"><div>On Jul 28, 2015, at 5:13 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br><div><div dir="ltr">I'd probably skip the pointer case and let callers dereference the pointer. I think that keeps the code a bit more obvious - avoids any weirdness/confusion around arrays of collections, etc (did this decay to a pointer then dereference that pointer and iterate the sub-collection, or what?)<br></div></div></blockquote></span>Good point.  Will remove it.<span><br><blockquote type="cite"><div><div dir="ltr"><br>It might be easier to read the tests if the classes were interleaved with the test cases rather than "class A B C, test A B C”?<br></div></div></blockquote></span>I can do that, depending of course on how much of the simplification you mention merits even keeping the Vector classes at all.<span><br><blockquote type="cite"><div><div dir="ltr"><br>The generalized case might be easier to read if we had a make_reverse_iterator to avoid the whole (decltype*2, std::end*2, std::begin*2)*2, etc?<br></div></div></blockquote></span>Good idea.  Will give that a try.<span><br><blockquote type="cite"><div><div dir="ltr"><br>Could the test classes be made smaller/simpler? They don't need to be real collections - or if they are, perhaps we should just use real collections in those cases. (at least for the easy cases - eg: skip BidirectionalVector and just use std::vector directly, the other two probably at least don't need const/non-const overloads (doesn't seem like you're testing the const case and I'm not sure it would add much value to do so - but could consider it (maybe templated in some way to reduce duplication?)) - and perhaps just expose the vector rather than having push_back, given these are brief utilities (could have these containers constructed from the underlying container directly - so you populate that, then just create a wrapper)). gunit has a fancy test system that allows you to write one test as a template then run it with a set of types to instantiate the template with - that might apply here, but I'm not sure.<br></div></div></blockquote></span>I might need to keep the Bidirectional one just to ensure that we prefer rbegin() over reverse_iterator(begin()).  But otherwise i think you’re right about simplifying them.</div><div><br></div><div>I took a look at the standard library to see if any of the types there can only be iterated backwards.<span> </span></div></div></blockquote><div><br>Yeah, I'd be surprised (if anywhere, I'd check std::forward_list - but I guess that only goes forwards, not backwards) - I would imagine anything that had only one iteration order would define that order to be forwards.<br><br>So yeah, a thin adapter that just has a member vector, perhaps, and rbegin/rend - or something similarly simple.<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div> Thought perhaps queue or stack would only have rbegin() then i could use them instead of vector.  Unfortunately they are only protocols which use list and vector as their default implementations.<div><div><br><blockquote type="cite"><div><div dir="ltr"><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 28, 2015 at 3:35 PM, Pete Cooper<span> </span><span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span><span> </span>wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Once more update.  Seems I hadn’t handled pointers.  Added a variant which takes a pointer to a container and calls ->rbegin() and ->rend().<div><br></div><div></div></div><br><div style="word-wrap:break-word"><div><br><div><blockquote type="cite"><div>On Jul 28, 2015, at 10:19 AM, Pete Cooper <<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>> wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><br>On Jul 28, 2015, at 9:59 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br><div><div dir="ltr">I'm OK calling it 'reverse' as you have (since it has just the one argument it shouldn't be ambiguous with the iterator versions)<br><br>* These functions shouldn't be ‘static’</div></div></blockquote>Good point.  Made them inline like the other methods in the same file.<br><blockquote type="cite"><div><div dir="ltr">* Could you try using non-member begin/end in the second version - that should allow it to work with arrays. Give it a go/add a test?<br></div></div></blockquote>Done.  Added a test for this too.<br><blockquote type="cite"><div><div dir="ltr">* Maybe test the case where a container has rbegin/rend and begin/end to ensure we still favor the rbegin/rend (and that it's not ambiguous?) - presumably they're more efficient, if they're provided?<br></div></div></blockquote>Added a test for this too.  I left begin(), end() without method bodies so that if they were called we’d get linker errors.<br><blockquote type="cite"><div><div dir="ltr"><br>& the reason you don't need explicit SFINAE is because you put the interesting expressions in the return type - so they're part of the SFINAE condition already, conveniently.<br></div></div></blockquote>Makes sense.  Thanks for the explanation.<br><blockquote type="cite"><div><div dir="ltr"><br>I think Saleem (cc'd) had an existing implementation of something like this that he might be willing to provide some insight from?<br></div></div></blockquote>Cool.  Happy to see his implementation too, and to take whichever suits.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Updated patch included.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Cheers,</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Pete</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"></div><span><reverse.patch></span><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br><blockquote type="cite"><div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 28, 2015 at 9:43 AM, Pete Cooper<span> </span><span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span><span> </span>wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Hi David<div><br></div><div>Please find attached a patch for a reverse range adapter.  Its based on feedback you gave in <a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150720/289410.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150720/289410.html</a>.</div><div><br></div><div>There are 2 versions.  The first uses rbegin()/rend(), the second constructs std::reverse_iterators around begin()/end().</div><div><br></div><div>I was surprised to find I didn’t need enable_if or any other such tricks.</div><div><br></div><div>I’ve updated a single use of the pattern ‘for auto x : make_range(rbegin(), rend())’ to the new reverse method.</div><div><br></div><div>I was considering reverse_range instead as a name to avoid confusion with std::reverse.  I’d prefer to not do make_reverse_range just to save on characters.</div><div><br></div><div>Feedback welcome.</div><div><br></div><div>Cheers,</div><div>Pete</div><div><br></div><div></div></div><br><div style="word-wrap:break-word"><div></div></div><br></blockquote></div><br></div></div></blockquote></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">_______________________________________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">llvm-commits mailing list</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="mailto:llvm-commits@cs.uiuc.edu" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">llvm-commits@cs.uiuc.edu</a><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a></div></blockquote></div></div></div></blockquote></div></div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></blockquote></div></div></div></blockquote></div></div></div></div></blockquote></div></div></blockquote></div></div></div><br></div></blockquote></div><br></div></div>