aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.cc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2025-01-27 16:45:56 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2025-01-27 16:45:56 +0100
commitad8e6a4ada0a7ed73ac99404ff2b41ed9dc5e940 (patch)
tree17c9791ff5a17e8dd151ec56e45092388e54eae6 /gcc/fortran/frontend-passes.cc
parent6a510dea7f3b047d0650a48e558a4911973930eb (diff)
downloadgcc-ad8e6a4ada0a7ed73ac99404ff2b41ed9dc5e940.zip
gcc-ad8e6a4ada0a7ed73ac99404ff2b41ed9dc5e940.tar.gz
gcc-ad8e6a4ada0a7ed73ac99404ff2b41ed9dc5e940.tar.bz2
c++: Implement for namespace statics CWG 2867 - Order of initialization for structured bindings [PR115769]
The following patch adds CWG 2867 support for namespace locals. Those vars are just pushed into {static,tls}_aggregates chain, then pruned from those lists, separated by priority and finally emitted into the corresponding dynamic initialization functions. The patch adds two flags used on the TREE_LIST nodes in those lists, one marks the structured binding base variable and/or associated ref extended temps, another marks the vars initialized using get methods. The flags are preserved across the pruning, for splitting into by priority all associated decls of a structured binding using tuple* are forced into the same priority as the first one, and finally when actually emitting code, CLEANUP_POINT_EXPRs are disabled in the base initializer(s) and code from the bases and non-bases together is wrapped into a single CLEANUP_POINT_EXPR. 2025-01-27 Jakub Jelinek <jakub@redhat.com> PR c++/115769 gcc/cp/ * cp-tree.h (STATIC_INIT_DECOMP_BASE_P): Define. (STATIC_INIT_DECOMP_NONBASE_P): Define. * decl.cc (cp_finish_decl): Mark nodes in {static,tls}_aggregates emitted for namespace scope structured bindings with STATIC_INIT_DECOMP_{,NON}BASE_P flags when needed. * decl2.cc (decomp_handle_one_var, decomp_finalize_var_list): New functions. (emit_partial_init_fini_fn): Use them. (prune_vars_needing_no_initialization): Assert STATIC_INIT_DECOMP_*BASE_P is not set on DECL_EXTERNAL vars to be pruned out. (partition_vars_for_init_fini): Use same priority for consecutive STATIC_INIT_DECOMP_*BASE_P vars and propagate those flags to new TREE_LISTs when possible. Formatting fix. (handle_tls_init): Use decomp_handle_one_var and decomp_finalize_var_list functions. gcc/testsuite/ * g++.dg/DRs/dr2867-5.C: New test. * g++.dg/DRs/dr2867-6.C: New test. * g++.dg/DRs/dr2867-7.C: New test. * g++.dg/DRs/dr2867-8.C: New test.
Diffstat (limited to 'gcc/fortran/frontend-passes.cc')
0 files changed, 0 insertions, 0 deletions