[llvm] r316330 - Support formatting formatv_objects.

Maxim Kuvyrkov via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 11:06:33 PDT 2017


Hi Sam,

This seem to have broken clang-cmake-aarch64-quick [1] and clang-cmake-aarch64-global-isel [2] buildbots.  Would you please investigate?

Thanks!

[1] http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/9443
[2] http://lab.llvm.org:8011/builders/clang-cmake-aarch64-global-isel/builds/1675

--
Maxim Kuvyrkov
www.linaro.org



> On Oct 23, 2017, at 6:40 PM, Sam McCall via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: sammccall
> Date: Mon Oct 23 08:40:44 2017
> New Revision: 316330
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=316330&view=rev
> Log:
> Support formatting formatv_objects.
> 
> Summary:
> Support formatting formatv_objects.
> 
> While here, fix documentation about member-formatters, and attempted
> perfect-forwarding (I think).
> 
> Reviewers: zturner
> 
> Subscribers: llvm-commits
> 
> Differential Revision: https://reviews.llvm.org/D38997
> 
> Modified:
>    llvm/trunk/include/llvm/Support/FormatVariadic.h
>    llvm/trunk/include/llvm/Support/FormatVariadicDetails.h
>    llvm/trunk/unittests/Support/FormatVariadicTest.cpp
> 
> Modified: llvm/trunk/include/llvm/Support/FormatVariadic.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FormatVariadic.h?rev=316330&r1=316329&r2=316330&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FormatVariadic.h (original)
> +++ llvm/trunk/include/llvm/Support/FormatVariadic.h Mon Oct 23 08:40:44 2017
> @@ -230,9 +230,8 @@ public:
> // For a given parameter of type T, the following steps are executed in order
> // until a match is found:
> //
> -//   1. If the parameter is of class type, and contains a method
> -//      void format(raw_ostream &Stream, StringRef Options)
> -//      Then this method is invoked to produce the formatted output.  The
> +//   1. If the parameter is of class type, and inherits from format_adapter,
> +//      Then format() is invoked on it to produce the formatted output.  The
> //      implementation should write the formatted text into `Stream`.
> //   2. If there is a suitable template specialization of format_provider<>
> //      for type T containing a method whose signature is:
> @@ -259,6 +258,13 @@ inline auto formatv(const char *Fmt, Ts
>       std::make_tuple(detail::build_format_adapter(std::forward<Ts>(Vals))...));
> }
> 
> +// Allow a formatv_object to be formatted (no options supported).
> +template <typename T> struct format_provider<formatv_object<T>> {
> +  static void format(const formatv_object<T> &V, raw_ostream &OS, StringRef) {
> +    OS << V;
> +  }
> +};
> +
> } // end namespace llvm
> 
> #endif // LLVM_SUPPORT_FORMATVARIADIC_H
> 
> Modified: llvm/trunk/include/llvm/Support/FormatVariadicDetails.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FormatVariadicDetails.h?rev=316330&r1=316329&r2=316330&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FormatVariadicDetails.h (original)
> +++ llvm/trunk/include/llvm/Support/FormatVariadicDetails.h Mon Oct 23 08:40:44 2017
> @@ -31,7 +31,7 @@ template <typename T> class provider_for
>   T Item;
> 
> public:
> -  explicit provider_format_adapter(T &&Item) : Item(Item) {}
> +  explicit provider_format_adapter(T &&Item) : Item(std::forward<T>(Item)) {}
> 
>   void format(llvm::raw_ostream &S, StringRef Options) override {
>     format_provider<typename std::decay<T>::type>::format(Item, S, Options);
> 
> Modified: llvm/trunk/unittests/Support/FormatVariadicTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/FormatVariadicTest.cpp?rev=316330&r1=316329&r2=316330&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/FormatVariadicTest.cpp (original)
> +++ llvm/trunk/unittests/Support/FormatVariadicTest.cpp Mon Oct 23 08:40:44 2017
> @@ -578,3 +578,32 @@ TEST(FormatVariadicTest, FormatAdapter)
>   // const Format cvar(1);
>   // EXPECT_EQ("Format", formatv("{0}", cvar).str());
> }
> +
> +TEST(FormatVariadicTest, FormatFormatvObject) {
> +  EXPECT_EQ("Format", formatv("F{0}t", formatv("o{0}a", "rm")).str());
> +  EXPECT_EQ("[   ! ]", formatv("[{0,+5}]", formatv("{0,-2}", "!")).str());
> +}
> +
> +namespace {
> +struct Recorder {
> +  int Copied = 0, Moved = 0;
> +  Recorder() = default;
> +  Recorder(const Recorder &Copy) : Copied(1 + Copy.Copied), Moved(Copy.Moved) {}
> +  Recorder(const Recorder &&Move)
> +      : Copied(Move.Copied), Moved(1 + Move.Moved) {}
> +};
> +} // namespace
> +template <> struct llvm::format_provider<Recorder> {
> +  static void format(const Recorder &R, raw_ostream &OS, StringRef style) {
> +    OS << R.Copied << "C " << R.Moved << "M";
> +  }
> +};
> +
> +TEST(FormatVariadicTest, CopiesAndMoves) {
> +  Recorder R;
> +  EXPECT_EQ("0C 0M", formatv("{0}", R).str());
> +  EXPECT_EQ("0C 3M", formatv("{0}", std::move(R)).str());
> +  EXPECT_EQ("0C 3M", formatv("{0}", Recorder()).str());
> +  EXPECT_EQ(0, R.Copied);
> +  EXPECT_EQ(0, R.Moved);
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list