Commit 8e7d7a30 by Shannon Woods

Fix use of references with va_start

BUG=angle:736 va_start behavior is undefined if the second parameter is a function, array, or reference type. clang produces a warning for this, while MSVC does not. Change-Id: I0bc2805e312e3542aac816f10a257e2f1cfad128 Reviewed-on: https://chromium-review.googlesource.com/216010Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarNico Weber <thakis@chromium.org> Tested-by: 's avatarNico Weber <thakis@chromium.org>
parent 685dd27a
...@@ -8,26 +8,26 @@ ...@@ -8,26 +8,26 @@
#include <vector> #include <vector>
std::string FormatString(const std::string &fmt, va_list vararg) std::string FormatString(const char *fmt, va_list vararg)
{ {
static std::vector<char> buffer(512); static std::vector<char> buffer(512);
// Attempt to just print to the current buffer // Attempt to just print to the current buffer
int len = vsnprintf(&buffer[0], buffer.size(), fmt.c_str(), vararg); int len = vsnprintf(&buffer[0], buffer.size(), fmt, vararg);
if (len < 0 || static_cast<size_t>(len) >= buffer.size()) if (len < 0 || static_cast<size_t>(len) >= buffer.size())
{ {
// Buffer was not large enough, calculate the required size and resize the buffer // Buffer was not large enough, calculate the required size and resize the buffer
len = vsnprintf(NULL, 0, fmt.c_str(), vararg); len = vsnprintf(NULL, 0, fmt, vararg);
buffer.resize(len + 1); buffer.resize(len + 1);
// Print again // Print again
vsnprintf(&buffer[0], buffer.size(), fmt.c_str(), vararg); vsnprintf(&buffer[0], buffer.size(), fmt, vararg);
} }
return std::string(buffer.data(), len); return std::string(buffer.data(), len);
} }
std::string FormatString(const std::string &fmt, ...) std::string FormatString(const char *fmt, ...)
{ {
va_list vararg; va_list vararg;
va_start(vararg, fmt); va_start(vararg, fmt);
......
...@@ -132,8 +132,8 @@ inline std::string Str(int i) ...@@ -132,8 +132,8 @@ inline std::string Str(int i)
return strstr.str(); return strstr.str();
} }
std::string FormatString(const std::string &fmt, va_list vararg); std::string FormatString(const char *fmt, va_list vararg);
std::string FormatString(const std::string &fmt, ...); std::string FormatString(const char *fmt, ...);
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define snprintf _snprintf #define snprintf _snprintf
......
...@@ -22,7 +22,7 @@ Error::Error(GLenum errorCode) ...@@ -22,7 +22,7 @@ Error::Error(GLenum errorCode)
{ {
} }
Error::Error(GLenum errorCode, const std::string &msg, ...) Error::Error(GLenum errorCode, const char *msg, ...)
: mCode(errorCode), : mCode(errorCode),
mMessage() mMessage()
{ {
......
...@@ -20,7 +20,7 @@ class Error ...@@ -20,7 +20,7 @@ class Error
{ {
public: public:
explicit Error(GLenum errorCode); explicit Error(GLenum errorCode);
Error(GLenum errorCode, const std::string &msg, ...); Error(GLenum errorCode, const char *msg, ...);
Error(const Error &other); Error(const Error &other);
Error &operator=(const Error &other); Error &operator=(const Error &other);
......
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