Skip to content

Commit

Permalink
[Support] Format provider improvements
Browse files Browse the repository at this point in the history
Remove `std::forward` call for `iterator_range` iterator de-reference.
It fixes formatting usage for some tricky cases, like special ranges,
which de-reference to value type.

Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D94769
  • Loading branch information
vinograd47 committed Nov 9, 2022
1 parent 625796f commit 791bdba
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
7 changes: 2 additions & 5 deletions llvm/include/llvm/Support/FormatProviders.h
Expand Up @@ -355,7 +355,6 @@ struct range_item_has_provider

template <typename IterT> class format_provider<llvm::iterator_range<IterT>> {
using value = typename std::iterator_traits<IterT>::value_type;
using reference = typename std::iterator_traits<IterT>::reference;

static StringRef consumeOneOption(StringRef &Style, char Indicator,
StringRef Default) {
Expand Down Expand Up @@ -403,15 +402,13 @@ template <typename IterT> class format_provider<llvm::iterator_range<IterT>> {
auto Begin = V.begin();
auto End = V.end();
if (Begin != End) {
auto Adapter =
detail::build_format_adapter(std::forward<reference>(*Begin));
auto Adapter = detail::build_format_adapter(*Begin);
Adapter.format(Stream, ArgStyle);
++Begin;
}
while (Begin != End) {
Stream << Sep;
auto Adapter =
detail::build_format_adapter(std::forward<reference>(*Begin));
auto Adapter = detail::build_format_adapter(*Begin);
Adapter.format(Stream, ArgStyle);
++Begin;
}
Expand Down
28 changes: 28 additions & 0 deletions llvm/unittests/Support/FormatVariadicTest.cpp
Expand Up @@ -697,3 +697,31 @@ TEST(FormatVariadicTest, FormatError) {
EXPECT_EQ("X", formatv("{0}", fmt_consume(std::move(E1))).str());
EXPECT_FALSE(E1.isA<StringError>()); // consumed
}

TEST(FormatVariadicTest, FormatFilterRange) {
std::vector<int> Vec{0, 1, 2};
auto Range = map_range(Vec, [](int V) { return V + 1; });
EXPECT_EQ("1, 2, 3", formatv("{0}", Range).str());
}

namespace {

class IntegerValuesRange final
: public indexed_accessor_range<IntegerValuesRange, NoneType, int, int *,
int> {
public:
using indexed_accessor_range<IntegerValuesRange, NoneType, int, int *,
int>::indexed_accessor_range;

static int dereference(const NoneType &, ptrdiff_t Index) {
return static_cast<int>(Index);
}
};

TEST(FormatVariadicTest, FormatRangeNonRef) {
IntegerValuesRange Range(None, 0, 3);
EXPECT_EQ("0, 1, 2",
formatv("{0}", make_range(Range.begin(), Range.end())).str());
}

} // namespace

0 comments on commit 791bdba

Please sign in to comment.