r256595 - Emit a -Wmicrosoft warning when pasting /##/ into a comment token in MS mode.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 29 15:28:40 PST 2015


On Tue, Dec 29, 2015 at 3:23 PM, Nico Weber <thakis at chromium.org> wrote:

> On Tue, Dec 29, 2015 at 6:16 PM, Richard Smith via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> On Tue, Dec 29, 2015 at 3:06 PM, Nico Weber via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> Author: nico
>>> Date: Tue Dec 29 17:06:17 2015
>>> New Revision: 256595
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=256595&view=rev
>>> Log:
>>> Emit a -Wmicrosoft warning when pasting /##/ into a comment token in MS
>>> mode.
>>>
>>> Modified:
>>>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>>     cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
>>>     cfe/trunk/include/clang/Lex/TokenLexer.h
>>>     cfe/trunk/lib/Lex/PPLexerChange.cpp
>>>     cfe/trunk/lib/Lex/TokenLexer.cpp
>>>     cfe/trunk/test/Preprocessor/macro_paste_msextensions.c
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Dec 29
>>> 17:06:17 2015
>>> @@ -765,6 +765,7 @@ def MicrosoftCast : DiagGroup<"microsoft
>>>  def MicrosoftConstInit : DiagGroup<"microsoft-const-init">;
>>>  def MicrosoftVoidPseudoDtor : DiagGroup<"microsoft-void-pseudo-dtor">;
>>>  def MicrosoftAnonTag : DiagGroup<"microsoft-anon-tag">;
>>> +def MicrosoftCommentPaste : DiagGroup<"microsoft-comment-paste">;
>>>  // Aliases.
>>>  def : DiagGroup<"msvc-include", [MicrosoftInclude]>;
>>>                  // -Wmsvc-include = -Wmicrosoft-include
>>> @@ -778,7 +779,8 @@ def Microsoft : DiagGroup<"microsoft",
>>>       MicrosoftEnumValue, MicrosoftDefaultArgRedefinition,
>>> MicrosoftTemplate,
>>>       MicrosoftRedeclareStatic, MicrosoftEnumForwardReference,
>>> MicrosoftGoto,
>>>       MicrosoftFlexibleArray, MicrosoftExtraQualification, MicrosoftCast,
>>> -     MicrosoftConstInit, MicrosoftVoidPseudoDtor, MicrosoftAnonTag]>;
>>> +     MicrosoftConstInit, MicrosoftVoidPseudoDtor, MicrosoftAnonTag,
>>> +     MicrosoftCommentPaste]>;
>>>
>>>  def ObjCNonUnifiedException : DiagGroup<"objc-nonunified-exceptions">;
>>>
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Tue Dec 29
>>> 17:06:17 2015
>>> @@ -59,6 +59,9 @@ def ext_dollar_in_identifier : Extension
>>>  def ext_charize_microsoft : Extension<
>>>    "charizing operator #@ is a Microsoft extension">,
>>>    InGroup<MicrosoftCharize>;
>>> +def ext_comment_paste_microsoft : Extension<
>>> +  "pasting two '/' tokens into a '//' comment token is a Microsoft
>>> extension">,
>>>
>>
>> It's not really technically correct to call this a token. Maybe drop the
>> word "token" here?
>>
>
> Thanks for the review! You mean only the second "token", not the first
> "tokens", right?
>

Yes.

And FWIW I find this extension horrifying. =)

