Commit f0fbe57d by Nathan Sidwell Committed by Nathan Sidwell

[C++/83739] bogus error tsubsting range for in generic lambda

https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01554.html
	PR c++/83739
	* pt.c (tsubst_expr) <case RANGE_FOR_STMT>: Rebuild a range_for if
	this not a final instantiation.

	PR c++/83739
	* g++.dg/cpp1y/pr83739.C: New.

From-SVN: r256795
parent c6d6367f
2018-01-17 Nathan Sidwell <nathan@acm.org>
PR c++/83739
* pt.c (tsubst_expr) <case RANGE_FOR_STMT>: Rebuild a range_for if
this not a final instantiation.
2018-01-16 Jason Merrill <jason@redhat.com> 2018-01-16 Jason Merrill <jason@redhat.com>
PR c++/83714 - ICE checking return in template. PR c++/83714 - ICE checking return in template.
......
...@@ -16153,26 +16153,40 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, ...@@ -16153,26 +16153,40 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
case RANGE_FOR_STMT: case RANGE_FOR_STMT:
{ {
/* Construct another range_for, if this is not a final
substitution (for inside inside a generic lambda of a
template). Otherwise convert to a regular for. */
tree decl, expr; tree decl, expr;
stmt = begin_for_stmt (NULL_TREE, NULL_TREE); stmt = (processing_template_decl
? begin_range_for_stmt (NULL_TREE, NULL_TREE)
: begin_for_stmt (NULL_TREE, NULL_TREE));
decl = RANGE_FOR_DECL (t); decl = RANGE_FOR_DECL (t);
decl = tsubst (decl, args, complain, in_decl); decl = tsubst (decl, args, complain, in_decl);
maybe_push_decl (decl); maybe_push_decl (decl);
expr = RECUR (RANGE_FOR_EXPR (t)); expr = RECUR (RANGE_FOR_EXPR (t));
const unsigned short unroll
= RANGE_FOR_UNROLL (t) ? tree_to_uhwi (RANGE_FOR_UNROLL (t)) : 0; tree decomp_first = NULL_TREE;
unsigned decomp_cnt = 0;
if (VAR_P (decl) && DECL_DECOMPOSITION_P (decl)) if (VAR_P (decl) && DECL_DECOMPOSITION_P (decl))
decl = tsubst_decomp_names (decl, RANGE_FOR_DECL (t), args,
complain, in_decl,
&decomp_first, &decomp_cnt);
if (processing_template_decl)
{ {
unsigned int cnt; RANGE_FOR_IVDEP (stmt) = RANGE_FOR_IVDEP (t);
tree first; RANGE_FOR_UNROLL (stmt) = RANGE_FOR_UNROLL (t);
decl = tsubst_decomp_names (decl, RANGE_FOR_DECL (t), args, finish_range_for_decl (stmt, decl, expr);
complain, in_decl, &first, &cnt);
stmt = cp_convert_range_for (stmt, decl, expr, first, cnt,
RANGE_FOR_IVDEP (t), unroll);
} }
else else
stmt = cp_convert_range_for (stmt, decl, expr, NULL_TREE, 0, {
RANGE_FOR_IVDEP (t), unroll); unsigned short unroll = (RANGE_FOR_UNROLL (t)
? tree_to_uhwi (RANGE_FOR_UNROLL (t)) : 0);
stmt = cp_convert_range_for (stmt, decl, expr,
decomp_first, decomp_cnt,
RANGE_FOR_IVDEP (t), unroll);
}
bool prev = note_iteration_stmt_body_start (); bool prev = note_iteration_stmt_body_start ();
RECUR (RANGE_FOR_BODY (t)); RECUR (RANGE_FOR_BODY (t));
note_iteration_stmt_body_end (prev); note_iteration_stmt_body_end (prev);
......
2018-01-17 Nathan Sidwell <nathan@acm.org>
PR c++/83739
* g++.dg/cpp1y/pr83739.C: New.
2018-01-17 Eric Botcazou <ebotcazou@adacore.com> 2018-01-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc.target/visium/overflow8.c: Pass -fno-if-conversion. * gcc.target/visium/overflow8.c: Pass -fno-if-conversion.
......
// { dg-do compile { target c++14 } }
// PR 83739, deduced range-for in lambda in template
template <bool> void f()
{
int x[2];
auto delegate = [](auto & foo)
{
for (auto bar : foo);
};
delegate(x);
}
int main() {
f<true>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment