1 // { dg-do compile { target c++14 } }
2 
3 // PRs 78621
4 
5 // We erroneously mangled lambda auto parms as-if template parameters (T<n>_),
6 // rather than auto (Da). Fixed in abi version 11
7 
8 template<typename T> class X;
9 
10 template<typename T>
forward(T & v)11 T &&forward (T &v)
12 {
13   return static_cast<T &&> (v);
14 }
15 
16 template<typename T>
eat(T & v)17 void eat (T &v)
18 {
19 }
20 
21 template<typename S, typename T>
eat(S &,T & v)22   void eat (S &, T &v)
23 {
24 }
25 
Foo()26 void Foo ()
27 {
28   auto lam = [](auto &) { };
29   auto lam_1 = [](int &, auto &) { };
30   auto lam_2 = [](auto &, X<int> &) { };
31   auto lam_3 = [](auto (*)[5]) { };
32 
33   forward (lam);
34   forward (lam_1);
35   forward (lam_2);
36   forward (lam_3);
37 
38   eat (lam);
39   eat (lam_1);
40   eat (lam_2);
41   eat (lam_3);
42 
43   // The auto lambda should mangle similarly to the non-auto one
44   auto lambda_1 = [](float *, float *) { };
45   auto lambda_2 = [](auto *, auto *) { };
46   auto lambda_3 = [](auto *, auto *) { };
47 
48   int *i;
49 
50   eat (i, lambda_1);
51   eat (i, lambda_2);
52 
53   // The autos should squangle to the first one.
54   eat (lambda_2, lambda_3);
55 }
56 
Bar()57 template<typename X> void Bar ()
58 {
59   auto lambda_1 = [](X *, float *, float *) { };
60   auto lambda_2 = [](X *, auto *, auto *) { };
61   auto lambda_3 = [](X *, auto *...) {};
62 
63   int *i;
64 
65   eat (i, lambda_1);
66   eat (i, lambda_2);
67   eat (i, lambda_3);
68 }
69 
Baz()70 void Baz ()
71 {
72   Bar<short> ();
73 }
74 
75 // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_E_EOS0_S1_:" } }
76 // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRiRT_E0_EOS1_S2_:" } }
77 // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_R1XIiEE1_EOS0_S1_:" } }
78 // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlPA5_T_E2_EOS0_RS0_:" } }
79 // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_E_EvS1_:" } }
80 // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRiRT_E0_EvS2_:" } }
81 // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_R1XIiEE1_EvS1_:" } }
82 // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPA5_T_E2_EvRS0_:" } }
83 // { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPfS1_E3_EvRT_RT0_:" } }
84 // { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPT_PT0_E4_EvRS1_RS3_:" } }
85 // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } }
86 // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } }
87 // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } }
88 // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsDpPT_E1_EvRT_RT0_:" } }
89