summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorEric Astor <epastor@google.com>2019-10-30 12:44:49 -0400
committerEric Astor <epastor@google.com>2019-11-04 12:49:19 -0500
commitbe6ac471f613427f3b5b3a306fe033e526d59f76 (patch)
treeed65c85cacfe66a635b5d674f9a0a0d837a88e92 /clang/lib
parenta8653da4320c5e37fccc54d396f2286a0dce7efe (diff)
downloadbcm5719-llvm-be6ac471f613427f3b5b3a306fe033e526d59f76.tar.gz
bcm5719-llvm-be6ac471f613427f3b5b3a306fe033e526d59f76.zip
[ms] Fix Microsoft compatibility handling of commas in nested macro expansions.
In Microsoft-compatibility mode, single commas from nested macro expansions should not be considered as argument separators; we already emulated this by marking them to be ignored. However, in MSVC's preprocessor, subsequent expansions DO treat these commas as argument separators... so we now ignore each comma at most once. Includes a small unit test that validates we match MSVC's behavior as shown in https://gcc.godbolt.org/z/y0twaq Fixes PR43282 Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D69626
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index dfbcaedcacf..c13515280b7 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -820,18 +820,26 @@ MacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName,
}
} else if (Tok.is(tok::l_paren)) {
++NumParens;
- } else if (Tok.is(tok::comma) && NumParens == 0 &&
- !(Tok.getFlags() & Token::IgnoredComma)) {
+ } else if (Tok.is(tok::comma)) {
// In Microsoft-compatibility mode, single commas from nested macro
// expansions should not be considered as argument separators. We test
- // for this with the IgnoredComma token flag above.
-
- // Comma ends this argument if there are more fixed arguments expected.
- // However, if this is a variadic macro, and this is part of the
- // variadic part, then the comma is just an argument token.
- if (!isVariadic) break;
- if (NumFixedArgsLeft > 1)
- break;
+ // for this with the IgnoredComma token flag.
+ if (Tok.getFlags() & Token::IgnoredComma) {
+ // However, in MSVC's preprocessor, subsequent expansions do treat
+ // these commas as argument separators. This leads to a common
+ // workaround used in macros that need to work in both MSVC and
+ // compliant preprocessors. Therefore, the IgnoredComma flag can only
+ // apply once to any given token.
+ Tok.clearFlag(Token::IgnoredComma);
+ } else if (NumParens == 0) {
+ // Comma ends this argument if there are more fixed arguments
+ // expected. However, if this is a variadic macro, and this is part of
+ // the variadic part, then the comma is just an argument token.
+ if (!isVariadic)
+ break;
+ if (NumFixedArgsLeft > 1)
+ break;
+ }
} else if (Tok.is(tok::comment) && !KeepMacroComments) {
// If this is a comment token in the argument list and we're just in
// -C mode (not -CC mode), discard the comment.
OpenPOWER on IntegriCloud