diff options
author | Chris Lattner <sabre@nondot.org> | 2009-12-07 01:58:34 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-12-07 01:58:34 +0000 |
commit | 807b93ee6ae2806b53131abc779d2b146d853aed (patch) | |
tree | ea2183273ef8583792fed914205a5a6c67adf1c4 | |
parent | 5146b1b69feac638ab14ce82037931eb3b23391b (diff) |
fix -dM with variadic macros, PR5699
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90735 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Frontend/PrintPreprocessedOutput.cpp | 23 | ||||
-rw-r--r-- | test/Preprocessor/dump_macros.c | 9 |
2 files changed, 24 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 << ')'; } diff --git a/test/Preprocessor/dump_macros.c b/test/Preprocessor/dump_macros.c index 29b1d29394..b4d2906127 100644 --- a/test/Preprocessor/dump_macros.c +++ b/test/Preprocessor/dump_macros.c @@ -27,3 +27,12 @@ #define G 1 #undef G #define G 2 + +// Variadic macros of various sorts. PR5699 + +// CHECK: H(x,...) __VA_ARGS__ +#define H(x, ...) __VA_ARGS__ +// CHECK: I(...) __VA_ARGS__ +#define I(...) __VA_ARGS__ +// CHECK: J(x...) __VA_ARGS__ +#define J(x ...) __VA_ARGS__ |