diff options
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/debug-info-variadic-method.m | 16 |
2 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index db545c64306..d621755fba6 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2429,6 +2429,9 @@ llvm::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D, // Get rest of the arguments. for (const auto *PI : OMethod->params()) Elts.push_back(getOrCreateType(PI->getType(), F)); + // Variadic methods need a special marker at the end of the type list. + if (OMethod->isVariadic()) + Elts.push_back(DBuilder.createUnspecifiedParameter()); llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts); return DBuilder.createSubroutineType(F, EltTypeArray); diff --git a/clang/test/CodeGenObjC/debug-info-variadic-method.m b/clang/test/CodeGenObjC/debug-info-variadic-method.m new file mode 100644 index 00000000000..8d49ce2b98e --- /dev/null +++ b/clang/test/CodeGenObjC/debug-info-variadic-method.m @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -o - -emit-llvm -g %s | FileCheck %s + +// This test verifies that variadic ObjC methods get the +// DW_TAG_unspecified_parameter marker. + +@interface Foo +- (void) Bar: (int) n, ...; +@end + +@implementation Foo +- (void) Bar: (int) n, ... +{ + // CHECK: metadata ![[NUM:[^,]*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] + // CHECK: ![[NUM]] = {{metadata !{null, metadata ![^,]*, metadata ![^,]*, metadata ![^,]*, null}}} +} +@end |

