r184968 - Match MSVC's handling of commas during macro argument expansion
João Matos
ripzonetriton at gmail.com
Wed Jun 26 11:02:16 PDT 2013
Nice to see this finally fixed!
On Wed, Jun 26, 2013 at 6:16 PM, Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Wed Jun 26 12:16:08 2013
> New Revision: 184968
>
> URL: http://llvm.org/viewvc/llvm-project?rev=184968&view=rev
> Log:
> Match MSVC's handling of commas during macro argument expansion
>
> This allows clang to parse the type_traits header in Visual Studio 2012,
> which is included widely in practice.
>
> This is a rework of r163022 by João Matos. The original patch broke
> preprocessing of gtest headers, which this patch addresses.
>
> Patch by Will Wilson!
>
> Modified:
> cfe/trunk/include/clang/Lex/Token.h
> cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> cfe/trunk/lib/Lex/TokenLexer.cpp
> cfe/trunk/test/Preprocessor/microsoft-ext.c
>
> Modified: cfe/trunk/include/clang/Lex/Token.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Token.h?rev=184968&r1=184967&r2=184968&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/Token.h (original)
> +++ cfe/trunk/include/clang/Lex/Token.h Wed Jun 26 12:16:08 2013
> @@ -77,7 +77,8 @@ public:
> NeedsCleaning = 0x08, // Contained an escaped newline or trigraph.
> LeadingEmptyMacro = 0x10, // Empty macro exists before this token.
> HasUDSuffix = 0x20, // This string or character literal has a
> ud-suffix.
> - HasUCN = 0x40 // This identifier contains a UCN.
> + HasUCN = 0x40, // This identifier contains a UCN.
> + IgnoredComma = 0x80, // This comma is not a macro argument
> separator (MS).
> };
>
> tok::TokenKind getKind() const { return (tok::TokenKind)Kind; }
>
> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=184968&r1=184967&r2=184968&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Jun 26 12:16:08 2013
> @@ -458,7 +458,12 @@ MacroArgs *Preprocessor::ReadFunctionLik
> }
> } else if (Tok.is(tok::l_paren)) {
> ++NumParens;
> - } else if (Tok.is(tok::comma) && NumParens == 0) {
> + } else if (Tok.is(tok::comma) && NumParens == 0 &&
> + !(Tok.getFlags() & Token::IgnoredComma)) {
> + // 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.
>
> Modified: cfe/trunk/lib/Lex/TokenLexer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/TokenLexer.cpp?rev=184968&r1=184967&r2=184968&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/TokenLexer.cpp (original)
> +++ cfe/trunk/lib/Lex/TokenLexer.cpp Wed Jun 26 12:16:08 2013
> @@ -278,6 +278,14 @@ void TokenLexer::ExpandFunctionArguments
> unsigned NumToks = MacroArgs::getArgLength(ResultArgToks);
> ResultToks.append(ResultArgToks, ResultArgToks+NumToks);
>
> + // In Microsoft-compatibility mode, we follow MSVC's preprocessing
> + // behavior by not considering single commas from nested macro
> + // expansions as argument separators. Set a flag on the token so
> we can
> + // test for this later when the macro expansion is processed.
> + if (PP.getLangOpts().MicrosoftMode && NumToks == 1 &&
> + ResultToks.back().is(tok::comma))
> + ResultToks.back().setFlag(Token::IgnoredComma);
> +
> // If the '##' came from expanding an argument, turn it into
> 'unknown'
> // to avoid pasting.
> for (unsigned i = FirstResult, e = ResultToks.size(); i != e;
> ++i) {
>
> Modified: cfe/trunk/test/Preprocessor/microsoft-ext.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/microsoft-ext.c?rev=184968&r1=184967&r2=184968&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Preprocessor/microsoft-ext.c (original)
> +++ cfe/trunk/test/Preprocessor/microsoft-ext.c Wed Jun 26 12:16:08 2013
> @@ -22,3 +22,15 @@ class GMOCK_ACTION_CLASS_(name, value_pa
> ACTION_TEMPLATE(InvokeArgument,
> HAS_1_TEMPLATE_PARAMS(int, k),
> AND_2_VALUE_PARAMS(p0, p1));
> +
> +// This tests compatibility with behaviour needed for type_traits in
> VS2012
> +// Test based on _VARIADIC_EXPAND_0X macros in xstddef of VS2012
> +#define _COMMA ,
> +
> +#define MAKER(_arg1, _comma, _arg2)
> \
> + void func(_arg1 _comma _arg2) {}
> +#define MAKE_FUNC(_makerP1, _makerP2, _arg1, _comma, _arg2)
> \
> + _makerP1##_makerP2(_arg1, _comma, _arg2)
> +
> +MAKE_FUNC(MAK, ER, int a, _COMMA, int b);
> +// CHECK: void func(int a , int b) {}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
João Matos
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130626/a5ebf49d/attachment.html>
More information about the cfe-commits
mailing list