r258530 - [MSVC Compat] Accept elided commas in macro function arguments

Ehsan Akhgari via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 22 11:44:15 PST 2016


Do you mean only a warning for the case this patch is handling, or also for
cases such as the second test case in
https://llvm.org/bugs/show_bug.cgi?id=25875#c1 too?

(I think it would probably be a good idea to warn in both cases.)

On Fri, Jan 22, 2016 at 2:39 PM, Nico Weber <thakis at chromium.org> wrote:

> Is it possible to emit some -Wmicrosoft warning in cases where this is
> necessary?
>
> On Fri, Jan 22, 2016 at 2:26 PM, Ehsan Akhgari via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: ehsan
>> Date: Fri Jan 22 13:26:44 2016
>> New Revision: 258530
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=258530&view=rev
>> Log:
>> [MSVC Compat] Accept elided commas in macro function arguments
>>
>> Summary:
>> This fixes PR25875.  When the trailing comma in a macro argument list is
>> elided, we need to treat it similarly to the case where a variadic macro
>> misses one actual argument.
>>
>> Reviewers: rnk, rsmith
>>
>> Subscribers: cfe-commits
>>
>> Differential Revision: http://reviews.llvm.org/D15670
>>
>> 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=258530&r1=258529&r2=258530&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Lex/Token.h (original)
>> +++ cfe/trunk/include/clang/Lex/Token.h Fri Jan 22 13:26:44 2016
>> @@ -85,6 +85,7 @@ public:
>>      IgnoredComma = 0x80,   // This comma is not a macro argument
>> separator (MS).
>>      StringifiedInMacro = 0x100, // This string or character literal is
>> formed by
>>                                  // macro stringizing or charizing
>> operator.
>> +    CommaAfterElided = 0x200, // The comma following this token was
>> elided (MS).
>>    };
>>
>>    tok::TokenKind getKind() const { return Kind; }
>> @@ -297,6 +298,11 @@ public:
>>    bool stringifiedInMacro() const {
>>      return (Flags & StringifiedInMacro) ? true : false;
>>    }
>> +
>> +  /// Returns true if the comma after this token was elided.
>> +  bool commaAfterElided() const {
>> +    return (Flags & CommaAfterElided) ? true : false;
>> +  }
>>  };
>>
>>  /// \brief Information about the conditional stack (\#if directives)
>>
>> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=258530&r1=258529&r2=258530&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
>> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Fri Jan 22 13:26:44 2016
>> @@ -723,6 +723,7 @@ MacroArgs *Preprocessor::ReadFunctionLik
>>    // heap allocations in the common case.
>>    SmallVector<Token, 64> ArgTokens;
>>    bool ContainsCodeCompletionTok = false;
>> +  bool FoundElidedComma = false;
>>
>>    SourceLocation TooManyArgsLoc;
>>
>> @@ -765,6 +766,10 @@ MacroArgs *Preprocessor::ReadFunctionLik
>>          // If we found the ) token, the macro arg list is done.
>>          if (NumParens-- == 0) {
>>            MacroEnd = Tok.getLocation();
>> +          if (!ArgTokens.empty() &&
>> +              ArgTokens.back().commaAfterElided()) {
>> +            FoundElidedComma = true;
>> +          }
>>            break;
>>          }
>>        } else if (Tok.is(tok::l_paren)) {
>> @@ -909,7 +914,7 @@ MacroArgs *Preprocessor::ReadFunctionLik
>>        // then we have an empty "()" argument empty list.  This is fine,
>> even if
>>        // the macro expects one argument (the argument is just empty).
>>        isVarargsElided = MI->isVariadic();
>> -    } else if (MI->isVariadic() &&
>> +    } else if ((FoundElidedComma || MI->isVariadic()) &&
>>                 (NumActuals+1 == MinArgsExpected ||  // A(x, ...) -> A(X)
>>                  (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...)
>> -> A()
>>        // Varargs where the named vararg parameter is missing: OK as
>> extension.
>>
>> Modified: cfe/trunk/lib/Lex/TokenLexer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/TokenLexer.cpp?rev=258530&r1=258529&r2=258530&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/TokenLexer.cpp (original)
>> +++ cfe/trunk/lib/Lex/TokenLexer.cpp Fri Jan 22 13:26:44 2016
>> @@ -154,12 +154,17 @@ bool TokenLexer::MaybeRemoveCommaBeforeV
>>    // Remove the comma.
>>    ResultToks.pop_back();
>>
>> -  // If the comma was right after another paste (e.g.
>> "X##,##__VA_ARGS__"),
>> -  // then removal of the comma should produce a placemarker token (in C99
>> -  // terms) which we model by popping off the previous ##, giving us a
>> plain
>> -  // "X" when __VA_ARGS__ is empty.
>> -  if (!ResultToks.empty() && ResultToks.back().is(tok::hashhash))
>> -    ResultToks.pop_back();
>> +  if (!ResultToks.empty()) {
>> +    // If the comma was right after another paste (e.g.
>> "X##,##__VA_ARGS__"),
>> +    // then removal of the comma should produce a placemarker token (in
>> C99
>> +    // terms) which we model by popping off the previous ##, giving us a
>> plain
>> +    // "X" when __VA_ARGS__ is empty.
>> +    if (ResultToks.back().is(tok::hashhash))
>> +      ResultToks.pop_back();
>> +
>> +    // Remember that this comma was elided.
>> +    ResultToks.back().setFlag(Token::CommaAfterElided);
>> +  }
>>
>>    // Never add a space, even if the comma, ##, or arg had a space.
>>    NextTokGetsSpace = false;
>>
>> Modified: cfe/trunk/test/Preprocessor/microsoft-ext.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/microsoft-ext.c?rev=258530&r1=258529&r2=258530&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Preprocessor/microsoft-ext.c (original)
>> +++ cfe/trunk/test/Preprocessor/microsoft-ext.c Fri Jan 22 13:26:44 2016
>> @@ -34,3 +34,12 @@ ACTION_TEMPLATE(InvokeArgument,
>>
>>  MAKE_FUNC(MAK, ER, int a, _COMMA, int b);
>>  // CHECK: void func(int a , int b) {}
>> +
>> +#define macro(a, b) (a - b)
>> +void function(int a);
>> +#define COMMA_ELIDER(...) \
>> +  macro(x, __VA_ARGS__); \
>> +  function(x, __VA_ARGS__);
>> +COMMA_ELIDER();
>> +// CHECK: (x - );
>> +// CHECK: function(x);
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>


-- 
Ehsan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160122/f463d0ab/attachment-0001.html>


More information about the cfe-commits mailing list