-
- Downloads
c++: Fix mangling of lambdas in static data member initializers [PR107741]
This fixes an issue where lambdas declared in the initializer of a
static data member within the class body do not get a mangling scope of
that variable; this results in mangled names that do not conform to the
ABI spec.
To do this, the patch splits up grokfield for this case specifically,
allowing a declaration to be build and used in start_lambda_scope before
parsing the initializer, so that record_lambda_scope works correctly.
As a drive-by, this also fixes the issue of a static member not being
visible within its own initializer.
PR c++/107741
gcc/c-family/ChangeLog:
* c-opts.cc (c_common_post_options): Bump ABI version.
gcc/ChangeLog:
* common.opt: Add -fabi-version=20.
* doc/invoke.texi: Likewise.
gcc/cp/ChangeLog:
* cp-tree.h (start_initialized_static_member): Declare.
(finish_initialized_static_member): Declare.
* decl2.cc (start_initialized_static_member): New function.
(finish_initialized_static_member): New function.
* lambda.cc (record_lambda_scope): Support falling back to old
ABI (maybe with warning).
* parser.cc (cp_parser_member_declaration): Build decl early
when parsing an initialized static data member.
gcc/testsuite/ChangeLog:
* g++.dg/abi/macro0.C: Bump ABI version.
* g++.dg/abi/mangle74.C: Remove XFAILs.
* g++.dg/other/fold1.C: Restore originally raised error.
* g++.dg/abi/lambda-ctx2-19.C: New test.
* g++.dg/abi/lambda-ctx2-19vs20.C: New test.
* g++.dg/abi/lambda-ctx2-20.C: New test.
* g++.dg/abi/lambda-ctx2.h: New test.
* g++.dg/cpp0x/static-member-init-1.C: New test.
Signed-off-by:
Nathaniel Shead <nathanieloshead@gmail.com>
Showing
- gcc/c-family/c-opts.cc 1 addition, 1 deletiongcc/c-family/c-opts.cc
- gcc/common.opt 4 additions, 1 deletiongcc/common.opt
- gcc/cp/cp-tree.h 3 additions, 0 deletionsgcc/cp/cp-tree.h
- gcc/cp/decl2.cc 77 additions, 0 deletionsgcc/cp/decl2.cc
- gcc/cp/lambda.cc 28 additions, 5 deletionsgcc/cp/lambda.cc
- gcc/cp/parser.cc 50 additions, 24 deletionsgcc/cp/parser.cc
- gcc/doc/invoke.texi 3 additions, 0 deletionsgcc/doc/invoke.texi
- gcc/testsuite/g++.dg/abi/lambda-ctx2-19.C 10 additions, 0 deletionsgcc/testsuite/g++.dg/abi/lambda-ctx2-19.C
- gcc/testsuite/g++.dg/abi/lambda-ctx2-19vs20.C 8 additions, 0 deletionsgcc/testsuite/g++.dg/abi/lambda-ctx2-19vs20.C
- gcc/testsuite/g++.dg/abi/lambda-ctx2-20.C 10 additions, 0 deletionsgcc/testsuite/g++.dg/abi/lambda-ctx2-20.C
- gcc/testsuite/g++.dg/abi/lambda-ctx2.h 27 additions, 0 deletionsgcc/testsuite/g++.dg/abi/lambda-ctx2.h
- gcc/testsuite/g++.dg/abi/macro0.C 1 addition, 1 deletiongcc/testsuite/g++.dg/abi/macro0.C
- gcc/testsuite/g++.dg/abi/mangle74.C 2 additions, 2 deletionsgcc/testsuite/g++.dg/abi/mangle74.C
- gcc/testsuite/g++.dg/cpp0x/static-member-init-1.C 5 additions, 0 deletionsgcc/testsuite/g++.dg/cpp0x/static-member-init-1.C
- gcc/testsuite/g++.dg/other/fold1.C 1 addition, 1 deletiongcc/testsuite/g++.dg/other/fold1.C
Loading
Please register or sign in to comment