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

Sam McCall via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 21 06:55:32 PDT 2019


Next attempt landed in 369527.

On Wed, Aug 21, 2019 at 3:40 PM Sam McCall <sam.mccall at gmail.com> wrote:

> I've reverted it.
> I didn't realize people were using this copy of gtest without also using
> support/adt, so I guess we'll end up somewhere similar to the
> existing GTEST_NO_LLVM_RAW_OSTREAM.
>
> On Wed, Aug 21, 2019 at 3:19 PM Hans Wennborg <hans at chromium.org> wrote:
>
>> 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
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190821/e352e134/attachment.html>


More information about the llvm-commits mailing list