r201821 - Expand macros in pragmas with -fms-extensions and -E
Adrian Prantl
aprantl at apple.com
Thu Feb 20 17:12:07 PST 2014
Great. Thanks!
-- adrian
On Feb 20, 2014, at 17:11, Reid Kleckner <rnk at google.com> wrote:
> Thanks, this should have been fixed in r201825, and the builder has subsequent runs that don't fail that test.
>
>
> On Thu, Feb 20, 2014 at 4:55 PM, Adrian Prantl <aprantl at apple.com> wrote:
> Hi Reid,
>
> this or possibly 201820 is causing our buildbot to fail:
>
> http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/12417
>
> please have a quick look.
> -- adrian
>
> On Feb 20, 2014, at 14:59, Reid Kleckner <reid at kleckner.net> wrote:
>
> > Author: rnk
> > Date: Thu Feb 20 16:59:51 2014
> > New Revision: 201821
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=201821&view=rev
> > Log:
> > Expand macros in pragmas with -fms-extensions and -E
> >
> > gcc never expands macros in pragmas and MSVC always expands macros
> > before processing pragmas. Clang usually allows macro expansion, except
> > in a handful of pragmas, most of which are handled by the lexer.
> >
> > Also remove PPCallbacks for pragmas that are currently handled in the
> > parser. Without a Parser, such as with clang -E, these callbacks would
> > never be called.
> >
> > Fixes PR18576.
> >
> > Added:
> > cfe/trunk/test/Preprocessor/print-pragma-microsoft.c
> > Modified:
> > cfe/trunk/include/clang/Lex/PPCallbacks.h
> > cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
> > cfe/trunk/lib/Parse/ParsePragma.cpp
> >
> > Modified: cfe/trunk/include/clang/Lex/PPCallbacks.h
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PPCallbacks.h?rev=201821&r1=201820&r2=201821&view=diff
> > ==============================================================================
> > --- cfe/trunk/include/clang/Lex/PPCallbacks.h (original)
> > +++ cfe/trunk/include/clang/Lex/PPCallbacks.h Thu Feb 20 16:59:51 2014
> > @@ -161,18 +161,6 @@ public:
> > PragmaIntroducerKind Introducer) {
> > }
> >
> > - /// \brief Callback invoked when a \#pragma comment directive is read.
> > - virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
> > - const std::string &Str) {
> > - }
> > -
> > - /// \brief Callback invoked when a \#pragma detect_mismatch directive is
> > - /// read.
> > - virtual void PragmaDetectMismatch(SourceLocation Loc,
> > - const std::string &Name,
> > - const std::string &Value) {
> > - }
> > -
> > /// \brief Callback invoked when a \#pragma clang __debug directive is read.
> > /// \param Loc The location of the debug directive.
> > /// \param DebugType The identifier following __debug.
> > @@ -387,19 +375,6 @@ public:
> > Second->Ident(Loc, str);
> > }
> >
> > - virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
> > - const std::string &Str) {
> > - First->PragmaComment(Loc, Kind, Str);
> > - Second->PragmaComment(Loc, Kind, Str);
> > - }
> > -
> > - virtual void PragmaDetectMismatch(SourceLocation Loc,
> > - const std::string &Name,
> > - const std::string &Value) {
> > - First->PragmaDetectMismatch(Loc, Name, Value);
> > - Second->PragmaDetectMismatch(Loc, Name, Value);
> > - }
> > -
> > virtual void PragmaMessage(SourceLocation Loc, StringRef Namespace,
> > PragmaMessageKind Kind, StringRef Str) {
> > First->PragmaMessage(Loc, Namespace, Kind, Str);
> >
> > Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=201821&r1=201820&r2=201821&view=diff
> > ==============================================================================
> > --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original)
> > +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Thu Feb 20 16:59:51 2014
> > @@ -138,11 +138,6 @@ public:
> > const Module *Imported);
> > virtual void Ident(SourceLocation Loc, const std::string &str);
> > virtual void PragmaCaptured(SourceLocation Loc, StringRef Str);
> > - virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
> > - const std::string &Str);
> > - virtual void PragmaDetectMismatch(SourceLocation Loc,
> > - const std::string &Name,
> > - const std::string &Value);
> > virtual void PragmaMessage(SourceLocation Loc, StringRef Namespace,
> > PragmaMessageKind Kind, StringRef Str);
> > virtual void PragmaDebug(SourceLocation Loc, StringRef DebugType);
> > @@ -402,36 +397,6 @@ static void outputPrintable(llvm::raw_os
> > }
> > }
> >
> > -void PrintPPOutputPPCallbacks::PragmaComment(SourceLocation Loc,
> > - const IdentifierInfo *Kind,
> > - const std::string &Str) {
> > - startNewLineIfNeeded();
> > - MoveToLine(Loc);
> > - OS << "#pragma comment(" << Kind->getName();
> > -
> > - if (!Str.empty()) {
> > - OS << ", \"";
> > - outputPrintable(OS, Str);
> > - OS << '"';
> > - }
> > -
> > - OS << ')';
> > - setEmittedDirectiveOnThisLine();
> > -}
> > -
> > -void PrintPPOutputPPCallbacks::PragmaDetectMismatch(SourceLocation Loc,
> > - const std::string &Name,
> > - const std::string &Value) {
> > - startNewLineIfNeeded();
> > - MoveToLine(Loc);
> > - OS << "#pragma detect_mismatch(\"" << Name << '"';
> > - outputPrintable(OS, Name);
> > - OS << "\", \"";
> > - outputPrintable(OS, Value);
> > - OS << "\")";
> > - setEmittedDirectiveOnThisLine();
> > -}
> > -
> > void PrintPPOutputPPCallbacks::PragmaMessage(SourceLocation Loc,
> > StringRef Namespace,
> > PragmaMessageKind Kind,
> > @@ -615,7 +580,13 @@ struct UnknownPragmaHandler : public Pra
> > Callbacks->OS << ' ';
> > std::string TokSpell = PP.getSpelling(PragmaTok);
> > Callbacks->OS.write(&TokSpell[0], TokSpell.size());
> > - PP.LexUnexpandedToken(PragmaTok);
> > +
> > + // Expand macros in pragmas with -fms-extensions. The assumption is that
> > + // the majority of pragmas in such a file will be Microsoft pragmas.
> > + if (PP.getLangOpts().MicrosoftExt)
> > + PP.Lex(PragmaTok);
> > + else
> > + PP.LexUnexpandedToken(PragmaTok);
> > }
> > Callbacks->setEmittedDirectiveOnThisLine();
> > }
> >
> > Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=201821&r1=201820&r2=201821&view=diff
> > ==============================================================================
> > --- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
> > +++ cfe/trunk/lib/Parse/ParsePragma.cpp Thu Feb 20 16:59:51 2014
> > @@ -1253,11 +1253,6 @@ void PragmaDetectMismatchHandler::Handle
> > return;
> > }
> >
> > - // If the pragma is lexically sound, notify any interested PPCallbacks.
> > - if (PP.getPPCallbacks())
> > - PP.getPPCallbacks()->PragmaDetectMismatch(CommentLoc, NameString,
> > - ValueString);
> > -
> > Actions.ActOnPragmaDetectMismatch(NameString, ValueString);
> > }
> >
> > @@ -1328,9 +1323,5 @@ void PragmaCommentHandler::HandlePragma(
> > return;
> > }
> >
> > - // If the pragma is lexically sound, notify any interested PPCallbacks.
> > - if (PP.getPPCallbacks())
> > - PP.getPPCallbacks()->PragmaComment(CommentLoc, II, ArgumentString);
> > -
> > Actions.ActOnPragmaMSComment(Kind, ArgumentString);
> > }
> >
> > Added: cfe/trunk/test/Preprocessor/print-pragma-microsoft.c
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/print-pragma-microsoft.c?rev=201821&view=auto
> > ==============================================================================
> > --- cfe/trunk/test/Preprocessor/print-pragma-microsoft.c (added)
> > +++ cfe/trunk/test/Preprocessor/print-pragma-microsoft.c Thu Feb 20 16:59:51 2014
> > @@ -0,0 +1,20 @@
> > +// RUN: %clang_cc1 %s -fsyntax-only -fms-extensions -E -o - | FileCheck %s
> > +
> > +#define BAR "2"
> > +#pragma comment(linker, "bar=" BAR)
> > +// CHECK: #pragma comment(linker, "bar=" "2")
> > +#pragma comment(user, "Compiled on " __DATE__ " at " __TIME__)
> > +// CHECK: #pragma comment(user, "Compiled on " "{{[^"]*}}" " at " "{{[^"]*}}")
> > +
> > +#define KEY1 "KEY1"
> > +#define KEY2 "KEY2"
> > +#define VAL1 "VAL1\""
> > +#define VAL2 "VAL2"
> > +
> > +#pragma detect_mismatch(KEY1 KEY2, VAL1 VAL2)
> > +// CHECK: #pragma detect_mismatch("KEY1" "KEY2", "VAL1\"" "VAL2")
> > +
> > +#define _CRT_PACKING 8
> > +#pragma pack(push, _CRT_PACKING)
> > +// CHECK: #pragma pack(push, 8)
> > +#pragma pack(pop)
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140220/f9ce38af/attachment.html>
More information about the cfe-commits
mailing list