mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 12:00:11 -05:00
We currently use a per-extra-scope counter to discriminate multiple lambdas in a particular such scope. This is not ABI compliant. This patch merely refactors the existing code to make it easier to drop in a conformant mangling -- there's no functional change here. I rename the LAMBDA_EXPR_DISCIMINATOR to LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR, foreshadowing that there'll be a new discriminator. To provide ABI warnings we'll need to calculate both, and that requires some repacking of the lambda_expr's fields. Finally, although we end up calling the discriminator setter and the scope recorder (nearly) always consecutively, it's clearer to handle it as two separate operations. That also allows us to remove the instantiation special-case for a null extra-scope. gcc/cp/ * cp-tree.h (LAMBDA_EXPR_DISCRIMINATOR): Rename to ... (LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR): ... here. (struct tree_lambda_expr): Make default_capture_mode & discriminator_scope bitfields. (record_null_lambda_scope) Delete. (record_lambda_scope_discriminator): Declare. * lambda.cc (struct lambda_discriminator): New struct. (lambda_scope, lambda_scope_stack): Adjust types. (lambda_count): Delete. (struct tree_int): Delete. (start_lambda_scope, finish_lambda_scope): Adjust. (record_lambda_scope): Only record the scope. (record_lambda_scope_discriminator): New. * mangle.cc (write_closure_type_name): Adjust. * module.cc (trees_out::core_vals): Likewise, (trees_in::core_vals): Likewise. * parser.cc (cp_parser_lambda_expression): Call record_lambda_scope_discriminator. * pt.cc (tsubst_lambda_expr): Adjust record_lambda_scope caling. Call record_lambda_scope_discriminator. Commonize control flow on tsubsting the operator function. libcc1/ * libcp1plugin.cc (plugin_start_closure): Adjust. gcc/testsuite/ * g++.dg/abi/lambda-sig1-17.C: New. * g++.dg/abi/lambda-sig1.h: New. * g++.dg/cpp1y/lambda-mangle-1.C: Extracted to ... * g++.dg/cpp1y/lambda-mangle-1.h: ... here. * g++.dg/cpp1y/lambda-mangle-1-11.C: New * g++.dg/cpp1y/lambda-mangle-1-17.C
90 lines
2.3 KiB
C++
90 lines
2.3 KiB
C++
// { dg-do compile { target c++14 } }
|
|
|
|
// PRs 78621
|
|
|
|
// We erroneously mangled lambda auto parms as-if template parameters (T<n>_),
|
|
// rather than auto (Da). Fixed in abi version 11
|
|
|
|
template<typename T> class X;
|
|
|
|
template<typename T>
|
|
T &&forward (T &v)
|
|
{
|
|
return static_cast<T &&> (v);
|
|
}
|
|
|
|
template<typename T>
|
|
void eat (T &v)
|
|
{
|
|
}
|
|
|
|
template<typename S, typename T>
|
|
void eat (S &, T &v)
|
|
{
|
|
}
|
|
|
|
inline void Foo ()
|
|
{
|
|
auto lam = [](auto &) { };
|
|
auto lam_1 = [](int &, auto &) { };
|
|
auto lam_2 = [](auto &, X<int> &) { };
|
|
auto lam_3 = [](auto (*)[5]) { };
|
|
|
|
forward (lam);
|
|
forward (lam_1);
|
|
forward (lam_2);
|
|
forward (lam_3);
|
|
|
|
eat (lam);
|
|
eat (lam_1);
|
|
eat (lam_2);
|
|
eat (lam_3);
|
|
|
|
// The auto lambda should mangle similarly to the non-auto one
|
|
auto lambda_1 = [](float *, float *) { };
|
|
auto lambda_2 = [](auto *, auto *) { };
|
|
auto lambda_3 = [](auto *, auto *) { };
|
|
|
|
int *i;
|
|
|
|
eat (i, lambda_1);
|
|
eat (i, lambda_2);
|
|
|
|
// The autos should squangle to the first one.
|
|
eat (lambda_2, lambda_3);
|
|
}
|
|
|
|
template<typename X> void Bar ()
|
|
{
|
|
auto lambda_1 = [](X *, float *, float *) { };
|
|
auto lambda_2 = [](X *, auto *, auto *) { };
|
|
auto lambda_3 = [](X *, auto *...) {};
|
|
|
|
int *i;
|
|
|
|
eat (i, lambda_1);
|
|
eat (i, lambda_2);
|
|
eat (i, lambda_3);
|
|
}
|
|
|
|
void Baz ()
|
|
{
|
|
Bar<short> ();
|
|
Foo ();
|
|
}
|
|
|
|
// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_E_EOS0_S1_:" } }
|
|
// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRiRT_E0_EOS1_S2_:" } }
|
|
// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlRT_R1XIiEE1_EOS0_S1_:" } }
|
|
// { dg-final { scan-assembler "_Z7forwardIZ3FoovEUlPA5_T_E2_EOS0_RS0_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_E_EvS1_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRiRT_E0_EvS2_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlRT_R1XIiEE1_EvS1_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPA5_T_E2_EvRS0_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPfS1_E3_EvRT_RT0_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIPiZ3FoovEUlPT_PT0_E4_EvRS1_RS3_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIZ3FoovEUlPT_PT0_E4_Z3FoovEUlS1_S3_E5_EvRS0_RS2_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPfS3_E_EvRT_RT0_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_:" } }
|
|
// { dg-final { scan-assembler "_Z3eatIPiZ3BarIsEvvEUlPsDpPT_E1_EvRT_RT0_:" } }
|