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? > + 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