mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-11-24 20:43:52 +08:00
2b0e81d5cc
This implements ABI-compliant lambda discriminators. Not only do we have per-scope counters, but we also distinguish by lambda signature. Only lambdas with the same signature will need non-zero discriminators. As the discriminator is signature-dependent, we have to process the lambda function's declaration before we can determine it. For templated and generic lambdas the signature is that of the uninstantiated lambda -- not separate for each instantiation. With this change, gcc and clang now produce the same lambda manglings for all these testcases. gcc/cp/ * cp-tree.h (LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR): New. (struct tree_lambda_expr): Add discriminator_sig bitfield. (recrd_lambda_scope_sig_discriminator): Declare. * lambda.cc (struct lambda_sig_count): New. (lambda_discriminator): Add signature vector. (start_lambda_scope): Adjust. (compare_lambda_template_head, compare_lambda_sig): New. (record_lambda_scope_sig_discriminator): New. * mangle.cc (write_closure_type): Use the scope-sig discriminator for ABI >= 18. Emit abi mangling warning if needed. * module.cc (trees_out::core_vals): Stream the new discriminator. (trees_in::core_vals): Likewise. * parser.cc (cp_parser_lambda_declarator_opt): Call record_lambda_scope_sig_discriminator. * pt.cc (tsubst_lambda_expr): Likewise. libcc1/ * libcp1plugin.cc (plugin_start_lambda_closure_class_type): Initialize the per-scope, per-signature discriminator. gcc/testsuite/ * g++.dg/abi/lambda-sig1-18.C: New. * g++.dg/abi/lambda-sig1-18vs17.C: New. * g++.dg/cpp1y/lambda-mangle-1-18.C: New. |
||
---|---|---|
.. | ||
aclocal.m4 | ||
callbacks.cc | ||
callbacks.hh | ||
cc1plugin-config.h.in | ||
ChangeLog | ||
compiler-name.hh | ||
compiler.cc | ||
compiler.hh | ||
configure | ||
configure.ac | ||
connection.cc | ||
connection.hh | ||
context.cc | ||
context.hh | ||
deleter.hh | ||
findcomp.cc | ||
findcomp.hh | ||
gdbctx.hh | ||
libcc1.cc | ||
libcc1.sym | ||
libcc1plugin.cc | ||
libcc1plugin.sym | ||
libcp1.cc | ||
libcp1plugin.cc | ||
libcp1plugin.sym | ||
Makefile.am | ||
Makefile.in | ||
marshall-cp.hh | ||
marshall.cc | ||
marshall.hh | ||
names.cc | ||
names.hh | ||
rpc.hh | ||
status.hh |