diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-23 04:53:03 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-23 04:53:03 +0000 |
| commit | c7f576fc91cdc802bc97fae56bfed38867b11ff0 (patch) | |
| tree | 415012c08feecd57f978a99ce402a2dae00f1180 /clang | |
| parent | 249237cb2e9668bfc64a1bc7b5d4d25eac1190d5 (diff) | |
| download | bcm5719-llvm-c7f576fc91cdc802bc97fae56bfed38867b11ff0.tar.gz bcm5719-llvm-c7f576fc91cdc802bc97fae56bfed38867b11ff0.zip | |
Fix mangling numbers for varargs lambdas; varargs and non-varargs lambdas get
different lambda-sigs, so they should have different counters.
llvm-svn: 284933
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/ItaniumCXXABI.cpp | 5 | ||||
| -rw-r--r-- | 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 482c3c5d338..091d5f031f8 100644 --- a/clang/lib/AST/ItaniumCXXABI.cpp +++ b/clang/lib/AST/ItaniumCXXABI.cpp @@ -63,9 +63,10 @@ public: CallOperator->getType()->getAs<FunctionProtoType>(); 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<FunctionProtoType>()]; } diff --git a/clang/test/CodeGenCXX/mangle-lambdas.cpp b/clang/test/CodeGenCXX/mangle-lambdas.cpp index 051cfdc3a22..15987ebe46b 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 |

