From: Chris Lattner Date: Fri, 15 May 2009 16:08:43 +0000 (+0000) Subject: Fix processing of -Ufoo to not inject "#undef foo 1" into the predefines X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dcdecf4a777e503b24de6b15a054d580b585c06c;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71860 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index f9929d1558..102f385f7e 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/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()); }