[llvm] r369518 - [gtest] Fix printing of StringRef and SmallString in assert messages.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 21 06:19:39 PDT 2019


The buildbots (and my local build) are sad, e.g.

http://lab.llvm.org:8011/builders/clang-ppc64be-linux-lnt/builds/30148/steps/ninja%20check%201/logs/stdio
http://lab.llvm.org:8011/builders/clang-ppc64le-linux-lnt/builds/20170/steps/ninja%20check%201/logs/stdio

On Wed, Aug 21, 2019 at 1:35 PM Sam McCall via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: sammccall
> Date: Wed Aug 21 04:37:06 2019
> New Revision: 369518
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369518&view=rev
> Log:
> [gtest] Fix printing of StringRef and SmallString in assert messages.
>
> Summary:
> These are detected by gtest as containers, and so previously printed as e.g.
>   { '.' (46, 0x2E), 's' (115, 0x73), 'e' (101, 0x65), 'c' (99, 0x63), '0' (48, 0x30) },
>
> gtest itself overloads PrintTo for std::string and friends, we use the same mechanism.
>
> Reviewers: labath
>
> Subscribers: dexonsmith, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D66520
>
> Modified:
>     llvm/trunk/unittests/ADT/SmallStringTest.cpp
>     llvm/trunk/unittests/ADT/StringRefTest.cpp
>     llvm/trunk/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h
>
> Modified: llvm/trunk/unittests/ADT/SmallStringTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallStringTest.cpp?rev=369518&r1=369517&r2=369518&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ADT/SmallStringTest.cpp (original)
> +++ llvm/trunk/unittests/ADT/SmallStringTest.cpp Wed Aug 21 04:37:06 2019
> @@ -169,7 +169,7 @@ TEST_F(SmallStringTest, Realloc) {
>    EXPECT_EQ("abcdyyy", theString.slice(0, 7));
>  }
>
> -TEST(StringRefTest, Comparisons) {
> +TEST_F(SmallStringTest, Comparisons) {
>    EXPECT_EQ(-1, SmallString<10>("aab").compare("aad"));
>    EXPECT_EQ( 0, SmallString<10>("aab").compare("aab"));
>    EXPECT_EQ( 1, SmallString<10>("aab").compare("aaa"));
> @@ -203,4 +203,12 @@ TEST(StringRefTest, Comparisons) {
>    EXPECT_EQ( 1, SmallString<10>("V8_q0").compare_numeric("V1_q0"));
>  }
>
> +// Check gtest prints SmallString as a string instead of a container of chars.
> +// The code is in utils/unittest/googletest/internal/custom/gtest-printers.h
> +TEST_F(SmallStringTest, GTestPrinter) {
> +  EXPECT_EQ(R"("foo")", ::testing::PrintToString(SmallString<1>("foo")));
> +  const SmallVectorImpl<char> &ErasedSmallString = SmallString<1>("foo");
> +  EXPECT_EQ(R"("foo")", ::testing::PrintToString(ErasedSmallString));
>  }
> +
> +} // namespace
>
> Modified: llvm/trunk/unittests/ADT/StringRefTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/StringRefTest.cpp?rev=369518&r1=369517&r2=369518&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ADT/StringRefTest.cpp (original)
> +++ llvm/trunk/unittests/ADT/StringRefTest.cpp Wed Aug 21 04:37:06 2019
> @@ -1055,6 +1055,12 @@ TEST(StringRefTest, StringLiteral) {
>    EXPECT_EQ(StringRef("Bar"), Strings[1]);
>  }
>
> +// Check gtest prints StringRef as a string instead of a container of chars.
> +// The code is in utils/unittest/googletest/internal/custom/gtest-printers.h
> +TEST(StringRefTest, GTestPrinter) {
> +  EXPECT_EQ(R"("foo")", ::testing::PrintToString(StringRef("foo")));
> +}
> +
>  static_assert(is_trivially_copyable<StringRef>::value, "trivially copyable");
>
>  } // end anonymous namespace
>
> Modified: llvm/trunk/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h?rev=369518&r1=369517&r2=369518&view=diff
> ==============================================================================
> --- llvm/trunk/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h (original)
> +++ llvm/trunk/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h Wed Aug 21 04:37:06 2019
> @@ -39,4 +39,33 @@
>  #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
>  #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
>
> +#include "llvm/ADT/SmallString.h"
> +#include "llvm/ADT/StringRef.h"
> +#include <ostream>
> +
> +namespace llvm {
> +
> +// Printing of llvm String types.
> +// gtest sees these as containers of char (they have nested iterator types),
> +// so their operator<< is never considered unless we provide PrintTo().
> +// PrintStringTo provides quotes and escaping, at the cost of a copy.
> +
> +inline void PrintTo(llvm::StringRef S, std::ostream *OS) {
> +  *OS << ::testing::PrintToString(S.str());
> +}
> +// We need both SmallString<N> and SmallVectorImpl<char> overloads:
> +//  - the SmallString<N> template is needed as overload resolution will
> +//    instantiate generic PrintTo<T> rather than do derived-to-base conversion
> +//  - but SmallVectorImpl<char> is sometimes the actual static type, in code
> +//    that erases the small size
> +template <unsigned N>
> +inline void PrintTo(const SmallString<N> &S, std::ostream *OS) {
> +  *OS << ::testing::PrintToString(std::string(S.data(), S.size()));
> +}
> +inline void PrintTo(const SmallVectorImpl<char> &S, std::ostream *OS) {
> +  *OS << ::testing::PrintToString(std::string(S.data(), S.size()));
> +}
> +
> +} // namespace llvm
> +
>  #endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list