Skip to content

Commit b6360fb

Browse files
committed
qualify_consts: extract check_short_circuiting_in_const_local.
1 parent 8f184b3 commit b6360fb

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

src/librustc_mir/transform/qualify_consts.rs

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,37 +1655,8 @@ impl<'tcx> MirPass<'tcx> for QualifyAndPromoteConstants<'tcx> {
16551655
_ => None,
16561656
};
16571657

1658-
if !body.control_flow_destroyed.is_empty() {
1659-
let mut locals = body.vars_iter();
1660-
if let Some(local) = locals.next() {
1661-
let span = body.local_decls[local].source_info.span;
1662-
let mut error = tcx.sess.struct_span_err(
1663-
span,
1664-
&format!(
1665-
"new features like let bindings are not permitted in {}s \
1666-
which also use short circuiting operators",
1667-
mode,
1668-
),
1669-
);
1670-
for (span, kind) in body.control_flow_destroyed.iter() {
1671-
error.span_note(
1672-
*span,
1673-
&format!("use of {} here does not actually short circuit due to \
1674-
the const evaluator presently not being able to do control flow. \
1675-
See https://github.com/rust-lang/rust/issues/49146 for more \
1676-
information.", kind),
1677-
);
1678-
}
1679-
for local in locals {
1680-
let span = body.local_decls[local].source_info.span;
1681-
error.span_note(
1682-
span,
1683-
"more locals defined here",
1684-
);
1685-
}
1686-
error.emit();
1687-
}
1688-
}
1658+
check_short_circuiting_in_const_local(tcx, body, mode);
1659+
16891660
let promoted_temps = match mode {
16901661
// Already computed by `mir_const_qualif`.
16911662
Mode::Const => const_promoted_temps.unwrap(),
@@ -1762,6 +1733,39 @@ fn determine_mode(tcx: TyCtxt<'_>, hir_id: HirId, def_id: DefId) -> Mode {
17621733
}
17631734
}
17641735

1736+
fn check_short_circuiting_in_const_local(tcx: TyCtxt<'_>, body: &mut Body<'tcx>, mode: Mode) {
1737+
if body.control_flow_destroyed.is_empty() {
1738+
return;
1739+
}
1740+
1741+
let mut locals = body.vars_iter();
1742+
if let Some(local) = locals.next() {
1743+
let span = body.local_decls[local].source_info.span;
1744+
let mut error = tcx.sess.struct_span_err(
1745+
span,
1746+
&format!(
1747+
"new features like let bindings are not permitted in {}s \
1748+
which also use short circuiting operators",
1749+
mode,
1750+
),
1751+
);
1752+
for (span, kind) in body.control_flow_destroyed.iter() {
1753+
error.span_note(
1754+
*span,
1755+
&format!("use of {} here does not actually short circuit due to \
1756+
the const evaluator presently not being able to do control flow. \
1757+
See https://github.com/rust-lang/rust/issues/49146 for more \
1758+
information.", kind),
1759+
);
1760+
}
1761+
for local in locals {
1762+
let span = body.local_decls[local].source_info.span;
1763+
error.span_note(span, "more locals defined here");
1764+
}
1765+
error.emit();
1766+
}
1767+
}
1768+
17651769
fn args_required_const(tcx: TyCtxt<'_>, def_id: DefId) -> Option<FxHashSet<usize>> {
17661770
let attrs = tcx.get_attrs(def_id);
17671771
let attr = attrs.iter().find(|a| a.check_name(sym::rustc_args_required_const))?;

0 commit comments

Comments
 (0)