diff options
author | Jason Merrill <jason@redhat.com> | 2022-07-25 11:13:31 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-07-25 23:12:08 -0400 |
commit | 60954a06ceb1598d86763e5504d8e1b874b6bd6a (patch) | |
tree | 053a0cf76a45cef7fad5d07a62b52fbeab8cec9d | |
parent | 3387ec265151e6635e4b382c6023e898eb8bb08b (diff) |
c++: aggregate prvalue as for range [PR106230]
Since my PR94041 work on temporary lifetime in aggregate initialization, we
end up calling build_vec_init to initialize the reference-extended temporary
for the artificial __for_range variable. And build_vec_init uses
finish_for_stmt to implement its loop. That function assumes that if
__for_range is in current_binding_level, we're finishing a range-for, and we
should fix up the variable as it goes out of scope. But when called from
build_vec_init we aren't finishing a range-for, and do_poplevel doesn't
remove the variable from scope because stmts_are_full_exprs_p is false. So
let's check that here as well, and leave the DECL_NAME alone.
PR c++/106230
gcc/cp/ChangeLog:
* semantics.cc (finish_for_stmt): Check stmts_are_full_exprs_p.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/range-for38.C: New test.
-rw-r--r-- | gcc/cp/semantics.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/range-for38.C | 16 |
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index ab48f11c9be..972a1966f69 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -1398,6 +1398,11 @@ finish_for_stmt (tree for_stmt) add_stmt (do_poplevel (scope)); + /* If we're being called from build_vec_init, don't mess with the names of + the variables for an enclosing range-for. */ + if (!stmts_are_full_exprs_p ()) + return; + for (int i = 0; i < 3; i++) if (range_for_decl[i]) DECL_NAME (range_for_decl[i]) diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for38.C b/gcc/testsuite/g++.dg/cpp0x/range-for38.C new file mode 100644 index 00000000000..39845b937c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for38.C @@ -0,0 +1,16 @@ +// PR c++/106230 +// { dg-do compile { target c++11 } } + +struct A { + A(); + operator int(); +}; +template <int N> struct array { + A elts[N]; + A *begin(); + A *end(); +}; +void fn() { + for (int i : array<4>{}) + ; +} |