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  inline 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    Foo ();
      74  }
      75  
      76  // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_E_EOS0_S1_:" } }
      77  // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRiRT_E0_EOS1_S2_:" } }
      78  // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_R1XIiEE1_EOS0_S1_:" } }
      79  // { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlPA5_T_E2_EOS0_RS0_:" } }
      80  // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_E_EvS1_:" } }
      81  // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRiRT_E0_EvS2_:" } }
      82  // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_R1XIiEE1_EvS1_:" } }
      83  // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPA5_T_E2_EvRS0_:" } }
      84  // { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPfS1_E3_EvRT_RT0_:" } }
      85  // { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPT_PT0_E4_EvRS1_RS3_:" } }
      86  // { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } }
      87  // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } }
      88  // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } }
      89  // { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsDpPT_E1_EvRT_RT0_:" } }