+  InGroup<MicrosoftCommentPaste>;
>>>
>>>  def ext_token_used : Extension<"extension used">,
>>>    InGroup<DiagGroup<"language-extension-token">>;
>>>
>>> Modified: cfe/trunk/include/clang/Lex/TokenLexer.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/TokenLexer.h?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Lex/TokenLexer.h (original)
>>> +++ cfe/trunk/include/clang/Lex/TokenLexer.h Tue Dec 29 17:06:17 2015
>>> @@ -175,7 +175,7 @@ private:
>>>    /// macro, other active macros, and anything left on the current
>>> physical
>>>    /// source line of the expanded buffer.  Handle this by returning the
>>>    /// first token on the next line.
>>> -  void HandleMicrosoftCommentPaste(Token &Tok);
>>> +  void HandleMicrosoftCommentPaste(Token &Tok, SourceLocation OpLoc);
>>>
>>>    /// \brief If \p loc is a FileID and points inside the current macro
>>>    /// definition, returns the appropriate source location pointing at
>>> the
>>>
>>> Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original)
>>> +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Tue Dec 29 17:06:17 2015
>>> @@ -561,7 +561,6 @@ void Preprocessor::RemoveTopOfLexerStack
>>>  void Preprocessor::HandleMicrosoftCommentPaste(Token &Tok) {
>>>    assert(CurTokenLexer && !CurPPLexer &&
>>>           "Pasted comment can only be formed from macro");
>>> -
>>>    // We handle this by scanning for the closest real lexer, switching
>>> it to
>>>    // raw mode and preprocessor mode.  This will cause it to return \n
>>> as an
>>>    // explicit EOD token.
>>>
>>> Modified: cfe/trunk/lib/Lex/TokenLexer.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/TokenLexer.cpp?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Lex/TokenLexer.cpp (original)
>>> +++ cfe/trunk/lib/Lex/TokenLexer.cpp Tue Dec 29 17:06:17 2015
>>> @@ -624,21 +624,22 @@ bool TokenLexer::PasteTokens(Token &Tok)
>>>        // error.  This occurs with "x ## +"  and other stuff.  Return
>>> with Tok
>>>        // unmodified and with RHS as the next token to lex.
>>>        if (isInvalid) {
>>> +        // Explicitly convert the token location to have proper
>>> expansion
>>> +        // information so that the user knows where it came from.
>>> +        SourceManager &SM = PP.getSourceManager();
>>> +        SourceLocation Loc =
>>> +          SM.createExpansionLoc(PasteOpLoc, ExpandLocStart,
>>> ExpandLocEnd, 2);
>>> +
>>>          // Test for the Microsoft extension of /##/ turning into //
>>> here on the
>>>          // error path.
>>>          if (PP.getLangOpts().MicrosoftExt && Tok.is(tok::slash) &&
>>>              RHS.is(tok::slash)) {
>>> -          HandleMicrosoftCommentPaste(Tok);
>>> +          HandleMicrosoftCommentPaste(Tok, Loc);
>>>            return true;
>>>          }
>>>
>>>          // Do not emit the error when preprocessing assembler code.
>>>          if (!PP.getLangOpts().AsmPreprocessor) {
>>> -          // Explicitly convert the token location to have proper
>>> expansion
>>> -          // information so that the user knows where it came from.
>>> -          SourceManager &SM = PP.getSourceManager();
>>> -          SourceLocation Loc =
>>> -            SM.createExpansionLoc(PasteOpLoc, ExpandLocStart,
>>> ExpandLocEnd, 2);
>>>            // If we're in microsoft extensions mode, downgrade this from
>>> a hard
>>>            // error to an extension that defaults to an error.  This
>>> allows
>>>            // disabling it.
>>> @@ -719,7 +720,9 @@ bool TokenLexer::isParsingPreprocessorDi
>>>  /// macro, other active macros, and anything left on the current
>>> physical
>>>  /// source line of the expanded buffer.  Handle this by returning the
>>>  /// first token on the next line.
>>> -void TokenLexer::HandleMicrosoftCommentPaste(Token &Tok) {
>>> +void TokenLexer::HandleMicrosoftCommentPaste(Token &Tok, SourceLocation
>>> OpLoc) {
>>> +  PP.Diag(OpLoc, diag::ext_comment_paste_microsoft);
>>> +
>>>    // We 'comment out' the rest of this macro by just ignoring the rest
>>> of the
>>>    // tokens that have not been lexed yet, if any.
>>>
>>>
>>> Modified: cfe/trunk/test/Preprocessor/macro_paste_msextensions.c
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/macro_paste_msextensions.c?rev=256595&r1=256594&r2=256595&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Preprocessor/macro_paste_msextensions.c (original)
>>> +++ cfe/trunk/test/Preprocessor/macro_paste_msextensions.c Tue Dec 29
>>> 17:06:17 2015
>>> @@ -1,3 +1,4 @@
>>> +// RUN: %clang_cc1 -verify -fms-extensions -Wmicrosoft %s
>>>  // RUN: not %clang_cc1 -P -E -fms-extensions %s | FileCheck
>>> -strict-whitespace %s
>>>
>>>  // This horrible stuff should preprocess into (other than whitespace):
>>> @@ -10,6 +11,7 @@ int foo;
>>>  // CHECK: int foo;
>>>
>>>  #define comment /##/  dead tokens live here
>>> +// expected-warning at +1 {{pasting two '/' tokens}}
>>>  comment This is stupidity
>>>
>>>  int bar;
>>> @@ -18,6 +20,7 @@ int bar;
>>>
>>>  #define nested(x) int x comment cute little dead tokens...
>>>
>>> +// expected-warning at +1 {{pasting two '/' tokens}}
>>>  nested(baz)  rise of the dead tokens
>>>
>>>  ;
>>> @@ -29,13 +32,13 @@ nested(baz)  rise of the dead tokens
>>>  // rdar://8197149 - VC++ allows invalid token pastes: (##baz
>>>  #define foo(x) abc(x)
>>>  #define bar(y) foo(##baz(y))
>>> -bar(q)
>>> +bar(q) // expected-warning {{type specifier missing}} expected-error
>>> {{invalid preprocessing token}} expected-error {{parameter list without
>>> types}}
>>>
>>>  // CHECK: abc(baz(q))
>>>
>>>
>>>  #define str(x) #x
>>>  #define collapse_spaces(a, b, c, d) str(a ## - ## b ## - ## c ## d)
>>> -collapse_spaces(1a, b2, 3c, d4)
>>> +collapse_spaces(1a, b2, 3c, d4) // expected-error 4 {{invalid
>>> preprocessing token}} expected-error {{expected function body}}
>>>
>>>  // CHECK: "1a-b2-3cd4"
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151229/fbd1f10c/attachment-0001.html>


More information about the cfe-commits mailing list