r256595 - Emit a -Wmicrosoft warning when pasting /##/ into a comment token in MS mode.
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 29 15:35:39 PST 2015
On Tue, Dec 29, 2015 at 6:28 PM, Richard Smith <richard at metafoo.co.uk>
wrote:
> 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.
>
Done in 256600.
>
> 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/b3d729ae/attachment-0001.html>
More information about the cfe-commits
mailing list