From 4579b76ff60fcb99c2699f7a9026a4fd18e460be Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 15 May 2009 16:08:43 +0000 Subject: [PATCH] Fix processing of -Ufoo to not inject "#undef foo 1" into the predefines buffer. This caused exciting nonsense like this: $ clang t.c -fsyntax-only -UMACRO In file included from :104: :1:14: warning: extra tokens at end of #undef directive [-Wextra-tokens] #undef MACRO 1 ^ // 1 diagnostic generated. rdar://6891800 llvm-svn: 71860 --- clang/lib/Frontend/InitPreprocessor.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index f9929d1558a6..102f385f7e05 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -51,6 +51,16 @@ static void DefineBuiltinMacro(std::vector &Buf, const char *Macro, Buf.push_back('\n'); } +// Append a #undef line to Buf for Macro. Macro should be of the form XXX +// and we emit "#undef XXX". +static void UndefineBuiltinMacro(std::vector &Buf, const char *Macro) { + // Push "macroname". + const char *Command = "#undef "; + Buf.insert(Buf.end(), Command, Command+strlen(Command)); + Buf.insert(Buf.end(), Macro, Macro+strlen(Macro)); + Buf.push_back('\n'); +} + /// Add the quoted name of an implicit include file. static void AddQuotedIncludePath(std::vector &Buf, const std::string &File) { @@ -441,7 +451,7 @@ bool InitializePreprocessor(Preprocessor &PP, for (PreprocessorInitOptions::macro_iterator I = InitOpts.macro_begin(), E = InitOpts.macro_end(); I != E; ++I) { if (I->second) // isUndef - DefineBuiltinMacro(PredefineBuffer, I->first.c_str(), "#undef "); + UndefineBuiltinMacro(PredefineBuffer, I->first.c_str()); else DefineBuiltinMacro(PredefineBuffer, I->first.c_str()); }