diff options
author | Shahbaz Youssefi <syoussefi@google.com> | 2019-12-16 16:23:21 (GMT) |
---|---|---|
committer | Shahbaz Youssefi <syoussefi@google.com> | 2019-12-16 16:27:52 (GMT) |
commit | d2016469064bdb488ce271c84684518d2716fec2 (patch) | |
tree | ca634916ef74462e613d53bf940076a21363d1c0 /googletest | |
parent | 5b162a79d49d044690f3eb7d87ecc3b98a3f2e25 (diff) | |
download | googletest-d2016469064bdb488ce271c84684518d2716fec2.zip googletest-d2016469064bdb488ce271c84684518d2716fec2.tar.gz googletest-d2016469064bdb488ce271c84684518d2716fec2.tar.bz2 |
Workaround VS bug w.r.t empty arguments to macros
Empty arguments can be passed to macros per C99 and C++11 specs, which
can then be forwarded to other macros.
Visual Studio's compiler has a bug in the following situation:
#define A(x) #x
#define B(x, y) A(x)
B(, b)
In the above case, Visual Studio first expands x to nothing, then
complains that A is not invoked with the right amount of arguments.
However, x in A(x) is still one argument, even if it expands to no
preprocessing tokens. See also https://stackoverflow.com/a/7674214.
Diffstat (limited to 'googletest')
-rw-r--r-- | googletest/include/gtest/internal/gtest-internal.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/googletest/include/gtest/internal/gtest-internal.h b/googletest/include/gtest/internal/gtest-internal.h index eac831a..978728e 100644 --- a/googletest/include/gtest/internal/gtest-internal.h +++ b/googletest/include/gtest/internal/gtest-internal.h @@ -79,7 +79,16 @@ #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar // Stringifies its argument. -#define GTEST_STRINGIFY_(name) #name +// Work around a bug in visual studio which doesn't accept code like this: +// +// #define GTEST_STRINGIFY_(name) #name +// #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ... +// MACRO(, x, y) +// +// Complaining about the argument to GTEST_STRINGIFY_ being empty. +// This is allowed by the spec. +#define GTEST_STRINGIFY_HELPER_(name, ...) #name +#define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__,) namespace proto2 { class Message; } |