Skip to content

Commit

Permalink
Disable unsafe implicit conversion to std::string (#729)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed May 19, 2018
1 parent d2bf93f commit d940fa6
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 15 deletions.
5 changes: 3 additions & 2 deletions include/fmt/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -629,8 +629,9 @@ inline typename std::enable_if<
template <typename C, typename T, typename Char = typename C::char_type>
inline typename std::enable_if<
!convert_to_int<T, Char>::value &&
!std::is_convertible<T, basic_string_view<Char>>::value &&
!std::is_convertible<T, std::basic_string<Char>>::value,
!std::is_convertible<T, basic_string_view<Char>>::value,
// Implicit conversion to std::string is not handled here because it's
// unsafe: https://github.com/fmtlib/fmt/issues/729
typed_value<C, custom_type>>::type
make_value(const T &val) { return val; }

Expand Down
11 changes: 9 additions & 2 deletions test/compile-test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ set(CMAKE_REQUIRED_FLAGS ${CPP14_FLAG})
function (generate_source result fragment)
set(${result} "
#define FMT_HEADER_ONLY 1
#include \"fmt/posix.h\"
#include \"fmt/ostream.h\"
#include \"fmt/format.h\"
int main() {
${fragment}
}
Expand Down Expand Up @@ -58,6 +57,14 @@ expect_compile_error("fmt::format(\"{}\", L\"foo\");")
# mixing UTF-8 with UTF-16/32 can result in an invalid output.
expect_compile_error("fmt::format(L\"{}\", \"foo\");")

# Formatting a wide string with a narrow format string is forbidden.
expect_compile_error("
struct S {
operator std::string() const { return std::string(); }
};
fmt::format(\"{}\", S());
")

# Make sure that compiler features detected in the header
# match the features detected in CMake.
if (SUPPORTS_USER_DEFINED_LITERALS)
Expand Down
10 changes: 0 additions & 10 deletions test/format-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1072,16 +1072,6 @@ TEST(FormatterTest, FormatStdStringView) {
}
#endif

struct ConvertibleToString {
std::string s;
ConvertibleToString() : s("foo") {}
operator const std::string &() const { return s; }
};

TEST(FormatterTest, FormatConvertibleToString) {
EXPECT_EQ("foo", format("{}", ConvertibleToString()));
}

struct ConvertibleToStringView {
operator fmt::string_view() const { return "foo"; }
};
Expand Down
2 changes: 1 addition & 1 deletion test/util-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ TEST(UtilTest, BitCast) {
uint32_t u[2];
};
auto s = fmt::internal::bit_cast<S>(uint64_t(42));
EXPECT_EQ(fmt::internal::bit_cast<uint64_t>(s), 42);
EXPECT_EQ(fmt::internal::bit_cast<uint64_t>(s), 42u);
s = fmt::internal::bit_cast<S>(uint64_t(~0ull));
EXPECT_EQ(fmt::internal::bit_cast<uint64_t>(s), ~0ull);
}
Expand Down

0 comments on commit d940fa6

Please sign in to comment.