On Tue, Dec 29, 2015 at 6:28 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> On Tue, Dec 29, 2015 at 3:23 PM, Nico Weber <tha...@chromium.org> wrote: > >> On Tue, Dec 29, 2015 at 6:16 PM, Richard Smith via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> On Tue, Dec 29, 2015 at 3:06 PM, Nico Weber via cfe-commits < >>> cfe-commits@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@+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@+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@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>> >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >>> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits