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 <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
