Commit 5098decb authored by Kirill Smelkov's avatar Kirill Smelkov

fmt: Adjust to support MSVC

- there is no __attribute__ on that compiler
- sadly va_start is rejected to work on reference:

    z:\home\kirr\src\tools\go\pygo-win\BuildTools\vc\tools\msvc\14.35.32215\include\vadefs.h(194): error C2338: static_assert failed: 'va_start argument must not have reference type and must not be parenthesized'
    golang/fmt.cpp(53): note: see reference to class template instantiation '__vcrt_assert_va_start_is_not_reference<const golang::string &>' being compiled

  -> change format from string& to be string in sprintf.

  Probably it should be ok in practice from performance point of view because
  string contains only pointer to data, not the data itself.
parent 22a597a0
// Copyright (C) 2019-2020 Nexedi SA and Contributors. // Copyright (C) 2019-2023 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com> // Kirill Smelkov <kirr@nexedi.com>
// //
// This program is free software: you can Use, Study, Modify and Redistribute // This program is free software: you can Use, Study, Modify and Redistribute
...@@ -48,7 +48,7 @@ string _vsprintf(const char *format, va_list argp) { ...@@ -48,7 +48,7 @@ string _vsprintf(const char *format, va_list argp) {
return string(buf.get(), buf.get() + nchar); // without trailing '\0' return string(buf.get(), buf.get() + nchar); // without trailing '\0'
} }
string sprintf(const string &format, ...) { string sprintf(const string format, ...) {
va_list argp; va_list argp;
va_start(argp, format); va_start(argp, format);
string str = fmt::_vsprintf(format.c_str(), argp); string str = fmt::_vsprintf(format.c_str(), argp);
...@@ -64,7 +64,7 @@ string sprintf(const char *format, ...) { ...@@ -64,7 +64,7 @@ string sprintf(const char *format, ...) {
return str; return str;
} }
error ___errorf(const string &format, ...) { error ___errorf(const string format, ...) {
va_list argp; va_list argp;
va_start(argp, format); va_start(argp, format);
error err = errors::New(fmt::_vsprintf(format.c_str(), argp)); error err = errors::New(fmt::_vsprintf(format.c_str(), argp));
......
#ifndef _NXD_LIBGOLANG_FMT_H #ifndef _NXD_LIBGOLANG_FMT_H
#define _NXD_LIBGOLANG_FMT_H #define _NXD_LIBGOLANG_FMT_H
// Copyright (C) 2019-2020 Nexedi SA and Contributors. // Copyright (C) 2019-2023 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com> // Kirill Smelkov <kirr@nexedi.com>
// //
// This program is free software: you can Use, Study, Modify and Redistribute // This program is free software: you can Use, Study, Modify and Redistribute
...@@ -40,7 +40,7 @@ namespace golang { ...@@ -40,7 +40,7 @@ namespace golang {
namespace fmt { namespace fmt {
// sprintf formats text into string. // sprintf formats text into string.
LIBGOLANG_API string sprintf(const string &format, ...); LIBGOLANG_API string sprintf(const string format, ...);
// intseq<i1, i2, ...> and intrange<n> are used by errorf to handle %w. // intseq<i1, i2, ...> and intrange<n> are used by errorf to handle %w.
...@@ -75,7 +75,7 @@ namespace { ...@@ -75,7 +75,7 @@ namespace {
// //
// format suffix ": %w" is additionally handled as in Go with // format suffix ": %w" is additionally handled as in Go with
// `errorf("... : %w", ..., err)` creating error that can be unwrapped back to err. // `errorf("... : %w", ..., err)` creating error that can be unwrapped back to err.
LIBGOLANG_API error ___errorf(const string& format, ...); LIBGOLANG_API error ___errorf(const string format, ...);
LIBGOLANG_API error ___errorfTryWrap(const string& format, error last_err, ...); LIBGOLANG_API error ___errorfTryWrap(const string& format, error last_err, ...);
LIBGOLANG_API string ___error_str(error err); LIBGOLANG_API string ___error_str(error err);
...@@ -111,7 +111,10 @@ inline error errorf(const string& format, Argv... argv) { ...@@ -111,7 +111,10 @@ inline error errorf(const string& format, Argv... argv) {
// `const char *` overloads just to catch format mistakes as // `const char *` overloads just to catch format mistakes as
// __attribute__(format) does not work with std::string. // __attribute__(format) does not work with std::string.
LIBGOLANG_API string sprintf(const char *format, ...) LIBGOLANG_API string sprintf(const char *format, ...)
__attribute__ ((format (printf, 1, 2))); #ifndef _MSC_VER
__attribute__ ((format (printf, 1, 2)))
#endif
;
// cannot use __attribute__(format) for errorf as we add %w handling. // cannot use __attribute__(format) for errorf as we add %w handling.
// still `const char *` overload is useful for performance. // still `const char *` overload is useful for performance.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment