<div dir="ltr">Already reverted, sorry for the trouble.</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 29, 2016 at 4:13 PM Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Looks like this broke the build with clang:<br class="gmail_msg">
<br class="gmail_msg">
/home/espindola/llvm/llvm-project/llvm/include/llvm/ADT/STLExtras.h:632:22:<br class="gmail_msg">
error: declaration of 'V' shadows template parameter<br class="gmail_msg">
  template <typename V> struct result_pair {<br class="gmail_msg">
<br class="gmail_msg">
Cheers,<br class="gmail_msg">
Rafael<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
On 29 September 2016 at 15:59, Zachary Turner via llvm-commits<br class="gmail_msg">
<<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">
> Author: zturner<br class="gmail_msg">
> Date: Thu Sep 29 17:59:30 2016<br class="gmail_msg">
> New Revision: 282804<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=282804&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=282804&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> Add llvm::enumerate() to STLExtras.<br class="gmail_msg">
><br class="gmail_msg">
> enumerate allows you to iterate over a range by pairing the<br class="gmail_msg">
> iterator's value with its index in the enumeration.  This gives<br class="gmail_msg">
> you most of the benefits of using a for loop while still allowing<br class="gmail_msg">
> the range syntax.<br class="gmail_msg">
><br class="gmail_msg">
> Modified:<br class="gmail_msg">
>     llvm/trunk/include/llvm/ADT/STLExtras.h<br class="gmail_msg">
>     llvm/trunk/unittests/ADT/STLExtrasTest.cpp<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/ADT/STLExtras.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=282804&r1=282803&r2=282804&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=282804&r1=282803&r2=282804&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/ADT/STLExtras.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/ADT/STLExtras.h Thu Sep 29 17:59:30 2016<br class="gmail_msg">
> @@ -626,6 +626,73 @@ template <typename T> struct deref {<br class="gmail_msg">
>    }<br class="gmail_msg">
>  };<br class="gmail_msg">
><br class="gmail_msg">
> +namespace detail {<br class="gmail_msg">
> +template <typename I, typename V> class enumerator_impl {<br class="gmail_msg">
> +public:<br class="gmail_msg">
> +  template <typename V> struct result_pair {<br class="gmail_msg">
> +    result_pair(std::size_t Index, V Value) : Index(Index), Value(Value) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> +    const std::size_t Index;<br class="gmail_msg">
> +    V Value;<br class="gmail_msg">
> +  };<br class="gmail_msg">
> +<br class="gmail_msg">
> +  template <typename I, typename V> struct iterator {<br class="gmail_msg">
> +    iterator(I Iter, std::size_t Index) : Iter(Iter), Index(Index) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> +    result_pair<const V> operator*() const {<br class="gmail_msg">
> +      return result_pair<const V>(Index, *Iter);<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +    result_pair<V> operator*() { return result_pair<V>(Index, *Iter); }<br class="gmail_msg">
> +<br class="gmail_msg">
> +    iterator &operator++() {<br class="gmail_msg">
> +      ++Iter;<br class="gmail_msg">
> +      ++Index;<br class="gmail_msg">
> +      return *this;<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
> +    bool operator!=(const iterator &RHS) const { return Iter != RHS.Iter; }<br class="gmail_msg">
> +<br class="gmail_msg">
> +  private:<br class="gmail_msg">
> +    I Iter;<br class="gmail_msg">
> +    std::size_t Index;<br class="gmail_msg">
> +  };<br class="gmail_msg">
> +<br class="gmail_msg">
> +  enumerator_impl(I Begin, I End)<br class="gmail_msg">
> +      : Begin(std::move(Begin)), End(std::move(End)) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> +  iterator<I, V> begin() { return iterator<I, V>(Begin, 0); }<br class="gmail_msg">
> +  iterator<I, V> end() { return iterator<I, V>(End, std::size_t(-1)); }<br class="gmail_msg">
> +<br class="gmail_msg">
> +  iterator<I, V> begin() const { return iterator<I, V>(Begin, 0); }<br class="gmail_msg">
> +  iterator<I, V> end() const { return iterator<I, V>(End, std::size_t(-1)); }<br class="gmail_msg">
> +<br class="gmail_msg">
> +private:<br class="gmail_msg">
> +  I Begin;<br class="gmail_msg">
> +  I End;<br class="gmail_msg">
> +};<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +/// Given an input range, returns a new range whose values are are pair (A,B)<br class="gmail_msg">
> +/// such that A is the 0-based index of the item in the sequence, and B is<br class="gmail_msg">
> +/// the value from the original sequence.  Example:<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// std::vector<char> Items = {'A', 'B', 'C', 'D'};<br class="gmail_msg">
> +/// for (auto X : enumerate(Items)) {<br class="gmail_msg">
> +///   printf("Item %d - %c\n", X.Item, X.Value);<br class="gmail_msg">
> +/// }<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// Output:<br class="gmail_msg">
> +///   Item 0 - A<br class="gmail_msg">
> +///   Item 1 - B<br class="gmail_msg">
> +///   Item 2 - C<br class="gmail_msg">
> +///   Item 3 - D<br class="gmail_msg">
> +///<br class="gmail_msg">
> +template <typename R> auto enumerate(R &&Range) {<br class="gmail_msg">
> +  typedef decltype(std::begin(Range)) I;<br class="gmail_msg">
> +  typedef decltype(*std::begin(Range)) V;<br class="gmail_msg">
> +  return detail::enumerator_impl<I, V>(std::begin(Range), std::end(Range));<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
>  } // End llvm namespace<br class="gmail_msg">
><br class="gmail_msg">
>  #endif<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/unittests/ADT/STLExtrasTest.cpp<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/STLExtrasTest.cpp?rev=282804&r1=282803&r2=282804&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/STLExtrasTest.cpp?rev=282804&r1=282803&r2=282804&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/unittests/ADT/STLExtrasTest.cpp (original)<br class="gmail_msg">
> +++ llvm/trunk/unittests/ADT/STLExtrasTest.cpp Thu Sep 29 17:59:30 2016<br class="gmail_msg">
> @@ -10,6 +10,8 @@<br class="gmail_msg">
>  #include "llvm/ADT/STLExtras.h"<br class="gmail_msg">
>  #include "gtest/gtest.h"<br class="gmail_msg">
><br class="gmail_msg">
> +#include <vector><br class="gmail_msg">
> +<br class="gmail_msg">
>  using namespace llvm;<br class="gmail_msg">
><br class="gmail_msg">
>  namespace {<br class="gmail_msg">
> @@ -37,4 +39,51 @@ TEST(STLExtrasTest, Rank) {<br class="gmail_msg">
>    EXPECT_EQ(4, f(rank<6>()));<br class="gmail_msg">
>  }<br class="gmail_msg">
><br class="gmail_msg">
> +TEST(STLExtrasTest, Enumerate) {<br class="gmail_msg">
> +  std::vector<char> foo = {'a', 'b', 'c'};<br class="gmail_msg">
> +<br class="gmail_msg">
> +  std::vector<std::pair<std::size_t, char>> results;<br class="gmail_msg">
> +<br class="gmail_msg">
> +  for (auto X : llvm::enumerate(foo)) {<br class="gmail_msg">
> +    results.push_back(std::make_pair(X.Index, X.Value));<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +  ASSERT_EQ(3, results.size());<br class="gmail_msg">
> +  EXPECT_EQ(0, results[0].first);<br class="gmail_msg">
> +  EXPECT_EQ('a', results[0].second);<br class="gmail_msg">
> +  EXPECT_EQ(1, results[1].first);<br class="gmail_msg">
> +  EXPECT_EQ('b', results[1].second);<br class="gmail_msg">
> +  EXPECT_EQ(2, results[2].first);<br class="gmail_msg">
> +  EXPECT_EQ('c', results[2].second);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  results.clear();<br class="gmail_msg">
> +  const std::vector<int> bar = {'1', '2', '3'};<br class="gmail_msg">
> +  for (auto X : llvm::enumerate(bar)) {<br class="gmail_msg">
> +    results.push_back(std::make_pair(X.Index, X.Value));<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +  EXPECT_EQ(0, results[0].first);<br class="gmail_msg">
> +  EXPECT_EQ('1', results[0].second);<br class="gmail_msg">
> +  EXPECT_EQ(1, results[1].first);<br class="gmail_msg">
> +  EXPECT_EQ('2', results[1].second);<br class="gmail_msg">
> +  EXPECT_EQ(2, results[2].first);<br class="gmail_msg">
> +  EXPECT_EQ('3', results[2].second);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  results.clear();<br class="gmail_msg">
> +  const std::vector<int> baz;<br class="gmail_msg">
> +  for (auto X : llvm::enumerate(baz)) {<br class="gmail_msg">
> +    results.push_back(std::make_pair(X.Index, X.Value));<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +  EXPECT_TRUE(baz.empty());<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +TEST(STLExtrasTest, EnumerateModify) {<br class="gmail_msg">
> +  std::vector<char> foo = {'a', 'b', 'c'};<br class="gmail_msg">
> +<br class="gmail_msg">
> +  for (auto X : llvm::enumerate(foo)) {<br class="gmail_msg">
> +    ++X.Value;<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +<br class="gmail_msg">
> +  EXPECT_EQ('b', foo[0]);<br class="gmail_msg">
> +  EXPECT_EQ('c', foo[1]);<br class="gmail_msg">
> +  EXPECT_EQ('d', foo[2]);<br class="gmail_msg">
> +}<br class="gmail_msg">
>  }<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> _______________________________________________<br class="gmail_msg">
> llvm-commits mailing list<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>