111
|
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>
|
|
11 T &&forward (T &v)
|
|
12 {
|
|
13 return static_cast<T &&> (v);
|
|
14 }
|
|
15
|
|
16 template<typename T>
|
|
17 void eat (T &v)
|
|
18 {
|
|
19 }
|
|
20
|
|
21 template<typename S, typename T>
|
|
22 void eat (S &, T &v)
|
|
23 {
|
|
24 }
|
|
25
|
|
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
|
|
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
|
|
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_:" } }
|
131
|
88 // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsDpPT_E1_EvRT_RT0_:" } }
|