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;
- 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 = tsubst (decl, args, complain, in_decl);
maybe_push_decl (decl);
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))
+ decl = tsubst_decomp_names (decl, RANGE_FOR_DECL (t), args,
+ complain, in_decl,
+ &decomp_first, &decomp_cnt);
+
+ if (processing_template_decl)
{
- unsigned int cnt;
- tree first;
- decl = tsubst_decomp_names (decl, RANGE_FOR_DECL (t), args,
- complain, in_decl, &first, &cnt);
- stmt = cp_convert_range_for (stmt, decl, expr, first, cnt,
- RANGE_FOR_IVDEP (t), unroll);
+ RANGE_FOR_IVDEP (stmt) = RANGE_FOR_IVDEP (t);
+ RANGE_FOR_UNROLL (stmt) = RANGE_FOR_UNROLL (t);
+ finish_range_for_decl (stmt, decl, expr);
}
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 ();
RECUR (RANGE_FOR_BODY (t));
note_iteration_stmt_body_end (prev);