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. 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