On Mon, Aug 27, 2012 at 9:10 AM, Martin Vejnár <[email protected]> wrote:
> From: [email protected] [mailto:[email protected]]
>> On Mon, Aug 27, 2012 at 5:42 AM, Martin Vejnár <[email protected]>
>> wrote:
>> > I’ve beed asked to post this patch to cfe-commits, so there you go.
>> > The preprocessor show now consume a comma before elided
>> __VA_ARGS__
>> > even if there is no pasting operator in between. E.g.
>>
>> In the future, can you submit as an svn patch since not everyone uses git?
>
> Sure, sorry for that, I didn't realize it would be difficult to apply.

No worries!

>> > +    if (PP.getLangOpts().MicrosoftMode &&
>> > +        (unsigned)ArgNo == Macro->getNumArgs()-1 && // is __VA_ARGS__
>> > +        ActualArgs->isVarargsElidedUse() &&       // Argument elided.
>> > +        !ResultToks.empty() && ResultToks.back().is(tok::comma)) {
>> > +      // Never add a space, even if the comma or arg had a space.
>> > +      NextTokGetsSpace = false;
>> > +
>> > +      // Remove the comma
>> > +      ResultToks.pop_back();
>> > +
>> > +      // If the comma was right after another paste (e.g.
>> "X##,__VA_ARGS__"),
>> > +      // the paste is ignored by MS compilers.
>>
>> Minor nit: the comment doesn't seem to match the code.  You've checked
>> for a comma then a hash, but the comment implies you've found a hash and
>> then a comma.
>
> No, actually, the comment is correct. ResultToks is a vector of tokens that 
> have already been consumed, so they are popped from right to left (the comma 
> is popped, then the preceding hashhash).

Ahhhh, okay, that makes far more sense then!  Thanks for the explanation.

>> > +      if (!ResultToks.empty() && ResultToks.back().is(tok::hashhash))
>> > +        ResultToks.pop_back();
>> > +      continue;
>> > +    }
>> > +
>>
>> >
>> > --- /dev/null
>> > +++ b/test/Preprocessor/macro_fn_ms_comma_swallow.c
>> > @@ -0,0 +1,7 @@
>> > +// Test the GNU comma swallowing extension.
>> > +// RUN: %clang_cc1 %s -E -fms-compatibility | FileCheck
>> > +-strict-whitespace %s
>> > +
>> > +// should eat the comma before emtpy varargs // CHECK: 1: {foo}
>> > +#define X1(b, ...) {b,__VA_ARGS__}
>> > +1: X1(foo)
>>
>> Instead of creating an entire test case for this, it might make more sense to
>> put this test macro_fn_comma_swallow.c and add a second pass to the test
>> using a check prefix for MS.
>
> Oh, I didn't know it was possible. I've read up on -check-prefix, thanks.
>
>> Otherwise, everything looks good!  Thanks for the patch!
>
> Thank you! :)

My pleasure!

~Aaron

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to