From c7f576fc91cdc802bc97fae56bfed38867b11ff0 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 23 Oct 2016 04:53:03 +0000 Subject: [PATCH] Fix mangling numbers for varargs lambdas; varargs and non-varargs lambdas get different lambda-sigs, so they should have different counters. llvm-svn: 284933 --- clang/lib/AST/ItaniumCXXABI.cpp | 5 +++-- clang/test/CodeGenCXX/mangle-lambdas.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ItaniumCXXABI.cpp b/clang/lib/AST/ItaniumCXXABI.cpp index 482c3c5..091d5f0 100644 --- a/clang/lib/AST/ItaniumCXXABI.cpp +++ b/clang/lib/AST/ItaniumCXXABI.cpp @@ -63,9 +63,10 @@ public: CallOperator->getType()->getAs(); ASTContext &Context = CallOperator->getASTContext(); + FunctionProtoType::ExtProtoInfo EPI; + EPI.Variadic = Proto->isVariadic(); QualType Key = - Context.getFunctionType(Context.VoidTy, Proto->getParamTypes(), - FunctionProtoType::ExtProtoInfo()); + Context.getFunctionType(Context.VoidTy, Proto->getParamTypes(), EPI); Key = Context.getCanonicalType(Key); return ++ManglingNumbers[Key->castAs()]; } diff --git a/clang/test/CodeGenCXX/mangle-lambdas.cpp b/clang/test/CodeGenCXX/mangle-lambdas.cpp index 051cfdc..15987eb 100644 --- a/clang/test/CodeGenCXX/mangle-lambdas.cpp +++ b/clang/test/CodeGenCXX/mangle-lambdas.cpp @@ -173,6 +173,16 @@ namespace PR12123 { // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %"struct.PR12123::A"* @_ZZN7PR121231B1fERKSt9type_infoEd_NKUlvE_clEv +// CHECK-LABEL: define {{.*}} @_Z{{[0-9]*}}testVarargsLambdaNumberingv( +inline int testVarargsLambdaNumbering() { + // CHECK: testVarargsLambdaNumberingvE{{.*}}UlzE_ + auto a = [](...) { static int n; return ++n; }; + // CHECK: testVarargsLambdaNumberingvE{{.*}}UlvE_ + auto b = []() { static int n; return ++n; }; + return a() + b(); +} +int k = testVarargsLambdaNumbering(); + // Check linkage of the various lambdas. // CHECK-LABEL: define linkonce_odr i32 @_ZZ11inline_funciENKUlvE_clEv // CHECK: ret i32 1 -- 2.7.4