Workaround missed optimization in gcc (#668)

This commit is contained in:
Victor Zverovich 2018-03-04 11:45:20 -08:00
parent bb47109a78
commit a103b9bc46

View File

@ -1187,11 +1187,16 @@ std::wstring vformat(wstring_view format_str, wformat_args args);
*/ */
template <typename... Args> template <typename... Args>
inline std::string format(string_view format_str, const Args & ... args) { inline std::string format(string_view format_str, const Args & ... args) {
return vformat(format_str, make_args(args...)); // This should be just
// return vformat(format_str, make_args(args...));
// but gcc has trouble optimizing the latter, so break it down.
arg_store<context, Args...> as(args...);
return vformat(format_str, as);
} }
template <typename... Args> template <typename... Args>
inline std::wstring format(wstring_view format_str, const Args & ... args) { inline std::wstring format(wstring_view format_str, const Args & ... args) {
return vformat(format_str, make_args<wcontext>(args...)); arg_store<wcontext, Args...> as(args...);
return vformat(format_str, as);
} }
FMT_API void vprint(std::FILE *f, string_view format_str, format_args args); FMT_API void vprint(std::FILE *f, string_view format_str, format_args args);
@ -1207,7 +1212,8 @@ FMT_API void vprint(std::FILE *f, string_view format_str, format_args args);
*/ */
template <typename... Args> template <typename... Args>
inline void print(std::FILE *f, string_view format_str, const Args & ... args) { inline void print(std::FILE *f, string_view format_str, const Args & ... args) {
vprint(f, format_str, make_args(args...)); arg_store<context, Args...> as(args...);
vprint(f, format_str, as);
} }
FMT_API void vprint(string_view format_str, format_args args); FMT_API void vprint(string_view format_str, format_args args);
@ -1223,7 +1229,8 @@ FMT_API void vprint(string_view format_str, format_args args);
*/ */
template <typename... Args> template <typename... Args>
inline void print(string_view format_str, const Args & ... args) { inline void print(string_view format_str, const Args & ... args) {
vprint(format_str, make_args(args...)); arg_store<context, Args...> as(args...);
vprint(format_str, as);
} }
} // namespace fmt } // namespace fmt