summaryrefslogtreecommitdiffstats
path: root/googletest
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2021-01-05 17:21:27 (GMT)
committerDerek Mauro <dmauro@google.com>2021-01-14 01:58:57 (GMT)
commitf8304d762e0ed119d3d1c72deb1976dc80029db5 (patch)
tree0e79c6abd727e495fc3aa9aab6482b1ceb0b2f4d /googletest
parent95a9bdd9f91222e34d7ef50757e24351d73927b9 (diff)
downloadgoogletest-f8304d762e0ed119d3d1c72deb1976dc80029db5.zip
googletest-f8304d762e0ed119d3d1c72deb1976dc80029db5.tar.gz
googletest-f8304d762e0ed119d3d1c72deb1976dc80029db5.tar.bz2
Googletest export
Add support for printing incomplete types in the universal printer. PiperOrigin-RevId: 350154637
Diffstat (limited to 'googletest')
-rw-r--r--googletest/include/gtest/gtest-printers.h17
-rw-r--r--googletest/test/googletest-printers-test.cc7
2 files changed, 19 insertions, 5 deletions
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h
index 463f0af..d329224 100644
--- a/googletest/include/gtest/gtest-printers.h
+++ b/googletest/include/gtest/gtest-printers.h
@@ -261,16 +261,23 @@ struct ConvertibleToStringViewPrinter {
GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
size_t count,
::std::ostream* os);
-struct FallbackPrinter {
- template <typename T>
+struct RawBytesPrinter {
+ // SFINAE on `sizeof` to make sure we have a complete type.
+ template <typename T, size_t = sizeof(T)>
static void PrintValue(const T& value, ::std::ostream* os) {
PrintBytesInObjectTo(
- static_cast<const unsigned char*>(
- reinterpret_cast<const void*>(std::addressof(value))),
+ reinterpret_cast<const unsigned char*>(std::addressof(value)),
sizeof(value), os);
}
};
+struct FallbackPrinter {
+ template <typename T>
+ static void PrintValue(const T&, ::std::ostream* os) {
+ *os << "(incomplete type)";
+ }
+};
+
// Try every printer in order and return the first one that works.
template <typename T, typename E, typename Printer, typename... Printers>
struct FindFirstPrinter : FindFirstPrinter<T, E, Printers...> {};
@@ -297,7 +304,7 @@ void PrintWithFallback(const T& value, ::std::ostream* os) {
T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter,
internal_stream_operator_without_lexical_name_lookup::StreamPrinter,
ProtobufPrinter, ConvertibleToIntegerPrinter,
- ConvertibleToStringViewPrinter, FallbackPrinter>::type;
+ ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type;
Printer::PrintValue(value, os);
}
diff --git a/googletest/test/googletest-printers-test.cc b/googletest/test/googletest-printers-test.cc
index bf1e0b5..24ec230 100644
--- a/googletest/test/googletest-printers-test.cc
+++ b/googletest/test/googletest-printers-test.cc
@@ -1695,6 +1695,13 @@ TEST(UniversalPrintTest, WorksForCharArray) {
EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str());
}
+TEST(UniversalPrintTest, IncompleteType) {
+ struct Incomplete;
+ char some_object = 0;
+ EXPECT_EQ("(incomplete type)",
+ PrintToString(reinterpret_cast<Incomplete&>(some_object)));
+}
+
TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsEmptyTuple) {
Strings result = UniversalTersePrintTupleFieldsToStrings(::std::make_tuple());
EXPECT_EQ(0u, result.size());