r201821 - Expand macros in pragmas with -fms-extensions and -E
Adrian Prantl
aprantl at apple.com
Thu Feb 20 16:55:28 PST 2014
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
More information about the cfe-commits
mailing list