base: Remove the ability to cprintf stringstreams directly.
authorGabe Black <gabeblack@google.com>
Mon, 29 Jan 2018 22:42:26 +0000 (14:42 -0800)
committerGabe Black <gabeblack@google.com>
Mon, 29 Jan 2018 23:48:24 +0000 (23:48 +0000)
The cprintf functions don't know ahead of time what format characters
are going to be used with what underlying data types, and so any
type must be minimally usable with the default specialization of
format_integer, format_char, format_float and format_string. All of
those functions ultimately print their parameter with out << data
except the one which prints stringstreams. That function accesses the
buffer of the string stream with .str(), and then prints that instead.

That should technically work out ok as long as stringstreams are only
printed using %s, but there's no way to guarantee that ahead of time.
To avoid that problem, and because gem5 doesn't ever actually use the
ability to print stringstreams directly, this change removes that
feature and modifies the corresponding part of the unit test.

If we ever do want to print the contents of a string stream, it won't
be difficult to add a .str() to it.

Change-Id: Id902eaff042b96b374efe0183e5e3be9626e8c88
Reviewed-on: https://gem5-review.googlesource.com/7642
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/base/cprintf_formats.hh
src/base/cprintftest.cc

index 4c78fdf5026871400193694bac168e6105f199e8..f55fb955e6d0c704f9b4c9f0d2a650002ca2b25c 100644 (file)
@@ -337,10 +337,6 @@ inline void
 format_string(std::ostream &out, const T &data, Format &fmt)
 { _format_string(out, data, fmt); }
 
-inline void
-format_string(std::ostream &out, const std::stringstream &data, Format &fmt)
-{ _format_string(out, data.str(), fmt); }
-
 } // namespace cp
 
 #endif // __CPRINTF_FORMATS_HH__
index 86694ed834cab9e7739ef676a21175ab15dbf801..3a1b97e409033e2a413958a88fe03ce87354860e 100644 (file)
@@ -166,7 +166,7 @@ TEST(CPrintf, Types)
 
     std::stringstream foo2;
     foo2 << "stringstream test";
-    ccprintf(ss, "%s\n", foo2);
+    ccprintf(ss, "%s\n", foo2.str());
     EXPECT_EQ(ss.str(), "stringstream test\n");
     ss.str("");