diff options
Diffstat (limited to 'lib/Frontend/PrintPreprocessedOutput.cpp')
-rw-r--r-- | lib/Frontend/PrintPreprocessedOutput.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/Frontend/PrintPreprocessedOutput.cpp b/lib/Frontend/PrintPreprocessedOutput.cpp index e0186abeb4..c23c6e3b9a 100644 --- a/lib/Frontend/PrintPreprocessedOutput.cpp +++ b/lib/Frontend/PrintPreprocessedOutput.cpp @@ -28,6 +28,13 @@ #include <cstdio> using namespace clang; +static void PrintArgName(const IdentifierInfo *II, llvm::raw_ostream &OS) { + if (II->getName() == "__VA_ARGS__") + OS << "..."; + else + OS << II->getName(); +} + /// PrintMacroDefinition - Print a macro definition in a form that will be /// properly accepted back as a definition. static void PrintMacroDefinition(const IdentifierInfo &II, const MacroInfo &MI, @@ -39,19 +46,19 @@ static void PrintMacroDefinition(const IdentifierInfo &II, const MacroInfo &MI, if (MI.arg_empty()) ; else if (MI.getNumArgs() == 1) - OS << (*MI.arg_begin())->getName(); + PrintArgName(*MI.arg_begin(), OS); else { MacroInfo::arg_iterator AI = MI.arg_begin(), E = MI.arg_end(); OS << (*AI++)->getName(); - while (AI != E) - OS << ',' << (*AI++)->getName(); - } - - if (MI.isVariadic()) { - if (!MI.arg_empty()) + while (AI != E) { OS << ','; - OS << "..."; + PrintArgName(*AI++, OS); + } } + + if (MI.isGNUVarargs()) + OS << "..."; // #define foo(x...) + OS << ')'; } |