Merge pull request #4075 from rust-lang/rustup-2024-12-06
Automatic Rustup
This commit is contained in:
commit
981f43271b
306 changed files with 4847 additions and 3712 deletions
6
.gitattributes
vendored
6
.gitattributes
vendored
|
|
@ -4,8 +4,10 @@
|
|||
*.cpp rust
|
||||
*.h rust
|
||||
*.rs rust diff=rust
|
||||
*.fixed linguist-language=Rust
|
||||
*.mir linguist-language=Rust
|
||||
*.fixed linguist-language=Rust -merge
|
||||
*.mir linguist-language=Rust -merge
|
||||
*.stderr -merge
|
||||
*.stdout -merge
|
||||
src/etc/installer/gfx/* binary
|
||||
src/vendor/** -text
|
||||
Cargo.lock linguist-generated=false
|
||||
|
|
|
|||
2
.gitmodules
vendored
2
.gitmodules
vendored
|
|
@ -33,7 +33,7 @@
|
|||
[submodule "src/llvm-project"]
|
||||
path = src/llvm-project
|
||||
url = https://github.com/rust-lang/llvm-project.git
|
||||
branch = rustc/19.1-2024-09-17
|
||||
branch = rustc/19.1-2024-12-03
|
||||
shallow = true
|
||||
[submodule "src/doc/embedded-book"]
|
||||
path = src/doc/embedded-book
|
||||
|
|
|
|||
|
|
@ -2566,6 +2566,18 @@ pub enum SelfKind {
|
|||
Explicit(P<Ty>, Mutability),
|
||||
}
|
||||
|
||||
impl SelfKind {
|
||||
pub fn to_ref_suggestion(&self) -> String {
|
||||
match self {
|
||||
SelfKind::Region(None, mutbl) => mutbl.ref_prefix_str().to_string(),
|
||||
SelfKind::Region(Some(lt), mutbl) => format!("&{lt} {}", mutbl.prefix_str()),
|
||||
SelfKind::Value(_) | SelfKind::Explicit(_, _) => {
|
||||
unreachable!("if we had an explicit self, we wouldn't be here")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub type ExplicitSelf = Spanned<SelfKind>;
|
||||
|
||||
impl Param {
|
||||
|
|
|
|||
|
|
@ -1625,9 +1625,10 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
|
|||
visit_thin_exprs(vis, call_args);
|
||||
vis.visit_span(span);
|
||||
}
|
||||
ExprKind::Binary(_binop, lhs, rhs) => {
|
||||
ExprKind::Binary(binop, lhs, rhs) => {
|
||||
vis.visit_expr(lhs);
|
||||
vis.visit_expr(rhs);
|
||||
vis.visit_span(&mut binop.span);
|
||||
}
|
||||
ExprKind::Unary(_unop, ohs) => vis.visit_expr(ohs),
|
||||
ExprKind::Cast(expr, ty) => {
|
||||
|
|
@ -1785,20 +1786,21 @@ pub fn noop_filter_map_expr<T: MutVisitor>(vis: &mut T, mut e: P<Expr>) -> Optio
|
|||
|
||||
pub fn walk_flat_map_stmt<T: MutVisitor>(
|
||||
vis: &mut T,
|
||||
Stmt { kind, mut span, mut id }: Stmt,
|
||||
Stmt { kind, span, mut id }: Stmt,
|
||||
) -> SmallVec<[Stmt; 1]> {
|
||||
vis.visit_id(&mut id);
|
||||
let stmts: SmallVec<_> = walk_flat_map_stmt_kind(vis, kind)
|
||||
let mut stmts: SmallVec<[Stmt; 1]> = walk_flat_map_stmt_kind(vis, kind)
|
||||
.into_iter()
|
||||
.map(|kind| Stmt { id, kind, span })
|
||||
.collect();
|
||||
if stmts.len() > 1 {
|
||||
panic!(
|
||||
match stmts.len() {
|
||||
0 => {}
|
||||
1 => vis.visit_span(&mut stmts[0].span),
|
||||
2.. => panic!(
|
||||
"cloning statement `NodeId`s is prohibited by default, \
|
||||
the visitor should implement custom statement visiting"
|
||||
);
|
||||
),
|
||||
}
|
||||
vis.visit_span(&mut span);
|
||||
stmts
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -207,8 +207,6 @@ ast_passes_precise_capturing_duplicated = duplicate `use<...>` precise capturing
|
|||
|
||||
ast_passes_precise_capturing_not_allowed_here = `use<...>` precise capturing syntax not allowed in {$loc}
|
||||
|
||||
ast_passes_show_span = {$msg}
|
||||
|
||||
ast_passes_stability_outside_std = stability attributes may not be used outside of the standard library
|
||||
|
||||
ast_passes_static_without_body =
|
||||
|
|
|
|||
|
|
@ -779,14 +779,6 @@ pub(crate) struct IncompatibleFeatures {
|
|||
pub f2: Symbol,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(ast_passes_show_span)]
|
||||
pub(crate) struct ShowSpan {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub msg: &'static str,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(ast_passes_negative_bound_not_supported)]
|
||||
pub(crate) struct NegativeBoundUnsupported {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
//! The `rustc_ast_passes` crate contains passes which validate the AST in `syntax`
|
||||
//! parsed by `rustc_parse` and then lowered, after the passes in this crate,
|
||||
//! by `rustc_ast_lowering`.
|
||||
//!
|
||||
//! The crate also contains other misc AST visitors, e.g. `node_count` and `show_span`.
|
||||
|
||||
// tidy-alphabetical-start
|
||||
#![allow(internal_features)]
|
||||
|
|
@ -18,6 +16,5 @@
|
|||
pub mod ast_validation;
|
||||
mod errors;
|
||||
pub mod feature_gate;
|
||||
pub mod show_span;
|
||||
|
||||
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
||||
|
|
|
|||
|
|
@ -1,68 +0,0 @@
|
|||
//! Span debugger
|
||||
//!
|
||||
//! This module shows spans for all expressions in the crate
|
||||
//! to help with compiler debugging.
|
||||
|
||||
use std::str::FromStr;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::visit;
|
||||
use rustc_ast::visit::Visitor;
|
||||
use rustc_errors::DiagCtxtHandle;
|
||||
|
||||
use crate::errors;
|
||||
|
||||
enum Mode {
|
||||
Expression,
|
||||
Pattern,
|
||||
Type,
|
||||
}
|
||||
|
||||
impl FromStr for Mode {
|
||||
type Err = ();
|
||||
fn from_str(s: &str) -> Result<Mode, ()> {
|
||||
let mode = match s {
|
||||
"expr" => Mode::Expression,
|
||||
"pat" => Mode::Pattern,
|
||||
"ty" => Mode::Type,
|
||||
_ => return Err(()),
|
||||
};
|
||||
Ok(mode)
|
||||
}
|
||||
}
|
||||
|
||||
struct ShowSpanVisitor<'a> {
|
||||
dcx: DiagCtxtHandle<'a>,
|
||||
mode: Mode,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> for ShowSpanVisitor<'a> {
|
||||
fn visit_expr(&mut self, e: &'a ast::Expr) {
|
||||
if let Mode::Expression = self.mode {
|
||||
self.dcx.emit_warn(errors::ShowSpan { span: e.span, msg: "expression" });
|
||||
}
|
||||
visit::walk_expr(self, e);
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, p: &'a ast::Pat) {
|
||||
if let Mode::Pattern = self.mode {
|
||||
self.dcx.emit_warn(errors::ShowSpan { span: p.span, msg: "pattern" });
|
||||
}
|
||||
visit::walk_pat(self, p);
|
||||
}
|
||||
|
||||
fn visit_ty(&mut self, t: &'a ast::Ty) {
|
||||
if let Mode::Type = self.mode {
|
||||
self.dcx.emit_warn(errors::ShowSpan { span: t.span, msg: "type" });
|
||||
}
|
||||
visit::walk_ty(self, t);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(dcx: DiagCtxtHandle<'_>, mode: &str, krate: &ast::Crate) {
|
||||
let Ok(mode) = mode.parse() else {
|
||||
return;
|
||||
};
|
||||
let mut v = ShowSpanVisitor { dcx, mode };
|
||||
visit::walk_crate(&mut v, krate);
|
||||
}
|
||||
|
|
@ -973,25 +973,20 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
propagated_outlives_requirements: &mut Vec<ClosureOutlivesRequirement<'tcx>>,
|
||||
) -> bool {
|
||||
let tcx = infcx.tcx;
|
||||
|
||||
let TypeTest { generic_kind, lower_bound, span: _, verify_bound: _ } = type_test;
|
||||
let TypeTest { generic_kind, lower_bound, span: blame_span, ref verify_bound } = *type_test;
|
||||
|
||||
let generic_ty = generic_kind.to_ty(tcx);
|
||||
let Some(subject) = self.try_promote_type_test_subject(infcx, generic_ty) else {
|
||||
return false;
|
||||
};
|
||||
|
||||
debug!("subject = {:?}", subject);
|
||||
|
||||
let r_scc = self.constraint_sccs.scc(*lower_bound);
|
||||
|
||||
let r_scc = self.constraint_sccs.scc(lower_bound);
|
||||
debug!(
|
||||
"lower_bound = {:?} r_scc={:?} universe={:?}",
|
||||
lower_bound,
|
||||
r_scc,
|
||||
self.constraint_sccs.annotation(r_scc).min_universe()
|
||||
);
|
||||
|
||||
// If the type test requires that `T: 'a` where `'a` is a
|
||||
// placeholder from another universe, that effectively requires
|
||||
// `T: 'static`, so we have to propagate that requirement.
|
||||
|
|
@ -1004,7 +999,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
propagated_outlives_requirements.push(ClosureOutlivesRequirement {
|
||||
subject,
|
||||
outlived_free_region: static_r,
|
||||
blame_span: type_test.span,
|
||||
blame_span,
|
||||
category: ConstraintCategory::Boring,
|
||||
});
|
||||
|
||||
|
|
@ -1031,12 +1026,12 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
// where `ur` is a local bound -- we are sometimes in a
|
||||
// position to prove things that our caller cannot. See
|
||||
// #53570 for an example.
|
||||
if self.eval_verify_bound(infcx, generic_ty, ur, &type_test.verify_bound) {
|
||||
if self.eval_verify_bound(infcx, generic_ty, ur, &verify_bound) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let non_local_ub = self.universal_region_relations.non_local_upper_bounds(ur);
|
||||
debug!("try_promote_type_test: non_local_ub={:?}", non_local_ub);
|
||||
debug!(?non_local_ub);
|
||||
|
||||
// This is slightly too conservative. To show T: '1, given `'2: '1`
|
||||
// and `'3: '1` we only need to prove that T: '2 *or* T: '3, but to
|
||||
|
|
@ -1049,10 +1044,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
let requirement = ClosureOutlivesRequirement {
|
||||
subject,
|
||||
outlived_free_region: upper_bound,
|
||||
blame_span: type_test.span,
|
||||
blame_span,
|
||||
category: ConstraintCategory::Boring,
|
||||
};
|
||||
debug!("try_promote_type_test: pushing {:#?}", requirement);
|
||||
debug!(?requirement, "adding closure requirement");
|
||||
propagated_outlives_requirements.push(requirement);
|
||||
}
|
||||
}
|
||||
|
|
@ -1063,44 +1058,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
/// variables in the type `T` with an equal universal region from the
|
||||
/// closure signature.
|
||||
/// This is not always possible, so this is a fallible process.
|
||||
#[instrument(level = "debug", skip(self, infcx))]
|
||||
#[instrument(level = "debug", skip(self, infcx), ret)]
|
||||
fn try_promote_type_test_subject(
|
||||
&self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Option<ClosureOutlivesSubject<'tcx>> {
|
||||
let tcx = infcx.tcx;
|
||||
|
||||
// Opaque types' args may include useless lifetimes.
|
||||
// We will replace them with ReStatic.
|
||||
struct OpaqueFolder<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
}
|
||||
impl<'tcx> ty::TypeFolder<TyCtxt<'tcx>> for OpaqueFolder<'tcx> {
|
||||
fn cx(&self) -> TyCtxt<'tcx> {
|
||||
self.tcx
|
||||
}
|
||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||
use ty::TypeSuperFoldable as _;
|
||||
let tcx = self.tcx;
|
||||
let &ty::Alias(ty::Opaque, ty::AliasTy { args, def_id, .. }) = t.kind() else {
|
||||
return t.super_fold_with(self);
|
||||
};
|
||||
let args = std::iter::zip(args, tcx.variances_of(def_id)).map(|(arg, v)| {
|
||||
match (arg.unpack(), v) {
|
||||
(ty::GenericArgKind::Lifetime(_), ty::Bivariant) => {
|
||||
tcx.lifetimes.re_static.into()
|
||||
}
|
||||
_ => arg.fold_with(self),
|
||||
}
|
||||
});
|
||||
Ty::new_opaque(tcx, def_id, tcx.mk_args_from_iter(args))
|
||||
}
|
||||
}
|
||||
|
||||
let ty = ty.fold_with(&mut OpaqueFolder { tcx });
|
||||
let mut failed = false;
|
||||
|
||||
let ty = fold_regions(tcx, ty, |r, _depth| {
|
||||
let r_vid = self.to_region_vid(r);
|
||||
let r_scc = self.constraint_sccs.scc(r_vid);
|
||||
|
|
|
|||
|
|
@ -94,6 +94,21 @@ builtin_macros_cfg_accessible_indeterminate = cannot determine whether the path
|
|||
builtin_macros_cfg_accessible_literal_path = `cfg_accessible` path cannot be a literal
|
||||
builtin_macros_cfg_accessible_multiple_paths = multiple `cfg_accessible` paths are specified
|
||||
builtin_macros_cfg_accessible_unspecified_path = `cfg_accessible` path is not specified
|
||||
|
||||
builtin_macros_coerce_pointee_requires_maybe_sized = `derive(CoercePointee)` requires `{$name}` to be marked `?Sized`
|
||||
|
||||
builtin_macros_coerce_pointee_requires_one_field = `CoercePointee` can only be derived on `struct`s with at least one field
|
||||
|
||||
builtin_macros_coerce_pointee_requires_one_generic = `CoercePointee` can only be derived on `struct`s that are generic over at least one type
|
||||
|
||||
builtin_macros_coerce_pointee_requires_one_pointee = exactly one generic type parameter must be marked as `#[pointee]` to derive `CoercePointee` traits
|
||||
|
||||
builtin_macros_coerce_pointee_requires_transparent = `CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`
|
||||
|
||||
builtin_macros_coerce_pointee_too_many_pointees = only one type parameter can be marked as `#[pointee]` when deriving `CoercePointee` traits
|
||||
.label = here another type parameter is marked as `#[pointee]`
|
||||
|
||||
|
||||
builtin_macros_concat_bytes_array = cannot concatenate doubly nested array
|
||||
.note = byte strings are treated as arrays of bytes
|
||||
.help = try flattening the array
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use rustc_ast::{
|
|||
use rustc_attr as attr;
|
||||
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
|
||||
use rustc_expand::base::{Annotatable, ExtCtxt};
|
||||
use rustc_macros::Diagnostic;
|
||||
use rustc_span::symbol::{Ident, sym};
|
||||
use rustc_span::{Span, Symbol};
|
||||
use thin_vec::{ThinVec, thin_vec};
|
||||
|
|
@ -38,12 +39,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
.any(|r| matches!(r, attr::ReprTransparent))
|
||||
});
|
||||
if !is_transparent {
|
||||
cx.dcx()
|
||||
.struct_span_err(
|
||||
span,
|
||||
"`CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`",
|
||||
)
|
||||
.emit();
|
||||
cx.dcx().emit_err(RequireTransparent { span });
|
||||
return;
|
||||
}
|
||||
if !matches!(
|
||||
|
|
@ -51,22 +47,12 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
VariantData::Struct { fields, recovered: _ } | VariantData::Tuple(fields, _)
|
||||
if !fields.is_empty())
|
||||
{
|
||||
cx.dcx()
|
||||
.struct_span_err(
|
||||
span,
|
||||
"`CoercePointee` can only be derived on `struct`s with at least one field",
|
||||
)
|
||||
.emit();
|
||||
cx.dcx().emit_err(RequireOneField { span });
|
||||
return;
|
||||
}
|
||||
(aitem.ident, g)
|
||||
} else {
|
||||
cx.dcx()
|
||||
.struct_span_err(
|
||||
span,
|
||||
"`CoercePointee` can only be derived on `struct`s with `#[repr(transparent)]`",
|
||||
)
|
||||
.emit();
|
||||
cx.dcx().emit_err(RequireTransparent { span });
|
||||
return;
|
||||
};
|
||||
|
||||
|
|
@ -95,10 +81,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
|
||||
let pointee_param_idx = if type_params.is_empty() {
|
||||
// `#[derive(CoercePointee)]` requires at least one generic type on the target `struct`
|
||||
cx.dcx().struct_span_err(
|
||||
span,
|
||||
"`CoercePointee` can only be derived on `struct`s that are generic over at least one type",
|
||||
).emit();
|
||||
cx.dcx().emit_err(RequireOneGeneric { span });
|
||||
return;
|
||||
} else if type_params.len() == 1 {
|
||||
// Regardless of the only type param being designed as `#[pointee]` or not, we can just use it as such
|
||||
|
|
@ -111,19 +94,11 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
match (pointees.next(), pointees.next()) {
|
||||
(Some((idx, _span)), None) => idx,
|
||||
(None, _) => {
|
||||
cx.dcx().struct_span_err(
|
||||
span,
|
||||
"exactly one generic type parameter must be marked as #[pointee] to derive CoercePointee traits",
|
||||
).emit();
|
||||
cx.dcx().emit_err(RequireOnePointee { span });
|
||||
return;
|
||||
}
|
||||
(Some((_, one)), Some((_, another))) => {
|
||||
cx.dcx()
|
||||
.struct_span_err(
|
||||
vec![one, another],
|
||||
"only one type parameter can be marked as `#[pointee]` when deriving CoercePointee traits",
|
||||
)
|
||||
.emit();
|
||||
cx.dcx().emit_err(TooManyPointees { one, another });
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -181,15 +156,10 @@ pub(crate) fn expand_deriving_coerce_pointee(
|
|||
pointee_ty_ident.name,
|
||||
)
|
||||
{
|
||||
cx.dcx()
|
||||
.struct_span_err(
|
||||
pointee_ty_ident.span,
|
||||
format!(
|
||||
"`derive(CoercePointee)` requires {} to be marked `?Sized`",
|
||||
pointee_ty_ident.name
|
||||
),
|
||||
)
|
||||
.emit();
|
||||
cx.dcx().emit_err(RequiresMaybeSized {
|
||||
span: pointee_ty_ident.span,
|
||||
name: pointee_ty_ident.name.to_ident_string(),
|
||||
});
|
||||
return;
|
||||
}
|
||||
let arg = GenericArg::Type(s_ty.clone());
|
||||
|
|
@ -459,3 +429,48 @@ impl<'a, 'b> rustc_ast::visit::Visitor<'a> for AlwaysErrorOnGenericParam<'a, 'b>
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_requires_transparent)]
|
||||
struct RequireTransparent {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_requires_one_field)]
|
||||
struct RequireOneField {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_requires_one_generic)]
|
||||
struct RequireOneGeneric {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_requires_one_pointee)]
|
||||
struct RequireOnePointee {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_too_many_pointees)]
|
||||
struct TooManyPointees {
|
||||
#[primary_span]
|
||||
one: Span,
|
||||
#[label]
|
||||
another: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_coerce_pointee_requires_maybe_sized)]
|
||||
struct RequiresMaybeSized {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
name: String,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -418,9 +418,7 @@ fn run_compiler(
|
|||
return early_exit();
|
||||
}
|
||||
|
||||
if sess.opts.unstable_opts.parse_crate_root_only
|
||||
|| sess.opts.unstable_opts.show_span.is_some()
|
||||
{
|
||||
if sess.opts.unstable_opts.parse_crate_root_only {
|
||||
return early_exit();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -309,10 +309,10 @@ impl<'tcx> Visitor<'tcx> for CollectItemTypesVisitor<'tcx> {
|
|||
self.tcx.ensure().type_of(param.def_id);
|
||||
if let Some(default) = default {
|
||||
// need to store default and type of default
|
||||
self.tcx.ensure().const_param_default(param.def_id);
|
||||
if let hir::ConstArgKind::Anon(ac) = default.kind {
|
||||
self.tcx.ensure().type_of(ac.def_id);
|
||||
}
|
||||
self.tcx.ensure().const_param_default(param.def_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1817,7 +1817,6 @@ fn const_param_default<'tcx>(
|
|||
),
|
||||
};
|
||||
let icx = ItemCtxt::new(tcx, def_id);
|
||||
// FIXME(const_generics): investigate which places do and don't need const ty feeding
|
||||
let ct = icx.lowerer().lower_const_arg(default_ct, FeedConstTy::No);
|
||||
let ct = icx.lowerer().lower_const_arg(default_ct, FeedConstTy::Param(def_id.to_def_id()));
|
||||
ty::EarlyBinder::bind(ct)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ use rustc_middle::ty::{self, Article, IsSuggestable, Ty, TyCtxt, TypeVisitableEx
|
|||
use rustc_middle::{bug, span_bug};
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::{DUMMY_SP, Span};
|
||||
use tracing::debug;
|
||||
|
||||
use super::{ItemCtxt, bad_placeholder};
|
||||
use crate::errors::TypeofReservedKeywordUsed;
|
||||
|
|
@ -138,252 +137,26 @@ fn const_arg_anon_type_of<'tcx>(tcx: TyCtxt<'tcx>, arg_hir_id: HirId, span: Span
|
|||
use hir::*;
|
||||
use rustc_middle::ty::Ty;
|
||||
|
||||
let parent_node_id = tcx.parent_hir_id(arg_hir_id);
|
||||
let parent_node = tcx.hir_node(parent_node_id);
|
||||
|
||||
let (generics, arg_idx) = match parent_node {
|
||||
// Easy case: arrays repeat expressions.
|
||||
match tcx.parent_hir_node(arg_hir_id) {
|
||||
// Array length const arguments do not have `type_of` fed as there is never a corresponding
|
||||
// generic parameter definition.
|
||||
Node::Ty(&hir::Ty { kind: TyKind::Array(_, ref constant), .. })
|
||||
| Node::Expr(&Expr { kind: ExprKind::Repeat(_, ref constant), .. })
|
||||
if constant.hir_id == arg_hir_id =>
|
||||
{
|
||||
return tcx.types.usize;
|
||||
}
|
||||
Node::GenericParam(&GenericParam {
|
||||
def_id: param_def_id,
|
||||
kind: GenericParamKind::Const { default: Some(ct), .. },
|
||||
..
|
||||
}) if ct.hir_id == arg_hir_id => {
|
||||
return tcx
|
||||
.type_of(param_def_id)
|
||||
.no_bound_vars()
|
||||
.expect("const parameter types cannot be generic");
|
||||
}
|
||||
|
||||
// This match arm is for when the def_id appears in a GAT whose
|
||||
// path can't be resolved without typechecking e.g.
|
||||
//
|
||||
// trait Foo {
|
||||
// type Assoc<const N: usize>;
|
||||
// fn foo() -> Self::Assoc<3>;
|
||||
// }
|
||||
//
|
||||
// In the above code we would call this query with the def_id of 3 and
|
||||
// the parent_node we match on would be the hir node for Self::Assoc<3>
|
||||
//
|
||||
// `Self::Assoc<3>` cant be resolved without typechecking here as we
|
||||
// didnt write <Self as Foo>::Assoc<3>. If we did then another match
|
||||
// arm would handle this.
|
||||
//
|
||||
// I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU
|
||||
Node::Ty(hir_ty @ hir::Ty { kind: TyKind::Path(QPath::TypeRelative(ty, segment)), .. }) => {
|
||||
// Find the Item containing the associated type so we can create an ItemCtxt.
|
||||
// Using the ItemCtxt lower the HIR for the unresolved assoc type into a
|
||||
// ty which is a fully resolved projection.
|
||||
// For the code example above, this would mean lowering `Self::Assoc<3>`
|
||||
// to a ty::Alias(ty::Projection, `<Self as Foo>::Assoc<3>`).
|
||||
let item_def_id = tcx.hir().get_parent_item(ty.hir_id).def_id;
|
||||
let ty = ItemCtxt::new(tcx, item_def_id).lower_ty(hir_ty);
|
||||
|
||||
// Iterate through the generics of the projection to find the one that corresponds to
|
||||
// the def_id that this query was called with. We filter to only type and const args here
|
||||
// as a precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't
|
||||
// but it can't hurt to be safe ^^
|
||||
if let ty::Alias(ty::Projection | ty::Inherent, projection) = ty.kind() {
|
||||
let generics = tcx.generics_of(projection.def_id);
|
||||
|
||||
let arg_index = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.hir_id() == arg_hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching AnonConst in segment");
|
||||
});
|
||||
|
||||
(generics, arg_index)
|
||||
} else {
|
||||
// I dont think it's possible to reach this but I'm not 100% sure - BoxyUwU
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
"unexpected non-GAT usage of an anon const",
|
||||
);
|
||||
}
|
||||
}
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::MethodCall(segment, ..) | ExprKind::Path(QPath::TypeRelative(_, segment)),
|
||||
..
|
||||
}) => {
|
||||
let body_owner = tcx.hir().enclosing_body_owner(arg_hir_id);
|
||||
let tables = tcx.typeck(body_owner);
|
||||
// This may fail in case the method/path does not actually exist.
|
||||
// As there is no relevant param for `def_id`, we simply return
|
||||
// `None` here.
|
||||
let Some(type_dependent_def) = tables.type_dependent_def_id(parent_node_id) else {
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("unable to find type-dependent def for {parent_node_id:?}"),
|
||||
);
|
||||
};
|
||||
let idx = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.hir_id() == arg_hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching ConstArg in segment");
|
||||
});
|
||||
|
||||
(tcx.generics_of(type_dependent_def), idx)
|
||||
}
|
||||
|
||||
Node::Ty(&hir::Ty { kind: TyKind::Path(_), .. })
|
||||
| Node::Expr(&Expr { kind: ExprKind::Path(_) | ExprKind::Struct(..), .. })
|
||||
| Node::TraitRef(..)
|
||||
| Node::Pat(_) => {
|
||||
let path = match parent_node {
|
||||
Node::Ty(&hir::Ty { kind: TyKind::Path(QPath::Resolved(_, path)), .. })
|
||||
| Node::TraitRef(&TraitRef { path, .. }) => &*path,
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::Path(QPath::Resolved(_, path))
|
||||
| ExprKind::Struct(&QPath::Resolved(_, path), ..),
|
||||
..
|
||||
}) => {
|
||||
let body_owner = tcx.hir().enclosing_body_owner(arg_hir_id);
|
||||
let _tables = tcx.typeck(body_owner);
|
||||
&*path
|
||||
}
|
||||
Node::Pat(pat) => {
|
||||
if let Some(path) = get_path_containing_arg_in_pat(pat, arg_hir_id) {
|
||||
path
|
||||
} else {
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("unable to find const parent for {arg_hir_id} in pat {pat:?}"),
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("unexpected const parent path {parent_node:?}"),
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// We've encountered an `AnonConst` in some path, so we need to
|
||||
// figure out which generic parameter it corresponds to and return
|
||||
// the relevant type.
|
||||
let Some((arg_index, segment)) = path.segments.iter().find_map(|seg| {
|
||||
let args = seg.args?;
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.hir_id() == arg_hir_id)
|
||||
.map(|index| (index, seg))
|
||||
.or_else(|| {
|
||||
args.constraints
|
||||
.iter()
|
||||
.copied()
|
||||
.filter_map(AssocItemConstraint::ct)
|
||||
.position(|ct| ct.hir_id == arg_hir_id)
|
||||
.map(|idx| (idx, seg))
|
||||
})
|
||||
}) else {
|
||||
return Ty::new_error_with_message(tcx, span, "no arg matching AnonConst in path");
|
||||
};
|
||||
|
||||
let generics = match tcx.res_generics_def_id(segment.res) {
|
||||
Some(def_id) => tcx.generics_of(def_id),
|
||||
None => {
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("unexpected anon const res {:?} in path: {:?}", segment.res, path),
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
(generics, arg_index)
|
||||
}
|
||||
|
||||
_ => {
|
||||
return Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("unexpected const arg parent in type_of(): {parent_node:?}"),
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
debug!(?parent_node);
|
||||
debug!(?generics, ?arg_idx);
|
||||
if let Some(param_def_id) = generics
|
||||
.own_params
|
||||
.iter()
|
||||
.filter(|param| param.kind.is_ty_or_const())
|
||||
.nth(match generics.has_self && generics.parent.is_none() {
|
||||
true => arg_idx + 1,
|
||||
false => arg_idx,
|
||||
})
|
||||
.and_then(|param| match param.kind {
|
||||
ty::GenericParamDefKind::Const { .. } => {
|
||||
debug!(?param);
|
||||
Some(param.def_id)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
{
|
||||
tcx.type_of(param_def_id).no_bound_vars().expect("const parameter types cannot be generic")
|
||||
} else {
|
||||
return Ty::new_error_with_message(
|
||||
// This is not a `bug!` as const arguments in path segments that did not resolve to anything
|
||||
// will result in `type_of` never being fed.
|
||||
_ => Ty::new_error_with_message(
|
||||
tcx,
|
||||
span,
|
||||
format!("const generic parameter not found in {generics:?} at position {arg_idx:?}"),
|
||||
);
|
||||
"`type_of` called on const argument's anon const before the const argument was lowered",
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_path_containing_arg_in_pat<'hir>(
|
||||
pat: &'hir hir::Pat<'hir>,
|
||||
arg_id: HirId,
|
||||
) -> Option<&'hir hir::Path<'hir>> {
|
||||
use hir::*;
|
||||
|
||||
let is_arg_in_path = |p: &hir::Path<'_>| {
|
||||
p.segments
|
||||
.iter()
|
||||
.filter_map(|seg| seg.args)
|
||||
.flat_map(|args| args.args)
|
||||
.any(|arg| arg.hir_id() == arg_id)
|
||||
};
|
||||
let mut arg_path = None;
|
||||
pat.walk(|pat| match pat.kind {
|
||||
PatKind::Struct(QPath::Resolved(_, path), _, _)
|
||||
| PatKind::TupleStruct(QPath::Resolved(_, path), _, _)
|
||||
| PatKind::Path(QPath::Resolved(_, path))
|
||||
if is_arg_in_path(path) =>
|
||||
{
|
||||
arg_path = Some(path);
|
||||
false
|
||||
}
|
||||
_ => true,
|
||||
});
|
||||
arg_path
|
||||
}
|
||||
|
||||
pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_, Ty<'_>> {
|
||||
use rustc_hir::*;
|
||||
use rustc_middle::ty::Ty;
|
||||
|
|
|
|||
|
|
@ -226,13 +226,18 @@ impl TaitConstraintLocator<'_> {
|
|||
constrained = true;
|
||||
|
||||
if !opaque_types_defined_by.contains(&self.def_id) {
|
||||
self.tcx.dcx().emit_err(TaitForwardCompat {
|
||||
let guar = self.tcx.dcx().emit_err(TaitForwardCompat {
|
||||
span: hidden_type.span,
|
||||
item_span: self
|
||||
.tcx
|
||||
.def_ident_span(item_def_id)
|
||||
.unwrap_or_else(|| self.tcx.def_span(item_def_id)),
|
||||
});
|
||||
// Avoid "opaque type not constrained" errors on the opaque itself.
|
||||
self.found = Some(ty::OpaqueHiddenType {
|
||||
span: DUMMY_SP,
|
||||
ty: Ty::new_error(self.tcx, guar),
|
||||
});
|
||||
}
|
||||
let concrete_type =
|
||||
self.tcx.erase_regions(hidden_type.remap_generic_params_to_declaration_params(
|
||||
|
|
@ -248,7 +253,7 @@ impl TaitConstraintLocator<'_> {
|
|||
if !constrained {
|
||||
debug!("no constraints in typeck results");
|
||||
if opaque_types_defined_by.contains(&self.def_id) {
|
||||
self.tcx.dcx().emit_err(TaitForwardCompat2 {
|
||||
let guar = self.tcx.dcx().emit_err(TaitForwardCompat2 {
|
||||
span: self
|
||||
.tcx
|
||||
.def_ident_span(item_def_id)
|
||||
|
|
@ -256,6 +261,11 @@ impl TaitConstraintLocator<'_> {
|
|||
opaque_type_span: self.tcx.def_span(self.def_id),
|
||||
opaque_type: self.tcx.def_path_str(self.def_id),
|
||||
});
|
||||
// Avoid "opaque type not constrained" errors on the opaque itself.
|
||||
self.found = Some(ty::OpaqueHiddenType {
|
||||
span: DUMMY_SP,
|
||||
ty: Ty::new_error(self.tcx, guar),
|
||||
});
|
||||
}
|
||||
return;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3394,7 +3394,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let Some(ty) = self.node_ty_opt(tail_expr.hir_id) else {
|
||||
return;
|
||||
};
|
||||
if self.can_eq(self.param_env, expected_ty, ty) {
|
||||
if self.can_eq(self.param_env, expected_ty, ty)
|
||||
// FIXME: this happens with macro calls. Need to figure out why the stmt
|
||||
// `println!();` doesn't include the `;` in its `Span`. (#133845)
|
||||
// We filter these out to avoid ICEs with debug assertions on caused by
|
||||
// empty suggestions.
|
||||
&& stmt.span.hi() != tail_expr.span.hi()
|
||||
{
|
||||
err.span_suggestion_short(
|
||||
stmt.span.with_lo(tail_expr.span.hi()),
|
||||
"remove this semicolon",
|
||||
|
|
|
|||
|
|
@ -54,10 +54,6 @@ pub(crate) fn parse<'a>(sess: &'a Session) -> Result<ast::Crate> {
|
|||
})
|
||||
.map_err(|parse_error| parse_error.emit())?;
|
||||
|
||||
if let Some(ref s) = sess.opts.unstable_opts.show_span {
|
||||
rustc_ast_passes::show_span::run(sess.dcx(), s, &krate);
|
||||
}
|
||||
|
||||
if sess.opts.unstable_opts.input_stats {
|
||||
input_stats::print_ast_stats(&krate, "PRE EXPANSION AST STATS", "ast-stats-1");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -844,7 +844,6 @@ fn test_unstable_options_tracking_hash() {
|
|||
tracked!(sanitizer_recover, SanitizerSet::ADDRESS);
|
||||
tracked!(saturating_float_casts, Some(true));
|
||||
tracked!(share_generics, Some(true));
|
||||
tracked!(show_span, Some(String::from("abc")));
|
||||
tracked!(simulate_remapped_rust_src_base, Some(PathBuf::from("/rustc/abc")));
|
||||
tracked!(small_data_threshold, Some(16));
|
||||
tracked!(split_lto_unit, Some(true));
|
||||
|
|
|
|||
|
|
@ -885,6 +885,12 @@ lint_unnameable_test_items = cannot test inner items
|
|||
lint_unnecessary_qualification = unnecessary qualification
|
||||
.suggestion = remove the unnecessary path segments
|
||||
|
||||
lint_unpredictable_fn_pointer_comparisons = function pointer comparisons do not produce meaningful results since their addresses are not guaranteed to be unique
|
||||
.note_duplicated_fn = the address of the same function can vary between different codegen units
|
||||
.note_deduplicated_fn = furthermore, different functions could have the same address after being merged together
|
||||
.note_visit_fn_addr_eq = for more information visit <https://doc.rust-lang.org/nightly/core/ptr/fn.fn_addr_eq.html>
|
||||
.fn_addr_eq_suggestion = refactor your code, or use `std::ptr::fn_addr_eq` to suppress the lint
|
||||
|
||||
lint_unqualified_local_imports = `use` of a local item without leading `self::`, `super::`, or `crate::`
|
||||
|
||||
lint_unsafe_attr_outside_unsafe = unsafe attribute used without unsafe
|
||||
|
|
|
|||
|
|
@ -1815,6 +1815,42 @@ pub(crate) enum AmbiguousWidePointerComparisonsAddrSuggestion<'a> {
|
|||
},
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
pub(crate) enum UnpredictableFunctionPointerComparisons<'a> {
|
||||
#[diag(lint_unpredictable_fn_pointer_comparisons)]
|
||||
#[note(lint_note_duplicated_fn)]
|
||||
#[note(lint_note_deduplicated_fn)]
|
||||
#[note(lint_note_visit_fn_addr_eq)]
|
||||
Suggestion {
|
||||
#[subdiagnostic]
|
||||
sugg: UnpredictableFunctionPointerComparisonsSuggestion<'a>,
|
||||
},
|
||||
#[diag(lint_unpredictable_fn_pointer_comparisons)]
|
||||
#[note(lint_note_duplicated_fn)]
|
||||
#[note(lint_note_deduplicated_fn)]
|
||||
#[note(lint_note_visit_fn_addr_eq)]
|
||||
Warn,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[multipart_suggestion(
|
||||
lint_fn_addr_eq_suggestion,
|
||||
style = "verbose",
|
||||
applicability = "maybe-incorrect"
|
||||
)]
|
||||
pub(crate) struct UnpredictableFunctionPointerComparisonsSuggestion<'a> {
|
||||
pub ne: &'a str,
|
||||
pub cast_right: String,
|
||||
pub deref_left: &'a str,
|
||||
pub deref_right: &'a str,
|
||||
#[suggestion_part(code = "{ne}std::ptr::fn_addr_eq({deref_left}")]
|
||||
pub left: Span,
|
||||
#[suggestion_part(code = ", {deref_right}")]
|
||||
pub middle: Span,
|
||||
#[suggestion_part(code = "{cast_right})")]
|
||||
pub right: Span,
|
||||
}
|
||||
|
||||
pub(crate) struct ImproperCTypes<'a> {
|
||||
pub ty: Ty<'a>,
|
||||
pub desc: &'a str,
|
||||
|
|
|
|||
|
|
@ -23,7 +23,9 @@ use crate::lints::{
|
|||
AmbiguousWidePointerComparisons, AmbiguousWidePointerComparisonsAddrMetadataSuggestion,
|
||||
AmbiguousWidePointerComparisonsAddrSuggestion, AtomicOrderingFence, AtomicOrderingLoad,
|
||||
AtomicOrderingStore, ImproperCTypes, InvalidAtomicOrderingDiag, InvalidNanComparisons,
|
||||
InvalidNanComparisonsSuggestion, UnusedComparisons, VariantSizeDifferencesDiag,
|
||||
InvalidNanComparisonsSuggestion, UnpredictableFunctionPointerComparisons,
|
||||
UnpredictableFunctionPointerComparisonsSuggestion, UnusedComparisons,
|
||||
VariantSizeDifferencesDiag,
|
||||
};
|
||||
use crate::{LateContext, LateLintPass, LintContext, fluent_generated as fluent};
|
||||
|
||||
|
|
@ -166,6 +168,35 @@ declare_lint! {
|
|||
"detects ambiguous wide pointer comparisons"
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `unpredictable_function_pointer_comparisons` lint checks comparison
|
||||
/// of function pointer as the operands.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust
|
||||
/// fn a() {}
|
||||
/// fn b() {}
|
||||
///
|
||||
/// let f: fn() = a;
|
||||
/// let g: fn() = b;
|
||||
///
|
||||
/// let _ = f == g;
|
||||
/// ```
|
||||
///
|
||||
/// {{produces}}
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// Function pointers comparisons do not produce meaningful result since
|
||||
/// they are never guaranteed to be unique and could vary between different
|
||||
/// code generation units. Furthermore, different functions could have the
|
||||
/// same address after being merged together.
|
||||
UNPREDICTABLE_FUNCTION_POINTER_COMPARISONS,
|
||||
Warn,
|
||||
"detects unpredictable function pointer comparisons"
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Default)]
|
||||
pub(crate) struct TypeLimits {
|
||||
/// Id of the last visited negated expression
|
||||
|
|
@ -178,7 +209,8 @@ impl_lint_pass!(TypeLimits => [
|
|||
UNUSED_COMPARISONS,
|
||||
OVERFLOWING_LITERALS,
|
||||
INVALID_NAN_COMPARISONS,
|
||||
AMBIGUOUS_WIDE_POINTER_COMPARISONS
|
||||
AMBIGUOUS_WIDE_POINTER_COMPARISONS,
|
||||
UNPREDICTABLE_FUNCTION_POINTER_COMPARISONS
|
||||
]);
|
||||
|
||||
impl TypeLimits {
|
||||
|
|
@ -255,7 +287,7 @@ fn lint_nan<'tcx>(
|
|||
cx.emit_span_lint(INVALID_NAN_COMPARISONS, e.span, lint);
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
#[derive(Debug, PartialEq, Copy, Clone)]
|
||||
enum ComparisonOp {
|
||||
BinOp(hir::BinOpKind),
|
||||
Other,
|
||||
|
|
@ -383,6 +415,100 @@ fn lint_wide_pointer<'tcx>(
|
|||
);
|
||||
}
|
||||
|
||||
fn lint_fn_pointer<'tcx>(
|
||||
cx: &LateContext<'tcx>,
|
||||
e: &'tcx hir::Expr<'tcx>,
|
||||
cmpop: ComparisonOp,
|
||||
l: &'tcx hir::Expr<'tcx>,
|
||||
r: &'tcx hir::Expr<'tcx>,
|
||||
) {
|
||||
let peel_refs = |mut ty: Ty<'tcx>| -> (Ty<'tcx>, usize) {
|
||||
let mut refs = 0;
|
||||
|
||||
while let ty::Ref(_, inner_ty, _) = ty.kind() {
|
||||
ty = *inner_ty;
|
||||
refs += 1;
|
||||
}
|
||||
|
||||
(ty, refs)
|
||||
};
|
||||
|
||||
// Left and right operands can have borrows, remove them
|
||||
let l = l.peel_borrows();
|
||||
let r = r.peel_borrows();
|
||||
|
||||
let Some(l_ty) = cx.typeck_results().expr_ty_opt(l) else { return };
|
||||
let Some(r_ty) = cx.typeck_results().expr_ty_opt(r) else { return };
|
||||
|
||||
// Remove any references as `==` will deref through them (and count the
|
||||
// number of references removed, for latter).
|
||||
let (l_ty, l_ty_refs) = peel_refs(l_ty);
|
||||
let (r_ty, r_ty_refs) = peel_refs(r_ty);
|
||||
|
||||
if !l_ty.is_fn() || !r_ty.is_fn() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Let's try to suggest `ptr::fn_addr_eq` if/when possible.
|
||||
|
||||
let is_eq_ne = matches!(cmpop, ComparisonOp::BinOp(hir::BinOpKind::Eq | hir::BinOpKind::Ne));
|
||||
|
||||
if !is_eq_ne {
|
||||
// Neither `==` nor `!=`, we can't suggest `ptr::fn_addr_eq`, just show the warning.
|
||||
return cx.emit_span_lint(
|
||||
UNPREDICTABLE_FUNCTION_POINTER_COMPARISONS,
|
||||
e.span,
|
||||
UnpredictableFunctionPointerComparisons::Warn,
|
||||
);
|
||||
}
|
||||
|
||||
let (Some(l_span), Some(r_span)) =
|
||||
(l.span.find_ancestor_inside(e.span), r.span.find_ancestor_inside(e.span))
|
||||
else {
|
||||
// No appropriate spans for the left and right operands, just show the warning.
|
||||
return cx.emit_span_lint(
|
||||
UNPREDICTABLE_FUNCTION_POINTER_COMPARISONS,
|
||||
e.span,
|
||||
UnpredictableFunctionPointerComparisons::Warn,
|
||||
);
|
||||
};
|
||||
|
||||
let ne = if cmpop == ComparisonOp::BinOp(hir::BinOpKind::Ne) { "!" } else { "" };
|
||||
|
||||
// `ptr::fn_addr_eq` only works with raw pointer, deref any references.
|
||||
let deref_left = &*"*".repeat(l_ty_refs);
|
||||
let deref_right = &*"*".repeat(r_ty_refs);
|
||||
|
||||
let left = e.span.shrink_to_lo().until(l_span.shrink_to_lo());
|
||||
let middle = l_span.shrink_to_hi().until(r_span.shrink_to_lo());
|
||||
let right = r_span.shrink_to_hi().until(e.span.shrink_to_hi());
|
||||
|
||||
// We only check for a right cast as `FnDef` == `FnPtr` is not possible,
|
||||
// only `FnPtr == FnDef` is possible.
|
||||
let cast_right = if !r_ty.is_fn_ptr() {
|
||||
let fn_sig = r_ty.fn_sig(cx.tcx);
|
||||
format!(" as {fn_sig}")
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
cx.emit_span_lint(
|
||||
UNPREDICTABLE_FUNCTION_POINTER_COMPARISONS,
|
||||
e.span,
|
||||
UnpredictableFunctionPointerComparisons::Suggestion {
|
||||
sugg: UnpredictableFunctionPointerComparisonsSuggestion {
|
||||
ne,
|
||||
deref_left,
|
||||
deref_right,
|
||||
left,
|
||||
middle,
|
||||
right,
|
||||
cast_right,
|
||||
},
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for TypeLimits {
|
||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx hir::Expr<'tcx>) {
|
||||
match e.kind {
|
||||
|
|
@ -399,7 +525,9 @@ impl<'tcx> LateLintPass<'tcx> for TypeLimits {
|
|||
cx.emit_span_lint(UNUSED_COMPARISONS, e.span, UnusedComparisons);
|
||||
} else {
|
||||
lint_nan(cx, e, binop, l, r);
|
||||
lint_wide_pointer(cx, e, ComparisonOp::BinOp(binop.node), l, r);
|
||||
let cmpop = ComparisonOp::BinOp(binop.node);
|
||||
lint_wide_pointer(cx, e, cmpop, l, r);
|
||||
lint_fn_pointer(cx, e, cmpop, l, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -411,6 +539,7 @@ impl<'tcx> LateLintPass<'tcx> for TypeLimits {
|
|||
&& let Some(cmpop) = diag_item_cmpop(diag_item) =>
|
||||
{
|
||||
lint_wide_pointer(cx, e, cmpop, l, r);
|
||||
lint_fn_pointer(cx, e, cmpop, l, r);
|
||||
}
|
||||
hir::ExprKind::MethodCall(_, l, [r], _)
|
||||
if let Some(def_id) = cx.typeck_results().type_dependent_def_id(e.hir_id)
|
||||
|
|
@ -418,6 +547,7 @@ impl<'tcx> LateLintPass<'tcx> for TypeLimits {
|
|||
&& let Some(cmpop) = diag_item_cmpop(diag_item) =>
|
||||
{
|
||||
lint_wide_pointer(cx, e, cmpop, l, r);
|
||||
lint_fn_pointer(cx, e, cmpop, l, r);
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
use rustc_hir::def::CtorOf;
|
||||
use rustc_index::Idx;
|
||||
use tracing::trace;
|
||||
|
||||
use crate::rmeta::*;
|
||||
|
||||
|
|
@ -530,8 +529,6 @@ where
|
|||
{
|
||||
/// Given the metadata, extract out the value at a particular index (if any).
|
||||
pub(super) fn get<'a, 'tcx, M: Metadata<'a, 'tcx>>(&self, metadata: M, i: I) -> T::Value<'tcx> {
|
||||
trace!("LazyTable::lookup: index={:?} len={:?}", i, self.len);
|
||||
|
||||
// Access past the end of the table returns a Default
|
||||
if i.index() >= self.len {
|
||||
return Default::default();
|
||||
|
|
|
|||
|
|
@ -585,6 +585,10 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
|
|||
self.trait_def(trait_def_id).implement_via_object
|
||||
}
|
||||
|
||||
fn trait_is_unsafe(self, trait_def_id: Self::DefId) -> bool {
|
||||
self.trait_def(trait_def_id).safety == hir::Safety::Unsafe
|
||||
}
|
||||
|
||||
fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
||||
self.is_impl_trait_in_trait(def_id)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -978,6 +978,14 @@ impl<'tcx> rustc_type_ir::inherent::Ty<TyCtxt<'tcx>> for Ty<'tcx> {
|
|||
fn async_destructor_ty(self, interner: TyCtxt<'tcx>) -> Ty<'tcx> {
|
||||
self.async_destructor_ty(interner)
|
||||
}
|
||||
|
||||
fn has_unsafe_fields(self) -> bool {
|
||||
if let ty::Adt(adt_def, ..) = self.kind() {
|
||||
adt_def.all_fields().any(|x| x.safety == hir::Safety::Unsafe)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Type utilities
|
||||
|
|
|
|||
|
|
@ -84,12 +84,17 @@ mir_build_call_to_unsafe_fn_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
|||
|
||||
mir_build_confused = missing patterns are not covered because `{$variable}` is interpreted as a constant pattern, not a new variable
|
||||
|
||||
mir_build_const_param_in_pattern = const parameters cannot be referenced in patterns
|
||||
mir_build_const_defined_here = constant defined here
|
||||
|
||||
mir_build_const_pattern_depends_on_generic_parameter =
|
||||
constant pattern depends on a generic parameter
|
||||
mir_build_const_param_in_pattern = constant parameters cannot be referenced in patterns
|
||||
.label = can't be used in patterns
|
||||
mir_build_const_param_in_pattern_def = constant defined here
|
||||
|
||||
mir_build_const_pattern_depends_on_generic_parameter = constant pattern cannot depend on generic parameters
|
||||
.label = `const` depends on a generic parameter
|
||||
|
||||
mir_build_could_not_eval_const_pattern = could not evaluate constant pattern
|
||||
.label = could not evaluate constant
|
||||
|
||||
mir_build_deref_raw_pointer_requires_unsafe =
|
||||
dereference of raw pointer is unsafe and requires unsafe block
|
||||
|
|
@ -147,7 +152,8 @@ mir_build_inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
|||
|
||||
mir_build_interpreted_as_const = introduce a variable instead
|
||||
|
||||
mir_build_invalid_pattern = `{$non_sm_ty}` cannot be used in patterns
|
||||
mir_build_invalid_pattern = {$prefix} `{$non_sm_ty}` cannot be used in patterns
|
||||
.label = {$prefix} can't be used in patterns
|
||||
|
||||
mir_build_irrefutable_let_patterns_if_let = irrefutable `if let` {$count ->
|
||||
[one] pattern
|
||||
|
|
@ -244,10 +250,12 @@ mir_build_mutation_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsa
|
|||
.label = mutation of layout constrained field
|
||||
|
||||
mir_build_nan_pattern = cannot use NaN in patterns
|
||||
.label = evaluates to `NaN`, which is not allowed in patterns
|
||||
.note = NaNs compare inequal to everything, even themselves, so this pattern would never match
|
||||
.help = try using the `is_nan` method instead
|
||||
|
||||
mir_build_non_const_path = runtime values cannot be referenced in patterns
|
||||
.label = references a runtime value
|
||||
|
||||
mir_build_non_empty_never_pattern =
|
||||
mismatched types
|
||||
|
|
@ -265,13 +273,15 @@ mir_build_non_exhaustive_patterns_type_not_empty = non-exhaustive patterns: type
|
|||
.suggestion = ensure that all possible cases are being handled by adding a match arm with a wildcard pattern as shown
|
||||
.help = ensure that all possible cases are being handled by adding a match arm with a wildcard pattern
|
||||
|
||||
mir_build_non_partial_eq_match =
|
||||
to use a constant of type `{$non_peq_ty}` in a pattern, the type must implement `PartialEq`
|
||||
mir_build_non_partial_eq_match = constant of non-structural type `{$ty}` in a pattern
|
||||
.label = constant of non-structural type
|
||||
|
||||
mir_build_pattern_not_covered = refutable pattern in {$origin}
|
||||
.pattern_ty = the matched value is of type `{$pattern_ty}`
|
||||
|
||||
mir_build_pointer_pattern = function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
|
||||
mir_build_pointer_pattern = function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon
|
||||
.label = can't be used in patterns
|
||||
.note = see https://github.com/rust-lang/rust/issues/70861 for details
|
||||
|
||||
mir_build_privately_uninhabited = pattern `{$witness_1}` is currently uninhabited, but this variant contains private fields which may become inhabited in the future
|
||||
|
||||
|
|
@ -283,6 +293,8 @@ mir_build_rustc_box_attribute_error = `#[rustc_box]` attribute used incorrectly
|
|||
.missing_box = `#[rustc_box]` requires the `owned_box` lang item
|
||||
|
||||
mir_build_static_in_pattern = statics cannot be referenced in patterns
|
||||
.label = can't be used in patterns
|
||||
mir_build_static_in_pattern_def = `static` defined here
|
||||
|
||||
mir_build_suggest_attempted_int_lit = alternatively, you could prepend the pattern with an underscore to define a new named variable; identifiers cannot begin with digits
|
||||
|
||||
|
|
@ -310,12 +322,12 @@ mir_build_trailing_irrefutable_let_patterns = trailing irrefutable {$count ->
|
|||
*[other] them
|
||||
} into the body
|
||||
|
||||
mir_build_type_not_structural =
|
||||
to use a constant of type `{$non_sm_ty}` in a pattern, `{$non_sm_ty}` must be annotated with `#[derive(PartialEq)]`
|
||||
|
||||
mir_build_type_not_structural = constant of non-structural type `{$ty}` in a pattern
|
||||
.label = constant of non-structural type
|
||||
mir_build_type_not_structural_def = `{$ty}` must be annotated with `#[derive(PartialEq)]` to be usable in patterns
|
||||
mir_build_type_not_structural_more_info = see https://doc.rust-lang.org/stable/std/marker/trait.StructuralPartialEq.html for details
|
||||
|
||||
mir_build_type_not_structural_tip = the traits must be derived, manual `impl`s are not sufficient
|
||||
mir_build_type_not_structural_tip =
|
||||
the `PartialEq` trait must be derived, manual `impl`s are not sufficient; see https://doc.rust-lang.org/stable/std/marker/trait.StructuralPartialEq.html for details
|
||||
|
||||
mir_build_unconditional_recursion = function cannot return without recursing
|
||||
.label = cannot return without recursing
|
||||
|
|
@ -334,6 +346,7 @@ mir_build_union_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
|||
.label = access to union field
|
||||
|
||||
mir_build_union_pattern = cannot use unions in constant patterns
|
||||
.label = can't use a `union` here
|
||||
|
||||
mir_build_unreachable_making_this_unreachable = collectively making this unreachable
|
||||
|
||||
|
|
|
|||
|
|
@ -631,20 +631,27 @@ pub(crate) struct NonExhaustiveMatchAllArmsGuarded;
|
|||
#[diag(mir_build_static_in_pattern, code = E0158)]
|
||||
pub(crate) struct StaticInPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
#[label(mir_build_static_in_pattern_def)]
|
||||
pub(crate) static_span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_const_param_in_pattern, code = E0158)]
|
||||
pub(crate) struct ConstParamInPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
#[label(mir_build_const_param_in_pattern_def)]
|
||||
pub(crate) const_span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_non_const_path, code = E0080)]
|
||||
pub(crate) struct NonConstPath {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
|
|
@ -695,6 +702,7 @@ pub(crate) struct WantedConstant {
|
|||
#[diag(mir_build_const_pattern_depends_on_generic_parameter, code = E0158)]
|
||||
pub(crate) struct ConstPatternDependsOnGenericParameter {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
|
|
@ -702,6 +710,7 @@ pub(crate) struct ConstPatternDependsOnGenericParameter {
|
|||
#[diag(mir_build_could_not_eval_const_pattern)]
|
||||
pub(crate) struct CouldNotEvalConstPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
|
|
@ -867,33 +876,43 @@ pub(crate) enum Conflict {
|
|||
#[diag(mir_build_union_pattern)]
|
||||
pub(crate) struct UnionPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_type_not_structural)]
|
||||
#[note(mir_build_type_not_structural_tip)]
|
||||
#[note(mir_build_type_not_structural_more_info)]
|
||||
pub(crate) struct TypeNotStructural<'tcx> {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
pub(crate) non_sm_ty: Ty<'tcx>,
|
||||
#[label(mir_build_type_not_structural_def)]
|
||||
pub(crate) ty_def_span: Span,
|
||||
pub(crate) ty: Ty<'tcx>,
|
||||
#[note(mir_build_type_not_structural_tip)]
|
||||
pub(crate) manual_partialeq_impl_span: Option<Span>,
|
||||
#[note(mir_build_type_not_structural_more_info)]
|
||||
pub(crate) manual_partialeq_impl_note: bool,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_non_partial_eq_match)]
|
||||
#[note(mir_build_type_not_structural_more_info)]
|
||||
pub(crate) struct TypeNotPartialEq<'tcx> {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
pub(crate) non_peq_ty: Ty<'tcx>,
|
||||
pub(crate) ty: Ty<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_invalid_pattern)]
|
||||
pub(crate) struct InvalidPattern<'tcx> {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
pub(crate) non_sm_ty: Ty<'tcx>,
|
||||
pub(crate) prefix: String,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
|
@ -910,13 +929,16 @@ pub(crate) struct UnsizedPattern<'tcx> {
|
|||
#[help]
|
||||
pub(crate) struct NaNPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_build_pointer_pattern)]
|
||||
#[note]
|
||||
pub(crate) struct PointerPattern {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +1,17 @@
|
|||
use rustc_abi::{FieldIdx, VariantIdx};
|
||||
use rustc_apfloat::Float;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::Diag;
|
||||
use rustc_hir as hir;
|
||||
use rustc_index::Idx;
|
||||
use rustc_infer::infer::TyCtxtInferExt;
|
||||
use rustc_infer::traits::Obligation;
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::thir::{FieldPat, Pat, PatKind};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt, ValTree};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt, TypeVisitor, ValTree};
|
||||
use rustc_middle::{mir, span_bug};
|
||||
use rustc_span::Span;
|
||||
use rustc_span::def_id::DefId;
|
||||
use rustc_span::{Span, sym};
|
||||
use rustc_trait_selection::traits::ObligationCause;
|
||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
|
@ -35,7 +38,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||
id: hir::HirId,
|
||||
span: Span,
|
||||
) -> Box<Pat<'tcx>> {
|
||||
let mut convert = ConstToPat::new(self, id, span);
|
||||
let mut convert = ConstToPat::new(self, id, span, c);
|
||||
|
||||
match c.kind() {
|
||||
ty::ConstKind::Unevaluated(uv) => convert.unevaluated_to_pat(uv, ty),
|
||||
|
|
@ -49,21 +52,26 @@ struct ConstToPat<'tcx> {
|
|||
tcx: TyCtxt<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
span: Span,
|
||||
id: hir::HirId,
|
||||
|
||||
treat_byte_string_as_slice: bool,
|
||||
|
||||
c: ty::Const<'tcx>,
|
||||
}
|
||||
|
||||
impl<'tcx> ConstToPat<'tcx> {
|
||||
fn new(pat_ctxt: &PatCtxt<'_, 'tcx>, id: hir::HirId, span: Span) -> Self {
|
||||
fn new(pat_ctxt: &PatCtxt<'_, 'tcx>, id: hir::HirId, span: Span, c: ty::Const<'tcx>) -> Self {
|
||||
trace!(?pat_ctxt.typeck_results.hir_owner);
|
||||
ConstToPat {
|
||||
tcx: pat_ctxt.tcx,
|
||||
typing_env: pat_ctxt.typing_env,
|
||||
span,
|
||||
id,
|
||||
treat_byte_string_as_slice: pat_ctxt
|
||||
.typeck_results
|
||||
.treat_byte_string_as_slice
|
||||
.contains(&id.local_id),
|
||||
c,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -71,13 +79,32 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
ty.is_structural_eq_shallow(self.tcx)
|
||||
}
|
||||
|
||||
/// We errored. Signal that in the pattern, so that follow up errors can be silenced.
|
||||
fn mk_err(&self, mut err: Diag<'_>, ty: Ty<'tcx>) -> Box<Pat<'tcx>> {
|
||||
if let ty::ConstKind::Unevaluated(uv) = self.c.kind() {
|
||||
let def_kind = self.tcx.def_kind(uv.def);
|
||||
if let hir::def::DefKind::AssocConst = def_kind
|
||||
&& let Some(def_id) = uv.def.as_local()
|
||||
{
|
||||
// Include the container item in the output.
|
||||
err.span_label(self.tcx.def_span(self.tcx.local_parent(def_id)), "");
|
||||
}
|
||||
if let hir::def::DefKind::Const | hir::def::DefKind::AssocConst = def_kind {
|
||||
err.span_label(
|
||||
self.tcx.def_span(uv.def),
|
||||
crate::fluent_generated::mir_build_const_defined_here,
|
||||
);
|
||||
}
|
||||
}
|
||||
Box::new(Pat { span: self.span, ty, kind: PatKind::Error(err.emit()) })
|
||||
}
|
||||
|
||||
fn unevaluated_to_pat(
|
||||
&mut self,
|
||||
uv: ty::UnevaluatedConst<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> Box<Pat<'tcx>> {
|
||||
trace!(self.treat_byte_string_as_slice);
|
||||
let pat_from_kind = |kind| Box::new(Pat { span: self.span, ty, kind });
|
||||
|
||||
// It's not *technically* correct to be revealing opaque types here as borrowcheck has
|
||||
// not run yet. However, CTFE itself uses `TypingMode::PostAnalysis` unconditionally even
|
||||
|
|
@ -96,32 +123,60 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
Ok(Ok(c)) => c,
|
||||
Err(ErrorHandled::Reported(_, _)) => {
|
||||
// Let's tell the use where this failing const occurs.
|
||||
let e = self.tcx.dcx().emit_err(CouldNotEvalConstPattern { span: self.span });
|
||||
return pat_from_kind(PatKind::Error(e));
|
||||
let mut err =
|
||||
self.tcx.dcx().create_err(CouldNotEvalConstPattern { span: self.span });
|
||||
// We've emitted an error on the original const, it would be redundant to complain
|
||||
// on its use as well.
|
||||
if let ty::ConstKind::Unevaluated(uv) = self.c.kind()
|
||||
&& let hir::def::DefKind::Const | hir::def::DefKind::AssocConst =
|
||||
self.tcx.def_kind(uv.def)
|
||||
{
|
||||
err.downgrade_to_delayed_bug();
|
||||
}
|
||||
return self.mk_err(err, ty);
|
||||
}
|
||||
Err(ErrorHandled::TooGeneric(_)) => {
|
||||
let e = self
|
||||
let mut e = self
|
||||
.tcx
|
||||
.dcx()
|
||||
.emit_err(ConstPatternDependsOnGenericParameter { span: self.span });
|
||||
return pat_from_kind(PatKind::Error(e));
|
||||
.create_err(ConstPatternDependsOnGenericParameter { span: self.span });
|
||||
for arg in uv.args {
|
||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||
&& let ty::Param(param_ty) = ty.kind()
|
||||
{
|
||||
let def_id = self.tcx.hir().enclosing_body_owner(self.id);
|
||||
let generics = self.tcx.generics_of(def_id);
|
||||
let param = generics.type_param(*param_ty, self.tcx);
|
||||
let span = self.tcx.def_span(param.def_id);
|
||||
e.span_label(span, "constant depends on this generic parameter");
|
||||
if let Some(ident) = self.tcx.def_ident_span(def_id)
|
||||
&& self.tcx.sess.source_map().is_multiline(ident.between(span))
|
||||
{
|
||||
// Display the `fn` name as well in the diagnostic, as the generic isn't
|
||||
// in the same line and it could be confusing otherwise.
|
||||
e.span_label(ident, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
return self.mk_err(e, ty);
|
||||
}
|
||||
Ok(Err(bad_ty)) => {
|
||||
// The pattern cannot be turned into a valtree.
|
||||
let e = match bad_ty.kind() {
|
||||
ty::Adt(def, ..) => {
|
||||
assert!(def.is_union());
|
||||
self.tcx.dcx().emit_err(UnionPattern { span: self.span })
|
||||
self.tcx.dcx().create_err(UnionPattern { span: self.span })
|
||||
}
|
||||
ty::FnPtr(..) | ty::RawPtr(..) => {
|
||||
self.tcx.dcx().emit_err(PointerPattern { span: self.span })
|
||||
self.tcx.dcx().create_err(PointerPattern { span: self.span })
|
||||
}
|
||||
_ => self
|
||||
.tcx
|
||||
.dcx()
|
||||
.emit_err(InvalidPattern { span: self.span, non_sm_ty: bad_ty }),
|
||||
_ => self.tcx.dcx().create_err(InvalidPattern {
|
||||
span: self.span,
|
||||
non_sm_ty: bad_ty,
|
||||
prefix: bad_ty.prefix_string(self.tcx).to_string(),
|
||||
}),
|
||||
};
|
||||
return pat_from_kind(PatKind::Error(e));
|
||||
return self.mk_err(e, ty);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -130,42 +185,16 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
|
||||
if !inlined_const_as_pat.references_error() {
|
||||
// Always check for `PartialEq` if we had no other errors yet.
|
||||
if !self.type_has_partial_eq_impl(ty) {
|
||||
let err = TypeNotPartialEq { span: self.span, non_peq_ty: ty };
|
||||
let e = self.tcx.dcx().emit_err(err);
|
||||
return pat_from_kind(PatKind::Error(e));
|
||||
if !type_has_partial_eq_impl(self.tcx, typing_env, ty).0 {
|
||||
let mut err = self.tcx.dcx().create_err(TypeNotPartialEq { span: self.span, ty });
|
||||
extend_type_not_partial_eq(self.tcx, typing_env, ty, &mut err);
|
||||
return self.mk_err(err, ty);
|
||||
}
|
||||
}
|
||||
|
||||
inlined_const_as_pat
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", skip(self), ret)]
|
||||
fn type_has_partial_eq_impl(&self, ty: Ty<'tcx>) -> bool {
|
||||
let (infcx, param_env) = self.tcx.infer_ctxt().build_with_typing_env(self.typing_env);
|
||||
// double-check there even *is* a semantic `PartialEq` to dispatch to.
|
||||
//
|
||||
// (If there isn't, then we can safely issue a hard
|
||||
// error, because that's never worked, due to compiler
|
||||
// using `PartialEq::eq` in this scenario in the past.)
|
||||
let partial_eq_trait_id =
|
||||
self.tcx.require_lang_item(hir::LangItem::PartialEq, Some(self.span));
|
||||
let partial_eq_obligation = Obligation::new(
|
||||
self.tcx,
|
||||
ObligationCause::dummy(),
|
||||
param_env,
|
||||
ty::TraitRef::new(self.tcx, partial_eq_trait_id, [ty, ty]),
|
||||
);
|
||||
|
||||
// This *could* accept a type that isn't actually `PartialEq`, because region bounds get
|
||||
// ignored. However that should be pretty much impossible since consts that do not depend on
|
||||
// generics can only mention the `'static` lifetime, and how would one have a type that's
|
||||
// `PartialEq` for some lifetime but *not* for `'static`? If this ever becomes a problem
|
||||
// we'll need to leave some sort of trace of this requirement in the MIR so that borrowck
|
||||
// can ensure that the type really implements `PartialEq`.
|
||||
infcx.predicate_must_hold_modulo_regions(&partial_eq_obligation)
|
||||
}
|
||||
|
||||
fn field_pats(
|
||||
&self,
|
||||
vals: impl Iterator<Item = (ValTree<'tcx>, Ty<'tcx>)>,
|
||||
|
|
@ -190,10 +219,25 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
// Extremely important check for all ADTs! Make sure they opted-in to be used in
|
||||
// patterns.
|
||||
debug!("adt_def {:?} has !type_marked_structural for cv.ty: {:?}", adt_def, ty);
|
||||
let err = TypeNotStructural { span, non_sm_ty: ty };
|
||||
let e = tcx.dcx().emit_err(err);
|
||||
// We errored. Signal that in the pattern, so that follow up errors can be silenced.
|
||||
PatKind::Error(e)
|
||||
let (_impls_partial_eq, derived, structural, impl_def_id) =
|
||||
type_has_partial_eq_impl(self.tcx, self.typing_env, ty);
|
||||
let (manual_partialeq_impl_span, manual_partialeq_impl_note) =
|
||||
match (structural, impl_def_id) {
|
||||
(true, _) => (None, false),
|
||||
(_, Some(def_id)) if def_id.is_local() && !derived => {
|
||||
(Some(tcx.def_span(def_id)), false)
|
||||
}
|
||||
_ => (None, true),
|
||||
};
|
||||
let ty_def_span = tcx.def_span(adt_def.did());
|
||||
let err = TypeNotStructural {
|
||||
span,
|
||||
ty,
|
||||
ty_def_span,
|
||||
manual_partialeq_impl_span,
|
||||
manual_partialeq_impl_note,
|
||||
};
|
||||
return self.mk_err(tcx.dcx().create_err(err), ty);
|
||||
}
|
||||
ty::Adt(adt_def, args) if adt_def.is_enum() => {
|
||||
let (&variant_index, fields) = cv.unwrap_branch().split_first().unwrap();
|
||||
|
|
@ -207,7 +251,7 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
adt_def.variants()[variant_index]
|
||||
.fields
|
||||
.iter()
|
||||
.map(|field| field.ty(self.tcx, args)),
|
||||
.map(|field| field.ty(tcx, args)),
|
||||
),
|
||||
),
|
||||
}
|
||||
|
|
@ -216,7 +260,7 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
assert!(!def.is_union()); // Valtree construction would never succeed for unions.
|
||||
PatKind::Leaf {
|
||||
subpatterns: self.field_pats(cv.unwrap_branch().iter().copied().zip(
|
||||
def.non_enum_variant().fields.iter().map(|field| field.ty(self.tcx, args)),
|
||||
def.non_enum_variant().fields.iter().map(|field| field.ty(tcx, args)),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
|
@ -252,10 +296,10 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
// deref pattern.
|
||||
_ => {
|
||||
if !pointee_ty.is_sized(tcx, self.typing_env) && !pointee_ty.is_slice() {
|
||||
let err = UnsizedPattern { span, non_sm_ty: *pointee_ty };
|
||||
let e = tcx.dcx().emit_err(err);
|
||||
// We errored. Signal that in the pattern, so that follow up errors can be silenced.
|
||||
PatKind::Error(e)
|
||||
return self.mk_err(
|
||||
tcx.dcx().create_err(UnsizedPattern { span, non_sm_ty: *pointee_ty }),
|
||||
ty,
|
||||
);
|
||||
} else {
|
||||
// `b"foo"` produces a `&[u8; 3]`, but you can't use constants of array type when
|
||||
// matching against references, you can only use byte string literals.
|
||||
|
|
@ -286,8 +330,7 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
if is_nan {
|
||||
// NaNs are not ever equal to anything so they make no sense as patterns.
|
||||
// Also see <https://github.com/rust-lang/rfcs/pull/3535>.
|
||||
let e = tcx.dcx().emit_err(NaNPattern { span });
|
||||
PatKind::Error(e)
|
||||
return self.mk_err(tcx.dcx().create_err(NaNPattern { span }), ty);
|
||||
} else {
|
||||
PatKind::Constant {
|
||||
value: mir::Const::Ty(ty, ty::Const::new_value(tcx, cv, ty)),
|
||||
|
|
@ -305,13 +348,153 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
)
|
||||
}
|
||||
_ => {
|
||||
let err = InvalidPattern { span, non_sm_ty: ty };
|
||||
let e = tcx.dcx().emit_err(err);
|
||||
// We errored. Signal that in the pattern, so that follow up errors can be silenced.
|
||||
PatKind::Error(e)
|
||||
let err = InvalidPattern {
|
||||
span,
|
||||
non_sm_ty: ty,
|
||||
prefix: ty.prefix_string(tcx).to_string(),
|
||||
};
|
||||
return self.mk_err(tcx.dcx().create_err(err), ty);
|
||||
}
|
||||
};
|
||||
|
||||
Box::new(Pat { span, ty, kind })
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a type with type parameters, visit every ADT looking for types that need to
|
||||
/// `#[derive(PartialEq)]` for it to be a structural type.
|
||||
fn extend_type_not_partial_eq<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
err: &mut Diag<'_>,
|
||||
) {
|
||||
/// Collect all types that need to be `StructuralPartialEq`.
|
||||
struct UsedParamsNeedInstantiationVisitor<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
/// The user has written `impl PartialEq for Ty` which means it's non-structual.
|
||||
adts_with_manual_partialeq: FxHashSet<Span>,
|
||||
/// The type has no `PartialEq` implementation, neither manual or derived.
|
||||
adts_without_partialeq: FxHashSet<Span>,
|
||||
/// The user has written `impl PartialEq for Ty` which means it's non-structual,
|
||||
/// but we don't have a span to point at, so we'll just add them as a `note`.
|
||||
manual: Vec<Ty<'tcx>>,
|
||||
/// The type has no `PartialEq` implementation, neither manual or derived, but
|
||||
/// we don't have a span to point at, so we'll just add them as a `note`.
|
||||
without: Vec<Ty<'tcx>>,
|
||||
}
|
||||
|
||||
impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for UsedParamsNeedInstantiationVisitor<'tcx> {
|
||||
fn visit_ty(&mut self, ty: Ty<'tcx>) -> Self::Result {
|
||||
if let ty::Adt(def, _args) = ty.kind() {
|
||||
let ty_def_id = def.did();
|
||||
let ty_def_span = self.tcx.def_span(ty_def_id);
|
||||
let (impls_partial_eq, derived, structural, impl_def_id) =
|
||||
type_has_partial_eq_impl(self.tcx, self.typing_env, ty);
|
||||
match (impls_partial_eq, derived, structural, impl_def_id) {
|
||||
(_, _, true, _) => {}
|
||||
(true, false, _, Some(def_id)) if def_id.is_local() => {
|
||||
self.adts_with_manual_partialeq.insert(self.tcx.def_span(def_id));
|
||||
}
|
||||
(true, false, _, _) if ty_def_id.is_local() => {
|
||||
self.adts_with_manual_partialeq.insert(ty_def_span);
|
||||
}
|
||||
(false, _, _, _) if ty_def_id.is_local() => {
|
||||
self.adts_without_partialeq.insert(ty_def_span);
|
||||
}
|
||||
(true, false, _, _) => {
|
||||
self.manual.push(ty);
|
||||
}
|
||||
(false, _, _, _) => {
|
||||
self.without.push(ty);
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
}
|
||||
use rustc_middle::ty::TypeSuperVisitable;
|
||||
ty.super_visit_with(self)
|
||||
}
|
||||
}
|
||||
let mut v = UsedParamsNeedInstantiationVisitor {
|
||||
tcx,
|
||||
typing_env,
|
||||
adts_with_manual_partialeq: FxHashSet::default(),
|
||||
adts_without_partialeq: FxHashSet::default(),
|
||||
manual: vec![],
|
||||
without: vec![],
|
||||
};
|
||||
v.visit_ty(ty);
|
||||
#[allow(rustc::potential_query_instability)] // Span labels will be sorted by the rendering
|
||||
for span in v.adts_with_manual_partialeq {
|
||||
err.span_note(span, "the `PartialEq` trait must be derived, manual `impl`s are not sufficient; see https://doc.rust-lang.org/stable/std/marker/trait.StructuralPartialEq.html for details");
|
||||
}
|
||||
#[allow(rustc::potential_query_instability)] // Span labels will be sorted by the rendering
|
||||
for span in v.adts_without_partialeq {
|
||||
err.span_label(
|
||||
span,
|
||||
"must be annotated with `#[derive(PartialEq)]` to be usable in patterns",
|
||||
);
|
||||
}
|
||||
for ty in v.manual {
|
||||
err.note(format!(
|
||||
"`{ty}` must be annotated with `#[derive(PartialEq)]` to be usable in patterns, manual `impl`s are not sufficient; see https://doc.rust-lang.org/stable/std/marker/trait.StructuralPartialEq.html for details"
|
||||
));
|
||||
}
|
||||
for ty in v.without {
|
||||
err.note(format!(
|
||||
"`{ty}` must be annotated with `#[derive(PartialEq)]` to be usable in patterns"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", skip(tcx), ret)]
|
||||
fn type_has_partial_eq_impl<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
) -> (
|
||||
/* has impl */ bool,
|
||||
/* is derived */ bool,
|
||||
/* structural partial eq */ bool,
|
||||
/* non-blanket impl */ Option<DefId>,
|
||||
) {
|
||||
let (infcx, param_env) = tcx.infer_ctxt().build_with_typing_env(typing_env);
|
||||
// double-check there even *is* a semantic `PartialEq` to dispatch to.
|
||||
//
|
||||
// (If there isn't, then we can safely issue a hard
|
||||
// error, because that's never worked, due to compiler
|
||||
// using `PartialEq::eq` in this scenario in the past.)
|
||||
let partial_eq_trait_id = tcx.require_lang_item(hir::LangItem::PartialEq, None);
|
||||
let structural_partial_eq_trait_id = tcx.require_lang_item(hir::LangItem::StructuralPeq, None);
|
||||
|
||||
let partial_eq_obligation = Obligation::new(
|
||||
tcx,
|
||||
ObligationCause::dummy(),
|
||||
param_env,
|
||||
ty::TraitRef::new(tcx, partial_eq_trait_id, [ty, ty]),
|
||||
);
|
||||
|
||||
let mut automatically_derived = false;
|
||||
let mut structural_peq = false;
|
||||
let mut impl_def_id = None;
|
||||
for def_id in tcx.non_blanket_impls_for_ty(partial_eq_trait_id, ty) {
|
||||
automatically_derived = tcx.has_attr(def_id, sym::automatically_derived);
|
||||
impl_def_id = Some(def_id);
|
||||
}
|
||||
for _ in tcx.non_blanket_impls_for_ty(structural_partial_eq_trait_id, ty) {
|
||||
structural_peq = true;
|
||||
}
|
||||
// This *could* accept a type that isn't actually `PartialEq`, because region bounds get
|
||||
// ignored. However that should be pretty much impossible since consts that do not depend on
|
||||
// generics can only mention the `'static` lifetime, and how would one have a type that's
|
||||
// `PartialEq` for some lifetime but *not* for `'static`? If this ever becomes a problem
|
||||
// we'll need to leave some sort of trace of this requirement in the MIR so that borrowck
|
||||
// can ensure that the type really implements `PartialEq`.
|
||||
(
|
||||
infcx.predicate_must_hold_modulo_regions(&partial_eq_obligation),
|
||||
automatically_derived,
|
||||
structural_peq,
|
||||
impl_def_id,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -528,11 +528,17 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||
| Res::SelfCtor(..) => PatKind::Leaf { subpatterns },
|
||||
_ => {
|
||||
let e = match res {
|
||||
Res::Def(DefKind::ConstParam, _) => {
|
||||
self.tcx.dcx().emit_err(ConstParamInPattern { span })
|
||||
Res::Def(DefKind::ConstParam, def_id) => {
|
||||
self.tcx.dcx().emit_err(ConstParamInPattern {
|
||||
span,
|
||||
const_span: self.tcx().def_span(def_id),
|
||||
})
|
||||
}
|
||||
Res::Def(DefKind::Static { .. }, _) => {
|
||||
self.tcx.dcx().emit_err(StaticInPattern { span })
|
||||
Res::Def(DefKind::Static { .. }, def_id) => {
|
||||
self.tcx.dcx().emit_err(StaticInPattern {
|
||||
span,
|
||||
static_span: self.tcx().def_span(def_id),
|
||||
})
|
||||
}
|
||||
_ => self.tcx.dcx().emit_err(NonConstPath { span }),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use std::cmp::Ordering;
|
||||
use std::fmt::{self, Debug};
|
||||
|
||||
use rustc_data_structures::captures::Captures;
|
||||
|
|
@ -10,9 +11,12 @@ use tracing::{debug, debug_span, instrument};
|
|||
|
||||
use crate::coverage::graph::{BasicCoverageBlock, CoverageGraph, TraverseCoverageGraphWithLoops};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
/// The coverage counter or counter expression associated with a particular
|
||||
/// BCB node or BCB edge.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
enum BcbCounter {
|
||||
Counter { id: CounterId },
|
||||
Expression { id: ExpressionId },
|
||||
|
|
@ -43,8 +47,9 @@ struct BcbExpression {
|
|||
rhs: BcbCounter,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum CounterIncrementSite {
|
||||
/// Enum representing either a node or an edge in the coverage graph.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub(super) enum Site {
|
||||
Node { bcb: BasicCoverageBlock },
|
||||
Edge { from_bcb: BasicCoverageBlock, to_bcb: BasicCoverageBlock },
|
||||
}
|
||||
|
|
@ -54,16 +59,10 @@ pub(super) enum CounterIncrementSite {
|
|||
pub(super) struct CoverageCounters {
|
||||
/// List of places where a counter-increment statement should be injected
|
||||
/// into MIR, each with its corresponding counter ID.
|
||||
counter_increment_sites: IndexVec<CounterId, CounterIncrementSite>,
|
||||
counter_increment_sites: IndexVec<CounterId, Site>,
|
||||
|
||||
/// Coverage counters/expressions that are associated with individual BCBs.
|
||||
node_counters: IndexVec<BasicCoverageBlock, Option<BcbCounter>>,
|
||||
/// Coverage counters/expressions that are associated with the control-flow
|
||||
/// edge between two BCBs.
|
||||
///
|
||||
/// We currently don't iterate over this map, but if we do in the future,
|
||||
/// switch it back to `FxIndexMap` to avoid query stability hazards.
|
||||
edge_counters: FxHashMap<(BasicCoverageBlock, BasicCoverageBlock), BcbCounter>,
|
||||
|
||||
/// Table of expression data, associating each expression ID with its
|
||||
/// corresponding operator (+ or -) and its LHS/RHS operands.
|
||||
|
|
@ -83,93 +82,30 @@ impl CoverageCounters {
|
|||
let mut builder = CountersBuilder::new(graph, bcb_needs_counter);
|
||||
builder.make_bcb_counters();
|
||||
|
||||
builder.counters
|
||||
builder.into_coverage_counters()
|
||||
}
|
||||
|
||||
fn with_num_bcbs(num_bcbs: usize) -> Self {
|
||||
Self {
|
||||
counter_increment_sites: IndexVec::new(),
|
||||
node_counters: IndexVec::from_elem_n(None, num_bcbs),
|
||||
edge_counters: FxHashMap::default(),
|
||||
expressions: IndexVec::new(),
|
||||
expressions_memo: FxHashMap::default(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Shared helper used by [`Self::make_phys_node_counter`] and
|
||||
/// [`Self::make_phys_edge_counter`]. Don't call this directly.
|
||||
fn make_counter_inner(&mut self, site: CounterIncrementSite) -> BcbCounter {
|
||||
/// Creates a new physical counter for a BCB node or edge.
|
||||
fn make_phys_counter(&mut self, site: Site) -> BcbCounter {
|
||||
let id = self.counter_increment_sites.push(site);
|
||||
BcbCounter::Counter { id }
|
||||
}
|
||||
|
||||
/// Creates a new physical counter for a BCB node.
|
||||
fn make_phys_node_counter(&mut self, bcb: BasicCoverageBlock) -> BcbCounter {
|
||||
self.make_counter_inner(CounterIncrementSite::Node { bcb })
|
||||
}
|
||||
|
||||
/// Creates a new physical counter for a BCB edge.
|
||||
fn make_phys_edge_counter(
|
||||
&mut self,
|
||||
from_bcb: BasicCoverageBlock,
|
||||
to_bcb: BasicCoverageBlock,
|
||||
) -> BcbCounter {
|
||||
self.make_counter_inner(CounterIncrementSite::Edge { from_bcb, to_bcb })
|
||||
}
|
||||
|
||||
fn make_expression(&mut self, lhs: BcbCounter, op: Op, rhs: BcbCounter) -> BcbCounter {
|
||||
let new_expr = BcbExpression { lhs, op, rhs };
|
||||
*self
|
||||
.expressions_memo
|
||||
.entry(new_expr)
|
||||
.or_insert_with(|| Self::make_expression_inner(&mut self.expressions, new_expr))
|
||||
}
|
||||
|
||||
/// This is an associated function so that we can call it while borrowing
|
||||
/// `&mut self.expressions_memo`.
|
||||
fn make_expression_inner(
|
||||
expressions: &mut IndexVec<ExpressionId, BcbExpression>,
|
||||
new_expr: BcbExpression,
|
||||
) -> BcbCounter {
|
||||
// Simplify expressions using basic algebra.
|
||||
//
|
||||
// Some of these cases might not actually occur in practice, depending
|
||||
// on the details of how the instrumentor builds expressions.
|
||||
let BcbExpression { lhs, op, rhs } = new_expr;
|
||||
|
||||
if let BcbCounter::Expression { id } = lhs {
|
||||
let lhs_expr = &expressions[id];
|
||||
|
||||
// Simplify `(a - b) + b` to `a`.
|
||||
if lhs_expr.op == Op::Subtract && op == Op::Add && lhs_expr.rhs == rhs {
|
||||
return lhs_expr.lhs;
|
||||
}
|
||||
// Simplify `(a + b) - b` to `a`.
|
||||
if lhs_expr.op == Op::Add && op == Op::Subtract && lhs_expr.rhs == rhs {
|
||||
return lhs_expr.lhs;
|
||||
}
|
||||
// Simplify `(a + b) - a` to `b`.
|
||||
if lhs_expr.op == Op::Add && op == Op::Subtract && lhs_expr.lhs == rhs {
|
||||
return lhs_expr.rhs;
|
||||
}
|
||||
}
|
||||
|
||||
if let BcbCounter::Expression { id } = rhs {
|
||||
let rhs_expr = &expressions[id];
|
||||
|
||||
// Simplify `a + (b - a)` to `b`.
|
||||
if op == Op::Add && rhs_expr.op == Op::Subtract && lhs == rhs_expr.rhs {
|
||||
return rhs_expr.lhs;
|
||||
}
|
||||
// Simplify `a - (a - b)` to `b`.
|
||||
if op == Op::Subtract && rhs_expr.op == Op::Subtract && lhs == rhs_expr.lhs {
|
||||
return rhs_expr.rhs;
|
||||
}
|
||||
}
|
||||
|
||||
// Simplification failed, so actually create the new expression.
|
||||
let id = expressions.push(new_expr);
|
||||
BcbCounter::Expression { id }
|
||||
*self.expressions_memo.entry(new_expr).or_insert_with(|| {
|
||||
let id = self.expressions.push(new_expr);
|
||||
BcbCounter::Expression { id }
|
||||
})
|
||||
}
|
||||
|
||||
/// Creates a counter that is the sum of the given counters.
|
||||
|
|
@ -182,6 +118,12 @@ impl CoverageCounters {
|
|||
.reduce(|accum, counter| self.make_expression(accum, Op::Add, counter))
|
||||
}
|
||||
|
||||
/// Creates a counter whose value is `lhs - SUM(rhs)`.
|
||||
fn make_subtracted_sum(&mut self, lhs: BcbCounter, rhs: &[BcbCounter]) -> BcbCounter {
|
||||
let Some(rhs_sum) = self.make_sum(rhs) else { return lhs };
|
||||
self.make_expression(lhs, Op::Subtract, rhs_sum)
|
||||
}
|
||||
|
||||
pub(super) fn num_counters(&self) -> usize {
|
||||
self.counter_increment_sites.len()
|
||||
}
|
||||
|
|
@ -195,20 +137,6 @@ impl CoverageCounters {
|
|||
counter
|
||||
}
|
||||
|
||||
fn set_edge_counter(
|
||||
&mut self,
|
||||
from_bcb: BasicCoverageBlock,
|
||||
to_bcb: BasicCoverageBlock,
|
||||
counter: BcbCounter,
|
||||
) -> BcbCounter {
|
||||
let existing = self.edge_counters.insert((from_bcb, to_bcb), counter);
|
||||
assert!(
|
||||
existing.is_none(),
|
||||
"edge ({from_bcb:?} -> {to_bcb:?}) already has a counter: {existing:?} => {counter:?}"
|
||||
);
|
||||
counter
|
||||
}
|
||||
|
||||
pub(super) fn term_for_bcb(&self, bcb: BasicCoverageBlock) -> Option<CovTerm> {
|
||||
self.node_counters[bcb].map(|counter| counter.as_term())
|
||||
}
|
||||
|
|
@ -218,8 +146,8 @@ impl CoverageCounters {
|
|||
/// each site's corresponding counter ID.
|
||||
pub(super) fn counter_increment_sites(
|
||||
&self,
|
||||
) -> impl Iterator<Item = (CounterId, &CounterIncrementSite)> {
|
||||
self.counter_increment_sites.iter_enumerated()
|
||||
) -> impl Iterator<Item = (CounterId, Site)> + Captures<'_> {
|
||||
self.counter_increment_sites.iter_enumerated().map(|(id, &site)| (id, site))
|
||||
}
|
||||
|
||||
/// Returns an iterator over the subset of BCB nodes that have been associated
|
||||
|
|
@ -254,22 +182,53 @@ impl CoverageCounters {
|
|||
}
|
||||
}
|
||||
|
||||
/// Symbolic representation of the coverage counter to be used for a particular
|
||||
/// node or edge in the coverage graph. The same site counter can be used for
|
||||
/// multiple sites, if they have been determined to have the same count.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
enum SiteCounter {
|
||||
/// A physical counter at some node/edge.
|
||||
Phys { site: Site },
|
||||
/// A counter expression for a node that takes the sum of all its in-edge
|
||||
/// counters.
|
||||
NodeSumExpr { bcb: BasicCoverageBlock },
|
||||
/// A counter expression for an edge that takes the counter of its source
|
||||
/// node, and subtracts the counters of all its sibling out-edges.
|
||||
EdgeDiffExpr { from_bcb: BasicCoverageBlock, to_bcb: BasicCoverageBlock },
|
||||
}
|
||||
|
||||
/// Yields the graph successors of `from_bcb` that aren't `to_bcb`. This is
|
||||
/// used when creating a counter expression for [`SiteCounter::EdgeDiffExpr`].
|
||||
///
|
||||
/// For example, in this diagram the sibling out-edge targets of edge `AC` are
|
||||
/// the nodes `B` and `D`.
|
||||
///
|
||||
/// ```text
|
||||
/// A
|
||||
/// / | \
|
||||
/// B C D
|
||||
/// ```
|
||||
fn sibling_out_edge_targets(
|
||||
graph: &CoverageGraph,
|
||||
from_bcb: BasicCoverageBlock,
|
||||
to_bcb: BasicCoverageBlock,
|
||||
) -> impl Iterator<Item = BasicCoverageBlock> + Captures<'_> {
|
||||
graph.successors[from_bcb].iter().copied().filter(move |&t| t != to_bcb)
|
||||
}
|
||||
|
||||
/// Helper struct that allows counter creation to inspect the BCB graph, and
|
||||
/// the set of nodes that need counters.
|
||||
struct CountersBuilder<'a> {
|
||||
counters: CoverageCounters,
|
||||
graph: &'a CoverageGraph,
|
||||
bcb_needs_counter: &'a BitSet<BasicCoverageBlock>,
|
||||
|
||||
site_counters: FxHashMap<Site, SiteCounter>,
|
||||
}
|
||||
|
||||
impl<'a> CountersBuilder<'a> {
|
||||
fn new(graph: &'a CoverageGraph, bcb_needs_counter: &'a BitSet<BasicCoverageBlock>) -> Self {
|
||||
assert_eq!(graph.num_nodes(), bcb_needs_counter.domain_size());
|
||||
Self {
|
||||
counters: CoverageCounters::with_num_bcbs(graph.num_nodes()),
|
||||
graph,
|
||||
bcb_needs_counter,
|
||||
}
|
||||
Self { graph, bcb_needs_counter, site_counters: FxHashMap::default() }
|
||||
}
|
||||
|
||||
fn make_bcb_counters(&mut self) {
|
||||
|
|
@ -302,9 +261,7 @@ impl<'a> CountersBuilder<'a> {
|
|||
fn make_node_counter_and_out_edge_counters(&mut self, from_bcb: BasicCoverageBlock) {
|
||||
// First, ensure that this node has a counter of some kind.
|
||||
// We might also use that counter to compute one of the out-edge counters.
|
||||
let node_counter = self.get_or_make_node_counter(from_bcb);
|
||||
|
||||
let successors = self.graph.successors[from_bcb].as_slice();
|
||||
self.get_or_make_node_counter(from_bcb);
|
||||
|
||||
// If this node's out-edges won't sum to the node's counter,
|
||||
// then there's no reason to create edge counters here.
|
||||
|
|
@ -315,11 +272,11 @@ impl<'a> CountersBuilder<'a> {
|
|||
// When choosing which out-edge should be given a counter expression, ignore edges that
|
||||
// already have counters, or could use the existing counter of their target node.
|
||||
let out_edge_has_counter = |to_bcb| {
|
||||
if self.counters.edge_counters.contains_key(&(from_bcb, to_bcb)) {
|
||||
if self.site_counters.contains_key(&Site::Edge { from_bcb, to_bcb }) {
|
||||
return true;
|
||||
}
|
||||
self.graph.sole_predecessor(to_bcb) == Some(from_bcb)
|
||||
&& self.counters.node_counters[to_bcb].is_some()
|
||||
&& self.site_counters.contains_key(&Site::Node { bcb: to_bcb })
|
||||
};
|
||||
|
||||
// Determine the set of out-edges that could benefit from being given an expression.
|
||||
|
|
@ -332,51 +289,41 @@ impl<'a> CountersBuilder<'a> {
|
|||
|
||||
// If there are out-edges without counters, choose one to be given an expression
|
||||
// (computed from this node and the other out-edges) instead of a physical counter.
|
||||
let Some(target_bcb) = self.choose_out_edge_for_expression(from_bcb, &candidate_successors)
|
||||
let Some(to_bcb) = self.choose_out_edge_for_expression(from_bcb, &candidate_successors)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
// For each out-edge other than the one that was chosen to get an expression,
|
||||
// ensure that it has a counter (existing counter/expression or a new counter),
|
||||
// and accumulate the corresponding counters into a single sum expression.
|
||||
let other_out_edge_counters = successors
|
||||
.iter()
|
||||
.copied()
|
||||
// Skip the chosen edge, since we'll calculate its count from this sum.
|
||||
.filter(|&edge_target_bcb| edge_target_bcb != target_bcb)
|
||||
.map(|to_bcb| self.get_or_make_edge_counter(from_bcb, to_bcb))
|
||||
.collect::<Vec<_>>();
|
||||
let Some(sum_of_all_other_out_edges) = self.counters.make_sum(&other_out_edge_counters)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
// ensure that it has a counter (existing counter/expression or a new counter).
|
||||
for target in sibling_out_edge_targets(self.graph, from_bcb, to_bcb) {
|
||||
self.get_or_make_edge_counter(from_bcb, target);
|
||||
}
|
||||
|
||||
// Now create an expression for the chosen edge, by taking the counter
|
||||
// for its source node and subtracting the sum of its sibling out-edges.
|
||||
let expression =
|
||||
self.counters.make_expression(node_counter, Op::Subtract, sum_of_all_other_out_edges);
|
||||
|
||||
debug!("{target_bcb:?} gets an expression: {expression:?}");
|
||||
self.counters.set_edge_counter(from_bcb, target_bcb, expression);
|
||||
let counter = SiteCounter::EdgeDiffExpr { from_bcb, to_bcb };
|
||||
self.site_counters.insert(Site::Edge { from_bcb, to_bcb }, counter);
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
fn get_or_make_node_counter(&mut self, bcb: BasicCoverageBlock) -> BcbCounter {
|
||||
fn get_or_make_node_counter(&mut self, bcb: BasicCoverageBlock) -> SiteCounter {
|
||||
// If the BCB already has a counter, return it.
|
||||
if let Some(counter) = self.counters.node_counters[bcb] {
|
||||
if let Some(&counter) = self.site_counters.get(&Site::Node { bcb }) {
|
||||
debug!("{bcb:?} already has a counter: {counter:?}");
|
||||
return counter;
|
||||
}
|
||||
|
||||
let counter = self.make_node_counter_inner(bcb);
|
||||
self.counters.set_node_counter(bcb, counter)
|
||||
self.site_counters.insert(Site::Node { bcb }, counter);
|
||||
counter
|
||||
}
|
||||
|
||||
fn make_node_counter_inner(&mut self, bcb: BasicCoverageBlock) -> BcbCounter {
|
||||
fn make_node_counter_inner(&mut self, bcb: BasicCoverageBlock) -> SiteCounter {
|
||||
// If the node's sole in-edge already has a counter, use that.
|
||||
if let Some(sole_pred) = self.graph.sole_predecessor(bcb)
|
||||
&& let Some(&edge_counter) = self.counters.edge_counters.get(&(sole_pred, bcb))
|
||||
&& let Some(&edge_counter) =
|
||||
self.site_counters.get(&Site::Edge { from_bcb: sole_pred, to_bcb: bcb })
|
||||
{
|
||||
return edge_counter;
|
||||
}
|
||||
|
|
@ -390,20 +337,17 @@ impl<'a> CountersBuilder<'a> {
|
|||
// leading to infinite recursion.
|
||||
if predecessors.len() <= 1 || predecessors.contains(&bcb) {
|
||||
debug!(?bcb, ?predecessors, "node has <=1 predecessors or is its own predecessor");
|
||||
let counter = self.counters.make_phys_node_counter(bcb);
|
||||
let counter = SiteCounter::Phys { site: Site::Node { bcb } };
|
||||
debug!(?bcb, ?counter, "node gets a physical counter");
|
||||
return counter;
|
||||
}
|
||||
|
||||
// A BCB with multiple incoming edges can compute its count by ensuring that counters
|
||||
// exist for each of those edges, and then adding them up to get a total count.
|
||||
let in_edge_counters = predecessors
|
||||
.iter()
|
||||
.copied()
|
||||
.map(|from_bcb| self.get_or_make_edge_counter(from_bcb, bcb))
|
||||
.collect::<Vec<_>>();
|
||||
let sum_of_in_edges: BcbCounter =
|
||||
self.counters.make_sum(&in_edge_counters).expect("there must be at least one in-edge");
|
||||
for &from_bcb in predecessors {
|
||||
self.get_or_make_edge_counter(from_bcb, bcb);
|
||||
}
|
||||
let sum_of_in_edges = SiteCounter::NodeSumExpr { bcb };
|
||||
|
||||
debug!("{bcb:?} gets a new counter (sum of predecessor counters): {sum_of_in_edges:?}");
|
||||
sum_of_in_edges
|
||||
|
|
@ -414,22 +358,23 @@ impl<'a> CountersBuilder<'a> {
|
|||
&mut self,
|
||||
from_bcb: BasicCoverageBlock,
|
||||
to_bcb: BasicCoverageBlock,
|
||||
) -> BcbCounter {
|
||||
) -> SiteCounter {
|
||||
// If the edge already has a counter, return it.
|
||||
if let Some(&counter) = self.counters.edge_counters.get(&(from_bcb, to_bcb)) {
|
||||
if let Some(&counter) = self.site_counters.get(&Site::Edge { from_bcb, to_bcb }) {
|
||||
debug!("Edge {from_bcb:?}->{to_bcb:?} already has a counter: {counter:?}");
|
||||
return counter;
|
||||
}
|
||||
|
||||
let counter = self.make_edge_counter_inner(from_bcb, to_bcb);
|
||||
self.counters.set_edge_counter(from_bcb, to_bcb, counter)
|
||||
self.site_counters.insert(Site::Edge { from_bcb, to_bcb }, counter);
|
||||
counter
|
||||
}
|
||||
|
||||
fn make_edge_counter_inner(
|
||||
&mut self,
|
||||
from_bcb: BasicCoverageBlock,
|
||||
to_bcb: BasicCoverageBlock,
|
||||
) -> BcbCounter {
|
||||
) -> SiteCounter {
|
||||
// If the target node has exactly one in-edge (i.e. this one), then just
|
||||
// use the node's counter, since it will have the same value.
|
||||
if let Some(sole_pred) = self.graph.sole_predecessor(to_bcb) {
|
||||
|
|
@ -447,7 +392,7 @@ impl<'a> CountersBuilder<'a> {
|
|||
}
|
||||
|
||||
// Make a new counter to count this edge.
|
||||
let counter = self.counters.make_phys_edge_counter(from_bcb, to_bcb);
|
||||
let counter = SiteCounter::Phys { site: Site::Edge { from_bcb, to_bcb } };
|
||||
debug!(?from_bcb, ?to_bcb, ?counter, "edge gets a physical counter");
|
||||
counter
|
||||
}
|
||||
|
|
@ -510,4 +455,145 @@ impl<'a> CountersBuilder<'a> {
|
|||
|
||||
None
|
||||
}
|
||||
|
||||
fn into_coverage_counters(self) -> CoverageCounters {
|
||||
Transcriber::new(&self).transcribe_counters()
|
||||
}
|
||||
}
|
||||
|
||||
/// Helper struct for converting `CountersBuilder` into a final `CoverageCounters`.
|
||||
struct Transcriber<'a> {
|
||||
old: &'a CountersBuilder<'a>,
|
||||
new: CoverageCounters,
|
||||
phys_counter_for_site: FxHashMap<Site, BcbCounter>,
|
||||
}
|
||||
|
||||
impl<'a> Transcriber<'a> {
|
||||
fn new(old: &'a CountersBuilder<'a>) -> Self {
|
||||
Self {
|
||||
old,
|
||||
new: CoverageCounters::with_num_bcbs(old.graph.num_nodes()),
|
||||
phys_counter_for_site: FxHashMap::default(),
|
||||
}
|
||||
}
|
||||
|
||||
fn transcribe_counters(mut self) -> CoverageCounters {
|
||||
for bcb in self.old.bcb_needs_counter.iter() {
|
||||
let site = Site::Node { bcb };
|
||||
let site_counter = self.site_counter(site);
|
||||
|
||||
// Resolve the site counter into flat lists of nodes/edges whose
|
||||
// physical counts contribute to the counter for this node.
|
||||
// Distinguish between counts that will be added vs subtracted.
|
||||
let mut pos = vec![];
|
||||
let mut neg = vec![];
|
||||
self.push_resolved_sites(site_counter, &mut pos, &mut neg);
|
||||
|
||||
// Simplify by cancelling out sites that appear on both sides.
|
||||
let (mut pos, mut neg) = sort_and_cancel(pos, neg);
|
||||
|
||||
if pos.is_empty() {
|
||||
// If we somehow end up with no positive terms after cancellation,
|
||||
// fall back to creating a physical counter. There's no known way
|
||||
// for this to happen, but it's hard to confidently rule it out.
|
||||
debug_assert!(false, "{site:?} has no positive counter terms");
|
||||
pos = vec![Some(site)];
|
||||
neg = vec![];
|
||||
}
|
||||
|
||||
let mut new_counters_for_sites = |sites: Vec<Option<Site>>| {
|
||||
sites
|
||||
.into_iter()
|
||||
.filter_map(|id| try { self.ensure_phys_counter(id?) })
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let mut pos = new_counters_for_sites(pos);
|
||||
let mut neg = new_counters_for_sites(neg);
|
||||
|
||||
pos.sort();
|
||||
neg.sort();
|
||||
|
||||
let pos_counter = self.new.make_sum(&pos).expect("`pos` should not be empty");
|
||||
let new_counter = self.new.make_subtracted_sum(pos_counter, &neg);
|
||||
self.new.set_node_counter(bcb, new_counter);
|
||||
}
|
||||
|
||||
self.new
|
||||
}
|
||||
|
||||
fn site_counter(&self, site: Site) -> SiteCounter {
|
||||
self.old.site_counters.get(&site).copied().unwrap_or_else(|| {
|
||||
// We should have already created all necessary site counters.
|
||||
// But if we somehow didn't, avoid crashing in release builds,
|
||||
// and just use an extra physical counter instead.
|
||||
debug_assert!(false, "{site:?} should have a counter");
|
||||
SiteCounter::Phys { site }
|
||||
})
|
||||
}
|
||||
|
||||
fn ensure_phys_counter(&mut self, site: Site) -> BcbCounter {
|
||||
*self.phys_counter_for_site.entry(site).or_insert_with(|| self.new.make_phys_counter(site))
|
||||
}
|
||||
|
||||
/// Resolves the given counter into flat lists of nodes/edges, whose counters
|
||||
/// will then be added and subtracted to form a counter expression.
|
||||
fn push_resolved_sites(&self, counter: SiteCounter, pos: &mut Vec<Site>, neg: &mut Vec<Site>) {
|
||||
match counter {
|
||||
SiteCounter::Phys { site } => pos.push(site),
|
||||
SiteCounter::NodeSumExpr { bcb } => {
|
||||
for &from_bcb in &self.old.graph.predecessors[bcb] {
|
||||
let edge_counter = self.site_counter(Site::Edge { from_bcb, to_bcb: bcb });
|
||||
self.push_resolved_sites(edge_counter, pos, neg);
|
||||
}
|
||||
}
|
||||
SiteCounter::EdgeDiffExpr { from_bcb, to_bcb } => {
|
||||
// First, add the count for `from_bcb`.
|
||||
let node_counter = self.site_counter(Site::Node { bcb: from_bcb });
|
||||
self.push_resolved_sites(node_counter, pos, neg);
|
||||
|
||||
// Then subtract the counts for the other out-edges.
|
||||
for target in sibling_out_edge_targets(self.old.graph, from_bcb, to_bcb) {
|
||||
let edge_counter = self.site_counter(Site::Edge { from_bcb, to_bcb: target });
|
||||
// Swap `neg` and `pos` so that the counter is subtracted.
|
||||
self.push_resolved_sites(edge_counter, neg, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Given two lists:
|
||||
/// - Sorts each list.
|
||||
/// - Converts each list to `Vec<Option<T>>`.
|
||||
/// - Scans for values that appear in both lists, and cancels them out by
|
||||
/// replacing matching pairs of values with `None`.
|
||||
fn sort_and_cancel<T: Ord>(mut pos: Vec<T>, mut neg: Vec<T>) -> (Vec<Option<T>>, Vec<Option<T>>) {
|
||||
pos.sort();
|
||||
neg.sort();
|
||||
|
||||
// Convert to `Vec<Option<T>>`. If `T` has a niche, this should be zero-cost.
|
||||
let mut pos = pos.into_iter().map(Some).collect::<Vec<_>>();
|
||||
let mut neg = neg.into_iter().map(Some).collect::<Vec<_>>();
|
||||
|
||||
// Scan through the lists using two cursors. When either cursor reaches the
|
||||
// end of its list, there can be no more equal pairs, so stop.
|
||||
let mut p = 0;
|
||||
let mut n = 0;
|
||||
while p < pos.len() && n < neg.len() {
|
||||
// If the values are equal, remove them and advance both cursors.
|
||||
// Otherwise, advance whichever cursor points to the lesser value.
|
||||
// (Choosing which cursor to advance relies on both lists being sorted.)
|
||||
match pos[p].cmp(&neg[n]) {
|
||||
Ordering::Less => p += 1,
|
||||
Ordering::Equal => {
|
||||
pos[p] = None;
|
||||
neg[n] = None;
|
||||
p += 1;
|
||||
n += 1;
|
||||
}
|
||||
Ordering::Greater => n += 1,
|
||||
}
|
||||
}
|
||||
|
||||
(pos, neg)
|
||||
}
|
||||
|
|
|
|||
41
compiler/rustc_mir_transform/src/coverage/counters/tests.rs
Normal file
41
compiler/rustc_mir_transform/src/coverage/counters/tests.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
use std::fmt::Debug;
|
||||
|
||||
use super::sort_and_cancel;
|
||||
|
||||
fn flatten<T>(input: Vec<Option<T>>) -> Vec<T> {
|
||||
input.into_iter().flatten().collect()
|
||||
}
|
||||
|
||||
fn sort_and_cancel_and_flatten<T: Clone + Ord>(pos: Vec<T>, neg: Vec<T>) -> (Vec<T>, Vec<T>) {
|
||||
let (pos_actual, neg_actual) = sort_and_cancel(pos, neg);
|
||||
(flatten(pos_actual), flatten(neg_actual))
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn check_test_case<T: Clone + Debug + Ord>(
|
||||
pos: Vec<T>,
|
||||
neg: Vec<T>,
|
||||
pos_expected: Vec<T>,
|
||||
neg_expected: Vec<T>,
|
||||
) {
|
||||
eprintln!("pos = {pos:?}; neg = {neg:?}");
|
||||
let output = sort_and_cancel_and_flatten(pos, neg);
|
||||
assert_eq!(output, (pos_expected, neg_expected));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cancellation() {
|
||||
let cases: &[(Vec<u32>, Vec<u32>, Vec<u32>, Vec<u32>)] = &[
|
||||
(vec![], vec![], vec![], vec![]),
|
||||
(vec![4, 2, 1, 5, 3], vec![], vec![1, 2, 3, 4, 5], vec![]),
|
||||
(vec![5, 5, 5, 5, 5], vec![5], vec![5, 5, 5, 5], vec![]),
|
||||
(vec![1, 1, 2, 2, 3, 3], vec![1, 2, 3], vec![1, 2, 3], vec![]),
|
||||
(vec![1, 1, 2, 2, 3, 3], vec![2, 4, 2], vec![1, 1, 3, 3], vec![4]),
|
||||
];
|
||||
|
||||
for (pos, neg, pos_expected, neg_expected) in cases {
|
||||
check_test_case(pos.to_vec(), neg.to_vec(), pos_expected.to_vec(), neg_expected.to_vec());
|
||||
// Same test case, but with its inputs flipped and its outputs flipped.
|
||||
check_test_case(neg.to_vec(), pos.to_vec(), neg_expected.to_vec(), pos_expected.to_vec());
|
||||
}
|
||||
}
|
||||
|
|
@ -25,7 +25,7 @@ use rustc_span::source_map::SourceMap;
|
|||
use rustc_span::{BytePos, Pos, SourceFile, Span};
|
||||
use tracing::{debug, debug_span, trace};
|
||||
|
||||
use crate::coverage::counters::{CounterIncrementSite, CoverageCounters};
|
||||
use crate::coverage::counters::{CoverageCounters, Site};
|
||||
use crate::coverage::graph::CoverageGraph;
|
||||
use crate::coverage::mappings::ExtractedMappings;
|
||||
|
||||
|
|
@ -265,13 +265,13 @@ fn inject_coverage_statements<'tcx>(
|
|||
coverage_counters: &CoverageCounters,
|
||||
) {
|
||||
// Inject counter-increment statements into MIR.
|
||||
for (id, counter_increment_site) in coverage_counters.counter_increment_sites() {
|
||||
for (id, site) in coverage_counters.counter_increment_sites() {
|
||||
// Determine the block to inject a counter-increment statement into.
|
||||
// For BCB nodes this is just their first block, but for edges we need
|
||||
// to create a new block between the two BCBs, and inject into that.
|
||||
let target_bb = match *counter_increment_site {
|
||||
CounterIncrementSite::Node { bcb } => basic_coverage_blocks[bcb].leader_bb(),
|
||||
CounterIncrementSite::Edge { from_bcb, to_bcb } => {
|
||||
let target_bb = match site {
|
||||
Site::Node { bcb } => basic_coverage_blocks[bcb].leader_bb(),
|
||||
Site::Edge { from_bcb, to_bcb } => {
|
||||
// Create a new block between the last block of `from_bcb` and
|
||||
// the first block of `to_bcb`.
|
||||
let from_bb = basic_coverage_blocks[from_bcb].last_bb();
|
||||
|
|
|
|||
|
|
@ -747,8 +747,8 @@ fn build_call_shim<'tcx>(
|
|||
sig.inputs_and_output = tcx.mk_type_list(&inputs_and_output);
|
||||
}
|
||||
|
||||
// FIXME(eddyb) avoid having this snippet both here and in
|
||||
// `Instance::fn_sig` (introduce `InstanceKind::fn_sig`?).
|
||||
// FIXME: Avoid having to adjust the signature both here and in
|
||||
// `fn_sig_for_fn_abi`.
|
||||
if let ty::InstanceKind::VTableShim(..) = instance {
|
||||
// Modify fn(self, ...) to fn(self: *mut Self, ...)
|
||||
let mut inputs_and_output = sig.inputs_and_output.to_vec();
|
||||
|
|
|
|||
|
|
@ -169,6 +169,14 @@ where
|
|||
return result;
|
||||
}
|
||||
|
||||
// Only consider auto impls of unsafe traits when there are no unsafe
|
||||
// fields.
|
||||
if ecx.cx().trait_is_unsafe(goal.predicate.def_id())
|
||||
&& goal.predicate.self_ty().has_unsafe_fields()
|
||||
{
|
||||
return Err(NoSolution);
|
||||
}
|
||||
|
||||
// We only look into opaque types during analysis for opaque types
|
||||
// outside of their defining scope. Doing so for opaques in the
|
||||
// defining scope may require calling `typeck` on the same item we're
|
||||
|
|
|
|||
|
|
@ -343,6 +343,9 @@ parse_incorrect_semicolon =
|
|||
.suggestion = remove this semicolon
|
||||
.help = {$name} declarations are not followed by a semicolon
|
||||
|
||||
parse_incorrect_type_on_self = type not allowed for shorthand `self` parameter
|
||||
.suggestion = move the modifiers on `self` to the type
|
||||
|
||||
parse_incorrect_use_of_await = incorrect use of `await`
|
||||
.parentheses_suggestion = `await` is not a method call, remove the parentheses
|
||||
|
||||
|
|
|
|||
|
|
@ -3409,3 +3409,22 @@ pub(crate) struct PolarityAndModifiers {
|
|||
pub polarity: &'static str,
|
||||
pub modifiers_concatenated: String,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(parse_incorrect_type_on_self)]
|
||||
pub(crate) struct IncorrectTypeOnSelf {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub move_self_modifier: MoveSelfModifier,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
|
||||
pub(crate) struct MoveSelfModifier {
|
||||
#[suggestion_part(code = "")]
|
||||
pub removal_span: Span,
|
||||
#[suggestion_part(code = "{modifier}")]
|
||||
pub insertion_span: Span,
|
||||
pub modifier: String,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2941,6 +2941,32 @@ impl<'a> Parser<'a> {
|
|||
};
|
||||
Ok((eself, eself_ident, eself_hi))
|
||||
};
|
||||
let expect_self_ident_not_typed =
|
||||
|this: &mut Self, modifier: &SelfKind, modifier_span: Span| {
|
||||
let eself_ident = expect_self_ident(this);
|
||||
|
||||
// Recover `: Type` after a qualified self
|
||||
if this.may_recover() && this.eat_noexpect(&token::Colon) {
|
||||
let snap = this.create_snapshot_for_diagnostic();
|
||||
match this.parse_ty() {
|
||||
Ok(ty) => {
|
||||
this.dcx().emit_err(errors::IncorrectTypeOnSelf {
|
||||
span: ty.span,
|
||||
move_self_modifier: errors::MoveSelfModifier {
|
||||
removal_span: modifier_span,
|
||||
insertion_span: ty.span.shrink_to_lo(),
|
||||
modifier: modifier.to_ref_suggestion(),
|
||||
},
|
||||
});
|
||||
}
|
||||
Err(diag) => {
|
||||
diag.cancel();
|
||||
this.restore_snapshot(snap);
|
||||
}
|
||||
}
|
||||
}
|
||||
eself_ident
|
||||
};
|
||||
// Recover for the grammar `*self`, `*const self`, and `*mut self`.
|
||||
let recover_self_ptr = |this: &mut Self| {
|
||||
this.dcx().emit_err(errors::SelfArgumentPointer { span: this.token.span });
|
||||
|
|
@ -2978,7 +3004,9 @@ impl<'a> Parser<'a> {
|
|||
// `¬_self`
|
||||
return Ok(None);
|
||||
};
|
||||
(eself, expect_self_ident(self), self.prev_token.span)
|
||||
let hi = self.token.span;
|
||||
let self_ident = expect_self_ident_not_typed(self, &eself, eself_lo.until(hi));
|
||||
(eself, self_ident, hi)
|
||||
}
|
||||
// `*self`
|
||||
token::BinOp(token::Star) if is_isolated_self(self, 1) => {
|
||||
|
|
|
|||
|
|
@ -302,7 +302,11 @@ impl<D: Deps> DepGraph<D> {
|
|||
OP: FnOnce() -> R,
|
||||
{
|
||||
match self.data() {
|
||||
Some(data) => data.with_anon_task(cx, dep_kind, op),
|
||||
Some(data) => {
|
||||
let (result, index) = data.with_anon_task_inner(cx, dep_kind, op);
|
||||
self.read_index(index);
|
||||
(result, index)
|
||||
}
|
||||
None => (op(), self.next_virtual_depnode_index()),
|
||||
}
|
||||
}
|
||||
|
|
@ -397,7 +401,16 @@ impl<D: Deps> DepGraphData<D> {
|
|||
|
||||
/// Executes something within an "anonymous" task, that is, a task the
|
||||
/// `DepNode` of which is determined by the list of inputs it read from.
|
||||
pub(crate) fn with_anon_task<Tcx: DepContext<Deps = D>, OP, R>(
|
||||
///
|
||||
/// NOTE: this does not actually count as a read of the DepNode here.
|
||||
/// Using the result of this task without reading the DepNode will result
|
||||
/// in untracked dependencies which may lead to ICEs as nodes are
|
||||
/// incorrectly marked green.
|
||||
///
|
||||
/// FIXME: This could perhaps return a `WithDepNode` to ensure that the
|
||||
/// user of this function actually performs the read; we'll have to see
|
||||
/// how to make that work with `anon` in `execute_job_incr`, though.
|
||||
pub(crate) fn with_anon_task_inner<Tcx: DepContext<Deps = D>, OP, R>(
|
||||
&self,
|
||||
cx: Tcx,
|
||||
dep_kind: DepKind,
|
||||
|
|
|
|||
|
|
@ -520,9 +520,11 @@ where
|
|||
let (result, dep_node_index) =
|
||||
qcx.start_query(job_id, query.depth_limit(), Some(&diagnostics), || {
|
||||
if query.anon() {
|
||||
return dep_graph_data.with_anon_task(*qcx.dep_context(), query.dep_kind(), || {
|
||||
query.compute(qcx, key)
|
||||
});
|
||||
return dep_graph_data.with_anon_task_inner(
|
||||
*qcx.dep_context(),
|
||||
query.dep_kind(),
|
||||
|| query.compute(qcx, key),
|
||||
);
|
||||
}
|
||||
|
||||
// `to_dep_node` is expensive for some `DepKind`s.
|
||||
|
|
|
|||
|
|
@ -2038,8 +2038,6 @@ written to standard error output)"),
|
|||
"make the current crate share its generic instantiations"),
|
||||
shell_argfiles: bool = (false, parse_bool, [UNTRACKED],
|
||||
"allow argument files to be specified with POSIX \"shell-style\" argument quoting"),
|
||||
show_span: Option<String> = (None, parse_opt_string, [TRACKED],
|
||||
"show spans in the crate root file, for compiler debugging (expr|pat|ty)"),
|
||||
simulate_remapped_rust_src_base: Option<PathBuf> = (None, parse_opt_pathbuf, [TRACKED],
|
||||
"simulate the effect of remap-debuginfo = true at bootstrapping by remapping path \
|
||||
to rust's source base directory. only meant for testing purposes"),
|
||||
|
|
|
|||
|
|
@ -3838,6 +3838,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
&& self.predicate_must_hold_modulo_regions(&Obligation::misc(
|
||||
tcx, expr.span, body_id, param_env, pred,
|
||||
))
|
||||
&& expr.span.hi() != rcvr.span.hi()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
expr.span.with_lo(rcvr.span.hi()),
|
||||
|
|
@ -4115,6 +4116,11 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
// the expected is a projection that we need to resolve.
|
||||
// && let Some(tail_ty) = typeck_results.expr_ty_opt(expr)
|
||||
&& expected_found.found.is_unit()
|
||||
// FIXME: this happens with macro calls. Need to figure out why the stmt
|
||||
// `println!();` doesn't include the `;` in its `Span`. (#133845)
|
||||
// We filter these out to avoid ICEs with debug assertions on caused by
|
||||
// empty suggestions.
|
||||
&& expr.span.hi() != stmt.span.hi()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
expr.span.shrink_to_hi().with_hi(stmt.span.hi()),
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ use rustc_infer::traits::{
|
|||
use rustc_middle::ty::fast_reject::DeepRejectCtxt;
|
||||
use rustc_middle::ty::{self, ToPolyTraitRef, Ty, TypeVisitableExt, TypingMode};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
use rustc_type_ir::Interner;
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
||||
use super::SelectionCandidate::*;
|
||||
|
|
@ -794,6 +795,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
| ty::Never
|
||||
| ty::Tuple(_)
|
||||
| ty::CoroutineWitness(..) => {
|
||||
use rustc_type_ir::inherent::*;
|
||||
|
||||
// Only consider auto impls of unsafe traits when there are
|
||||
// no unsafe fields.
|
||||
if self.tcx().trait_is_unsafe(def_id) && self_ty.has_unsafe_fields() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Only consider auto impls if there are no manual impls for the root of `self_ty`.
|
||||
//
|
||||
// For example, we only consider auto candidates for `&i32: Auto` if no explicit impl
|
||||
|
|
|
|||
|
|
@ -16,9 +16,7 @@ use rustc_hir::lang_items::LangItem;
|
|||
use rustc_infer::infer::{DefineOpaqueTypes, HigherRankedType, InferOk};
|
||||
use rustc_infer::traits::ObligationCauseCode;
|
||||
use rustc_middle::traits::{BuiltinImplSource, SignatureMismatchData};
|
||||
use rustc_middle::ty::{
|
||||
self, GenericArgs, GenericArgsRef, GenericParamDefKind, ToPolyTraitRef, Ty, TyCtxt, Upcast,
|
||||
};
|
||||
use rustc_middle::ty::{self, GenericArgsRef, ToPolyTraitRef, Ty, TyCtxt, Upcast};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
use rustc_span::def_id::DefId;
|
||||
use tracing::{debug, instrument};
|
||||
|
|
@ -638,60 +636,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
// higher-ranked things.
|
||||
// Prevent, e.g., `dyn Iterator<Item = str>`.
|
||||
for bound in self.tcx().item_bounds(assoc_type).transpose_iter() {
|
||||
let arg_bound = if defs.is_empty() {
|
||||
bound.instantiate(tcx, trait_predicate.trait_ref.args)
|
||||
} else {
|
||||
let mut args = smallvec::SmallVec::with_capacity(defs.count());
|
||||
args.extend(trait_predicate.trait_ref.args.iter());
|
||||
let mut bound_vars: smallvec::SmallVec<[ty::BoundVariableKind; 8]> =
|
||||
smallvec::SmallVec::with_capacity(
|
||||
bound.skip_binder().kind().bound_vars().len() + defs.count(),
|
||||
);
|
||||
bound_vars.extend(bound.skip_binder().kind().bound_vars().into_iter());
|
||||
GenericArgs::fill_single(&mut args, defs, &mut |param, _| match param.kind {
|
||||
GenericParamDefKind::Type { .. } => {
|
||||
let kind = ty::BoundTyKind::Param(param.def_id, param.name);
|
||||
let bound_var = ty::BoundVariableKind::Ty(kind);
|
||||
bound_vars.push(bound_var);
|
||||
Ty::new_bound(tcx, ty::INNERMOST, ty::BoundTy {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind,
|
||||
})
|
||||
.into()
|
||||
}
|
||||
GenericParamDefKind::Lifetime => {
|
||||
let kind = ty::BoundRegionKind::Named(param.def_id, param.name);
|
||||
let bound_var = ty::BoundVariableKind::Region(kind);
|
||||
bound_vars.push(bound_var);
|
||||
ty::Region::new_bound(tcx, ty::INNERMOST, ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind,
|
||||
})
|
||||
.into()
|
||||
}
|
||||
GenericParamDefKind::Const { .. } => {
|
||||
let bound_var = ty::BoundVariableKind::Const;
|
||||
bound_vars.push(bound_var);
|
||||
ty::Const::new_bound(
|
||||
tcx,
|
||||
ty::INNERMOST,
|
||||
ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
});
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(&bound_vars);
|
||||
let assoc_ty_args = tcx.mk_args(&args);
|
||||
let bound =
|
||||
bound.map_bound(|b| b.kind().skip_binder()).instantiate(tcx, assoc_ty_args);
|
||||
ty::Binder::bind_with_vars(bound, bound_vars).upcast(tcx)
|
||||
};
|
||||
let normalized_bound = normalize_with_depth_to(
|
||||
self,
|
||||
obligation.param_env,
|
||||
obligation.cause.clone(),
|
||||
obligation.recursion_depth + 1,
|
||||
arg_bound,
|
||||
bound.instantiate(tcx, trait_predicate.trait_ref.args),
|
||||
&mut nested,
|
||||
);
|
||||
nested.push(obligation.with(tcx, normalized_bound));
|
||||
|
|
|
|||
|
|
@ -1400,10 +1400,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
where
|
||||
OP: FnOnce(&mut Self) -> R,
|
||||
{
|
||||
let (result, dep_node) =
|
||||
self.tcx().dep_graph.with_anon_task(self.tcx(), dep_kinds::TraitSelect, || op(self));
|
||||
self.tcx().dep_graph.read_index(dep_node);
|
||||
(result, dep_node)
|
||||
self.tcx().dep_graph.with_anon_task(self.tcx(), dep_kinds::TraitSelect, || op(self))
|
||||
}
|
||||
|
||||
/// filter_impls filters candidates that have a positive impl for a negative
|
||||
|
|
|
|||
|
|
@ -31,20 +31,20 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
tcx: TyCtxt<'tcx>,
|
||||
instance: ty::Instance<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
) -> ty::PolyFnSig<'tcx> {
|
||||
) -> ty::FnSig<'tcx> {
|
||||
if let InstanceKind::ThreadLocalShim(..) = instance.def {
|
||||
return ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
return tcx.mk_fn_sig(
|
||||
[],
|
||||
tcx.thread_local_ptr_ty(instance.def_id()),
|
||||
false,
|
||||
hir::Safety::Safe,
|
||||
rustc_abi::ExternAbi::Unadjusted,
|
||||
));
|
||||
);
|
||||
}
|
||||
|
||||
let ty = instance.ty(tcx, typing_env);
|
||||
match *ty.kind() {
|
||||
ty::FnDef(..) => {
|
||||
ty::FnDef(def_id, args) => {
|
||||
// HACK(davidtwco,eddyb): This is a workaround for polymorphization considering
|
||||
// parameters unused if they show up in the signature, but not in the `mir::Body`
|
||||
// (i.e. due to being inside a projection that got normalized, see
|
||||
|
|
@ -52,9 +52,8 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
// track of a polymorphization `ParamEnv` to allow normalizing later.
|
||||
//
|
||||
// We normalize the `fn_sig` again after instantiating at a later point.
|
||||
let mut sig = match *ty.kind() {
|
||||
ty::FnDef(def_id, args) => tcx
|
||||
.fn_sig(def_id)
|
||||
let mut sig = tcx.instantiate_bound_regions_with_erased(
|
||||
tcx.fn_sig(def_id)
|
||||
.map_bound(|fn_sig| {
|
||||
tcx.normalize_erasing_regions(
|
||||
ty::TypingEnv::non_body_analysis(tcx, def_id),
|
||||
|
|
@ -62,62 +61,36 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
)
|
||||
})
|
||||
.instantiate(tcx, args),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
);
|
||||
|
||||
if let ty::InstanceKind::VTableShim(..) = instance.def {
|
||||
// Modify `fn(self, ...)` to `fn(self: *mut Self, ...)`.
|
||||
sig = sig.map_bound(|mut sig| {
|
||||
let mut inputs_and_output = sig.inputs_and_output.to_vec();
|
||||
inputs_and_output[0] = Ty::new_mut_ptr(tcx, inputs_and_output[0]);
|
||||
sig.inputs_and_output = tcx.mk_type_list(&inputs_and_output);
|
||||
sig
|
||||
});
|
||||
let mut inputs_and_output = sig.inputs_and_output.to_vec();
|
||||
inputs_and_output[0] = Ty::new_mut_ptr(tcx, inputs_and_output[0]);
|
||||
sig.inputs_and_output = tcx.mk_type_list(&inputs_and_output);
|
||||
}
|
||||
|
||||
sig
|
||||
}
|
||||
ty::Closure(def_id, args) => {
|
||||
let sig = args.as_closure().sig();
|
||||
|
||||
let bound_vars =
|
||||
tcx.mk_bound_variable_kinds_from_iter(sig.bound_vars().iter().chain(iter::once(
|
||||
ty::BoundVariableKind::Region(ty::BoundRegionKind::ClosureEnv),
|
||||
)));
|
||||
let br = ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind: ty::BoundRegionKind::ClosureEnv,
|
||||
};
|
||||
let env_region = ty::Region::new_bound(tcx, ty::INNERMOST, br);
|
||||
let sig = tcx.instantiate_bound_regions_with_erased(args.as_closure().sig());
|
||||
let env_ty = tcx.closure_env_ty(
|
||||
Ty::new_closure(tcx, def_id, args),
|
||||
args.as_closure().kind(),
|
||||
env_region,
|
||||
tcx.lifetimes.re_erased,
|
||||
);
|
||||
|
||||
let sig = sig.skip_binder();
|
||||
ty::Binder::bind_with_vars(
|
||||
tcx.mk_fn_sig(
|
||||
iter::once(env_ty).chain(sig.inputs().iter().cloned()),
|
||||
sig.output(),
|
||||
sig.c_variadic,
|
||||
sig.safety,
|
||||
sig.abi,
|
||||
),
|
||||
bound_vars,
|
||||
tcx.mk_fn_sig(
|
||||
iter::once(env_ty).chain(sig.inputs().iter().cloned()),
|
||||
sig.output(),
|
||||
sig.c_variadic,
|
||||
sig.safety,
|
||||
sig.abi,
|
||||
)
|
||||
}
|
||||
ty::CoroutineClosure(def_id, args) => {
|
||||
let coroutine_ty = Ty::new_coroutine_closure(tcx, def_id, args);
|
||||
let sig = args.as_coroutine_closure().coroutine_closure_sig();
|
||||
let bound_vars =
|
||||
tcx.mk_bound_variable_kinds_from_iter(sig.bound_vars().iter().chain(iter::once(
|
||||
ty::BoundVariableKind::Region(ty::BoundRegionKind::ClosureEnv),
|
||||
)));
|
||||
let br = ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind: ty::BoundRegionKind::ClosureEnv,
|
||||
};
|
||||
let env_region = ty::Region::new_bound(tcx, ty::INNERMOST, br);
|
||||
|
||||
// When this `CoroutineClosure` comes from a `ConstructCoroutineInClosureShim`,
|
||||
// make sure we respect the `target_kind` in that shim.
|
||||
// FIXME(async_closures): This shouldn't be needed, and we should be populating
|
||||
|
|
@ -138,42 +111,32 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
coroutine_ty
|
||||
}
|
||||
} else {
|
||||
tcx.closure_env_ty(coroutine_ty, coroutine_kind, env_region)
|
||||
tcx.closure_env_ty(coroutine_ty, coroutine_kind, tcx.lifetimes.re_erased)
|
||||
};
|
||||
|
||||
let sig = sig.skip_binder();
|
||||
ty::Binder::bind_with_vars(
|
||||
tcx.mk_fn_sig(
|
||||
iter::once(env_ty).chain([sig.tupled_inputs_ty]),
|
||||
sig.to_coroutine_given_kind_and_upvars(
|
||||
tcx,
|
||||
args.as_coroutine_closure().parent_args(),
|
||||
tcx.coroutine_for_closure(def_id),
|
||||
coroutine_kind,
|
||||
env_region,
|
||||
args.as_coroutine_closure().tupled_upvars_ty(),
|
||||
args.as_coroutine_closure().coroutine_captures_by_ref_ty(),
|
||||
),
|
||||
sig.c_variadic,
|
||||
sig.safety,
|
||||
sig.abi,
|
||||
let sig = tcx.instantiate_bound_regions_with_erased(sig);
|
||||
|
||||
tcx.mk_fn_sig(
|
||||
iter::once(env_ty).chain([sig.tupled_inputs_ty]),
|
||||
sig.to_coroutine_given_kind_and_upvars(
|
||||
tcx,
|
||||
args.as_coroutine_closure().parent_args(),
|
||||
tcx.coroutine_for_closure(def_id),
|
||||
coroutine_kind,
|
||||
tcx.lifetimes.re_erased,
|
||||
args.as_coroutine_closure().tupled_upvars_ty(),
|
||||
args.as_coroutine_closure().coroutine_captures_by_ref_ty(),
|
||||
),
|
||||
bound_vars,
|
||||
sig.c_variadic,
|
||||
sig.safety,
|
||||
sig.abi,
|
||||
)
|
||||
}
|
||||
ty::Coroutine(did, args) => {
|
||||
let coroutine_kind = tcx.coroutine_kind(did).unwrap();
|
||||
let sig = args.as_coroutine().sig();
|
||||
|
||||
let bound_vars = tcx.mk_bound_variable_kinds_from_iter(iter::once(
|
||||
ty::BoundVariableKind::Region(ty::BoundRegionKind::ClosureEnv),
|
||||
));
|
||||
let br = ty::BoundRegion {
|
||||
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
|
||||
kind: ty::BoundRegionKind::ClosureEnv,
|
||||
};
|
||||
|
||||
let env_ty = Ty::new_mut_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br), ty);
|
||||
let env_ty = Ty::new_mut_ref(tcx, tcx.lifetimes.re_erased, ty);
|
||||
|
||||
let pin_did = tcx.require_lang_item(LangItem::Pin, None);
|
||||
let pin_adt_ref = tcx.adt_def(pin_did);
|
||||
|
|
@ -268,7 +231,7 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
}
|
||||
};
|
||||
|
||||
let fn_sig = if let Some(resume_ty) = resume_ty {
|
||||
if let Some(resume_ty) = resume_ty {
|
||||
tcx.mk_fn_sig(
|
||||
[env_ty, resume_ty],
|
||||
ret_ty,
|
||||
|
|
@ -285,8 +248,7 @@ fn fn_sig_for_fn_abi<'tcx>(
|
|||
hir::Safety::Safe,
|
||||
rustc_abi::ExternAbi::Rust,
|
||||
)
|
||||
};
|
||||
ty::Binder::bind_with_vars(fn_sig, bound_vars)
|
||||
}
|
||||
}
|
||||
_ => bug!("unexpected type {:?} in Instance::fn_sig", ty),
|
||||
}
|
||||
|
|
@ -335,8 +297,16 @@ fn fn_abi_of_fn_ptr<'tcx>(
|
|||
query: ty::PseudoCanonicalInput<'tcx, (ty::PolyFnSig<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
|
||||
) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
|
||||
let ty::PseudoCanonicalInput { typing_env, value: (sig, extra_args) } = query;
|
||||
|
||||
let cx = LayoutCx::new(tcx, typing_env);
|
||||
fn_abi_new_uncached(&cx, sig, extra_args, None, None, false)
|
||||
fn_abi_new_uncached(
|
||||
&cx,
|
||||
tcx.instantiate_bound_regions_with_erased(sig),
|
||||
extra_args,
|
||||
None,
|
||||
None,
|
||||
false,
|
||||
)
|
||||
}
|
||||
|
||||
fn fn_abi_of_instance<'tcx>(
|
||||
|
|
@ -567,7 +537,7 @@ fn fn_abi_sanity_check<'tcx>(
|
|||
#[tracing::instrument(level = "debug", skip(cx, caller_location, fn_def_id, force_thin_self_ptr))]
|
||||
fn fn_abi_new_uncached<'tcx>(
|
||||
cx: &LayoutCx<'tcx>,
|
||||
sig: ty::PolyFnSig<'tcx>,
|
||||
sig: ty::FnSig<'tcx>,
|
||||
extra_args: &[Ty<'tcx>],
|
||||
caller_location: Option<Ty<'tcx>>,
|
||||
fn_def_id: Option<DefId>,
|
||||
|
|
@ -575,7 +545,7 @@ fn fn_abi_new_uncached<'tcx>(
|
|||
force_thin_self_ptr: bool,
|
||||
) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
|
||||
let tcx = cx.tcx();
|
||||
let sig = tcx.normalize_erasing_late_bound_regions(cx.typing_env, sig);
|
||||
let sig = tcx.normalize_erasing_regions(cx.typing_env, sig);
|
||||
|
||||
let conv = conv_from_spec_abi(cx.tcx(), sig.abi, sig.c_variadic);
|
||||
|
||||
|
|
|
|||
|
|
@ -136,6 +136,9 @@ pub trait Ty<I: Interner<Ty = Self>>:
|
|||
matches!(self.kind(), ty::FnPtr(..))
|
||||
}
|
||||
|
||||
/// Checks whether this type is an ADT that has unsafe fields.
|
||||
fn has_unsafe_fields(self) -> bool;
|
||||
|
||||
fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
|
||||
match self.kind() {
|
||||
ty::FnPtr(sig_tys, hdr) => sig_tys.with(hdr),
|
||||
|
|
|
|||
|
|
@ -270,6 +270,9 @@ pub trait Interner:
|
|||
|
||||
fn trait_may_be_implemented_via_object(self, trait_def_id: Self::DefId) -> bool;
|
||||
|
||||
/// Returns `true` if this is an `unsafe trait`.
|
||||
fn trait_is_unsafe(self, trait_def_id: Self::DefId) -> bool;
|
||||
|
||||
fn is_impl_trait_in_trait(self, def_id: Self::DefId) -> bool;
|
||||
|
||||
fn delay_bug(self, msg: impl ToString) -> Self::ErrorGuaranteed;
|
||||
|
|
|
|||
|
|
@ -511,7 +511,7 @@ impl<D: Delegate<Cx = X>, X: Cx> SearchGraph<D> {
|
|||
|
||||
// This is for global caching, so we properly track query dependencies.
|
||||
// Everything that affects the `result` should be performed within this
|
||||
// `with_anon_task` closure. If computing this goal depends on something
|
||||
// `with_cached_task` closure. If computing this goal depends on something
|
||||
// not tracked by the cache key and from outside of this anon task, it
|
||||
// must not be added to the global cache. Notably, this is the case for
|
||||
// trait solver cycles participants.
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ pub mod net;
|
|||
pub mod option;
|
||||
pub mod panic;
|
||||
pub mod panicking;
|
||||
#[unstable(feature = "core_pattern_types", issue = "123646")]
|
||||
#[unstable(feature = "pattern_type_macro", issue = "123646")]
|
||||
pub mod pat;
|
||||
pub mod pin;
|
||||
#[unstable(feature = "random", issue = "130703")]
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ pub unsafe trait ZeroablePrimitive: Sized + Copy + private::Sealed {
|
|||
macro_rules! impl_zeroable_primitive {
|
||||
($($NonZeroInner:ident ( $primitive:ty )),+ $(,)?) => {
|
||||
mod private {
|
||||
use super::*;
|
||||
|
||||
#[unstable(
|
||||
feature = "nonzero_internals",
|
||||
reason = "implementation detail which may disappear or be replaced at any time",
|
||||
|
|
@ -45,7 +47,11 @@ macro_rules! impl_zeroable_primitive {
|
|||
pub trait Sealed {}
|
||||
|
||||
$(
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
// This inner type is never shown directly, so intentionally does not have Debug
|
||||
#[expect(missing_debug_implementations)]
|
||||
// Since this struct is non-generic and derives Copy,
|
||||
// the derived Clone is `*self` and thus doesn't field-project.
|
||||
#[derive(Clone, Copy)]
|
||||
#[repr(transparent)]
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[rustc_nonnull_optimization_guaranteed]
|
||||
|
|
@ -55,6 +61,16 @@ macro_rules! impl_zeroable_primitive {
|
|||
issue = "none"
|
||||
)]
|
||||
pub struct $NonZeroInner($primitive);
|
||||
|
||||
// This is required to allow matching a constant. We don't get it from a derive
|
||||
// because the derived `PartialEq` would do a field projection, which is banned
|
||||
// by <https://github.com/rust-lang/compiler-team/issues/807>.
|
||||
#[unstable(
|
||||
feature = "nonzero_internals",
|
||||
reason = "implementation detail which may disappear or be replaced at any time",
|
||||
issue = "none"
|
||||
)]
|
||||
impl StructuralPartialEq for $NonZeroInner {}
|
||||
)+
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +188,7 @@ where
|
|||
{
|
||||
#[inline]
|
||||
fn clone(&self) -> Self {
|
||||
Self(self.0)
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -440,15 +456,21 @@ where
|
|||
#[rustc_const_stable(feature = "const_nonzero_get", since = "1.34.0")]
|
||||
#[inline]
|
||||
pub const fn get(self) -> T {
|
||||
// FIXME: This can be changed to simply `self.0` once LLVM supports `!range` metadata
|
||||
// for function arguments: https://github.com/llvm/llvm-project/issues/76628
|
||||
//
|
||||
// Rustc can set range metadata only if it loads `self` from
|
||||
// memory somewhere. If the value of `self` was from by-value argument
|
||||
// of some not-inlined function, LLVM don't have range metadata
|
||||
// to understand that the value cannot be zero.
|
||||
//
|
||||
// For now, using the transmute `assume`s the range at runtime.
|
||||
// Using the transmute `assume`s the range at runtime.
|
||||
//
|
||||
// Even once LLVM supports `!range` metadata for function arguments
|
||||
// (see <https://github.com/llvm/llvm-project/issues/76628>), this can't
|
||||
// be `.0` because MCP#807 bans field-projecting into `scalar_valid_range`
|
||||
// types, and it arguably wouldn't want to be anyway because if this is
|
||||
// MIR-inlined, there's no opportunity to put that argument metadata anywhere.
|
||||
//
|
||||
// The good answer here will eventually be pattern types, which will hopefully
|
||||
// allow it to go back to `.0`, maybe with a cast of some sort.
|
||||
//
|
||||
// SAFETY: `ZeroablePrimitive` guarantees that the size and bit validity
|
||||
// of `.0` is such that this transmute is sound.
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/// ```
|
||||
#[macro_export]
|
||||
#[rustc_builtin_macro(pattern_type)]
|
||||
#[unstable(feature = "core_pattern_type", issue = "123646")]
|
||||
#[unstable(feature = "pattern_type_macro", issue = "123646")]
|
||||
macro_rules! pattern_type {
|
||||
($($arg:tt)*) => {
|
||||
/* compiler built-in */
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ use crate::pin::PinCoerceUnsized;
|
|||
use crate::ptr::Unique;
|
||||
use crate::slice::{self, SliceIndex};
|
||||
use crate::ub_checks::assert_unsafe_precondition;
|
||||
use crate::{fmt, hash, intrinsics, ptr};
|
||||
use crate::{fmt, hash, intrinsics, mem, ptr};
|
||||
|
||||
/// `*mut T` but non-zero and [covariant].
|
||||
///
|
||||
|
|
@ -69,6 +69,8 @@ use crate::{fmt, hash, intrinsics, ptr};
|
|||
#[rustc_nonnull_optimization_guaranteed]
|
||||
#[rustc_diagnostic_item = "NonNull"]
|
||||
pub struct NonNull<T: ?Sized> {
|
||||
// Remember to use `.as_ptr()` instead of `.pointer`, as field projecting to
|
||||
// this is banned by <https://github.com/rust-lang/compiler-team/issues/807>.
|
||||
pointer: *const T,
|
||||
}
|
||||
|
||||
|
|
@ -282,7 +284,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
pub fn addr(self) -> NonZero<usize> {
|
||||
// SAFETY: The pointer is guaranteed by the type to be non-null,
|
||||
// meaning that the address will be non-zero.
|
||||
unsafe { NonZero::new_unchecked(self.pointer.addr()) }
|
||||
unsafe { NonZero::new_unchecked(self.as_ptr().addr()) }
|
||||
}
|
||||
|
||||
/// Creates a new pointer with the given address and the [provenance][crate::ptr#provenance] of
|
||||
|
|
@ -296,7 +298,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
#[stable(feature = "strict_provenance", since = "1.84.0")]
|
||||
pub fn with_addr(self, addr: NonZero<usize>) -> Self {
|
||||
// SAFETY: The result of `ptr::from::with_addr` is non-null because `addr` is guaranteed to be non-zero.
|
||||
unsafe { NonNull::new_unchecked(self.pointer.with_addr(addr.get()) as *mut _) }
|
||||
unsafe { NonNull::new_unchecked(self.as_ptr().with_addr(addr.get()) as *mut _) }
|
||||
}
|
||||
|
||||
/// Creates a new pointer by mapping `self`'s address to a new one, preserving the
|
||||
|
|
@ -335,7 +337,12 @@ impl<T: ?Sized> NonNull<T> {
|
|||
#[must_use]
|
||||
#[inline(always)]
|
||||
pub const fn as_ptr(self) -> *mut T {
|
||||
self.pointer as *mut T
|
||||
// This is a transmute for the same reasons as `NonZero::get`.
|
||||
|
||||
// SAFETY: `NonNull` is `transparent` over a `*const T`, and `*const T`
|
||||
// and `*mut T` have the same layout, so transitively we can transmute
|
||||
// our `NonNull` to a `*mut T` directly.
|
||||
unsafe { mem::transmute::<Self, *mut T>(self) }
|
||||
}
|
||||
|
||||
/// Returns a shared reference to the value. If the value may be uninitialized, [`as_uninit_ref`]
|
||||
|
|
@ -484,7 +491,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
// Additionally safety contract of `offset` guarantees that the resulting pointer is
|
||||
// pointing to an allocation, there can't be an allocation at null, thus it's safe to
|
||||
// construct `NonNull`.
|
||||
unsafe { NonNull { pointer: intrinsics::offset(self.pointer, count) } }
|
||||
unsafe { NonNull { pointer: intrinsics::offset(self.as_ptr(), count) } }
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer in bytes.
|
||||
|
|
@ -508,7 +515,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
// Additionally safety contract of `offset` guarantees that the resulting pointer is
|
||||
// pointing to an allocation, there can't be an allocation at null, thus it's safe to
|
||||
// construct `NonNull`.
|
||||
unsafe { NonNull { pointer: self.pointer.byte_offset(count) } }
|
||||
unsafe { NonNull { pointer: self.as_ptr().byte_offset(count) } }
|
||||
}
|
||||
|
||||
/// Adds an offset to a pointer (convenience for `.offset(count as isize)`).
|
||||
|
|
@ -560,7 +567,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
// Additionally safety contract of `offset` guarantees that the resulting pointer is
|
||||
// pointing to an allocation, there can't be an allocation at null, thus it's safe to
|
||||
// construct `NonNull`.
|
||||
unsafe { NonNull { pointer: intrinsics::offset(self.pointer, count) } }
|
||||
unsafe { NonNull { pointer: intrinsics::offset(self.as_ptr(), count) } }
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer in bytes (convenience for `.byte_offset(count as isize)`).
|
||||
|
|
@ -584,7 +591,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
// Additionally safety contract of `add` guarantees that the resulting pointer is pointing
|
||||
// to an allocation, there can't be an allocation at null, thus it's safe to construct
|
||||
// `NonNull`.
|
||||
unsafe { NonNull { pointer: self.pointer.byte_add(count) } }
|
||||
unsafe { NonNull { pointer: self.as_ptr().byte_add(count) } }
|
||||
}
|
||||
|
||||
/// Subtracts an offset from a pointer (convenience for
|
||||
|
|
@ -666,7 +673,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
// Additionally safety contract of `sub` guarantees that the resulting pointer is pointing
|
||||
// to an allocation, there can't be an allocation at null, thus it's safe to construct
|
||||
// `NonNull`.
|
||||
unsafe { NonNull { pointer: self.pointer.byte_sub(count) } }
|
||||
unsafe { NonNull { pointer: self.as_ptr().byte_sub(count) } }
|
||||
}
|
||||
|
||||
/// Calculates the distance between two pointers within the same allocation. The returned value is in
|
||||
|
|
@ -763,7 +770,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `offset_from`.
|
||||
unsafe { self.pointer.offset_from(origin.pointer) }
|
||||
unsafe { self.as_ptr().offset_from(origin.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Calculates the distance between two pointers within the same allocation. The returned value is in
|
||||
|
|
@ -781,7 +788,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
#[rustc_const_stable(feature = "non_null_convenience", since = "1.80.0")]
|
||||
pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: NonNull<U>) -> isize {
|
||||
// SAFETY: the caller must uphold the safety contract for `byte_offset_from`.
|
||||
unsafe { self.pointer.byte_offset_from(origin.pointer) }
|
||||
unsafe { self.as_ptr().byte_offset_from(origin.as_ptr()) }
|
||||
}
|
||||
|
||||
// N.B. `wrapping_offset``, `wrapping_add`, etc are not implemented because they can wrap to null
|
||||
|
|
@ -856,7 +863,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `sub_ptr`.
|
||||
unsafe { self.pointer.sub_ptr(subtracted.pointer) }
|
||||
unsafe { self.as_ptr().sub_ptr(subtracted.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Calculates the distance between two pointers within the same allocation, *where it's known that
|
||||
|
|
@ -875,7 +882,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
#[rustc_const_unstable(feature = "const_ptr_sub_ptr", issue = "95892")]
|
||||
pub const unsafe fn byte_sub_ptr<U: ?Sized>(self, origin: NonNull<U>) -> usize {
|
||||
// SAFETY: the caller must uphold the safety contract for `byte_sub_ptr`.
|
||||
unsafe { self.pointer.byte_sub_ptr(origin.pointer) }
|
||||
unsafe { self.as_ptr().byte_sub_ptr(origin.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Reads the value from `self` without moving it. This leaves the
|
||||
|
|
@ -893,7 +900,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `read`.
|
||||
unsafe { ptr::read(self.pointer) }
|
||||
unsafe { ptr::read(self.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Performs a volatile read of the value from `self` without moving it. This
|
||||
|
|
@ -914,7 +921,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `read_volatile`.
|
||||
unsafe { ptr::read_volatile(self.pointer) }
|
||||
unsafe { ptr::read_volatile(self.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Reads the value from `self` without moving it. This leaves the
|
||||
|
|
@ -934,7 +941,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `read_unaligned`.
|
||||
unsafe { ptr::read_unaligned(self.pointer) }
|
||||
unsafe { ptr::read_unaligned(self.as_ptr()) }
|
||||
}
|
||||
|
||||
/// Copies `count * size_of<T>` bytes from `self` to `dest`. The source
|
||||
|
|
@ -954,7 +961,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `copy`.
|
||||
unsafe { ptr::copy(self.pointer, dest.as_ptr(), count) }
|
||||
unsafe { ptr::copy(self.as_ptr(), dest.as_ptr(), count) }
|
||||
}
|
||||
|
||||
/// Copies `count * size_of<T>` bytes from `self` to `dest`. The source
|
||||
|
|
@ -974,7 +981,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
|
||||
unsafe { ptr::copy_nonoverlapping(self.pointer, dest.as_ptr(), count) }
|
||||
unsafe { ptr::copy_nonoverlapping(self.as_ptr(), dest.as_ptr(), count) }
|
||||
}
|
||||
|
||||
/// Copies `count * size_of<T>` bytes from `src` to `self`. The source
|
||||
|
|
@ -994,7 +1001,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `copy`.
|
||||
unsafe { ptr::copy(src.pointer, self.as_ptr(), count) }
|
||||
unsafe { ptr::copy(src.as_ptr(), self.as_ptr(), count) }
|
||||
}
|
||||
|
||||
/// Copies `count * size_of<T>` bytes from `src` to `self`. The source
|
||||
|
|
@ -1014,7 +1021,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
|
||||
unsafe { ptr::copy_nonoverlapping(src.pointer, self.as_ptr(), count) }
|
||||
unsafe { ptr::copy_nonoverlapping(src.as_ptr(), self.as_ptr(), count) }
|
||||
}
|
||||
|
||||
/// Executes the destructor (if any) of the pointed-to value.
|
||||
|
|
@ -1201,7 +1208,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
|
||||
{
|
||||
// SAFETY: `align` has been checked to be a power of 2 above.
|
||||
unsafe { ptr::align_offset(self.pointer, align) }
|
||||
unsafe { ptr::align_offset(self.as_ptr(), align) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1229,7 +1236,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
where
|
||||
T: Sized,
|
||||
{
|
||||
self.pointer.is_aligned()
|
||||
self.as_ptr().is_aligned()
|
||||
}
|
||||
|
||||
/// Returns whether the pointer is aligned to `align`.
|
||||
|
|
@ -1266,7 +1273,7 @@ impl<T: ?Sized> NonNull<T> {
|
|||
#[must_use]
|
||||
#[unstable(feature = "pointer_is_aligned_to", issue = "96284")]
|
||||
pub fn is_aligned_to(self, align: usize) -> bool {
|
||||
self.pointer.is_aligned_to(align)
|
||||
self.as_ptr().is_aligned_to(align)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -304,6 +304,7 @@ fn test_const_nonnull_new() {
|
|||
#[test]
|
||||
#[cfg(unix)] // printf may not be available on other platforms
|
||||
#[allow(deprecated)] // For SipHasher
|
||||
#[cfg_attr(not(bootstrap), allow(unpredictable_function_pointer_comparisons))]
|
||||
pub fn test_variadic_fnptr() {
|
||||
use core::ffi;
|
||||
use core::hash::{Hash, SipHasher};
|
||||
|
|
|
|||
|
|
@ -589,7 +589,7 @@ pub mod net;
|
|||
pub mod num;
|
||||
pub mod os;
|
||||
pub mod panic;
|
||||
#[unstable(feature = "core_pattern_types", issue = "123646")]
|
||||
#[unstable(feature = "pattern_type_macro", issue = "123646")]
|
||||
pub mod pat;
|
||||
pub mod path;
|
||||
#[unstable(feature = "anonymous_pipe", issue = "127154")]
|
||||
|
|
|
|||
|
|
@ -324,9 +324,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.162"
|
||||
version = "0.2.167"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398"
|
||||
checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
|
|
@ -558,9 +558,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.31.4"
|
||||
version = "0.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be"
|
||||
checksum = "948512566b1895f93b1592c7574baeb2de842f224f2aab158799ecadb8ebbb46"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ walkdir = "2.4"
|
|||
xz2 = "0.1"
|
||||
|
||||
# Dependencies needed by the build-metrics feature
|
||||
sysinfo = { version = "0.31.2", default-features = false, optional = true, features = ["system"] }
|
||||
sysinfo = { version = "0.33.0", default-features = false, optional = true, features = ["system"] }
|
||||
|
||||
[target.'cfg(windows)'.dependencies.junction]
|
||||
version = "1.0.0"
|
||||
|
|
|
|||
|
|
@ -549,24 +549,24 @@ impl Step for DebuggerScripts {
|
|||
cp_debugger_script("natvis/liballoc.natvis");
|
||||
cp_debugger_script("natvis/libcore.natvis");
|
||||
cp_debugger_script("natvis/libstd.natvis");
|
||||
} else {
|
||||
cp_debugger_script("rust_types.py");
|
||||
|
||||
// gdb debugger scripts
|
||||
builder.install(&builder.src.join("src/etc/rust-gdb"), &sysroot.join("bin"), 0o755);
|
||||
builder.install(&builder.src.join("src/etc/rust-gdbgui"), &sysroot.join("bin"), 0o755);
|
||||
|
||||
cp_debugger_script("gdb_load_rust_pretty_printers.py");
|
||||
cp_debugger_script("gdb_lookup.py");
|
||||
cp_debugger_script("gdb_providers.py");
|
||||
|
||||
// lldb debugger scripts
|
||||
builder.install(&builder.src.join("src/etc/rust-lldb"), &sysroot.join("bin"), 0o755);
|
||||
|
||||
cp_debugger_script("lldb_lookup.py");
|
||||
cp_debugger_script("lldb_providers.py");
|
||||
cp_debugger_script("lldb_commands")
|
||||
}
|
||||
|
||||
cp_debugger_script("rust_types.py");
|
||||
|
||||
// gdb debugger scripts
|
||||
builder.install(&builder.src.join("src/etc/rust-gdb"), &sysroot.join("bin"), 0o755);
|
||||
builder.install(&builder.src.join("src/etc/rust-gdbgui"), &sysroot.join("bin"), 0o755);
|
||||
|
||||
cp_debugger_script("gdb_load_rust_pretty_printers.py");
|
||||
cp_debugger_script("gdb_lookup.py");
|
||||
cp_debugger_script("gdb_providers.py");
|
||||
|
||||
// lldb debugger scripts
|
||||
builder.install(&builder.src.join("src/etc/rust-lldb"), &sysroot.join("bin"), 0o755);
|
||||
|
||||
cp_debugger_script("lldb_lookup.py");
|
||||
cp_debugger_script("lldb_providers.py");
|
||||
cp_debugger_script("lldb_commands")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ impl BuildMetrics {
|
|||
running_steps: Vec::new(),
|
||||
|
||||
system_info: System::new_with_specifics(
|
||||
RefreshKind::new().with_cpu(CpuRefreshKind::everything()),
|
||||
RefreshKind::nothing().with_cpu(CpuRefreshKind::everything()),
|
||||
),
|
||||
timer_start: None,
|
||||
invocation_timer_start: Instant::now(),
|
||||
|
|
@ -161,8 +161,9 @@ impl BuildMetrics {
|
|||
|
||||
let dest = build.out.join("metrics.json");
|
||||
|
||||
let mut system =
|
||||
System::new_with_specifics(RefreshKind::new().with_cpu(CpuRefreshKind::everything()));
|
||||
let mut system = System::new_with_specifics(
|
||||
RefreshKind::nothing().with_cpu(CpuRefreshKind::everything()),
|
||||
);
|
||||
system.refresh_cpu_usage();
|
||||
system.refresh_memory();
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit e16dd73690a6cc3ecdc5f5d94bbc3ce158a42e16
|
||||
Subproject commit 614c19cb4025636eb2ba68ebb3d44e3bd3a5e6e4
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit f48b0e842a3911c63240e955d042089e9e0894c7
|
||||
Subproject commit 128669297c8a7fdf771042eaec18b8adfaeaf0cd
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 5c86c739ec71b8bc839310ff47fa94e94635bba9
|
||||
Subproject commit ede56d1bbe132bac476b5029cd6d7508ca9572e9
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 787b4166ccc67bd8f72a6e3ef6685ce9ce82909a
|
||||
Subproject commit b21d99b770f9aceb0810c843847c52f86f45d2ed
|
||||
|
|
@ -17,17 +17,18 @@ pub(crate) trait FormatRenderer<'tcx>: Sized {
|
|||
///
|
||||
/// This is true for html, and false for json. See #80664
|
||||
const RUN_ON_MODULE: bool;
|
||||
|
||||
/// This associated type is the type where the current module information is stored.
|
||||
///
|
||||
/// For each module, we go through their items by calling for each item:
|
||||
///
|
||||
/// 1. save_module_data
|
||||
/// 2. item
|
||||
/// 3. set_back_info
|
||||
/// 1. `save_module_data`
|
||||
/// 2. `item`
|
||||
/// 3. `restore_module_data`
|
||||
///
|
||||
/// However,the `item` method might update information in `self` (for example if the child is
|
||||
/// a module). To prevent it to impact the other children of the current module, we need to
|
||||
/// reset the information between each call to `item` by using `set_back_info`.
|
||||
/// This is because the `item` method might update information in `self` (for example if the child
|
||||
/// is a module). To prevent it from impacting the other children of the current module, we need to
|
||||
/// reset the information between each call to `item` by using `restore_module_data`.
|
||||
type ModuleData;
|
||||
|
||||
/// Sets up any state required for the renderer. When this is called the cache has already been
|
||||
|
|
@ -41,18 +42,18 @@ pub(crate) trait FormatRenderer<'tcx>: Sized {
|
|||
|
||||
/// This method is called right before call [`Self::item`]. This method returns a type
|
||||
/// containing information that needs to be reset after the [`Self::item`] method has been
|
||||
/// called with the [`Self::set_back_info`] method.
|
||||
/// called with the [`Self::restore_module_data`] method.
|
||||
///
|
||||
/// In short it goes like this:
|
||||
///
|
||||
/// ```ignore (not valid code)
|
||||
/// let reset_data = type.save_module_data();
|
||||
/// type.item(item)?;
|
||||
/// type.set_back_info(reset_data);
|
||||
/// let reset_data = renderer.save_module_data();
|
||||
/// renderer.item(item)?;
|
||||
/// renderer.restore_module_data(reset_data);
|
||||
/// ```
|
||||
fn save_module_data(&mut self) -> Self::ModuleData;
|
||||
/// Used to reset current module's information.
|
||||
fn set_back_info(&mut self, info: Self::ModuleData);
|
||||
fn restore_module_data(&mut self, info: Self::ModuleData);
|
||||
|
||||
/// Renders a single non-module item. This means no recursive sub-item rendering is required.
|
||||
fn item(&mut self, item: clean::Item) -> Result<(), Error>;
|
||||
|
|
@ -91,7 +92,7 @@ fn run_format_inner<'tcx, T: FormatRenderer<'tcx>>(
|
|||
for it in module.items {
|
||||
let info = cx.save_module_data();
|
||||
run_format_inner(cx, it, prof)?;
|
||||
cx.set_back_info(info);
|
||||
cx.restore_module_data(info);
|
||||
}
|
||||
|
||||
cx.mod_item_out()?;
|
||||
|
|
|
|||
|
|
@ -601,7 +601,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
|
|||
self.info
|
||||
}
|
||||
|
||||
fn set_back_info(&mut self, info: Self::ModuleData) {
|
||||
fn restore_module_data(&mut self, info: Self::ModuleData) {
|
||||
self.info = info;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
|
|||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::Session;
|
||||
use rustc_span::{FileName, sym};
|
||||
use rustc_span::{FileName, FileNameDisplayPreference, RealFileName, sym};
|
||||
use tracing::info;
|
||||
|
||||
use crate::clean;
|
||||
|
|
@ -50,8 +50,14 @@ struct LocalSourcesCollector<'a, 'tcx> {
|
|||
src_root: &'a Path,
|
||||
}
|
||||
|
||||
fn is_real_and_local(span: clean::Span, sess: &Session) -> bool {
|
||||
span.cnum(sess) == LOCAL_CRATE && span.filename(sess).is_real()
|
||||
fn filename_real_and_local(span: clean::Span, sess: &Session) -> Option<RealFileName> {
|
||||
if span.cnum(sess) == LOCAL_CRATE
|
||||
&& let FileName::Real(file) = span.filename(sess)
|
||||
{
|
||||
Some(file)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl LocalSourcesCollector<'_, '_> {
|
||||
|
|
@ -60,16 +66,8 @@ impl LocalSourcesCollector<'_, '_> {
|
|||
let span = item.span(self.tcx);
|
||||
let Some(span) = span else { return };
|
||||
// skip all synthetic "files"
|
||||
if !is_real_and_local(span, sess) {
|
||||
return;
|
||||
}
|
||||
let filename = span.filename(sess);
|
||||
let p = if let FileName::Real(file) = filename {
|
||||
match file.into_local_path() {
|
||||
Some(p) => p,
|
||||
None => return,
|
||||
}
|
||||
} else {
|
||||
let Some(p) = filename_real_and_local(span, sess).and_then(|file| file.into_local_path())
|
||||
else {
|
||||
return;
|
||||
};
|
||||
if self.local_sources.contains_key(&*p) {
|
||||
|
|
@ -135,8 +133,7 @@ impl DocVisitor<'_> for SourceCollector<'_, '_> {
|
|||
// If we're not rendering sources, there's nothing to do.
|
||||
// If we're including source files, and we haven't seen this file yet,
|
||||
// then we need to render it out to the filesystem.
|
||||
if is_real_and_local(span, sess) {
|
||||
let filename = span.filename(sess);
|
||||
if let Some(filename) = filename_real_and_local(span, sess) {
|
||||
let span = span.inner();
|
||||
let pos = sess.source_map().lookup_source_file(span.lo());
|
||||
let file_span = span.with_lo(pos.start_pos).with_hi(pos.end_position());
|
||||
|
|
@ -152,7 +149,7 @@ impl DocVisitor<'_> for SourceCollector<'_, '_> {
|
|||
span,
|
||||
format!(
|
||||
"failed to render source code for `{filename}`: {e}",
|
||||
filename = filename.prefer_local(),
|
||||
filename = filename.to_string_lossy(FileNameDisplayPreference::Local),
|
||||
),
|
||||
);
|
||||
false
|
||||
|
|
@ -168,18 +165,13 @@ impl SourceCollector<'_, '_> {
|
|||
/// Renders the given filename into its corresponding HTML source file.
|
||||
fn emit_source(
|
||||
&mut self,
|
||||
filename: &FileName,
|
||||
file: &RealFileName,
|
||||
file_span: rustc_span::Span,
|
||||
) -> Result<(), Error> {
|
||||
let p = match *filename {
|
||||
FileName::Real(ref file) => {
|
||||
if let Some(local_path) = file.local_path() {
|
||||
local_path.to_path_buf()
|
||||
} else {
|
||||
unreachable!("only the current crate should have sources emitted");
|
||||
}
|
||||
}
|
||||
_ => return Ok(()),
|
||||
let p = if let Some(local_path) = file.local_path() {
|
||||
local_path.to_path_buf()
|
||||
} else {
|
||||
unreachable!("only the current crate should have sources emitted");
|
||||
};
|
||||
if self.emitted_local_sources.contains(&*p) {
|
||||
// We've already emitted this source
|
||||
|
|
@ -233,8 +225,10 @@ impl SourceCollector<'_, '_> {
|
|||
cur.push(&fname);
|
||||
|
||||
let title = format!("{} - source", src_fname.to_string_lossy());
|
||||
let desc =
|
||||
format!("Source of the Rust file `{}`.", filename.prefer_remapped_unconditionaly());
|
||||
let desc = format!(
|
||||
"Source of the Rust file `{}`.",
|
||||
file.to_string_lossy(FileNameDisplayPreference::Remapped)
|
||||
);
|
||||
let page = layout::Page {
|
||||
title: &title,
|
||||
css_class: "src",
|
||||
|
|
|
|||
|
|
@ -163,11 +163,10 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
|
|||
}
|
||||
|
||||
fn save_module_data(&mut self) -> Self::ModuleData {
|
||||
unreachable!("RUN_ON_MODULE = false should never call save_module_data")
|
||||
unreachable!("RUN_ON_MODULE = false, should never call save_module_data")
|
||||
}
|
||||
|
||||
fn set_back_info(&mut self, _info: Self::ModuleData) {
|
||||
unreachable!("RUN_ON_MODULE = false should never call set_back_info")
|
||||
fn restore_module_data(&mut self, _info: Self::ModuleData) {
|
||||
unreachable!("RUN_ON_MODULE = false, should never call set_back_info")
|
||||
}
|
||||
|
||||
/// Inserts an item into the index. This should be used rather than directly calling insert on
|
||||
|
|
@ -248,7 +247,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
|
|||
}
|
||||
|
||||
fn mod_item_in(&mut self, _item: &clean::Item) -> Result<(), Error> {
|
||||
unreachable!("RUN_ON_MODULE = false should never call mod_item_in")
|
||||
unreachable!("RUN_ON_MODULE = false, should never call mod_item_in")
|
||||
}
|
||||
|
||||
fn after_krate(&mut self) -> Result<(), Error> {
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 104d0d16c3c7c3fef2435fef6efb2d57b70fff73
|
||||
Subproject commit 1268e87bdbaed0693a9d782ccd5a21e2cab2de33
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 4c39aaff66862cc0da52fe529aa1990bb8bb9a22
|
||||
Subproject commit 05f54fdc34310f458033af8a63ce1d699fae8bf6
|
||||
|
|
@ -744,7 +744,6 @@ pub static LINTS: &[&crate::LintInfo] = &[
|
|||
crate::unit_types::LET_UNIT_VALUE_INFO,
|
||||
crate::unit_types::UNIT_ARG_INFO,
|
||||
crate::unit_types::UNIT_CMP_INFO,
|
||||
crate::unnamed_address::FN_ADDRESS_COMPARISONS_INFO,
|
||||
crate::unnecessary_box_returns::UNNECESSARY_BOX_RETURNS_INFO,
|
||||
crate::unnecessary_literal_bound::UNNECESSARY_LITERAL_BOUND_INFO,
|
||||
crate::unnecessary_map_on_constructor::UNNECESSARY_MAP_ON_CONSTRUCTOR_INFO,
|
||||
|
|
|
|||
|
|
@ -74,6 +74,8 @@ declare_with_version! { RENAMED(RENAMED_VERSION): &[(&str, &str)] = &[
|
|||
#[clippy::version = "1.53.0"]
|
||||
("clippy::filter_map", "clippy::manual_filter_map"),
|
||||
#[clippy::version = ""]
|
||||
("clippy::fn_address_comparisons", "unpredictable_function_pointer_comparisons"),
|
||||
#[clippy::version = ""]
|
||||
("clippy::identity_conversion", "clippy::useless_conversion"),
|
||||
#[clippy::version = "pre 1.29.0"]
|
||||
("clippy::if_let_redundant_pattern_matching", "clippy::redundant_pattern_matching"),
|
||||
|
|
|
|||
|
|
@ -363,7 +363,6 @@ mod uninhabited_references;
|
|||
mod uninit_vec;
|
||||
mod unit_return_expecting_ord;
|
||||
mod unit_types;
|
||||
mod unnamed_address;
|
||||
mod unnecessary_box_returns;
|
||||
mod unnecessary_literal_bound;
|
||||
mod unnecessary_map_on_constructor;
|
||||
|
|
@ -786,7 +785,6 @@ pub fn register_lints(store: &mut rustc_lint::LintStore, conf: &'static Conf) {
|
|||
store.register_early_pass(|| Box::new(option_env_unwrap::OptionEnvUnwrap));
|
||||
store.register_late_pass(move |_| Box::new(wildcard_imports::WildcardImports::new(conf)));
|
||||
store.register_late_pass(|_| Box::<redundant_pub_crate::RedundantPubCrate>::default());
|
||||
store.register_late_pass(|_| Box::new(unnamed_address::UnnamedAddress));
|
||||
store.register_late_pass(|_| Box::<dereference::Dereferencing<'_>>::default());
|
||||
store.register_late_pass(|_| Box::new(option_if_let_else::OptionIfLetElse));
|
||||
store.register_late_pass(|_| Box::new(future_not_send::FutureNotSend));
|
||||
|
|
|
|||
|
|
@ -1,60 +0,0 @@
|
|||
use clippy_utils::diagnostics::span_lint;
|
||||
use rustc_hir::{BinOpKind, Expr, ExprKind};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::ty;
|
||||
use rustc_session::declare_lint_pass;
|
||||
|
||||
declare_clippy_lint! {
|
||||
/// ### What it does
|
||||
/// Checks for comparisons with an address of a function item.
|
||||
///
|
||||
/// ### Why is this bad?
|
||||
/// Function item address is not guaranteed to be unique and could vary
|
||||
/// between different code generation units. Furthermore different function items could have
|
||||
/// the same address after being merged together.
|
||||
///
|
||||
/// ### Example
|
||||
/// ```no_run
|
||||
/// type F = fn();
|
||||
/// fn a() {}
|
||||
/// let f: F = a;
|
||||
/// if f == a {
|
||||
/// // ...
|
||||
/// }
|
||||
/// ```
|
||||
#[clippy::version = "1.44.0"]
|
||||
pub FN_ADDRESS_COMPARISONS,
|
||||
correctness,
|
||||
"comparison with an address of a function item"
|
||||
}
|
||||
|
||||
declare_lint_pass!(UnnamedAddress => [FN_ADDRESS_COMPARISONS]);
|
||||
|
||||
impl LateLintPass<'_> for UnnamedAddress {
|
||||
fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
|
||||
fn is_comparison(binop: BinOpKind) -> bool {
|
||||
matches!(
|
||||
binop,
|
||||
BinOpKind::Eq | BinOpKind::Lt | BinOpKind::Le | BinOpKind::Ne | BinOpKind::Ge | BinOpKind::Gt
|
||||
)
|
||||
}
|
||||
|
||||
fn is_fn_def(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||
matches!(cx.typeck_results().expr_ty(expr).kind(), ty::FnDef(..))
|
||||
}
|
||||
|
||||
if let ExprKind::Binary(binop, left, right) = expr.kind
|
||||
&& is_comparison(binop.node)
|
||||
&& cx.typeck_results().expr_ty_adjusted(left).is_fn_ptr()
|
||||
&& cx.typeck_results().expr_ty_adjusted(right).is_fn_ptr()
|
||||
&& (is_fn_def(cx, left) || is_fn_def(cx, right))
|
||||
{
|
||||
span_lint(
|
||||
cx,
|
||||
FN_ADDRESS_COMPARISONS,
|
||||
expr.span,
|
||||
"comparing with a non-unique address of a function item",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
use std::fmt::Debug;
|
||||
use std::ptr;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
fn a() {}
|
||||
|
||||
#[warn(clippy::fn_address_comparisons)]
|
||||
fn main() {
|
||||
type F = fn();
|
||||
let f: F = a;
|
||||
let g: F = f;
|
||||
|
||||
// These should fail:
|
||||
let _ = f == a;
|
||||
//~^ ERROR: comparing with a non-unique address of a function item
|
||||
//~| NOTE: `-D clippy::fn-address-comparisons` implied by `-D warnings`
|
||||
let _ = f != a;
|
||||
//~^ ERROR: comparing with a non-unique address of a function item
|
||||
|
||||
// These should be fine:
|
||||
let _ = f == g;
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
error: comparing with a non-unique address of a function item
|
||||
--> tests/ui/fn_address_comparisons.rs:15:13
|
||||
|
|
||||
LL | let _ = f == a;
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: `-D clippy::fn-address-comparisons` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::fn_address_comparisons)]`
|
||||
|
||||
error: comparing with a non-unique address of a function item
|
||||
--> tests/ui/fn_address_comparisons.rs:18:13
|
||||
|
|
||||
LL | let _ = f != a;
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
@ -59,6 +59,7 @@
|
|||
#![allow(unknown_lints)]
|
||||
#![allow(unused_labels)]
|
||||
#![allow(ambiguous_wide_pointer_comparisons)]
|
||||
#![allow(unpredictable_function_pointer_comparisons)]
|
||||
#![allow(clippy::reversed_empty_ranges)]
|
||||
#![warn(clippy::almost_complete_range)] //~ ERROR: lint `clippy::almost_complete_letter_range`
|
||||
#![warn(clippy::disallowed_names)] //~ ERROR: lint `clippy::blacklisted_name`
|
||||
|
|
@ -74,6 +75,7 @@
|
|||
#![warn(clippy::mixed_read_write_in_expression)] //~ ERROR: lint `clippy::eval_order_dependence`
|
||||
#![warn(clippy::manual_find_map)] //~ ERROR: lint `clippy::find_map`
|
||||
#![warn(clippy::manual_filter_map)] //~ ERROR: lint `clippy::filter_map`
|
||||
#![warn(unpredictable_function_pointer_comparisons)] //~ ERROR: lint `clippy::fn_address_comparisons`
|
||||
#![warn(clippy::useless_conversion)] //~ ERROR: lint `clippy::identity_conversion`
|
||||
#![warn(clippy::redundant_pattern_matching)] //~ ERROR: lint `clippy::if_let_redundant_pattern_matching`
|
||||
#![warn(clippy::match_result_ok)] //~ ERROR: lint `clippy::if_let_some_result`
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
#![allow(unknown_lints)]
|
||||
#![allow(unused_labels)]
|
||||
#![allow(ambiguous_wide_pointer_comparisons)]
|
||||
#![allow(unpredictable_function_pointer_comparisons)]
|
||||
#![allow(clippy::reversed_empty_ranges)]
|
||||
#![warn(clippy::almost_complete_letter_range)] //~ ERROR: lint `clippy::almost_complete_letter_range`
|
||||
#![warn(clippy::blacklisted_name)] //~ ERROR: lint `clippy::blacklisted_name`
|
||||
|
|
@ -74,6 +75,7 @@
|
|||
#![warn(clippy::eval_order_dependence)] //~ ERROR: lint `clippy::eval_order_dependence`
|
||||
#![warn(clippy::find_map)] //~ ERROR: lint `clippy::find_map`
|
||||
#![warn(clippy::filter_map)] //~ ERROR: lint `clippy::filter_map`
|
||||
#![warn(clippy::fn_address_comparisons)] //~ ERROR: lint `clippy::fn_address_comparisons`
|
||||
#![warn(clippy::identity_conversion)] //~ ERROR: lint `clippy::identity_conversion`
|
||||
#![warn(clippy::if_let_redundant_pattern_matching)] //~ ERROR: lint `clippy::if_let_redundant_pattern_matching`
|
||||
#![warn(clippy::if_let_some_result)] //~ ERROR: lint `clippy::if_let_some_result`
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: lint `clippy::almost_complete_letter_range` has been renamed to `clippy::almost_complete_range`
|
||||
--> tests/ui/rename.rs:63:9
|
||||
--> tests/ui/rename.rs:64:9
|
||||
|
|
||||
LL | #![warn(clippy::almost_complete_letter_range)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::almost_complete_range`
|
||||
|
|
@ -8,394 +8,400 @@ LL | #![warn(clippy::almost_complete_letter_range)]
|
|||
= help: to override `-D warnings` add `#[allow(renamed_and_removed_lints)]`
|
||||
|
||||
error: lint `clippy::blacklisted_name` has been renamed to `clippy::disallowed_names`
|
||||
--> tests/ui/rename.rs:64:9
|
||||
--> tests/ui/rename.rs:65:9
|
||||
|
|
||||
LL | #![warn(clippy::blacklisted_name)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_names`
|
||||
|
||||
error: lint `clippy::block_in_if_condition_expr` has been renamed to `clippy::blocks_in_conditions`
|
||||
--> tests/ui/rename.rs:65:9
|
||||
--> tests/ui/rename.rs:66:9
|
||||
|
|
||||
LL | #![warn(clippy::block_in_if_condition_expr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
|
||||
|
||||
error: lint `clippy::block_in_if_condition_stmt` has been renamed to `clippy::blocks_in_conditions`
|
||||
--> tests/ui/rename.rs:66:9
|
||||
--> tests/ui/rename.rs:67:9
|
||||
|
|
||||
LL | #![warn(clippy::block_in_if_condition_stmt)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
|
||||
|
||||
error: lint `clippy::blocks_in_if_conditions` has been renamed to `clippy::blocks_in_conditions`
|
||||
--> tests/ui/rename.rs:67:9
|
||||
--> tests/ui/rename.rs:68:9
|
||||
|
|
||||
LL | #![warn(clippy::blocks_in_if_conditions)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::blocks_in_conditions`
|
||||
|
||||
error: lint `clippy::box_vec` has been renamed to `clippy::box_collection`
|
||||
--> tests/ui/rename.rs:68:9
|
||||
--> tests/ui/rename.rs:69:9
|
||||
|
|
||||
LL | #![warn(clippy::box_vec)]
|
||||
| ^^^^^^^^^^^^^^^ help: use the new name: `clippy::box_collection`
|
||||
|
||||
error: lint `clippy::const_static_lifetime` has been renamed to `clippy::redundant_static_lifetimes`
|
||||
--> tests/ui/rename.rs:69:9
|
||||
--> tests/ui/rename.rs:70:9
|
||||
|
|
||||
LL | #![warn(clippy::const_static_lifetime)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::redundant_static_lifetimes`
|
||||
|
||||
error: lint `clippy::cyclomatic_complexity` has been renamed to `clippy::cognitive_complexity`
|
||||
--> tests/ui/rename.rs:70:9
|
||||
--> tests/ui/rename.rs:71:9
|
||||
|
|
||||
LL | #![warn(clippy::cyclomatic_complexity)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::cognitive_complexity`
|
||||
|
||||
error: lint `clippy::derive_hash_xor_eq` has been renamed to `clippy::derived_hash_with_manual_eq`
|
||||
--> tests/ui/rename.rs:71:9
|
||||
--> tests/ui/rename.rs:72:9
|
||||
|
|
||||
LL | #![warn(clippy::derive_hash_xor_eq)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::derived_hash_with_manual_eq`
|
||||
|
||||
error: lint `clippy::disallowed_method` has been renamed to `clippy::disallowed_methods`
|
||||
--> tests/ui/rename.rs:72:9
|
||||
--> tests/ui/rename.rs:73:9
|
||||
|
|
||||
LL | #![warn(clippy::disallowed_method)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_methods`
|
||||
|
||||
error: lint `clippy::disallowed_type` has been renamed to `clippy::disallowed_types`
|
||||
--> tests/ui/rename.rs:73:9
|
||||
--> tests/ui/rename.rs:74:9
|
||||
|
|
||||
LL | #![warn(clippy::disallowed_type)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::disallowed_types`
|
||||
|
||||
error: lint `clippy::eval_order_dependence` has been renamed to `clippy::mixed_read_write_in_expression`
|
||||
--> tests/ui/rename.rs:74:9
|
||||
--> tests/ui/rename.rs:75:9
|
||||
|
|
||||
LL | #![warn(clippy::eval_order_dependence)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::mixed_read_write_in_expression`
|
||||
|
||||
error: lint `clippy::find_map` has been renamed to `clippy::manual_find_map`
|
||||
--> tests/ui/rename.rs:75:9
|
||||
--> tests/ui/rename.rs:76:9
|
||||
|
|
||||
LL | #![warn(clippy::find_map)]
|
||||
| ^^^^^^^^^^^^^^^^ help: use the new name: `clippy::manual_find_map`
|
||||
|
||||
error: lint `clippy::filter_map` has been renamed to `clippy::manual_filter_map`
|
||||
--> tests/ui/rename.rs:76:9
|
||||
--> tests/ui/rename.rs:77:9
|
||||
|
|
||||
LL | #![warn(clippy::filter_map)]
|
||||
| ^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::manual_filter_map`
|
||||
|
||||
error: lint `clippy::fn_address_comparisons` has been renamed to `unpredictable_function_pointer_comparisons`
|
||||
--> tests/ui/rename.rs:78:9
|
||||
|
|
||||
LL | #![warn(clippy::fn_address_comparisons)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unpredictable_function_pointer_comparisons`
|
||||
|
||||
error: lint `clippy::identity_conversion` has been renamed to `clippy::useless_conversion`
|
||||
--> tests/ui/rename.rs:77:9
|
||||
--> tests/ui/rename.rs:79:9
|
||||
|
|
||||
LL | #![warn(clippy::identity_conversion)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::useless_conversion`
|
||||
|
||||
error: lint `clippy::if_let_redundant_pattern_matching` has been renamed to `clippy::redundant_pattern_matching`
|
||||
--> tests/ui/rename.rs:78:9
|
||||
--> tests/ui/rename.rs:80:9
|
||||
|
|
||||
LL | #![warn(clippy::if_let_redundant_pattern_matching)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::redundant_pattern_matching`
|
||||
|
||||
error: lint `clippy::if_let_some_result` has been renamed to `clippy::match_result_ok`
|
||||
--> tests/ui/rename.rs:79:9
|
||||
--> tests/ui/rename.rs:81:9
|
||||
|
|
||||
LL | #![warn(clippy::if_let_some_result)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::match_result_ok`
|
||||
|
||||
error: lint `clippy::incorrect_clone_impl_on_copy_type` has been renamed to `clippy::non_canonical_clone_impl`
|
||||
--> tests/ui/rename.rs:80:9
|
||||
--> tests/ui/rename.rs:82:9
|
||||
|
|
||||
LL | #![warn(clippy::incorrect_clone_impl_on_copy_type)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::non_canonical_clone_impl`
|
||||
|
||||
error: lint `clippy::incorrect_partial_ord_impl_on_ord_type` has been renamed to `clippy::non_canonical_partial_ord_impl`
|
||||
--> tests/ui/rename.rs:81:9
|
||||
--> tests/ui/rename.rs:83:9
|
||||
|
|
||||
LL | #![warn(clippy::incorrect_partial_ord_impl_on_ord_type)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::non_canonical_partial_ord_impl`
|
||||
|
||||
error: lint `clippy::integer_arithmetic` has been renamed to `clippy::arithmetic_side_effects`
|
||||
--> tests/ui/rename.rs:82:9
|
||||
--> tests/ui/rename.rs:84:9
|
||||
|
|
||||
LL | #![warn(clippy::integer_arithmetic)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::arithmetic_side_effects`
|
||||
|
||||
error: lint `clippy::logic_bug` has been renamed to `clippy::overly_complex_bool_expr`
|
||||
--> tests/ui/rename.rs:83:9
|
||||
--> tests/ui/rename.rs:85:9
|
||||
|
|
||||
LL | #![warn(clippy::logic_bug)]
|
||||
| ^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::overly_complex_bool_expr`
|
||||
|
||||
error: lint `clippy::new_without_default_derive` has been renamed to `clippy::new_without_default`
|
||||
--> tests/ui/rename.rs:84:9
|
||||
--> tests/ui/rename.rs:86:9
|
||||
|
|
||||
LL | #![warn(clippy::new_without_default_derive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::new_without_default`
|
||||
|
||||
error: lint `clippy::option_and_then_some` has been renamed to `clippy::bind_instead_of_map`
|
||||
--> tests/ui/rename.rs:85:9
|
||||
--> tests/ui/rename.rs:87:9
|
||||
|
|
||||
LL | #![warn(clippy::option_and_then_some)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::bind_instead_of_map`
|
||||
|
||||
error: lint `clippy::option_expect_used` has been renamed to `clippy::expect_used`
|
||||
--> tests/ui/rename.rs:86:9
|
||||
--> tests/ui/rename.rs:88:9
|
||||
|
|
||||
LL | #![warn(clippy::option_expect_used)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::expect_used`
|
||||
|
||||
error: lint `clippy::option_map_unwrap_or` has been renamed to `clippy::map_unwrap_or`
|
||||
--> tests/ui/rename.rs:87:9
|
||||
--> tests/ui/rename.rs:89:9
|
||||
|
|
||||
LL | #![warn(clippy::option_map_unwrap_or)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
|
||||
|
||||
error: lint `clippy::option_map_unwrap_or_else` has been renamed to `clippy::map_unwrap_or`
|
||||
--> tests/ui/rename.rs:88:9
|
||||
--> tests/ui/rename.rs:90:9
|
||||
|
|
||||
LL | #![warn(clippy::option_map_unwrap_or_else)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
|
||||
|
||||
error: lint `clippy::option_unwrap_used` has been renamed to `clippy::unwrap_used`
|
||||
--> tests/ui/rename.rs:89:9
|
||||
--> tests/ui/rename.rs:91:9
|
||||
|
|
||||
LL | #![warn(clippy::option_unwrap_used)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_used`
|
||||
|
||||
error: lint `clippy::overflow_check_conditional` has been renamed to `clippy::panicking_overflow_checks`
|
||||
--> tests/ui/rename.rs:90:9
|
||||
--> tests/ui/rename.rs:92:9
|
||||
|
|
||||
LL | #![warn(clippy::overflow_check_conditional)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::panicking_overflow_checks`
|
||||
|
||||
error: lint `clippy::ref_in_deref` has been renamed to `clippy::needless_borrow`
|
||||
--> tests/ui/rename.rs:91:9
|
||||
--> tests/ui/rename.rs:93:9
|
||||
|
|
||||
LL | #![warn(clippy::ref_in_deref)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::needless_borrow`
|
||||
|
||||
error: lint `clippy::result_expect_used` has been renamed to `clippy::expect_used`
|
||||
--> tests/ui/rename.rs:92:9
|
||||
--> tests/ui/rename.rs:94:9
|
||||
|
|
||||
LL | #![warn(clippy::result_expect_used)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::expect_used`
|
||||
|
||||
error: lint `clippy::result_map_unwrap_or_else` has been renamed to `clippy::map_unwrap_or`
|
||||
--> tests/ui/rename.rs:93:9
|
||||
--> tests/ui/rename.rs:95:9
|
||||
|
|
||||
LL | #![warn(clippy::result_map_unwrap_or_else)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::map_unwrap_or`
|
||||
|
||||
error: lint `clippy::result_unwrap_used` has been renamed to `clippy::unwrap_used`
|
||||
--> tests/ui/rename.rs:94:9
|
||||
--> tests/ui/rename.rs:96:9
|
||||
|
|
||||
LL | #![warn(clippy::result_unwrap_used)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_used`
|
||||
|
||||
error: lint `clippy::single_char_push_str` has been renamed to `clippy::single_char_add_str`
|
||||
--> tests/ui/rename.rs:95:9
|
||||
--> tests/ui/rename.rs:97:9
|
||||
|
|
||||
LL | #![warn(clippy::single_char_push_str)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::single_char_add_str`
|
||||
|
||||
error: lint `clippy::stutter` has been renamed to `clippy::module_name_repetitions`
|
||||
--> tests/ui/rename.rs:96:9
|
||||
--> tests/ui/rename.rs:98:9
|
||||
|
|
||||
LL | #![warn(clippy::stutter)]
|
||||
| ^^^^^^^^^^^^^^^ help: use the new name: `clippy::module_name_repetitions`
|
||||
|
||||
error: lint `clippy::thread_local_initializer_can_be_made_const` has been renamed to `clippy::missing_const_for_thread_local`
|
||||
--> tests/ui/rename.rs:97:9
|
||||
--> tests/ui/rename.rs:99:9
|
||||
|
|
||||
LL | #![warn(clippy::thread_local_initializer_can_be_made_const)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::missing_const_for_thread_local`
|
||||
|
||||
error: lint `clippy::to_string_in_display` has been renamed to `clippy::recursive_format_impl`
|
||||
--> tests/ui/rename.rs:98:9
|
||||
--> tests/ui/rename.rs:100:9
|
||||
|
|
||||
LL | #![warn(clippy::to_string_in_display)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::recursive_format_impl`
|
||||
|
||||
error: lint `clippy::unwrap_or_else_default` has been renamed to `clippy::unwrap_or_default`
|
||||
--> tests/ui/rename.rs:99:9
|
||||
--> tests/ui/rename.rs:101:9
|
||||
|
|
||||
LL | #![warn(clippy::unwrap_or_else_default)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::unwrap_or_default`
|
||||
|
||||
error: lint `clippy::zero_width_space` has been renamed to `clippy::invisible_characters`
|
||||
--> tests/ui/rename.rs:100:9
|
||||
--> tests/ui/rename.rs:102:9
|
||||
|
|
||||
LL | #![warn(clippy::zero_width_space)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::invisible_characters`
|
||||
|
||||
error: lint `clippy::cast_ref_to_mut` has been renamed to `invalid_reference_casting`
|
||||
--> tests/ui/rename.rs:101:9
|
||||
--> tests/ui/rename.rs:103:9
|
||||
|
|
||||
LL | #![warn(clippy::cast_ref_to_mut)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_reference_casting`
|
||||
|
||||
error: lint `clippy::clone_double_ref` has been renamed to `suspicious_double_ref_op`
|
||||
--> tests/ui/rename.rs:102:9
|
||||
--> tests/ui/rename.rs:104:9
|
||||
|
|
||||
LL | #![warn(clippy::clone_double_ref)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `suspicious_double_ref_op`
|
||||
|
||||
error: lint `clippy::cmp_nan` has been renamed to `invalid_nan_comparisons`
|
||||
--> tests/ui/rename.rs:103:9
|
||||
--> tests/ui/rename.rs:105:9
|
||||
|
|
||||
LL | #![warn(clippy::cmp_nan)]
|
||||
| ^^^^^^^^^^^^^^^ help: use the new name: `invalid_nan_comparisons`
|
||||
|
||||
error: lint `clippy::drop_bounds` has been renamed to `drop_bounds`
|
||||
--> tests/ui/rename.rs:104:9
|
||||
--> tests/ui/rename.rs:106:9
|
||||
|
|
||||
LL | #![warn(clippy::drop_bounds)]
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `drop_bounds`
|
||||
|
||||
error: lint `clippy::drop_copy` has been renamed to `dropping_copy_types`
|
||||
--> tests/ui/rename.rs:105:9
|
||||
--> tests/ui/rename.rs:107:9
|
||||
|
|
||||
LL | #![warn(clippy::drop_copy)]
|
||||
| ^^^^^^^^^^^^^^^^^ help: use the new name: `dropping_copy_types`
|
||||
|
||||
error: lint `clippy::drop_ref` has been renamed to `dropping_references`
|
||||
--> tests/ui/rename.rs:106:9
|
||||
--> tests/ui/rename.rs:108:9
|
||||
|
|
||||
LL | #![warn(clippy::drop_ref)]
|
||||
| ^^^^^^^^^^^^^^^^ help: use the new name: `dropping_references`
|
||||
|
||||
error: lint `clippy::fn_null_check` has been renamed to `useless_ptr_null_checks`
|
||||
--> tests/ui/rename.rs:107:9
|
||||
--> tests/ui/rename.rs:109:9
|
||||
|
|
||||
LL | #![warn(clippy::fn_null_check)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `useless_ptr_null_checks`
|
||||
|
||||
error: lint `clippy::for_loop_over_option` has been renamed to `for_loops_over_fallibles`
|
||||
--> tests/ui/rename.rs:108:9
|
||||
--> tests/ui/rename.rs:110:9
|
||||
|
|
||||
LL | #![warn(clippy::for_loop_over_option)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
|
||||
|
||||
error: lint `clippy::for_loop_over_result` has been renamed to `for_loops_over_fallibles`
|
||||
--> tests/ui/rename.rs:109:9
|
||||
--> tests/ui/rename.rs:111:9
|
||||
|
|
||||
LL | #![warn(clippy::for_loop_over_result)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
|
||||
|
||||
error: lint `clippy::for_loops_over_fallibles` has been renamed to `for_loops_over_fallibles`
|
||||
--> tests/ui/rename.rs:110:9
|
||||
--> tests/ui/rename.rs:112:9
|
||||
|
|
||||
LL | #![warn(clippy::for_loops_over_fallibles)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `for_loops_over_fallibles`
|
||||
|
||||
error: lint `clippy::forget_copy` has been renamed to `forgetting_copy_types`
|
||||
--> tests/ui/rename.rs:111:9
|
||||
--> tests/ui/rename.rs:113:9
|
||||
|
|
||||
LL | #![warn(clippy::forget_copy)]
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `forgetting_copy_types`
|
||||
|
||||
error: lint `clippy::forget_ref` has been renamed to `forgetting_references`
|
||||
--> tests/ui/rename.rs:112:9
|
||||
--> tests/ui/rename.rs:114:9
|
||||
|
|
||||
LL | #![warn(clippy::forget_ref)]
|
||||
| ^^^^^^^^^^^^^^^^^^ help: use the new name: `forgetting_references`
|
||||
|
||||
error: lint `clippy::into_iter_on_array` has been renamed to `array_into_iter`
|
||||
--> tests/ui/rename.rs:113:9
|
||||
--> tests/ui/rename.rs:115:9
|
||||
|
|
||||
LL | #![warn(clippy::into_iter_on_array)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `array_into_iter`
|
||||
|
||||
error: lint `clippy::invalid_atomic_ordering` has been renamed to `invalid_atomic_ordering`
|
||||
--> tests/ui/rename.rs:114:9
|
||||
--> tests/ui/rename.rs:116:9
|
||||
|
|
||||
LL | #![warn(clippy::invalid_atomic_ordering)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_atomic_ordering`
|
||||
|
||||
error: lint `clippy::invalid_ref` has been renamed to `invalid_value`
|
||||
--> tests/ui/rename.rs:115:9
|
||||
--> tests/ui/rename.rs:117:9
|
||||
|
|
||||
LL | #![warn(clippy::invalid_ref)]
|
||||
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_value`
|
||||
|
||||
error: lint `clippy::invalid_utf8_in_unchecked` has been renamed to `invalid_from_utf8_unchecked`
|
||||
--> tests/ui/rename.rs:116:9
|
||||
--> tests/ui/rename.rs:118:9
|
||||
|
|
||||
LL | #![warn(clippy::invalid_utf8_in_unchecked)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `invalid_from_utf8_unchecked`
|
||||
|
||||
error: lint `clippy::let_underscore_drop` has been renamed to `let_underscore_drop`
|
||||
--> tests/ui/rename.rs:117:9
|
||||
--> tests/ui/rename.rs:119:9
|
||||
|
|
||||
LL | #![warn(clippy::let_underscore_drop)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `let_underscore_drop`
|
||||
|
||||
error: lint `clippy::maybe_misused_cfg` has been renamed to `unexpected_cfgs`
|
||||
--> tests/ui/rename.rs:118:9
|
||||
--> tests/ui/rename.rs:120:9
|
||||
|
|
||||
LL | #![warn(clippy::maybe_misused_cfg)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unexpected_cfgs`
|
||||
|
||||
error: lint `clippy::mem_discriminant_non_enum` has been renamed to `enum_intrinsics_non_enums`
|
||||
--> tests/ui/rename.rs:119:9
|
||||
--> tests/ui/rename.rs:121:9
|
||||
|
|
||||
LL | #![warn(clippy::mem_discriminant_non_enum)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `enum_intrinsics_non_enums`
|
||||
|
||||
error: lint `clippy::mismatched_target_os` has been renamed to `unexpected_cfgs`
|
||||
--> tests/ui/rename.rs:120:9
|
||||
--> tests/ui/rename.rs:122:9
|
||||
|
|
||||
LL | #![warn(clippy::mismatched_target_os)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unexpected_cfgs`
|
||||
|
||||
error: lint `clippy::panic_params` has been renamed to `non_fmt_panics`
|
||||
--> tests/ui/rename.rs:121:9
|
||||
--> tests/ui/rename.rs:123:9
|
||||
|
|
||||
LL | #![warn(clippy::panic_params)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `non_fmt_panics`
|
||||
|
||||
error: lint `clippy::positional_named_format_parameters` has been renamed to `named_arguments_used_positionally`
|
||||
--> tests/ui/rename.rs:122:9
|
||||
--> tests/ui/rename.rs:124:9
|
||||
|
|
||||
LL | #![warn(clippy::positional_named_format_parameters)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `named_arguments_used_positionally`
|
||||
|
||||
error: lint `clippy::temporary_cstring_as_ptr` has been renamed to `dangling_pointers_from_temporaries`
|
||||
--> tests/ui/rename.rs:123:9
|
||||
--> tests/ui/rename.rs:125:9
|
||||
|
|
||||
LL | #![warn(clippy::temporary_cstring_as_ptr)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `dangling_pointers_from_temporaries`
|
||||
|
||||
error: lint `clippy::undropped_manually_drops` has been renamed to `undropped_manually_drops`
|
||||
--> tests/ui/rename.rs:124:9
|
||||
--> tests/ui/rename.rs:126:9
|
||||
|
|
||||
LL | #![warn(clippy::undropped_manually_drops)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `undropped_manually_drops`
|
||||
|
||||
error: lint `clippy::unknown_clippy_lints` has been renamed to `unknown_lints`
|
||||
--> tests/ui/rename.rs:125:9
|
||||
--> tests/ui/rename.rs:127:9
|
||||
|
|
||||
LL | #![warn(clippy::unknown_clippy_lints)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unknown_lints`
|
||||
|
||||
error: lint `clippy::unused_label` has been renamed to `unused_labels`
|
||||
--> tests/ui/rename.rs:126:9
|
||||
--> tests/ui/rename.rs:128:9
|
||||
|
|
||||
LL | #![warn(clippy::unused_label)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^ help: use the new name: `unused_labels`
|
||||
|
||||
error: lint `clippy::vtable_address_comparisons` has been renamed to `ambiguous_wide_pointer_comparisons`
|
||||
--> tests/ui/rename.rs:127:9
|
||||
--> tests/ui/rename.rs:129:9
|
||||
|
|
||||
LL | #![warn(clippy::vtable_address_comparisons)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `ambiguous_wide_pointer_comparisons`
|
||||
|
||||
error: lint `clippy::reverse_range_loop` has been renamed to `clippy::reversed_empty_ranges`
|
||||
--> tests/ui/rename.rs:128:9
|
||||
--> tests/ui/rename.rs:130:9
|
||||
|
|
||||
LL | #![warn(clippy::reverse_range_loop)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `clippy::reversed_empty_ranges`
|
||||
|
||||
error: aborting due to 66 previous errors
|
||||
error: aborting due to 67 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3b382642aba7cffbb2f47829b24635fad87bcf5c
|
||||
706141b8d9090228343340378b1d4a2b095fa1fb
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
#![allow(unpredictable_function_pointer_comparisons)]
|
||||
|
||||
use std::mem;
|
||||
|
||||
trait Answer {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
#![allow(unpredictable_function_pointer_comparisons)]
|
||||
|
||||
type BuiltIn = for<'a> fn(&str);
|
||||
|
||||
struct Function {
|
||||
|
|
|
|||
|
|
@ -3936,17 +3936,8 @@ The tracking issue for this feature is: [#117693]
|
|||
"##,
|
||||
},
|
||||
Lint {
|
||||
label: "core_pattern_type",
|
||||
description: r##"# `core_pattern_type`
|
||||
|
||||
This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
|
||||
|
||||
------------------------
|
||||
"##,
|
||||
},
|
||||
Lint {
|
||||
label: "core_pattern_types",
|
||||
description: r##"# `core_pattern_types`
|
||||
label: "pattern_type_macro",
|
||||
description: r##"# `pattern_type_macro`
|
||||
|
||||
This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ const ALLOWLIST: &[&str] = &[
|
|||
"const_eval_validation_failure_note",
|
||||
"driver_impl_ice",
|
||||
"incremental_corrupt_file",
|
||||
"mir_build_pointer_pattern",
|
||||
];
|
||||
|
||||
fn check_period(filename: &str, contents: &str, bad: &mut bool) {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@
|
|||
//@ compile-flags: -Csymbol-mangling-version=v0 -Copt-level=0 --crate-type=lib
|
||||
|
||||
#![feature(pattern_types)]
|
||||
#![feature(core_pattern_types)]
|
||||
#![feature(core_pattern_type)]
|
||||
#![feature(pattern_type_macro)]
|
||||
|
||||
use std::pat::pattern_type;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
Function name: abort::main
|
||||
Raw bytes (89): 0x[01, 01, 0a, 01, 27, 05, 09, 03, 0d, 22, 11, 03, 0d, 03, 0d, 22, 15, 03, 0d, 03, 0d, 05, 09, 0d, 01, 0d, 01, 01, 1b, 03, 02, 0b, 00, 18, 22, 01, 0c, 00, 19, 11, 00, 1a, 02, 0a, 0e, 02, 09, 00, 0a, 22, 02, 0c, 00, 19, 15, 00, 1a, 00, 31, 1a, 00, 30, 00, 31, 22, 04, 0c, 00, 19, 05, 00, 1a, 00, 31, 09, 00, 30, 00, 31, 27, 01, 09, 00, 17, 0d, 02, 05, 01, 02]
|
||||
Raw bytes (89): 0x[01, 01, 0a, 07, 09, 01, 05, 03, 0d, 03, 13, 0d, 11, 03, 0d, 03, 1f, 0d, 15, 03, 0d, 05, 09, 0d, 01, 0d, 01, 01, 1b, 03, 02, 0b, 00, 18, 22, 01, 0c, 00, 19, 11, 00, 1a, 02, 0a, 0e, 02, 09, 00, 0a, 22, 02, 0c, 00, 19, 15, 00, 1a, 00, 31, 1a, 00, 30, 00, 31, 22, 04, 0c, 00, 19, 05, 00, 1a, 00, 31, 09, 00, 30, 00, 31, 27, 01, 09, 00, 17, 0d, 02, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 10
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Expression(9, Add)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(2)
|
||||
- expression 1 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Expression(8, Sub), rhs = Counter(4)
|
||||
- expression 4 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Expression(0, Add), rhs = Expression(4, Add)
|
||||
- expression 4 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
- expression 5 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 6 operands: lhs = Expression(8, Sub), rhs = Counter(5)
|
||||
- expression 7 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 6 operands: lhs = Expression(0, Add), rhs = Expression(7, Add)
|
||||
- expression 7 operands: lhs = Counter(3), rhs = Counter(5)
|
||||
- expression 8 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 9 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 13
|
||||
- Code(Counter(0)) at (prev + 13, 1) to (start + 1, 27)
|
||||
- Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 24)
|
||||
= (c0 + (c1 + c2))
|
||||
= ((c0 + c1) + c2)
|
||||
- Code(Expression(8, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= ((c0 + (c1 + c2)) - c3)
|
||||
= (((c0 + c1) + c2) - c3)
|
||||
- Code(Counter(4)) at (prev + 0, 26) to (start + 2, 10)
|
||||
- Code(Expression(3, Sub)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= (((c0 + (c1 + c2)) - c3) - c4)
|
||||
= (((c0 + c1) + c2) - (c3 + c4))
|
||||
- Code(Expression(8, Sub)) at (prev + 2, 12) to (start + 0, 25)
|
||||
= ((c0 + (c1 + c2)) - c3)
|
||||
= (((c0 + c1) + c2) - c3)
|
||||
- Code(Counter(5)) at (prev + 0, 26) to (start + 0, 49)
|
||||
- Code(Expression(6, Sub)) at (prev + 0, 48) to (start + 0, 49)
|
||||
= (((c0 + (c1 + c2)) - c3) - c5)
|
||||
= (((c0 + c1) + c2) - (c3 + c5))
|
||||
- Code(Expression(8, Sub)) at (prev + 4, 12) to (start + 0, 25)
|
||||
= ((c0 + (c1 + c2)) - c3)
|
||||
= (((c0 + c1) + c2) - c3)
|
||||
- Code(Counter(1)) at (prev + 0, 26) to (start + 0, 49)
|
||||
- Code(Counter(2)) at (prev + 0, 48) to (start + 0, 49)
|
||||
- Code(Expression(9, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
|
|
|
|||
|
|
@ -1,29 +1,30 @@
|
|||
Function name: assert::main
|
||||
Raw bytes (65): 0x[01, 01, 08, 01, 1b, 05, 1f, 09, 0d, 03, 11, 16, 05, 03, 11, 05, 1f, 09, 0d, 09, 01, 09, 01, 01, 1b, 03, 02, 0b, 00, 18, 16, 01, 0c, 00, 1a, 05, 00, 1b, 02, 0a, 12, 02, 13, 00, 20, 09, 00, 21, 02, 0a, 0d, 02, 09, 00, 0a, 1b, 01, 09, 00, 17, 11, 02, 05, 01, 02]
|
||||
Raw bytes (67): 0x[01, 01, 09, 07, 0d, 0b, 09, 01, 05, 03, 11, 17, 11, 1b, 0d, 01, 09, 23, 0d, 05, 09, 09, 01, 09, 01, 01, 1b, 03, 02, 0b, 00, 18, 0e, 01, 0c, 00, 1a, 05, 00, 1b, 02, 0a, 12, 02, 13, 00, 20, 09, 00, 21, 02, 0a, 0d, 02, 09, 00, 0a, 1f, 01, 09, 00, 17, 11, 02, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 8
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Expression(6, Add)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(7, Add)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
Number of expressions: 9
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(2)
|
||||
- expression 2 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 3 operands: lhs = Expression(0, Add), rhs = Counter(4)
|
||||
- expression 4 operands: lhs = Expression(5, Sub), rhs = Counter(1)
|
||||
- expression 5 operands: lhs = Expression(0, Add), rhs = Counter(4)
|
||||
- expression 6 operands: lhs = Counter(1), rhs = Expression(7, Add)
|
||||
- expression 7 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Expression(5, Add), rhs = Counter(4)
|
||||
- expression 5 operands: lhs = Expression(6, Add), rhs = Counter(3)
|
||||
- expression 6 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
- expression 7 operands: lhs = Expression(8, Add), rhs = Counter(3)
|
||||
- expression 8 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 9
|
||||
- Code(Counter(0)) at (prev + 9, 1) to (start + 1, 27)
|
||||
- Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 24)
|
||||
= (c0 + (c1 + (c2 + c3)))
|
||||
- Code(Expression(5, Sub)) at (prev + 1, 12) to (start + 0, 26)
|
||||
= ((c0 + (c1 + (c2 + c3))) - c4)
|
||||
= (((c0 + c1) + c2) + c3)
|
||||
- Code(Expression(3, Sub)) at (prev + 1, 12) to (start + 0, 26)
|
||||
= ((((c0 + c1) + c2) + c3) - c4)
|
||||
- Code(Counter(1)) at (prev + 0, 27) to (start + 2, 10)
|
||||
- Code(Expression(4, Sub)) at (prev + 2, 19) to (start + 0, 32)
|
||||
= (((c0 + (c1 + (c2 + c3))) - c4) - c1)
|
||||
= (((c0 + c2) + c3) - c4)
|
||||
- Code(Counter(2)) at (prev + 0, 33) to (start + 2, 10)
|
||||
- Code(Counter(3)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(6, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (c1 + (c2 + c3))
|
||||
- Code(Expression(7, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= ((c1 + c2) + c3)
|
||||
- Code(Counter(4)) at (prev + 2, 5) to (start + 1, 2)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
|
|
|
|||
|
|
@ -155,25 +155,25 @@ Number of file 0 mappings: 1
|
|||
Highest counter ID seen: c0
|
||||
|
||||
Function name: async::i::{closure#0}
|
||||
Raw bytes (63): 0x[01, 01, 02, 07, 19, 11, 15, 0b, 01, 2d, 13, 04, 0c, 09, 05, 09, 00, 0a, 01, 00, 0e, 00, 18, 05, 00, 1c, 00, 21, 09, 00, 27, 00, 30, 15, 01, 09, 00, 0a, 0d, 00, 0e, 00, 17, 1d, 00, 1b, 00, 20, 15, 00, 24, 00, 26, 19, 01, 0e, 00, 10, 03, 02, 01, 00, 02]
|
||||
Raw bytes (63): 0x[01, 01, 02, 07, 15, 0d, 11, 0b, 01, 2d, 13, 04, 0c, 09, 05, 09, 00, 0a, 01, 00, 0e, 00, 18, 05, 00, 1c, 00, 21, 09, 00, 27, 00, 30, 11, 01, 09, 00, 0a, 19, 00, 0e, 00, 17, 1d, 00, 1b, 00, 20, 11, 00, 24, 00, 26, 15, 01, 0e, 00, 10, 03, 02, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 2
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(6)
|
||||
- expression 1 operands: lhs = Counter(4), rhs = Counter(5)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(5)
|
||||
- expression 1 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
Number of file 0 mappings: 11
|
||||
- Code(Counter(0)) at (prev + 45, 19) to (start + 4, 12)
|
||||
- Code(Counter(2)) at (prev + 5, 9) to (start + 0, 10)
|
||||
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 24)
|
||||
- Code(Counter(1)) at (prev + 0, 28) to (start + 0, 33)
|
||||
- Code(Counter(2)) at (prev + 0, 39) to (start + 0, 48)
|
||||
- Code(Counter(5)) at (prev + 1, 9) to (start + 0, 10)
|
||||
- Code(Counter(3)) at (prev + 0, 14) to (start + 0, 23)
|
||||
- Code(Counter(4)) at (prev + 1, 9) to (start + 0, 10)
|
||||
- Code(Counter(6)) at (prev + 0, 14) to (start + 0, 23)
|
||||
- Code(Counter(7)) at (prev + 0, 27) to (start + 0, 32)
|
||||
- Code(Counter(5)) at (prev + 0, 36) to (start + 0, 38)
|
||||
- Code(Counter(6)) at (prev + 1, 14) to (start + 0, 16)
|
||||
- Code(Counter(4)) at (prev + 0, 36) to (start + 0, 38)
|
||||
- Code(Counter(5)) at (prev + 1, 14) to (start + 0, 16)
|
||||
- Code(Expression(0, Add)) at (prev + 2, 1) to (start + 0, 2)
|
||||
= ((c4 + c5) + c6)
|
||||
= ((c3 + c4) + c5)
|
||||
Highest counter ID seen: c7
|
||||
|
||||
Function name: async::j
|
||||
|
|
@ -243,22 +243,19 @@ Number of file 0 mappings: 5
|
|||
Highest counter ID seen: (none)
|
||||
|
||||
Function name: async::l
|
||||
Raw bytes (37): 0x[01, 01, 04, 01, 07, 05, 09, 0f, 02, 09, 05, 05, 01, 52, 01, 01, 0c, 02, 02, 0e, 00, 10, 05, 01, 0e, 00, 10, 09, 01, 0e, 00, 10, 0b, 02, 01, 00, 02]
|
||||
Raw bytes (33): 0x[01, 01, 02, 01, 07, 05, 09, 05, 01, 52, 01, 01, 0c, 02, 02, 0e, 00, 10, 09, 01, 0e, 00, 10, 05, 01, 0e, 00, 10, 01, 02, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 4
|
||||
Number of expressions: 2
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Expression(1, Add)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 2 operands: lhs = Expression(3, Add), rhs = Expression(0, Sub)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(1)
|
||||
Number of file 0 mappings: 5
|
||||
- Code(Counter(0)) at (prev + 82, 1) to (start + 1, 12)
|
||||
- Code(Expression(0, Sub)) at (prev + 2, 14) to (start + 0, 16)
|
||||
= (c0 - (c1 + c2))
|
||||
- Code(Counter(1)) at (prev + 1, 14) to (start + 0, 16)
|
||||
- Code(Counter(2)) at (prev + 1, 14) to (start + 0, 16)
|
||||
- Code(Expression(2, Add)) at (prev + 2, 1) to (start + 0, 2)
|
||||
= ((c2 + c1) + (c0 - (c1 + c2)))
|
||||
- Code(Counter(1)) at (prev + 1, 14) to (start + 0, 16)
|
||||
- Code(Counter(0)) at (prev + 2, 1) to (start + 0, 2)
|
||||
Highest counter ID seen: c2
|
||||
|
||||
Function name: async::m
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
Function name: guard::branch_match_guard
|
||||
Raw bytes (85): 0x[01, 01, 06, 19, 0d, 05, 09, 0f, 15, 13, 11, 17, 0d, 05, 09, 0d, 01, 0c, 01, 01, 10, 1d, 03, 0b, 00, 0c, 15, 01, 14, 02, 0a, 0d, 03, 0e, 00, 0f, 19, 00, 14, 00, 19, 20, 0d, 02, 00, 14, 00, 1e, 0d, 00, 1d, 02, 0a, 11, 03, 0e, 00, 0f, 1d, 00, 14, 00, 19, 20, 11, 09, 00, 14, 00, 1e, 11, 00, 1d, 02, 0a, 17, 03, 0e, 02, 0a, 0b, 04, 01, 00, 02]
|
||||
Raw bytes (85): 0x[01, 01, 06, 19, 0d, 05, 09, 0f, 15, 13, 11, 17, 0d, 05, 09, 0d, 01, 0c, 01, 01, 10, 02, 03, 0b, 00, 0c, 15, 01, 14, 02, 0a, 0d, 03, 0e, 00, 0f, 19, 00, 14, 00, 19, 20, 0d, 02, 00, 14, 00, 1e, 0d, 00, 1d, 02, 0a, 11, 03, 0e, 00, 0f, 02, 00, 14, 00, 19, 20, 11, 05, 00, 14, 00, 1e, 11, 00, 1d, 02, 0a, 17, 03, 0e, 02, 0a, 0b, 04, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 6
|
||||
|
|
@ -11,7 +11,8 @@ Number of expressions: 6
|
|||
- expression 5 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 13
|
||||
- Code(Counter(0)) at (prev + 12, 1) to (start + 1, 16)
|
||||
- Code(Counter(7)) at (prev + 3, 11) to (start + 0, 12)
|
||||
- Code(Expression(0, Sub)) at (prev + 3, 11) to (start + 0, 12)
|
||||
= (c6 - c3)
|
||||
- Code(Counter(5)) at (prev + 1, 20) to (start + 2, 10)
|
||||
- Code(Counter(3)) at (prev + 3, 14) to (start + 0, 15)
|
||||
- Code(Counter(6)) at (prev + 0, 20) to (start + 0, 25)
|
||||
|
|
@ -20,14 +21,15 @@ Number of file 0 mappings: 13
|
|||
false = (c6 - c3)
|
||||
- Code(Counter(3)) at (prev + 0, 29) to (start + 2, 10)
|
||||
- Code(Counter(4)) at (prev + 3, 14) to (start + 0, 15)
|
||||
- Code(Counter(7)) at (prev + 0, 20) to (start + 0, 25)
|
||||
- Branch { true: Counter(4), false: Counter(2) } at (prev + 0, 20) to (start + 0, 30)
|
||||
- Code(Expression(0, Sub)) at (prev + 0, 20) to (start + 0, 25)
|
||||
= (c6 - c3)
|
||||
- Branch { true: Counter(4), false: Counter(1) } at (prev + 0, 20) to (start + 0, 30)
|
||||
true = c4
|
||||
false = c2
|
||||
false = c1
|
||||
- Code(Counter(4)) at (prev + 0, 29) to (start + 2, 10)
|
||||
- Code(Expression(5, Add)) at (prev + 3, 14) to (start + 2, 10)
|
||||
= (c1 + c2)
|
||||
- Code(Expression(2, Add)) at (prev + 4, 1) to (start + 0, 2)
|
||||
= ((((c1 + c2) + c3) + c4) + c5)
|
||||
Highest counter ID seen: c7
|
||||
Highest counter ID seen: c6
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,14 @@
|
|||
Function name: if::branch_and
|
||||
Raw bytes (56): 0x[01, 01, 04, 05, 09, 0d, 02, 11, 0f, 0d, 02, 08, 01, 2b, 01, 01, 10, 05, 03, 08, 00, 09, 20, 09, 02, 00, 08, 00, 09, 09, 00, 0d, 00, 0e, 20, 11, 0d, 00, 0d, 00, 0e, 11, 00, 0f, 02, 06, 0f, 02, 0c, 02, 06, 0b, 03, 01, 00, 02]
|
||||
Raw bytes (60): 0x[01, 01, 06, 05, 09, 0b, 09, 05, 11, 13, 09, 17, 11, 05, 0d, 08, 01, 2b, 01, 01, 10, 05, 03, 08, 00, 09, 20, 09, 02, 00, 08, 00, 09, 09, 00, 0d, 00, 0e, 20, 0d, 11, 00, 0d, 00, 0e, 0d, 00, 0f, 02, 06, 06, 02, 0c, 02, 06, 0e, 03, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 4
|
||||
Number of expressions: 6
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 1 operands: lhs = Counter(3), rhs = Expression(0, Sub)
|
||||
- expression 2 operands: lhs = Counter(4), rhs = Expression(3, Add)
|
||||
- expression 3 operands: lhs = Counter(3), rhs = Expression(0, Sub)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(2)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 3 operands: lhs = Expression(4, Add), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Expression(5, Add), rhs = Counter(4)
|
||||
- expression 5 operands: lhs = Counter(1), rhs = Counter(3)
|
||||
Number of file 0 mappings: 8
|
||||
- Code(Counter(0)) at (prev + 43, 1) to (start + 1, 16)
|
||||
- Code(Counter(1)) at (prev + 3, 8) to (start + 0, 9)
|
||||
|
|
@ -14,14 +16,14 @@ Number of file 0 mappings: 8
|
|||
true = c2
|
||||
false = (c1 - c2)
|
||||
- Code(Counter(2)) at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(4), false: Counter(3) } at (prev + 0, 13) to (start + 0, 14)
|
||||
true = c4
|
||||
false = c3
|
||||
- Code(Counter(4)) at (prev + 0, 15) to (start + 2, 6)
|
||||
- Code(Expression(3, Add)) at (prev + 2, 12) to (start + 2, 6)
|
||||
= (c3 + (c1 - c2))
|
||||
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
|
||||
= (c4 + (c3 + (c1 - c2)))
|
||||
- Branch { true: Counter(3), false: Counter(4) } at (prev + 0, 13) to (start + 0, 14)
|
||||
true = c3
|
||||
false = c4
|
||||
- Code(Counter(3)) at (prev + 0, 15) to (start + 2, 6)
|
||||
- Code(Expression(1, Sub)) at (prev + 2, 12) to (start + 2, 6)
|
||||
= ((c1 + c4) - c2)
|
||||
- Code(Expression(3, Sub)) at (prev + 3, 1) to (start + 0, 2)
|
||||
= (((c1 + c3) + c4) - c2)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: if::branch_not
|
||||
|
|
|
|||
|
|
@ -34,39 +34,49 @@ Number of file 0 mappings: 6
|
|||
Highest counter ID seen: c2
|
||||
|
||||
Function name: lazy_boolean::chain
|
||||
Raw bytes (149): 0x[01, 01, 13, 11, 07, 0b, 16, 15, 1a, 09, 0d, 05, 09, 05, 09, 09, 0d, 47, 25, 4b, 21, 19, 1d, 03, 19, 03, 19, 3e, 1d, 03, 19, 3e, 1d, 03, 19, 47, 25, 4b, 21, 19, 1d, 13, 01, 24, 01, 01, 10, 03, 04, 09, 00, 0a, 05, 00, 0d, 00, 12, 20, 09, 16, 00, 0d, 00, 12, 09, 00, 16, 00, 1b, 20, 0d, 1a, 00, 16, 00, 1b, 0d, 00, 1f, 00, 24, 20, 11, 15, 00, 1f, 00, 24, 11, 00, 28, 00, 2d, 03, 01, 05, 00, 11, 43, 03, 09, 00, 0a, 03, 00, 0d, 00, 12, 20, 19, 3e, 00, 0d, 00, 12, 3e, 00, 16, 00, 1b, 20, 1d, 3a, 00, 16, 00, 1b, 3a, 00, 1f, 00, 24, 20, 21, 25, 00, 1f, 00, 24, 25, 00, 28, 00, 2d, 43, 01, 05, 01, 02]
|
||||
Raw bytes (169): 0x[01, 01, 1d, 5b, 0d, 5f, 15, 05, 11, 05, 09, 09, 0d, 6f, 25, 73, 21, 19, 1d, 5b, 67, 5f, 15, 05, 11, 0d, 19, 5b, 67, 5f, 15, 05, 11, 0d, 19, 5b, 63, 5f, 15, 05, 11, 67, 1d, 0d, 19, 5b, 63, 5f, 15, 05, 11, 67, 1d, 0d, 19, 6f, 25, 73, 21, 19, 1d, 13, 01, 24, 01, 01, 10, 02, 04, 09, 00, 0a, 05, 00, 0d, 00, 12, 20, 09, 0e, 00, 0d, 00, 12, 09, 00, 16, 00, 1b, 20, 0d, 12, 00, 16, 00, 1b, 0d, 00, 1f, 00, 24, 20, 11, 15, 00, 1f, 00, 24, 11, 00, 28, 00, 2d, 02, 01, 05, 00, 11, 6b, 03, 09, 00, 0a, 02, 00, 0d, 00, 12, 20, 19, 32, 00, 0d, 00, 12, 32, 00, 16, 00, 1b, 20, 1d, 56, 00, 16, 00, 1b, 56, 00, 1f, 00, 24, 20, 21, 25, 00, 1f, 00, 24, 25, 00, 28, 00, 2d, 6b, 01, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 19
|
||||
- expression 0 operands: lhs = Counter(4), rhs = Expression(1, Add)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Expression(5, Sub)
|
||||
- expression 2 operands: lhs = Counter(5), rhs = Expression(6, Sub)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 5 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 6 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 7 operands: lhs = Expression(17, Add), rhs = Counter(9)
|
||||
- expression 8 operands: lhs = Expression(18, Add), rhs = Counter(8)
|
||||
- expression 9 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
- expression 10 operands: lhs = Expression(0, Add), rhs = Counter(6)
|
||||
- expression 11 operands: lhs = Expression(0, Add), rhs = Counter(6)
|
||||
- expression 12 operands: lhs = Expression(15, Sub), rhs = Counter(7)
|
||||
- expression 13 operands: lhs = Expression(0, Add), rhs = Counter(6)
|
||||
- expression 14 operands: lhs = Expression(15, Sub), rhs = Counter(7)
|
||||
- expression 15 operands: lhs = Expression(0, Add), rhs = Counter(6)
|
||||
- expression 16 operands: lhs = Expression(17, Add), rhs = Counter(9)
|
||||
- expression 17 operands: lhs = Expression(18, Add), rhs = Counter(8)
|
||||
- expression 18 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
Number of expressions: 29
|
||||
- expression 0 operands: lhs = Expression(22, Add), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Expression(23, Add), rhs = Counter(5)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 5 operands: lhs = Expression(27, Add), rhs = Counter(9)
|
||||
- expression 6 operands: lhs = Expression(28, Add), rhs = Counter(8)
|
||||
- expression 7 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
- expression 8 operands: lhs = Expression(22, Add), rhs = Expression(25, Add)
|
||||
- expression 9 operands: lhs = Expression(23, Add), rhs = Counter(5)
|
||||
- expression 10 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 11 operands: lhs = Counter(3), rhs = Counter(6)
|
||||
- expression 12 operands: lhs = Expression(22, Add), rhs = Expression(25, Add)
|
||||
- expression 13 operands: lhs = Expression(23, Add), rhs = Counter(5)
|
||||
- expression 14 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 15 operands: lhs = Counter(3), rhs = Counter(6)
|
||||
- expression 16 operands: lhs = Expression(22, Add), rhs = Expression(24, Add)
|
||||
- expression 17 operands: lhs = Expression(23, Add), rhs = Counter(5)
|
||||
- expression 18 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 19 operands: lhs = Expression(25, Add), rhs = Counter(7)
|
||||
- expression 20 operands: lhs = Counter(3), rhs = Counter(6)
|
||||
- expression 21 operands: lhs = Expression(22, Add), rhs = Expression(24, Add)
|
||||
- expression 22 operands: lhs = Expression(23, Add), rhs = Counter(5)
|
||||
- expression 23 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 24 operands: lhs = Expression(25, Add), rhs = Counter(7)
|
||||
- expression 25 operands: lhs = Counter(3), rhs = Counter(6)
|
||||
- expression 26 operands: lhs = Expression(27, Add), rhs = Counter(9)
|
||||
- expression 27 operands: lhs = Expression(28, Add), rhs = Counter(8)
|
||||
- expression 28 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
Number of file 0 mappings: 19
|
||||
- Code(Counter(0)) at (prev + 36, 1) to (start + 1, 16)
|
||||
- Code(Expression(0, Add)) at (prev + 4, 9) to (start + 0, 10)
|
||||
= (c4 + ((c5 + (c2 - c3)) + (c1 - c2)))
|
||||
- Code(Expression(0, Sub)) at (prev + 4, 9) to (start + 0, 10)
|
||||
= (((c1 + c4) + c5) - c3)
|
||||
- Code(Counter(1)) at (prev + 0, 13) to (start + 0, 18)
|
||||
- Branch { true: Counter(2), false: Expression(5, Sub) } at (prev + 0, 13) to (start + 0, 18)
|
||||
- Branch { true: Counter(2), false: Expression(3, Sub) } at (prev + 0, 13) to (start + 0, 18)
|
||||
true = c2
|
||||
false = (c1 - c2)
|
||||
- Code(Counter(2)) at (prev + 0, 22) to (start + 0, 27)
|
||||
- Branch { true: Counter(3), false: Expression(6, Sub) } at (prev + 0, 22) to (start + 0, 27)
|
||||
- Branch { true: Counter(3), false: Expression(4, Sub) } at (prev + 0, 22) to (start + 0, 27)
|
||||
true = c3
|
||||
false = (c2 - c3)
|
||||
- Code(Counter(3)) at (prev + 0, 31) to (start + 0, 36)
|
||||
|
|
@ -74,97 +84,87 @@ Number of file 0 mappings: 19
|
|||
true = c4
|
||||
false = c5
|
||||
- Code(Counter(4)) at (prev + 0, 40) to (start + 0, 45)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 5) to (start + 0, 17)
|
||||
= (c4 + ((c5 + (c2 - c3)) + (c1 - c2)))
|
||||
- Code(Expression(16, Add)) at (prev + 3, 9) to (start + 0, 10)
|
||||
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 17)
|
||||
= (((c1 + c4) + c5) - c3)
|
||||
- Code(Expression(26, Add)) at (prev + 3, 9) to (start + 0, 10)
|
||||
= (((c6 + c7) + c8) + c9)
|
||||
- Code(Expression(0, Add)) at (prev + 0, 13) to (start + 0, 18)
|
||||
= (c4 + ((c5 + (c2 - c3)) + (c1 - c2)))
|
||||
- Branch { true: Counter(6), false: Expression(15, Sub) } at (prev + 0, 13) to (start + 0, 18)
|
||||
- Code(Expression(0, Sub)) at (prev + 0, 13) to (start + 0, 18)
|
||||
= (((c1 + c4) + c5) - c3)
|
||||
- Branch { true: Counter(6), false: Expression(12, Sub) } at (prev + 0, 13) to (start + 0, 18)
|
||||
true = c6
|
||||
false = ((c4 + ((c5 + (c2 - c3)) + (c1 - c2))) - c6)
|
||||
- Code(Expression(15, Sub)) at (prev + 0, 22) to (start + 0, 27)
|
||||
= ((c4 + ((c5 + (c2 - c3)) + (c1 - c2))) - c6)
|
||||
- Branch { true: Counter(7), false: Expression(14, Sub) } at (prev + 0, 22) to (start + 0, 27)
|
||||
false = (((c1 + c4) + c5) - (c3 + c6))
|
||||
- Code(Expression(12, Sub)) at (prev + 0, 22) to (start + 0, 27)
|
||||
= (((c1 + c4) + c5) - (c3 + c6))
|
||||
- Branch { true: Counter(7), false: Expression(21, Sub) } at (prev + 0, 22) to (start + 0, 27)
|
||||
true = c7
|
||||
false = (((c4 + ((c5 + (c2 - c3)) + (c1 - c2))) - c6) - c7)
|
||||
- Code(Expression(14, Sub)) at (prev + 0, 31) to (start + 0, 36)
|
||||
= (((c4 + ((c5 + (c2 - c3)) + (c1 - c2))) - c6) - c7)
|
||||
false = (((c1 + c4) + c5) - ((c3 + c6) + c7))
|
||||
- Code(Expression(21, Sub)) at (prev + 0, 31) to (start + 0, 36)
|
||||
= (((c1 + c4) + c5) - ((c3 + c6) + c7))
|
||||
- Branch { true: Counter(8), false: Counter(9) } at (prev + 0, 31) to (start + 0, 36)
|
||||
true = c8
|
||||
false = c9
|
||||
- Code(Counter(9)) at (prev + 0, 40) to (start + 0, 45)
|
||||
- Code(Expression(16, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
- Code(Expression(26, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= (((c6 + c7) + c8) + c9)
|
||||
Highest counter ID seen: c9
|
||||
|
||||
Function name: lazy_boolean::nested_mixed
|
||||
Raw bytes (155): 0x[01, 01, 16, 33, 1a, 09, 0d, 1e, 0d, 05, 09, 05, 09, 05, 09, 1e, 0d, 05, 09, 09, 0d, 33, 11, 09, 0d, 33, 11, 09, 0d, 19, 57, 1d, 21, 03, 15, 15, 19, 4a, 4e, 15, 19, 03, 15, 19, 57, 1d, 21, 13, 01, 31, 01, 01, 10, 03, 04, 09, 00, 0a, 05, 00, 0e, 00, 13, 20, 09, 1e, 00, 0e, 00, 13, 1e, 00, 17, 00, 1d, 20, 0d, 1a, 00, 17, 00, 1d, 33, 00, 23, 00, 28, 20, 11, 2e, 00, 23, 00, 28, 2e, 00, 2c, 00, 33, 03, 01, 05, 00, 11, 53, 03, 09, 00, 0a, 03, 00, 0e, 00, 13, 20, 15, 4e, 00, 0e, 00, 13, 15, 00, 17, 00, 1c, 20, 19, 4a, 00, 17, 00, 1c, 47, 00, 22, 00, 28, 20, 1d, 21, 00, 22, 00, 28, 1d, 00, 2c, 00, 33, 53, 01, 05, 01, 02]
|
||||
Raw bytes (141): 0x[01, 01, 0f, 05, 09, 05, 1f, 09, 0d, 09, 0d, 1f, 11, 09, 0d, 1f, 11, 09, 0d, 3b, 21, 19, 1d, 05, 15, 15, 19, 05, 19, 3b, 21, 19, 1d, 13, 01, 31, 01, 01, 10, 05, 04, 09, 00, 0a, 05, 00, 0e, 00, 13, 20, 09, 02, 00, 0e, 00, 13, 02, 00, 17, 00, 1d, 20, 0d, 06, 00, 17, 00, 1d, 1f, 00, 23, 00, 28, 20, 11, 1a, 00, 23, 00, 28, 1a, 00, 2c, 00, 33, 05, 01, 05, 00, 11, 37, 03, 09, 00, 0a, 05, 00, 0e, 00, 13, 20, 15, 2a, 00, 0e, 00, 13, 15, 00, 17, 00, 1c, 20, 19, 2e, 00, 17, 00, 1c, 32, 00, 22, 00, 28, 20, 1d, 21, 00, 22, 00, 28, 1d, 00, 2c, 00, 33, 37, 01, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 22
|
||||
- expression 0 operands: lhs = Expression(12, Add), rhs = Expression(6, Sub)
|
||||
- expression 1 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Expression(7, Sub), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 5 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 6 operands: lhs = Expression(7, Sub), rhs = Counter(3)
|
||||
- expression 7 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 8 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 9 operands: lhs = Expression(12, Add), rhs = Counter(4)
|
||||
- expression 10 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 11 operands: lhs = Expression(12, Add), rhs = Counter(4)
|
||||
- expression 12 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 13 operands: lhs = Counter(6), rhs = Expression(21, Add)
|
||||
- expression 14 operands: lhs = Counter(7), rhs = Counter(8)
|
||||
- expression 15 operands: lhs = Expression(0, Add), rhs = Counter(5)
|
||||
- expression 16 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 17 operands: lhs = Expression(18, Sub), rhs = Expression(19, Sub)
|
||||
- expression 18 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 19 operands: lhs = Expression(0, Add), rhs = Counter(5)
|
||||
- expression 20 operands: lhs = Counter(6), rhs = Expression(21, Add)
|
||||
- expression 21 operands: lhs = Counter(7), rhs = Counter(8)
|
||||
Number of expressions: 15
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(7, Add)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Expression(7, Add), rhs = Counter(4)
|
||||
- expression 5 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 6 operands: lhs = Expression(7, Add), rhs = Counter(4)
|
||||
- expression 7 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 8 operands: lhs = Expression(14, Add), rhs = Counter(8)
|
||||
- expression 9 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
- expression 10 operands: lhs = Counter(1), rhs = Counter(5)
|
||||
- expression 11 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 12 operands: lhs = Counter(1), rhs = Counter(6)
|
||||
- expression 13 operands: lhs = Expression(14, Add), rhs = Counter(8)
|
||||
- expression 14 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
Number of file 0 mappings: 19
|
||||
- Code(Counter(0)) at (prev + 49, 1) to (start + 1, 16)
|
||||
- Code(Expression(0, Add)) at (prev + 4, 9) to (start + 0, 10)
|
||||
= ((c2 + c3) + ((c1 - c2) - c3))
|
||||
- Code(Counter(1)) at (prev + 4, 9) to (start + 0, 10)
|
||||
- Code(Counter(1)) at (prev + 0, 14) to (start + 0, 19)
|
||||
- Branch { true: Counter(2), false: Expression(7, Sub) } at (prev + 0, 14) to (start + 0, 19)
|
||||
- Branch { true: Counter(2), false: Expression(0, Sub) } at (prev + 0, 14) to (start + 0, 19)
|
||||
true = c2
|
||||
false = (c1 - c2)
|
||||
- Code(Expression(7, Sub)) at (prev + 0, 23) to (start + 0, 29)
|
||||
- Code(Expression(0, Sub)) at (prev + 0, 23) to (start + 0, 29)
|
||||
= (c1 - c2)
|
||||
- Branch { true: Counter(3), false: Expression(6, Sub) } at (prev + 0, 23) to (start + 0, 29)
|
||||
- Branch { true: Counter(3), false: Expression(1, Sub) } at (prev + 0, 23) to (start + 0, 29)
|
||||
true = c3
|
||||
false = ((c1 - c2) - c3)
|
||||
- Code(Expression(12, Add)) at (prev + 0, 35) to (start + 0, 40)
|
||||
false = (c1 - (c2 + c3))
|
||||
- Code(Expression(7, Add)) at (prev + 0, 35) to (start + 0, 40)
|
||||
= (c2 + c3)
|
||||
- Branch { true: Counter(4), false: Expression(11, Sub) } at (prev + 0, 35) to (start + 0, 40)
|
||||
- Branch { true: Counter(4), false: Expression(6, Sub) } at (prev + 0, 35) to (start + 0, 40)
|
||||
true = c4
|
||||
false = ((c2 + c3) - c4)
|
||||
- Code(Expression(11, Sub)) at (prev + 0, 44) to (start + 0, 51)
|
||||
- Code(Expression(6, Sub)) at (prev + 0, 44) to (start + 0, 51)
|
||||
= ((c2 + c3) - c4)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 5) to (start + 0, 17)
|
||||
= ((c2 + c3) + ((c1 - c2) - c3))
|
||||
- Code(Expression(20, Add)) at (prev + 3, 9) to (start + 0, 10)
|
||||
= (c6 + (c7 + c8))
|
||||
- Code(Expression(0, Add)) at (prev + 0, 14) to (start + 0, 19)
|
||||
= ((c2 + c3) + ((c1 - c2) - c3))
|
||||
- Branch { true: Counter(5), false: Expression(19, Sub) } at (prev + 0, 14) to (start + 0, 19)
|
||||
- Code(Counter(1)) at (prev + 1, 5) to (start + 0, 17)
|
||||
- Code(Expression(13, Add)) at (prev + 3, 9) to (start + 0, 10)
|
||||
= ((c6 + c7) + c8)
|
||||
- Code(Counter(1)) at (prev + 0, 14) to (start + 0, 19)
|
||||
- Branch { true: Counter(5), false: Expression(10, Sub) } at (prev + 0, 14) to (start + 0, 19)
|
||||
true = c5
|
||||
false = (((c2 + c3) + ((c1 - c2) - c3)) - c5)
|
||||
false = (c1 - c5)
|
||||
- Code(Counter(5)) at (prev + 0, 23) to (start + 0, 28)
|
||||
- Branch { true: Counter(6), false: Expression(18, Sub) } at (prev + 0, 23) to (start + 0, 28)
|
||||
- Branch { true: Counter(6), false: Expression(11, Sub) } at (prev + 0, 23) to (start + 0, 28)
|
||||
true = c6
|
||||
false = (c5 - c6)
|
||||
- Code(Expression(17, Add)) at (prev + 0, 34) to (start + 0, 40)
|
||||
= ((c5 - c6) + (((c2 + c3) + ((c1 - c2) - c3)) - c5))
|
||||
- Code(Expression(12, Sub)) at (prev + 0, 34) to (start + 0, 40)
|
||||
= (c1 - c6)
|
||||
- Branch { true: Counter(7), false: Counter(8) } at (prev + 0, 34) to (start + 0, 40)
|
||||
true = c7
|
||||
false = c8
|
||||
- Code(Counter(7)) at (prev + 0, 44) to (start + 0, 51)
|
||||
- Code(Expression(20, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= (c6 + (c7 + c8))
|
||||
- Code(Expression(13, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= ((c6 + c7) + c8)
|
||||
Highest counter ID seen: c8
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
Function name: match_arms::guards
|
||||
Raw bytes (88): 0x[01, 01, 08, 07, 15, 0b, 11, 0f, 0d, 00, 09, 17, 25, 1b, 21, 1f, 1d, 03, 19, 0c, 01, 30, 01, 01, 10, 29, 03, 0b, 00, 10, 19, 01, 11, 00, 29, 20, 19, 09, 00, 17, 00, 1b, 1d, 01, 11, 00, 29, 20, 1d, 0d, 00, 17, 00, 1b, 21, 01, 11, 00, 29, 20, 21, 11, 00, 17, 00, 1b, 25, 01, 11, 00, 29, 20, 25, 15, 00, 17, 00, 1b, 03, 01, 0e, 00, 18, 13, 03, 05, 01, 02]
|
||||
Raw bytes (88): 0x[01, 01, 08, 07, 00, 0b, 11, 0f, 0d, 05, 09, 17, 25, 1b, 21, 1f, 1d, 03, 19, 0c, 01, 30, 01, 01, 10, 29, 03, 0b, 00, 10, 19, 01, 11, 00, 29, 20, 19, 05, 00, 17, 00, 1b, 1d, 01, 11, 00, 29, 20, 1d, 09, 00, 17, 00, 1b, 21, 01, 11, 00, 29, 20, 21, 0d, 00, 17, 00, 1b, 25, 01, 11, 00, 29, 20, 25, 11, 00, 17, 00, 1b, 03, 01, 0e, 00, 18, 13, 03, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 8
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(5)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Zero
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(4)
|
||||
- expression 2 operands: lhs = Expression(3, Add), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Zero, rhs = Counter(2)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Expression(5, Add), rhs = Counter(9)
|
||||
- expression 5 operands: lhs = Expression(6, Add), rhs = Counter(8)
|
||||
- expression 6 operands: lhs = Expression(7, Add), rhs = Counter(7)
|
||||
|
|
@ -15,81 +15,67 @@ Number of file 0 mappings: 12
|
|||
- Code(Counter(0)) at (prev + 48, 1) to (start + 1, 16)
|
||||
- Code(Counter(10)) at (prev + 3, 11) to (start + 0, 16)
|
||||
- Code(Counter(6)) at (prev + 1, 17) to (start + 0, 41)
|
||||
- Branch { true: Counter(6), false: Counter(2) } at (prev + 0, 23) to (start + 0, 27)
|
||||
- Branch { true: Counter(6), false: Counter(1) } at (prev + 0, 23) to (start + 0, 27)
|
||||
true = c6
|
||||
false = c2
|
||||
false = c1
|
||||
- Code(Counter(7)) at (prev + 1, 17) to (start + 0, 41)
|
||||
- Branch { true: Counter(7), false: Counter(3) } at (prev + 0, 23) to (start + 0, 27)
|
||||
- Branch { true: Counter(7), false: Counter(2) } at (prev + 0, 23) to (start + 0, 27)
|
||||
true = c7
|
||||
false = c3
|
||||
false = c2
|
||||
- Code(Counter(8)) at (prev + 1, 17) to (start + 0, 41)
|
||||
- Branch { true: Counter(8), false: Counter(4) } at (prev + 0, 23) to (start + 0, 27)
|
||||
- Branch { true: Counter(8), false: Counter(3) } at (prev + 0, 23) to (start + 0, 27)
|
||||
true = c8
|
||||
false = c4
|
||||
false = c3
|
||||
- Code(Counter(9)) at (prev + 1, 17) to (start + 0, 41)
|
||||
- Branch { true: Counter(9), false: Counter(5) } at (prev + 0, 23) to (start + 0, 27)
|
||||
- Branch { true: Counter(9), false: Counter(4) } at (prev + 0, 23) to (start + 0, 27)
|
||||
true = c9
|
||||
false = c5
|
||||
false = c4
|
||||
- Code(Expression(0, Add)) at (prev + 1, 14) to (start + 0, 24)
|
||||
= ((((Zero + c2) + c3) + c4) + c5)
|
||||
= ((((c1 + c2) + c3) + c4) + Zero)
|
||||
- Code(Expression(4, Add)) at (prev + 3, 5) to (start + 1, 2)
|
||||
= ((((((((Zero + c2) + c3) + c4) + c5) + c6) + c7) + c8) + c9)
|
||||
= ((((((((c1 + c2) + c3) + c4) + Zero) + c6) + c7) + c8) + c9)
|
||||
Highest counter ID seen: c10
|
||||
|
||||
Function name: match_arms::match_arms
|
||||
Raw bytes (51): 0x[01, 01, 06, 05, 07, 0b, 11, 09, 0d, 13, 02, 17, 09, 11, 0d, 07, 01, 18, 01, 01, 10, 05, 03, 0b, 00, 10, 11, 01, 11, 00, 21, 0d, 01, 11, 00, 21, 09, 01, 11, 00, 21, 02, 01, 11, 00, 21, 0f, 03, 05, 01, 02]
|
||||
Raw bytes (45): 0x[01, 01, 03, 05, 07, 0b, 11, 09, 0d, 07, 01, 18, 01, 01, 10, 05, 03, 0b, 00, 10, 09, 01, 11, 00, 21, 0d, 01, 11, 00, 21, 11, 01, 11, 00, 21, 02, 01, 11, 00, 21, 05, 03, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 6
|
||||
Number of expressions: 3
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Expression(1, Add)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(4)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Expression(4, Add), rhs = Expression(0, Sub)
|
||||
- expression 4 operands: lhs = Expression(5, Add), rhs = Counter(2)
|
||||
- expression 5 operands: lhs = Counter(4), rhs = Counter(3)
|
||||
Number of file 0 mappings: 7
|
||||
- Code(Counter(0)) at (prev + 24, 1) to (start + 1, 16)
|
||||
- Code(Counter(1)) at (prev + 3, 11) to (start + 0, 16)
|
||||
- Code(Counter(4)) at (prev + 1, 17) to (start + 0, 33)
|
||||
- Code(Counter(3)) at (prev + 1, 17) to (start + 0, 33)
|
||||
- Code(Counter(2)) at (prev + 1, 17) to (start + 0, 33)
|
||||
- Code(Counter(3)) at (prev + 1, 17) to (start + 0, 33)
|
||||
- Code(Counter(4)) at (prev + 1, 17) to (start + 0, 33)
|
||||
- Code(Expression(0, Sub)) at (prev + 1, 17) to (start + 0, 33)
|
||||
= (c1 - ((c2 + c3) + c4))
|
||||
- Code(Expression(3, Add)) at (prev + 3, 5) to (start + 1, 2)
|
||||
= (((c4 + c3) + c2) + (c1 - ((c2 + c3) + c4)))
|
||||
- Code(Counter(1)) at (prev + 3, 5) to (start + 1, 2)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: match_arms::or_patterns
|
||||
Raw bytes (75): 0x[01, 01, 0d, 11, 0d, 05, 2f, 33, 11, 09, 0d, 09, 2a, 05, 2f, 33, 11, 09, 0d, 03, 27, 09, 2a, 05, 2f, 33, 11, 09, 0d, 09, 01, 25, 01, 01, 10, 05, 03, 0b, 00, 10, 11, 01, 11, 00, 12, 0d, 00, 1e, 00, 1f, 03, 00, 24, 00, 2e, 09, 01, 11, 00, 12, 2a, 00, 1e, 00, 1f, 27, 00, 24, 00, 2e, 23, 03, 05, 01, 02]
|
||||
Raw bytes (57): 0x[01, 01, 04, 09, 0d, 05, 0b, 03, 11, 05, 03, 09, 01, 25, 01, 01, 10, 05, 03, 0b, 00, 10, 09, 01, 11, 00, 12, 0d, 00, 1e, 00, 1f, 03, 00, 24, 00, 2e, 11, 01, 11, 00, 12, 06, 00, 1e, 00, 1f, 0e, 00, 24, 00, 2e, 05, 03, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 13
|
||||
- expression 0 operands: lhs = Counter(4), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(11, Add)
|
||||
- expression 2 operands: lhs = Expression(12, Add), rhs = Counter(4)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Counter(2), rhs = Expression(10, Sub)
|
||||
- expression 5 operands: lhs = Counter(1), rhs = Expression(11, Add)
|
||||
- expression 6 operands: lhs = Expression(12, Add), rhs = Counter(4)
|
||||
- expression 7 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 8 operands: lhs = Expression(0, Add), rhs = Expression(9, Add)
|
||||
- expression 9 operands: lhs = Counter(2), rhs = Expression(10, Sub)
|
||||
- expression 10 operands: lhs = Counter(1), rhs = Expression(11, Add)
|
||||
- expression 11 operands: lhs = Expression(12, Add), rhs = Counter(4)
|
||||
- expression 12 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
Number of expressions: 4
|
||||
- expression 0 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(2, Add)
|
||||
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(4)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Expression(0, Add)
|
||||
Number of file 0 mappings: 9
|
||||
- Code(Counter(0)) at (prev + 37, 1) to (start + 1, 16)
|
||||
- Code(Counter(1)) at (prev + 3, 11) to (start + 0, 16)
|
||||
- Code(Counter(4)) at (prev + 1, 17) to (start + 0, 18)
|
||||
- Code(Counter(2)) at (prev + 1, 17) to (start + 0, 18)
|
||||
- Code(Counter(3)) at (prev + 0, 30) to (start + 0, 31)
|
||||
- Code(Expression(0, Add)) at (prev + 0, 36) to (start + 0, 46)
|
||||
= (c4 + c3)
|
||||
- Code(Counter(2)) at (prev + 1, 17) to (start + 0, 18)
|
||||
- Code(Expression(10, Sub)) at (prev + 0, 30) to (start + 0, 31)
|
||||
= (c2 + c3)
|
||||
- Code(Counter(4)) at (prev + 1, 17) to (start + 0, 18)
|
||||
- Code(Expression(1, Sub)) at (prev + 0, 30) to (start + 0, 31)
|
||||
= (c1 - ((c2 + c3) + c4))
|
||||
- Code(Expression(9, Add)) at (prev + 0, 36) to (start + 0, 46)
|
||||
= (c2 + (c1 - ((c2 + c3) + c4)))
|
||||
- Code(Expression(8, Add)) at (prev + 3, 5) to (start + 1, 2)
|
||||
= ((c4 + c3) + (c2 + (c1 - ((c2 + c3) + c4))))
|
||||
- Code(Expression(3, Sub)) at (prev + 0, 36) to (start + 0, 46)
|
||||
= (c1 - (c2 + c3))
|
||||
- Code(Counter(1)) at (prev + 3, 5) to (start + 1, 2)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
|
|
|
|||
|
|
@ -23,19 +23,19 @@ Number of file 0 mappings: 2
|
|||
Highest counter ID seen: c2
|
||||
|
||||
Function name: no_mir_spans::while_op_and
|
||||
Raw bytes (25): 0x[01, 01, 01, 09, 0d, 03, 01, 22, 01, 00, 13, 20, 09, 05, 05, 0b, 00, 10, 20, 02, 0d, 00, 14, 00, 19]
|
||||
Raw bytes (25): 0x[01, 01, 01, 05, 09, 03, 01, 22, 01, 00, 13, 20, 05, 0d, 05, 0b, 00, 10, 20, 02, 09, 00, 14, 00, 19]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 1
|
||||
- expression 0 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 3
|
||||
- Code(Counter(0)) at (prev + 34, 1) to (start + 0, 19)
|
||||
- Branch { true: Counter(2), false: Counter(1) } at (prev + 5, 11) to (start + 0, 16)
|
||||
true = c2
|
||||
false = c1
|
||||
- Branch { true: Expression(0, Sub), false: Counter(3) } at (prev + 0, 20) to (start + 0, 25)
|
||||
true = (c2 - c3)
|
||||
- Branch { true: Counter(1), false: Counter(3) } at (prev + 5, 11) to (start + 0, 16)
|
||||
true = c1
|
||||
false = c3
|
||||
- Branch { true: Expression(0, Sub), false: Counter(2) } at (prev + 0, 20) to (start + 0, 25)
|
||||
true = (c1 - c2)
|
||||
false = c2
|
||||
Highest counter ID seen: c3
|
||||
|
||||
Function name: no_mir_spans::while_op_or
|
||||
|
|
|
|||
|
|
@ -35,14 +35,14 @@ Number of file 0 mappings: 6
|
|||
Highest counter ID seen: c2
|
||||
|
||||
Function name: while::while_op_and
|
||||
Raw bytes (56): 0x[01, 01, 04, 05, 09, 03, 0d, 03, 0d, 11, 0d, 08, 01, 1e, 01, 01, 10, 05, 03, 09, 01, 12, 03, 02, 0b, 00, 10, 20, 0a, 0d, 00, 0b, 00, 10, 0a, 00, 14, 00, 19, 20, 09, 11, 00, 14, 00, 19, 09, 00, 1a, 03, 06, 0f, 04, 01, 00, 02]
|
||||
Raw bytes (56): 0x[01, 01, 04, 05, 09, 03, 0d, 03, 0d, 0d, 11, 08, 01, 1e, 01, 01, 10, 05, 03, 09, 01, 12, 03, 02, 0b, 00, 10, 20, 0a, 0d, 00, 0b, 00, 10, 0a, 00, 14, 00, 19, 20, 09, 11, 00, 14, 00, 19, 09, 00, 1a, 03, 06, 0f, 04, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 4
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(4), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
Number of file 0 mappings: 8
|
||||
- Code(Counter(0)) at (prev + 30, 1) to (start + 1, 16)
|
||||
- Code(Counter(1)) at (prev + 3, 9) to (start + 1, 18)
|
||||
|
|
@ -58,39 +58,34 @@ Number of file 0 mappings: 8
|
|||
false = c4
|
||||
- Code(Counter(2)) at (prev + 0, 26) to (start + 3, 6)
|
||||
- Code(Expression(3, Add)) at (prev + 4, 1) to (start + 0, 2)
|
||||
= (c4 + c3)
|
||||
= (c3 + c4)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: while::while_op_or
|
||||
Raw bytes (66): 0x[01, 01, 09, 05, 1b, 09, 0d, 03, 09, 03, 09, 22, 0d, 03, 09, 09, 0d, 22, 0d, 03, 09, 08, 01, 29, 01, 01, 10, 05, 03, 09, 01, 12, 03, 02, 0b, 00, 10, 20, 09, 22, 00, 0b, 00, 10, 22, 00, 14, 00, 19, 20, 0d, 1e, 00, 14, 00, 19, 1b, 00, 1a, 03, 06, 1e, 04, 01, 00, 02]
|
||||
Raw bytes (58): 0x[01, 01, 05, 07, 0d, 05, 09, 05, 0d, 05, 0d, 09, 0d, 08, 01, 29, 01, 01, 10, 05, 03, 09, 01, 12, 03, 02, 0b, 00, 10, 20, 09, 0f, 00, 0b, 00, 10, 0f, 00, 14, 00, 19, 20, 0d, 05, 00, 14, 00, 19, 13, 00, 1a, 03, 06, 05, 04, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 9
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Expression(6, Add)
|
||||
- expression 1 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(2)
|
||||
- expression 3 operands: lhs = Expression(0, Add), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Expression(8, Sub), rhs = Counter(3)
|
||||
- expression 5 operands: lhs = Expression(0, Add), rhs = Counter(2)
|
||||
- expression 6 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 7 operands: lhs = Expression(8, Sub), rhs = Counter(3)
|
||||
- expression 8 operands: lhs = Expression(0, Add), rhs = Counter(2)
|
||||
Number of expressions: 5
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
Number of file 0 mappings: 8
|
||||
- Code(Counter(0)) at (prev + 41, 1) to (start + 1, 16)
|
||||
- Code(Counter(1)) at (prev + 3, 9) to (start + 1, 18)
|
||||
- Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 16)
|
||||
= (c1 + (c2 + c3))
|
||||
- Branch { true: Counter(2), false: Expression(8, Sub) } at (prev + 0, 11) to (start + 0, 16)
|
||||
= ((c1 + c2) + c3)
|
||||
- Branch { true: Counter(2), false: Expression(3, Add) } at (prev + 0, 11) to (start + 0, 16)
|
||||
true = c2
|
||||
false = ((c1 + (c2 + c3)) - c2)
|
||||
- Code(Expression(8, Sub)) at (prev + 0, 20) to (start + 0, 25)
|
||||
= ((c1 + (c2 + c3)) - c2)
|
||||
- Branch { true: Counter(3), false: Expression(7, Sub) } at (prev + 0, 20) to (start + 0, 25)
|
||||
false = (c1 + c3)
|
||||
- Code(Expression(3, Add)) at (prev + 0, 20) to (start + 0, 25)
|
||||
= (c1 + c3)
|
||||
- Branch { true: Counter(3), false: Counter(1) } at (prev + 0, 20) to (start + 0, 25)
|
||||
true = c3
|
||||
false = (((c1 + (c2 + c3)) - c2) - c3)
|
||||
- Code(Expression(6, Add)) at (prev + 0, 26) to (start + 3, 6)
|
||||
false = c1
|
||||
- Code(Expression(4, Add)) at (prev + 0, 26) to (start + 3, 6)
|
||||
= (c2 + c3)
|
||||
- Code(Expression(7, Sub)) at (prev + 4, 1) to (start + 0, 2)
|
||||
= (((c1 + (c2 + c3)) - c2) - c3)
|
||||
- Code(Counter(1)) at (prev + 4, 1) to (start + 0, 2)
|
||||
Highest counter ID seen: c3
|
||||
|
||||
|
|
|
|||
|
|
@ -25,13 +25,13 @@ Number of file 0 mappings: 6
|
|||
Highest counter ID seen: c1
|
||||
|
||||
Function name: closure_macro::main::{closure#0}
|
||||
Raw bytes (35): 0x[01, 01, 03, 01, 05, 05, 0b, 09, 0d, 05, 01, 10, 1c, 03, 21, 05, 04, 11, 01, 27, 02, 03, 11, 00, 16, 0d, 00, 17, 00, 1e, 07, 02, 09, 00, 0a]
|
||||
Raw bytes (35): 0x[01, 01, 03, 01, 05, 0b, 0d, 05, 09, 05, 01, 10, 1c, 03, 21, 05, 04, 11, 01, 27, 02, 03, 11, 00, 16, 0d, 00, 17, 00, 1e, 07, 02, 09, 00, 0a]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 3
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(2, Add)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 5
|
||||
- Code(Counter(0)) at (prev + 16, 28) to (start + 3, 33)
|
||||
- Code(Counter(1)) at (prev + 4, 17) to (start + 1, 39)
|
||||
|
|
@ -39,6 +39,6 @@ Number of file 0 mappings: 5
|
|||
= (c0 - c1)
|
||||
- Code(Counter(3)) at (prev + 0, 23) to (start + 0, 30)
|
||||
- Code(Expression(1, Add)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= (c1 + (c2 + c3))
|
||||
= ((c1 + c2) + c3)
|
||||
Highest counter ID seen: c3
|
||||
|
||||
|
|
|
|||
|
|
@ -34,13 +34,13 @@ Number of file 0 mappings: 6
|
|||
Highest counter ID seen: c1
|
||||
|
||||
Function name: closure_macro_async::test::{closure#0}::{closure#0}
|
||||
Raw bytes (35): 0x[01, 01, 03, 01, 05, 05, 0b, 09, 0d, 05, 01, 15, 1c, 03, 21, 05, 04, 11, 01, 27, 02, 03, 11, 00, 16, 0d, 00, 17, 00, 1e, 07, 02, 09, 00, 0a]
|
||||
Raw bytes (35): 0x[01, 01, 03, 01, 05, 0b, 0d, 05, 09, 05, 01, 15, 1c, 03, 21, 05, 04, 11, 01, 27, 02, 03, 11, 00, 16, 0d, 00, 17, 00, 1e, 07, 02, 09, 00, 0a]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 3
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Expression(2, Add)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 5
|
||||
- Code(Counter(0)) at (prev + 21, 28) to (start + 3, 33)
|
||||
- Code(Counter(1)) at (prev + 4, 17) to (start + 1, 39)
|
||||
|
|
@ -48,6 +48,6 @@ Number of file 0 mappings: 5
|
|||
= (c0 - c1)
|
||||
- Code(Counter(3)) at (prev + 0, 23) to (start + 0, 30)
|
||||
- Code(Expression(1, Add)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= (c1 + (c2 + c3))
|
||||
= ((c1 + c2) + c3)
|
||||
Highest counter ID seen: c3
|
||||
|
||||
|
|
|
|||
|
|
@ -1,29 +1,27 @@
|
|||
Function name: conditions::assign_3_and_or
|
||||
Raw bytes (69): 0x[01, 01, 07, 07, 11, 09, 0d, 01, 05, 05, 09, 16, 1a, 05, 09, 01, 05, 09, 01, 1c, 01, 00, 2f, 03, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 1a, 00, 0d, 00, 0e, 05, 00, 12, 00, 13, 20, 09, 16, 00, 12, 00, 13, 13, 00, 17, 00, 18, 20, 0d, 11, 00, 17, 00, 18, 03, 01, 05, 01, 02]
|
||||
Raw bytes (65): 0x[01, 01, 05, 07, 11, 09, 0d, 01, 05, 05, 09, 01, 09, 09, 01, 1c, 01, 00, 2f, 03, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 0a, 00, 0d, 00, 0e, 05, 00, 12, 00, 13, 20, 09, 0e, 00, 12, 00, 13, 12, 00, 17, 00, 18, 20, 0d, 11, 00, 17, 00, 18, 03, 01, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 7
|
||||
Number of expressions: 5
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(4)
|
||||
- expression 1 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 3 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 4 operands: lhs = Expression(5, Sub), rhs = Expression(6, Sub)
|
||||
- expression 5 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 6 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 4 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
Number of file 0 mappings: 9
|
||||
- Code(Counter(0)) at (prev + 28, 1) to (start + 0, 47)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 9) to (start + 0, 10)
|
||||
= ((c2 + c3) + c4)
|
||||
- Code(Counter(0)) at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(1), false: Expression(6, Sub) } at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(1), false: Expression(2, Sub) } at (prev + 0, 13) to (start + 0, 14)
|
||||
true = c1
|
||||
false = (c0 - c1)
|
||||
- Code(Counter(1)) at (prev + 0, 18) to (start + 0, 19)
|
||||
- Branch { true: Counter(2), false: Expression(5, Sub) } at (prev + 0, 18) to (start + 0, 19)
|
||||
- Branch { true: Counter(2), false: Expression(3, Sub) } at (prev + 0, 18) to (start + 0, 19)
|
||||
true = c2
|
||||
false = (c1 - c2)
|
||||
- Code(Expression(4, Add)) at (prev + 0, 23) to (start + 0, 24)
|
||||
= ((c1 - c2) + (c0 - c1))
|
||||
- Code(Expression(4, Sub)) at (prev + 0, 23) to (start + 0, 24)
|
||||
= (c0 - c2)
|
||||
- Branch { true: Counter(3), false: Counter(4) } at (prev + 0, 23) to (start + 0, 24)
|
||||
true = c3
|
||||
false = c4
|
||||
|
|
@ -32,54 +30,54 @@ Number of file 0 mappings: 9
|
|||
Highest counter ID seen: c4
|
||||
|
||||
Function name: conditions::assign_3_or_and
|
||||
Raw bytes (73): 0x[01, 01, 09, 05, 07, 0b, 11, 09, 0d, 01, 05, 01, 05, 22, 11, 01, 05, 22, 11, 01, 05, 09, 01, 17, 01, 00, 2f, 03, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 22, 00, 0d, 00, 0e, 22, 00, 12, 00, 13, 20, 1e, 11, 00, 12, 00, 13, 1e, 00, 17, 00, 18, 20, 09, 0d, 00, 17, 00, 18, 03, 01, 05, 01, 02]
|
||||
Raw bytes (73): 0x[01, 01, 09, 07, 11, 0b, 0d, 05, 09, 01, 05, 01, 05, 01, 23, 05, 11, 01, 23, 05, 11, 09, 01, 17, 01, 00, 2f, 03, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 12, 00, 0d, 00, 0e, 12, 00, 12, 00, 13, 20, 1e, 11, 00, 12, 00, 13, 1e, 00, 17, 00, 18, 20, 09, 0d, 00, 17, 00, 18, 03, 01, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 9
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Expression(1, Add)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(4)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(4)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 3 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 4 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 5 operands: lhs = Expression(8, Sub), rhs = Counter(4)
|
||||
- expression 6 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 7 operands: lhs = Expression(8, Sub), rhs = Counter(4)
|
||||
- expression 8 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 5 operands: lhs = Counter(0), rhs = Expression(8, Add)
|
||||
- expression 6 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
- expression 7 operands: lhs = Counter(0), rhs = Expression(8, Add)
|
||||
- expression 8 operands: lhs = Counter(1), rhs = Counter(4)
|
||||
Number of file 0 mappings: 9
|
||||
- Code(Counter(0)) at (prev + 23, 1) to (start + 0, 47)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 9) to (start + 0, 10)
|
||||
= (c1 + ((c2 + c3) + c4))
|
||||
= (((c1 + c2) + c3) + c4)
|
||||
- Code(Counter(0)) at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(1), false: Expression(8, Sub) } at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(1), false: Expression(4, Sub) } at (prev + 0, 13) to (start + 0, 14)
|
||||
true = c1
|
||||
false = (c0 - c1)
|
||||
- Code(Expression(8, Sub)) at (prev + 0, 18) to (start + 0, 19)
|
||||
- Code(Expression(4, Sub)) at (prev + 0, 18) to (start + 0, 19)
|
||||
= (c0 - c1)
|
||||
- Branch { true: Expression(7, Sub), false: Counter(4) } at (prev + 0, 18) to (start + 0, 19)
|
||||
true = ((c0 - c1) - c4)
|
||||
true = (c0 - (c1 + c4))
|
||||
false = c4
|
||||
- Code(Expression(7, Sub)) at (prev + 0, 23) to (start + 0, 24)
|
||||
= ((c0 - c1) - c4)
|
||||
= (c0 - (c1 + c4))
|
||||
- Branch { true: Counter(2), false: Counter(3) } at (prev + 0, 23) to (start + 0, 24)
|
||||
true = c2
|
||||
false = c3
|
||||
- Code(Expression(0, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= (c1 + ((c2 + c3) + c4))
|
||||
= (((c1 + c2) + c3) + c4)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: conditions::assign_and
|
||||
Raw bytes (51): 0x[01, 01, 04, 07, 0e, 09, 0d, 01, 05, 01, 05, 07, 01, 0d, 01, 00, 21, 03, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 0e, 00, 0d, 00, 0e, 05, 00, 12, 00, 13, 20, 09, 0d, 00, 12, 00, 13, 03, 01, 05, 01, 02]
|
||||
Raw bytes (51): 0x[01, 01, 04, 07, 05, 0b, 0d, 01, 09, 01, 05, 07, 01, 0d, 01, 00, 21, 02, 01, 09, 00, 0a, 01, 00, 0d, 00, 0e, 20, 05, 0e, 00, 0d, 00, 0e, 05, 00, 12, 00, 13, 20, 09, 0d, 00, 12, 00, 13, 02, 01, 05, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 4
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Expression(3, Sub)
|
||||
- expression 1 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(1)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
- expression 3 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
Number of file 0 mappings: 7
|
||||
- Code(Counter(0)) at (prev + 13, 1) to (start + 0, 33)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 9) to (start + 0, 10)
|
||||
= ((c2 + c3) + (c0 - c1))
|
||||
- Code(Expression(0, Sub)) at (prev + 1, 9) to (start + 0, 10)
|
||||
= (((c0 + c2) + c3) - c1)
|
||||
- Code(Counter(0)) at (prev + 0, 13) to (start + 0, 14)
|
||||
- Branch { true: Counter(1), false: Expression(3, Sub) } at (prev + 0, 13) to (start + 0, 14)
|
||||
true = c1
|
||||
|
|
@ -88,8 +86,8 @@ Number of file 0 mappings: 7
|
|||
- Branch { true: Counter(2), false: Counter(3) } at (prev + 0, 18) to (start + 0, 19)
|
||||
true = c2
|
||||
false = c3
|
||||
- Code(Expression(0, Add)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= ((c2 + c3) + (c0 - c1))
|
||||
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 1, 2)
|
||||
= (((c0 + c2) + c3) - c1)
|
||||
Highest counter ID seen: c3
|
||||
|
||||
Function name: conditions::assign_or
|
||||
|
|
@ -128,13 +126,14 @@ Number of file 0 mappings: 1
|
|||
Highest counter ID seen: c0
|
||||
|
||||
Function name: conditions::func_call
|
||||
Raw bytes (39): 0x[01, 01, 03, 01, 05, 0b, 02, 09, 0d, 05, 01, 25, 01, 01, 0a, 20, 05, 02, 01, 09, 00, 0a, 05, 00, 0e, 00, 0f, 20, 09, 0d, 00, 0e, 00, 0f, 07, 01, 01, 00, 02]
|
||||
Raw bytes (41): 0x[01, 01, 04, 01, 05, 0b, 05, 0f, 0d, 01, 09, 05, 01, 25, 01, 01, 0a, 20, 05, 02, 01, 09, 00, 0a, 05, 00, 0e, 00, 0f, 20, 09, 0d, 00, 0e, 00, 0f, 06, 01, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 3
|
||||
Number of expressions: 4
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Expression(0, Sub)
|
||||
- expression 2 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(1)
|
||||
- expression 2 operands: lhs = Expression(3, Add), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
Number of file 0 mappings: 5
|
||||
- Code(Counter(0)) at (prev + 37, 1) to (start + 1, 10)
|
||||
- Branch { true: Counter(1), false: Expression(0, Sub) } at (prev + 1, 9) to (start + 0, 10)
|
||||
|
|
@ -144,8 +143,8 @@ Number of file 0 mappings: 5
|
|||
- Branch { true: Counter(2), false: Counter(3) } at (prev + 0, 14) to (start + 0, 15)
|
||||
true = c2
|
||||
false = c3
|
||||
- Code(Expression(1, Add)) at (prev + 1, 1) to (start + 0, 2)
|
||||
= ((c2 + c3) + (c0 - c1))
|
||||
- Code(Expression(1, Sub)) at (prev + 1, 1) to (start + 0, 2)
|
||||
= (((c0 + c2) + c3) - c1)
|
||||
Highest counter ID seen: c3
|
||||
|
||||
Function name: conditions::simple_assign
|
||||
|
|
|
|||
|
|
@ -1,264 +1,294 @@
|
|||
Function name: conditions::main
|
||||
Raw bytes (799): 0x[01, 01, 94, 01, 09, 2b, 2f, 41, 33, 3d, 35, 39, 01, 09, 0d, 35, 1e, 39, 0d, 35, 33, 3d, 35, 39, 2f, 41, 33, 3d, 35, 39, ce, 04, 0d, 01, 09, 03, 49, 62, 31, 03, 49, 5e, 4d, 62, 31, 03, 49, 5a, 51, 5e, 4d, 62, 31, 03, 49, 87, 01, 55, 4d, 51, 83, 01, 59, 87, 01, 55, 4d, 51, 49, 7f, 83, 01, 59, 87, 01, 55, 4d, 51, 5d, 65, ae, 01, 2d, 5d, 65, aa, 01, 69, ae, 01, 2d, 5d, 65, a6, 01, 6d, aa, 01, 69, ae, 01, 2d, 5d, 65, f3, 02, 71, 69, 6d, ef, 02, 75, f3, 02, 71, 69, 6d, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, e3, 02, 7d, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, de, 02, 29, e3, 02, 7d, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, da, 02, 81, 01, de, 02, 29, e3, 02, 7d, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, d6, 02, 85, 01, da, 02, 81, 01, de, 02, 29, e3, 02, 7d, e7, 02, 00, 65, eb, 02, ef, 02, 75, f3, 02, 71, 69, 6d, 8f, 04, 89, 01, 81, 01, 85, 01, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, 11, af, 04, b3, 04, 21, b7, 04, 1d, 15, 19, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, 83, 04, 11, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, fe, 03, 25, 83, 04, 11, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, fa, 03, 15, fe, 03, 25, 83, 04, 11, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, f6, 03, 19, fa, 03, 15, fe, 03, 25, 83, 04, 11, 7d, 87, 04, 8b, 04, 8d, 01, 8f, 04, 89, 01, 81, 01, 85, 01, b7, 04, 1d, 15, 19, b3, 04, 21, b7, 04, 1d, 15, 19, ab, 04, bb, 04, 11, af, 04, b3, 04, 21, b7, 04, 1d, 15, 19, bf, 04, ca, 04, c3, 04, 31, c7, 04, 2d, 25, 29, ce, 04, 0d, 01, 09, 44, 01, 03, 01, 02, 0c, 05, 02, 0d, 02, 06, 00, 02, 05, 00, 06, 03, 03, 09, 00, 0a, 01, 00, 10, 00, 1d, 09, 01, 09, 01, 0a, ce, 04, 02, 0f, 00, 1c, 0d, 01, 0c, 00, 19, 1e, 00, 1d, 00, 2a, 1a, 00, 2e, 00, 3c, 2f, 00, 3d, 02, 0a, 41, 02, 09, 00, 0a, 2b, 01, 09, 01, 12, ca, 04, 03, 09, 00, 0f, 03, 03, 09, 01, 0c, 45, 01, 0d, 02, 06, 00, 02, 05, 00, 06, 03, 02, 08, 00, 15, 49, 00, 16, 02, 06, 62, 02, 0f, 00, 1c, 5e, 01, 0c, 00, 19, 5a, 00, 1d, 00, 2a, 56, 00, 2e, 00, 3c, 83, 01, 00, 3d, 02, 0a, 59, 02, 09, 00, 0a, 7f, 01, 09, 00, 17, 31, 02, 09, 00, 0f, 7b, 03, 08, 00, 0c, 5d, 01, 0d, 01, 10, 61, 01, 11, 02, 0a, 00, 02, 09, 00, 0a, 5d, 02, 0c, 00, 19, 65, 00, 1a, 02, 0a, ae, 01, 04, 11, 00, 1e, aa, 01, 01, 10, 00, 1d, a6, 01, 00, 21, 00, 2e, a2, 01, 00, 32, 00, 40, ef, 02, 00, 41, 02, 0e, 75, 02, 0d, 00, 0e, eb, 02, 01, 0d, 00, 1b, 2d, 02, 0d, 00, 13, 00, 02, 05, 00, 06, e3, 02, 02, 09, 01, 0c, 79, 01, 0d, 02, 06, 00, 02, 05, 00, 06, 83, 04, 02, 09, 00, 0a, e3, 02, 00, 10, 00, 1d, 7d, 00, 1e, 02, 06, de, 02, 02, 0f, 00, 1c, da, 02, 01, 0c, 00, 19, d6, 02, 00, 1d, 00, 2a, d2, 02, 00, 2e, 00, 3c, 8b, 04, 00, 3d, 02, 0a, 8d, 01, 02, 09, 00, 0a, 87, 04, 01, 09, 00, 17, 29, 02, 0d, 02, 0f, ab, 04, 05, 09, 00, 0a, 83, 04, 00, 10, 00, 1d, 11, 00, 1e, 02, 06, fe, 03, 02, 0f, 00, 1c, fa, 03, 01, 0c, 00, 19, f6, 03, 00, 1d, 00, 2a, f2, 03, 00, 2e, 00, 3c, b3, 04, 00, 3d, 02, 0a, 21, 02, 09, 00, 0a, af, 04, 01, 09, 00, 17, 25, 02, 09, 00, 0f, a7, 04, 02, 01, 00, 02]
|
||||
Raw bytes (873): 0x[01, 01, b2, 01, 07, 19, 0b, 15, 0f, 11, 09, 0d, 01, 09, 8d, 01, 0d, 8d, 01, 33, 0d, 11, 33, 15, 0d, 11, 2f, 19, 33, 15, 0d, 11, 01, c7, 05, 09, 8d, 01, 03, 21, 03, 47, 21, 89, 01, 03, 4f, db, 03, 89, 01, 21, 25, 03, 5b, d7, 03, 89, 01, db, 03, 29, 21, 25, 77, 2d, 25, 29, 73, 31, 77, 2d, 25, 29, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, 35, 3d, 35, 93, 01, 3d, 85, 01, 35, 9b, 01, af, 01, 85, 01, 3d, 41, 35, a7, 01, ab, 01, 85, 01, af, 01, 45, 3d, 41, c3, 01, 49, 41, 45, bf, 01, 4d, c3, 01, 49, 41, 45, bb, 03, 35, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, bb, 03, 35, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, bb, 03, eb, 03, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, 35, 55, bb, 03, fb, 02, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, eb, 03, 81, 01, 35, 55, bb, 03, ab, 03, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, e7, 03, 81, 01, eb, 03, 59, 35, 55, bb, 03, df, 03, bf, 03, 4d, c3, 03, 49, c7, 03, 45, cb, 03, 41, cf, 03, 3d, d3, 03, 31, d7, 03, 2d, db, 03, 29, 21, 25, e3, 03, 81, 01, e7, 03, 5d, eb, 03, 59, 35, 55, ff, 03, 61, 59, 5d, fb, 03, 65, ff, 03, 61, 59, 5d, 87, 04, 79, 83, 05, 75, 87, 05, 71, 69, 6d, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, ef, 04, 69, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, ef, 04, cb, 04, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, 69, 7d, ef, 04, e3, 04, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, 87, 05, 7d, 69, 6d, ef, 04, ff, 04, f3, 04, 65, f7, 04, 61, fb, 04, 5d, 55, 59, 83, 05, 7d, 87, 05, 71, 69, 6d, 9b, 05, 75, 6d, 71, 97, 05, 79, 9b, 05, 75, 6d, 71, a3, 05, c7, 05, a7, 05, 89, 01, ab, 05, 85, 01, af, 05, 81, 01, b3, 05, 7d, b7, 05, 79, bb, 05, 75, bf, 05, 71, c3, 05, 6d, 01, 69, 09, 8d, 01, 44, 01, 03, 01, 02, 0c, 05, 02, 0d, 02, 06, 00, 02, 05, 00, 06, 03, 03, 09, 00, 0a, 01, 00, 10, 00, 1d, 09, 01, 09, 01, 0a, 12, 02, 0f, 00, 1c, 8d, 01, 01, 0c, 00, 19, 16, 00, 1d, 00, 2a, 1a, 00, 2e, 00, 3c, 2f, 00, 3d, 02, 0a, 19, 02, 09, 00, 0a, 2b, 01, 09, 01, 12, 36, 03, 09, 00, 0f, 03, 03, 09, 01, 0c, 1d, 01, 0d, 02, 06, 00, 02, 05, 00, 06, 03, 02, 08, 00, 15, 21, 00, 16, 02, 06, 3e, 02, 0f, 00, 1c, 42, 01, 0c, 00, 19, 4a, 00, 1d, 00, 2a, 56, 00, 2e, 00, 3c, 73, 00, 3d, 02, 0a, 31, 02, 09, 00, 0a, 6f, 01, 09, 00, 17, 89, 01, 02, 09, 00, 0f, cf, 03, 03, 08, 00, 0c, 35, 01, 0d, 01, 10, 39, 01, 11, 02, 0a, 00, 02, 09, 00, 0a, 35, 02, 0c, 00, 19, 3d, 00, 1a, 02, 0a, 8a, 01, 04, 11, 00, 1e, 8e, 01, 01, 10, 00, 1d, 96, 01, 00, 21, 00, 2e, a2, 01, 00, 32, 00, 40, bf, 01, 00, 41, 02, 0e, 4d, 02, 0d, 00, 0e, bb, 01, 01, 0d, 00, 1b, 85, 01, 02, 0d, 00, 13, 00, 02, 05, 00, 06, fe, 01, 02, 09, 01, 0c, 51, 01, 0d, 02, 06, 00, 02, 05, 00, 06, ef, 04, 02, 09, 00, 0a, fe, 01, 00, 10, 00, 1d, 55, 00, 1e, 02, 06, a6, 02, 02, 0f, 00, 1c, d2, 02, 01, 0c, 00, 19, 82, 03, 00, 1d, 00, 2a, b6, 03, 00, 2e, 00, 3c, fb, 03, 00, 3d, 02, 0a, 65, 02, 09, 00, 0a, f7, 03, 01, 09, 00, 17, 81, 01, 02, 0d, 02, 0f, 83, 04, 05, 09, 00, 0a, ef, 04, 00, 10, 00, 1d, 69, 00, 1e, 02, 06, a2, 04, 02, 0f, 00, 1c, b6, 04, 01, 0c, 00, 19, ce, 04, 00, 1d, 00, 2a, ea, 04, 00, 2e, 00, 3c, 97, 05, 00, 3d, 02, 0a, 79, 02, 09, 00, 0a, 93, 05, 01, 09, 00, 17, 7d, 02, 09, 00, 0f, 9e, 05, 02, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 148
|
||||
- expression 0 operands: lhs = Counter(2), rhs = Expression(10, Add)
|
||||
- expression 1 operands: lhs = Expression(11, Add), rhs = Counter(16)
|
||||
- expression 2 operands: lhs = Expression(12, Add), rhs = Counter(15)
|
||||
- expression 3 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
Number of expressions: 178
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(6)
|
||||
- expression 1 operands: lhs = Expression(2, Add), rhs = Counter(5)
|
||||
- expression 2 operands: lhs = Expression(3, Add), rhs = Counter(4)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
- expression 5 operands: lhs = Counter(3), rhs = Counter(13)
|
||||
- expression 6 operands: lhs = Expression(7, Sub), rhs = Counter(14)
|
||||
- expression 7 operands: lhs = Counter(3), rhs = Counter(13)
|
||||
- expression 8 operands: lhs = Expression(12, Add), rhs = Counter(15)
|
||||
- expression 9 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 10 operands: lhs = Expression(11, Add), rhs = Counter(16)
|
||||
- expression 11 operands: lhs = Expression(12, Add), rhs = Counter(15)
|
||||
- expression 12 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 13 operands: lhs = Expression(147, Sub), rhs = Counter(3)
|
||||
- expression 14 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
- expression 15 operands: lhs = Expression(0, Add), rhs = Counter(18)
|
||||
- expression 16 operands: lhs = Expression(24, Sub), rhs = Counter(12)
|
||||
- expression 17 operands: lhs = Expression(0, Add), rhs = Counter(18)
|
||||
- expression 18 operands: lhs = Expression(23, Sub), rhs = Counter(19)
|
||||
- expression 19 operands: lhs = Expression(24, Sub), rhs = Counter(12)
|
||||
- expression 20 operands: lhs = Expression(0, Add), rhs = Counter(18)
|
||||
- expression 21 operands: lhs = Expression(22, Sub), rhs = Counter(20)
|
||||
- expression 22 operands: lhs = Expression(23, Sub), rhs = Counter(19)
|
||||
- expression 23 operands: lhs = Expression(24, Sub), rhs = Counter(12)
|
||||
- expression 24 operands: lhs = Expression(0, Add), rhs = Counter(18)
|
||||
- expression 25 operands: lhs = Expression(33, Add), rhs = Counter(21)
|
||||
- expression 26 operands: lhs = Counter(19), rhs = Counter(20)
|
||||
- expression 27 operands: lhs = Expression(32, Add), rhs = Counter(22)
|
||||
- expression 28 operands: lhs = Expression(33, Add), rhs = Counter(21)
|
||||
- expression 29 operands: lhs = Counter(19), rhs = Counter(20)
|
||||
- expression 30 operands: lhs = Counter(18), rhs = Expression(31, Add)
|
||||
- expression 31 operands: lhs = Expression(32, Add), rhs = Counter(22)
|
||||
- expression 32 operands: lhs = Expression(33, Add), rhs = Counter(21)
|
||||
- expression 33 operands: lhs = Counter(19), rhs = Counter(20)
|
||||
- expression 34 operands: lhs = Counter(23), rhs = Counter(25)
|
||||
- expression 35 operands: lhs = Expression(43, Sub), rhs = Counter(11)
|
||||
- expression 36 operands: lhs = Counter(23), rhs = Counter(25)
|
||||
- expression 37 operands: lhs = Expression(42, Sub), rhs = Counter(26)
|
||||
- expression 38 operands: lhs = Expression(43, Sub), rhs = Counter(11)
|
||||
- expression 39 operands: lhs = Counter(23), rhs = Counter(25)
|
||||
- expression 40 operands: lhs = Expression(41, Sub), rhs = Counter(27)
|
||||
- expression 41 operands: lhs = Expression(42, Sub), rhs = Counter(26)
|
||||
- expression 42 operands: lhs = Expression(43, Sub), rhs = Counter(11)
|
||||
- expression 43 operands: lhs = Counter(23), rhs = Counter(25)
|
||||
- expression 44 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 45 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 46 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 47 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 48 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 49 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 50 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 51 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 52 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 53 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 54 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 55 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 56 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 57 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 58 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 59 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 60 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 61 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 62 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 63 operands: lhs = Expression(88, Add), rhs = Counter(31)
|
||||
- expression 64 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 65 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 66 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 67 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 68 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 69 operands: lhs = Expression(87, Sub), rhs = Counter(10)
|
||||
- expression 70 operands: lhs = Expression(88, Add), rhs = Counter(31)
|
||||
- expression 71 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 72 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 73 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 74 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 75 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 76 operands: lhs = Expression(86, Sub), rhs = Counter(32)
|
||||
- expression 77 operands: lhs = Expression(87, Sub), rhs = Counter(10)
|
||||
- expression 78 operands: lhs = Expression(88, Add), rhs = Counter(31)
|
||||
- expression 79 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 80 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 81 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 82 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 83 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 84 operands: lhs = Expression(85, Sub), rhs = Counter(33)
|
||||
- expression 85 operands: lhs = Expression(86, Sub), rhs = Counter(32)
|
||||
- expression 86 operands: lhs = Expression(87, Sub), rhs = Counter(10)
|
||||
- expression 87 operands: lhs = Expression(88, Add), rhs = Counter(31)
|
||||
- expression 88 operands: lhs = Expression(89, Add), rhs = Zero
|
||||
- expression 89 operands: lhs = Counter(25), rhs = Expression(90, Add)
|
||||
- expression 90 operands: lhs = Expression(91, Add), rhs = Counter(29)
|
||||
- expression 91 operands: lhs = Expression(92, Add), rhs = Counter(28)
|
||||
- expression 92 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 93 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 94 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 95 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 96 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 97 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 98 operands: lhs = Counter(4), rhs = Expression(139, Add)
|
||||
- expression 99 operands: lhs = Expression(140, Add), rhs = Counter(8)
|
||||
- expression 100 operands: lhs = Expression(141, Add), rhs = Counter(7)
|
||||
- expression 101 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 102 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 103 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 104 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 105 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 106 operands: lhs = Expression(128, Add), rhs = Counter(4)
|
||||
- expression 107 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 108 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 109 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 110 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 111 operands: lhs = Expression(127, Sub), rhs = Counter(9)
|
||||
- expression 112 operands: lhs = Expression(128, Add), rhs = Counter(4)
|
||||
- expression 113 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 114 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 115 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 116 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 117 operands: lhs = Expression(126, Sub), rhs = Counter(5)
|
||||
- expression 118 operands: lhs = Expression(127, Sub), rhs = Counter(9)
|
||||
- expression 119 operands: lhs = Expression(128, Add), rhs = Counter(4)
|
||||
- expression 120 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 121 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 122 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 123 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 124 operands: lhs = Expression(125, Sub), rhs = Counter(6)
|
||||
- expression 125 operands: lhs = Expression(126, Sub), rhs = Counter(5)
|
||||
- expression 126 operands: lhs = Expression(127, Sub), rhs = Counter(9)
|
||||
- expression 127 operands: lhs = Expression(128, Add), rhs = Counter(4)
|
||||
- expression 128 operands: lhs = Counter(31), rhs = Expression(129, Add)
|
||||
- expression 129 operands: lhs = Expression(130, Add), rhs = Counter(35)
|
||||
- expression 130 operands: lhs = Expression(131, Add), rhs = Counter(34)
|
||||
- expression 131 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 132 operands: lhs = Expression(141, Add), rhs = Counter(7)
|
||||
- expression 133 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 134 operands: lhs = Expression(140, Add), rhs = Counter(8)
|
||||
- expression 135 operands: lhs = Expression(141, Add), rhs = Counter(7)
|
||||
- expression 136 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 137 operands: lhs = Expression(138, Add), rhs = Expression(142, Add)
|
||||
- expression 138 operands: lhs = Counter(4), rhs = Expression(139, Add)
|
||||
- expression 139 operands: lhs = Expression(140, Add), rhs = Counter(8)
|
||||
- expression 140 operands: lhs = Expression(141, Add), rhs = Counter(7)
|
||||
- expression 141 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 142 operands: lhs = Expression(143, Add), rhs = Expression(146, Sub)
|
||||
- expression 143 operands: lhs = Expression(144, Add), rhs = Counter(12)
|
||||
- expression 144 operands: lhs = Expression(145, Add), rhs = Counter(11)
|
||||
- expression 145 operands: lhs = Counter(9), rhs = Counter(10)
|
||||
- expression 146 operands: lhs = Expression(147, Sub), rhs = Counter(3)
|
||||
- expression 147 operands: lhs = Counter(0), rhs = Counter(2)
|
||||
- expression 5 operands: lhs = Counter(35), rhs = Counter(3)
|
||||
- expression 6 operands: lhs = Counter(35), rhs = Expression(12, Add)
|
||||
- expression 7 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
- expression 8 operands: lhs = Expression(12, Add), rhs = Counter(5)
|
||||
- expression 9 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
- expression 10 operands: lhs = Expression(11, Add), rhs = Counter(6)
|
||||
- expression 11 operands: lhs = Expression(12, Add), rhs = Counter(5)
|
||||
- expression 12 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
- expression 13 operands: lhs = Counter(0), rhs = Expression(177, Add)
|
||||
- expression 14 operands: lhs = Counter(2), rhs = Counter(35)
|
||||
- expression 15 operands: lhs = Expression(0, Add), rhs = Counter(8)
|
||||
- expression 16 operands: lhs = Expression(0, Add), rhs = Expression(17, Add)
|
||||
- expression 17 operands: lhs = Counter(8), rhs = Counter(34)
|
||||
- expression 18 operands: lhs = Expression(0, Add), rhs = Expression(19, Add)
|
||||
- expression 19 operands: lhs = Expression(118, Add), rhs = Counter(34)
|
||||
- expression 20 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 21 operands: lhs = Expression(0, Add), rhs = Expression(22, Add)
|
||||
- expression 22 operands: lhs = Expression(117, Add), rhs = Counter(34)
|
||||
- expression 23 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 24 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 25 operands: lhs = Expression(29, Add), rhs = Counter(11)
|
||||
- expression 26 operands: lhs = Counter(9), rhs = Counter(10)
|
||||
- expression 27 operands: lhs = Expression(28, Add), rhs = Counter(12)
|
||||
- expression 28 operands: lhs = Expression(29, Add), rhs = Counter(11)
|
||||
- expression 29 operands: lhs = Counter(9), rhs = Counter(10)
|
||||
- expression 30 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 31 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 32 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 33 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 34 operands: lhs = Counter(13), rhs = Counter(15)
|
||||
- expression 35 operands: lhs = Counter(13), rhs = Expression(36, Add)
|
||||
- expression 36 operands: lhs = Counter(15), rhs = Counter(33)
|
||||
- expression 37 operands: lhs = Counter(13), rhs = Expression(38, Add)
|
||||
- expression 38 operands: lhs = Expression(43, Add), rhs = Counter(33)
|
||||
- expression 39 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 40 operands: lhs = Counter(13), rhs = Expression(41, Add)
|
||||
- expression 41 operands: lhs = Expression(42, Add), rhs = Counter(33)
|
||||
- expression 42 operands: lhs = Expression(43, Add), rhs = Counter(17)
|
||||
- expression 43 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 44 operands: lhs = Expression(48, Add), rhs = Counter(18)
|
||||
- expression 45 operands: lhs = Counter(16), rhs = Counter(17)
|
||||
- expression 46 operands: lhs = Expression(47, Add), rhs = Counter(19)
|
||||
- expression 47 operands: lhs = Expression(48, Add), rhs = Counter(18)
|
||||
- expression 48 operands: lhs = Counter(16), rhs = Counter(17)
|
||||
- expression 49 operands: lhs = Expression(110, Add), rhs = Counter(13)
|
||||
- expression 50 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 51 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 52 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 53 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 54 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 55 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 56 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 57 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 58 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 59 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 60 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 61 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 62 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 63 operands: lhs = Expression(110, Add), rhs = Counter(13)
|
||||
- expression 64 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 65 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 66 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 67 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 68 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 69 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 70 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 71 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 72 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 73 operands: lhs = Expression(110, Add), rhs = Expression(122, Add)
|
||||
- expression 74 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 75 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 76 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 77 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 78 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 79 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 80 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 81 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 82 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 83 operands: lhs = Counter(13), rhs = Counter(21)
|
||||
- expression 84 operands: lhs = Expression(110, Add), rhs = Expression(94, Add)
|
||||
- expression 85 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 86 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 87 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 88 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 89 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 90 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 91 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 92 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 93 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 94 operands: lhs = Expression(122, Add), rhs = Counter(32)
|
||||
- expression 95 operands: lhs = Counter(13), rhs = Counter(21)
|
||||
- expression 96 operands: lhs = Expression(110, Add), rhs = Expression(106, Add)
|
||||
- expression 97 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 98 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 99 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 100 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 101 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 102 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 103 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 104 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 105 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 106 operands: lhs = Expression(121, Add), rhs = Counter(32)
|
||||
- expression 107 operands: lhs = Expression(122, Add), rhs = Counter(22)
|
||||
- expression 108 operands: lhs = Counter(13), rhs = Counter(21)
|
||||
- expression 109 operands: lhs = Expression(110, Add), rhs = Expression(119, Add)
|
||||
- expression 110 operands: lhs = Expression(111, Add), rhs = Counter(19)
|
||||
- expression 111 operands: lhs = Expression(112, Add), rhs = Counter(18)
|
||||
- expression 112 operands: lhs = Expression(113, Add), rhs = Counter(17)
|
||||
- expression 113 operands: lhs = Expression(114, Add), rhs = Counter(16)
|
||||
- expression 114 operands: lhs = Expression(115, Add), rhs = Counter(15)
|
||||
- expression 115 operands: lhs = Expression(116, Add), rhs = Counter(12)
|
||||
- expression 116 operands: lhs = Expression(117, Add), rhs = Counter(11)
|
||||
- expression 117 operands: lhs = Expression(118, Add), rhs = Counter(10)
|
||||
- expression 118 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 119 operands: lhs = Expression(120, Add), rhs = Counter(32)
|
||||
- expression 120 operands: lhs = Expression(121, Add), rhs = Counter(23)
|
||||
- expression 121 operands: lhs = Expression(122, Add), rhs = Counter(22)
|
||||
- expression 122 operands: lhs = Counter(13), rhs = Counter(21)
|
||||
- expression 123 operands: lhs = Expression(127, Add), rhs = Counter(24)
|
||||
- expression 124 operands: lhs = Counter(22), rhs = Counter(23)
|
||||
- expression 125 operands: lhs = Expression(126, Add), rhs = Counter(25)
|
||||
- expression 126 operands: lhs = Expression(127, Add), rhs = Counter(24)
|
||||
- expression 127 operands: lhs = Counter(22), rhs = Counter(23)
|
||||
- expression 128 operands: lhs = Expression(129, Add), rhs = Counter(30)
|
||||
- expression 129 operands: lhs = Expression(160, Add), rhs = Counter(29)
|
||||
- expression 130 operands: lhs = Expression(161, Add), rhs = Counter(28)
|
||||
- expression 131 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 132 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 133 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 134 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 135 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 136 operands: lhs = Expression(155, Add), rhs = Counter(26)
|
||||
- expression 137 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 138 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 139 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 140 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 141 operands: lhs = Expression(155, Add), rhs = Expression(146, Add)
|
||||
- expression 142 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 143 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 144 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 145 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 146 operands: lhs = Counter(26), rhs = Counter(31)
|
||||
- expression 147 operands: lhs = Expression(155, Add), rhs = Expression(152, Add)
|
||||
- expression 148 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 149 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 150 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 151 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 152 operands: lhs = Expression(161, Add), rhs = Counter(31)
|
||||
- expression 153 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 154 operands: lhs = Expression(155, Add), rhs = Expression(159, Add)
|
||||
- expression 155 operands: lhs = Expression(156, Add), rhs = Counter(25)
|
||||
- expression 156 operands: lhs = Expression(157, Add), rhs = Counter(24)
|
||||
- expression 157 operands: lhs = Expression(158, Add), rhs = Counter(23)
|
||||
- expression 158 operands: lhs = Counter(21), rhs = Counter(22)
|
||||
- expression 159 operands: lhs = Expression(160, Add), rhs = Counter(31)
|
||||
- expression 160 operands: lhs = Expression(161, Add), rhs = Counter(28)
|
||||
- expression 161 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 162 operands: lhs = Expression(166, Add), rhs = Counter(29)
|
||||
- expression 163 operands: lhs = Counter(27), rhs = Counter(28)
|
||||
- expression 164 operands: lhs = Expression(165, Add), rhs = Counter(30)
|
||||
- expression 165 operands: lhs = Expression(166, Add), rhs = Counter(29)
|
||||
- expression 166 operands: lhs = Counter(27), rhs = Counter(28)
|
||||
- expression 167 operands: lhs = Expression(168, Add), rhs = Expression(177, Add)
|
||||
- expression 168 operands: lhs = Expression(169, Add), rhs = Counter(34)
|
||||
- expression 169 operands: lhs = Expression(170, Add), rhs = Counter(33)
|
||||
- expression 170 operands: lhs = Expression(171, Add), rhs = Counter(32)
|
||||
- expression 171 operands: lhs = Expression(172, Add), rhs = Counter(31)
|
||||
- expression 172 operands: lhs = Expression(173, Add), rhs = Counter(30)
|
||||
- expression 173 operands: lhs = Expression(174, Add), rhs = Counter(29)
|
||||
- expression 174 operands: lhs = Expression(175, Add), rhs = Counter(28)
|
||||
- expression 175 operands: lhs = Expression(176, Add), rhs = Counter(27)
|
||||
- expression 176 operands: lhs = Counter(0), rhs = Counter(26)
|
||||
- expression 177 operands: lhs = Counter(2), rhs = Counter(35)
|
||||
Number of file 0 mappings: 68
|
||||
- Code(Counter(0)) at (prev + 3, 1) to (start + 2, 12)
|
||||
- Code(Counter(1)) at (prev + 2, 13) to (start + 2, 6)
|
||||
- Code(Zero) at (prev + 2, 5) to (start + 0, 6)
|
||||
- Code(Expression(0, Add)) at (prev + 3, 9) to (start + 0, 10)
|
||||
= (c2 + (((c13 + c14) + c15) + c16))
|
||||
= ((((c2 + c3) + c4) + c5) + c6)
|
||||
- Code(Counter(0)) at (prev + 0, 16) to (start + 0, 29)
|
||||
- Code(Counter(2)) at (prev + 1, 9) to (start + 1, 10)
|
||||
- Code(Expression(147, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
- Code(Expression(4, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= (c0 - c2)
|
||||
- Code(Counter(3)) at (prev + 1, 12) to (start + 0, 25)
|
||||
- Code(Expression(7, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= (c3 - c13)
|
||||
- Code(Counter(35)) at (prev + 1, 12) to (start + 0, 25)
|
||||
- Code(Expression(5, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= (c35 - c3)
|
||||
- Code(Expression(6, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= ((c3 - c13) - c14)
|
||||
= (c35 - (c3 + c4))
|
||||
- Code(Expression(11, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c13 + c14) + c15)
|
||||
- Code(Counter(16)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= ((c3 + c4) + c5)
|
||||
- Code(Counter(6)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(10, Add)) at (prev + 1, 9) to (start + 1, 18)
|
||||
= (((c13 + c14) + c15) + c16)
|
||||
- Code(Expression(146, Sub)) at (prev + 3, 9) to (start + 0, 15)
|
||||
= ((c0 - c2) - c3)
|
||||
= (((c3 + c4) + c5) + c6)
|
||||
- Code(Expression(13, Sub)) at (prev + 3, 9) to (start + 0, 15)
|
||||
= (c0 - (c2 + c35))
|
||||
- Code(Expression(0, Add)) at (prev + 3, 9) to (start + 1, 12)
|
||||
= (c2 + (((c13 + c14) + c15) + c16))
|
||||
- Code(Counter(17)) at (prev + 1, 13) to (start + 2, 6)
|
||||
= ((((c2 + c3) + c4) + c5) + c6)
|
||||
- Code(Counter(7)) at (prev + 1, 13) to (start + 2, 6)
|
||||
- Code(Zero) at (prev + 2, 5) to (start + 0, 6)
|
||||
- Code(Expression(0, Add)) at (prev + 2, 8) to (start + 0, 21)
|
||||
= (c2 + (((c13 + c14) + c15) + c16))
|
||||
- Code(Counter(18)) at (prev + 0, 22) to (start + 2, 6)
|
||||
- Code(Expression(24, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= ((c2 + (((c13 + c14) + c15) + c16)) - c18)
|
||||
- Code(Expression(23, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= (((c2 + (((c13 + c14) + c15) + c16)) - c18) - c12)
|
||||
- Code(Expression(22, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= ((((c2 + (((c13 + c14) + c15) + c16)) - c18) - c12) - c19)
|
||||
= ((((c2 + c3) + c4) + c5) + c6)
|
||||
- Code(Counter(8)) at (prev + 0, 22) to (start + 2, 6)
|
||||
- Code(Expression(15, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= (((((c2 + c3) + c4) + c5) + c6) - c8)
|
||||
- Code(Expression(16, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= (((((c2 + c3) + c4) + c5) + c6) - (c8 + c34))
|
||||
- Code(Expression(18, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= (((((c2 + c3) + c4) + c5) + c6) - ((c8 + c9) + c34))
|
||||
- Code(Expression(21, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= (((((c2 + (((c13 + c14) + c15) + c16)) - c18) - c12) - c19) - c20)
|
||||
- Code(Expression(32, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c19 + c20) + c21)
|
||||
- Code(Counter(22)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(31, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c19 + c20) + c21) + c22)
|
||||
- Code(Counter(12)) at (prev + 2, 9) to (start + 0, 15)
|
||||
- Code(Expression(30, Add)) at (prev + 3, 8) to (start + 0, 12)
|
||||
= (c18 + (((c19 + c20) + c21) + c22))
|
||||
- Code(Counter(23)) at (prev + 1, 13) to (start + 1, 16)
|
||||
- Code(Counter(24)) at (prev + 1, 17) to (start + 2, 10)
|
||||
= (((((c2 + c3) + c4) + c5) + c6) - (((c8 + c9) + c10) + c34))
|
||||
- Code(Expression(28, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c9 + c10) + c11)
|
||||
- Code(Counter(12)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(27, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c9 + c10) + c11) + c12)
|
||||
- Code(Counter(34)) at (prev + 2, 9) to (start + 0, 15)
|
||||
- Code(Expression(115, Add)) at (prev + 3, 8) to (start + 0, 12)
|
||||
= ((((c8 + c9) + c10) + c11) + c12)
|
||||
- Code(Counter(13)) at (prev + 1, 13) to (start + 1, 16)
|
||||
- Code(Counter(14)) at (prev + 1, 17) to (start + 2, 10)
|
||||
- Code(Zero) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Counter(23)) at (prev + 2, 12) to (start + 0, 25)
|
||||
- Code(Counter(25)) at (prev + 0, 26) to (start + 2, 10)
|
||||
- Code(Expression(43, Sub)) at (prev + 4, 17) to (start + 0, 30)
|
||||
= (c23 - c25)
|
||||
- Code(Expression(42, Sub)) at (prev + 1, 16) to (start + 0, 29)
|
||||
= ((c23 - c25) - c11)
|
||||
- Code(Expression(41, Sub)) at (prev + 0, 33) to (start + 0, 46)
|
||||
= (((c23 - c25) - c11) - c26)
|
||||
- Code(Counter(13)) at (prev + 2, 12) to (start + 0, 25)
|
||||
- Code(Counter(15)) at (prev + 0, 26) to (start + 2, 10)
|
||||
- Code(Expression(34, Sub)) at (prev + 4, 17) to (start + 0, 30)
|
||||
= (c13 - c15)
|
||||
- Code(Expression(35, Sub)) at (prev + 1, 16) to (start + 0, 29)
|
||||
= (c13 - (c15 + c33))
|
||||
- Code(Expression(37, Sub)) at (prev + 0, 33) to (start + 0, 46)
|
||||
= (c13 - ((c15 + c16) + c33))
|
||||
- Code(Expression(40, Sub)) at (prev + 0, 50) to (start + 0, 64)
|
||||
= ((((c23 - c25) - c11) - c26) - c27)
|
||||
- Code(Expression(91, Add)) at (prev + 0, 65) to (start + 2, 14)
|
||||
= ((c26 + c27) + c28)
|
||||
- Code(Counter(29)) at (prev + 2, 13) to (start + 0, 14)
|
||||
- Code(Expression(90, Add)) at (prev + 1, 13) to (start + 0, 27)
|
||||
= (((c26 + c27) + c28) + c29)
|
||||
- Code(Counter(11)) at (prev + 2, 13) to (start + 0, 19)
|
||||
= (c13 - (((c15 + c16) + c17) + c33))
|
||||
- Code(Expression(47, Add)) at (prev + 0, 65) to (start + 2, 14)
|
||||
= ((c16 + c17) + c18)
|
||||
- Code(Counter(19)) at (prev + 2, 13) to (start + 0, 14)
|
||||
- Code(Expression(46, Add)) at (prev + 1, 13) to (start + 0, 27)
|
||||
= (((c16 + c17) + c18) + c19)
|
||||
- Code(Counter(33)) at (prev + 2, 13) to (start + 0, 19)
|
||||
- Code(Zero) at (prev + 2, 5) to (start + 0, 6)
|
||||
- Code(Expression(88, Add)) at (prev + 2, 9) to (start + 1, 12)
|
||||
= ((c25 + (((c26 + c27) + c28) + c29)) + Zero)
|
||||
- Code(Counter(30)) at (prev + 1, 13) to (start + 2, 6)
|
||||
- Code(Expression(63, Sub)) at (prev + 2, 9) to (start + 1, 12)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - c13)
|
||||
- Code(Counter(20)) at (prev + 1, 13) to (start + 2, 6)
|
||||
- Code(Zero) at (prev + 2, 5) to (start + 0, 6)
|
||||
- Code(Expression(128, Add)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= (c31 + (((c32 + c33) + c34) + c35))
|
||||
- Code(Expression(88, Add)) at (prev + 0, 16) to (start + 0, 29)
|
||||
= ((c25 + (((c26 + c27) + c28) + c29)) + Zero)
|
||||
- Code(Counter(31)) at (prev + 0, 30) to (start + 2, 6)
|
||||
- Code(Expression(87, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= (((c25 + (((c26 + c27) + c28) + c29)) + Zero) - c31)
|
||||
- Code(Expression(86, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= ((((c25 + (((c26 + c27) + c28) + c29)) + Zero) - c31) - c10)
|
||||
- Code(Expression(85, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= (((((c25 + (((c26 + c27) + c28) + c29)) + Zero) - c31) - c10) - c32)
|
||||
- Code(Expression(84, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= ((((((c25 + (((c26 + c27) + c28) + c29)) + Zero) - c31) - c10) - c32) - c33)
|
||||
- Code(Expression(130, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c32 + c33) + c34)
|
||||
- Code(Counter(35)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(129, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c32 + c33) + c34) + c35)
|
||||
- Code(Counter(10)) at (prev + 2, 13) to (start + 2, 15)
|
||||
- Code(Expression(138, Add)) at (prev + 5, 9) to (start + 0, 10)
|
||||
= (c4 + (((c5 + c6) + c7) + c8))
|
||||
- Code(Expression(128, Add)) at (prev + 0, 16) to (start + 0, 29)
|
||||
= (c31 + (((c32 + c33) + c34) + c35))
|
||||
- Code(Counter(4)) at (prev + 0, 30) to (start + 2, 6)
|
||||
- Code(Expression(127, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= ((c31 + (((c32 + c33) + c34) + c35)) - c4)
|
||||
- Code(Expression(126, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= (((c31 + (((c32 + c33) + c34) + c35)) - c4) - c9)
|
||||
- Code(Expression(125, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= ((((c31 + (((c32 + c33) + c34) + c35)) - c4) - c9) - c5)
|
||||
- Code(Expression(124, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= (((((c31 + (((c32 + c33) + c34) + c35)) - c4) - c9) - c5) - c6)
|
||||
- Code(Expression(140, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c5 + c6) + c7)
|
||||
- Code(Counter(8)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(139, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c5 + c6) + c7) + c8)
|
||||
- Code(Counter(9)) at (prev + 2, 9) to (start + 0, 15)
|
||||
- Code(Expression(137, Add)) at (prev + 2, 1) to (start + 0, 2)
|
||||
= ((c4 + (((c5 + c6) + c7) + c8)) + ((((c9 + c10) + c11) + c12) + ((c0 - c2) - c3)))
|
||||
- Code(Expression(155, Add)) at (prev + 2, 9) to (start + 0, 10)
|
||||
= ((((c21 + c22) + c23) + c24) + c25)
|
||||
- Code(Expression(63, Sub)) at (prev + 0, 16) to (start + 0, 29)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - c13)
|
||||
- Code(Counter(21)) at (prev + 0, 30) to (start + 2, 6)
|
||||
- Code(Expression(73, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - (c13 + c21))
|
||||
- Code(Expression(84, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - ((c13 + c21) + c32))
|
||||
- Code(Expression(96, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - (((c13 + c21) + c22) + c32))
|
||||
- Code(Expression(109, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= ((((((((((c8 + c9) + c10) + c11) + c12) + c15) + c16) + c17) + c18) + c19) - ((((c13 + c21) + c22) + c23) + c32))
|
||||
- Code(Expression(126, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c22 + c23) + c24)
|
||||
- Code(Counter(25)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(125, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c22 + c23) + c24) + c25)
|
||||
- Code(Counter(32)) at (prev + 2, 13) to (start + 2, 15)
|
||||
- Code(Expression(128, Add)) at (prev + 5, 9) to (start + 0, 10)
|
||||
= ((((c26 + c27) + c28) + c29) + c30)
|
||||
- Code(Expression(155, Add)) at (prev + 0, 16) to (start + 0, 29)
|
||||
= ((((c21 + c22) + c23) + c24) + c25)
|
||||
- Code(Counter(26)) at (prev + 0, 30) to (start + 2, 6)
|
||||
- Code(Expression(136, Sub)) at (prev + 2, 15) to (start + 0, 28)
|
||||
= (((((c21 + c22) + c23) + c24) + c25) - c26)
|
||||
- Code(Expression(141, Sub)) at (prev + 1, 12) to (start + 0, 25)
|
||||
= (((((c21 + c22) + c23) + c24) + c25) - (c26 + c31))
|
||||
- Code(Expression(147, Sub)) at (prev + 0, 29) to (start + 0, 42)
|
||||
= (((((c21 + c22) + c23) + c24) + c25) - ((c26 + c27) + c31))
|
||||
- Code(Expression(154, Sub)) at (prev + 0, 46) to (start + 0, 60)
|
||||
= (((((c21 + c22) + c23) + c24) + c25) - (((c26 + c27) + c28) + c31))
|
||||
- Code(Expression(165, Add)) at (prev + 0, 61) to (start + 2, 10)
|
||||
= ((c27 + c28) + c29)
|
||||
- Code(Counter(30)) at (prev + 2, 9) to (start + 0, 10)
|
||||
- Code(Expression(164, Add)) at (prev + 1, 9) to (start + 0, 23)
|
||||
= (((c27 + c28) + c29) + c30)
|
||||
- Code(Counter(31)) at (prev + 2, 9) to (start + 0, 15)
|
||||
- Code(Expression(167, Sub)) at (prev + 2, 1) to (start + 0, 2)
|
||||
= ((((((((((c0 + c26) + c27) + c28) + c29) + c30) + c31) + c32) + c33) + c34) - (c2 + c35))
|
||||
Highest counter ID seen: c35
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
Function name: continue::main
|
||||
Raw bytes (210): 0x[01, 01, 1c, 07, 09, 01, 05, 03, 0d, 1f, 15, 0d, 11, 1b, 19, 1f, 15, 0d, 11, 33, 21, 19, 1d, 2f, 25, 33, 21, 19, 1d, 47, 2d, 25, 29, 43, 31, 47, 2d, 25, 29, 31, 5f, 35, 39, 57, 3d, 31, 5f, 35, 39, 35, 39, 3d, 41, 6b, 45, 3d, 41, 49, 45, 1e, 01, 03, 01, 03, 12, 03, 04, 0e, 00, 13, 0a, 01, 0f, 00, 16, 05, 02, 11, 00, 19, 09, 02, 12, 04, 0e, 1b, 06, 0e, 00, 13, 16, 01, 0f, 00, 16, 15, 01, 16, 02, 0e, 11, 04, 11, 00, 19, 15, 03, 09, 00, 0e, 2f, 02, 0e, 00, 13, 2a, 01, 0f, 00, 16, 1d, 01, 15, 02, 0e, 21, 04, 11, 00, 19, 1d, 03, 09, 00, 0e, 43, 02, 0e, 00, 13, 3e, 01, 0c, 00, 13, 29, 01, 0d, 00, 15, 2d, 01, 0a, 01, 0e, 57, 03, 0e, 00, 13, 52, 01, 0f, 00, 16, 39, 01, 16, 02, 0e, 35, 03, 12, 02, 0e, 5f, 04, 09, 00, 0e, 6b, 02, 0e, 00, 13, 66, 01, 0f, 00, 16, 41, 01, 16, 02, 0e, 49, 04, 11, 00, 16, 41, 03, 09, 00, 0e, 6f, 02, 0d, 01, 02]
|
||||
Raw bytes (210): 0x[01, 01, 1c, 07, 09, 01, 05, 03, 0d, 1f, 15, 0d, 11, 1b, 19, 1f, 15, 0d, 11, 33, 21, 19, 1d, 2f, 25, 33, 21, 19, 1d, 47, 2d, 25, 29, 43, 31, 47, 2d, 25, 29, 5b, 39, 31, 35, 57, 3d, 5b, 39, 31, 35, 35, 39, 3d, 41, 6b, 45, 3d, 41, 45, 49, 1e, 01, 03, 01, 03, 12, 03, 04, 0e, 00, 13, 0a, 01, 0f, 00, 16, 05, 02, 11, 00, 19, 09, 02, 12, 04, 0e, 1b, 06, 0e, 00, 13, 16, 01, 0f, 00, 16, 15, 01, 16, 02, 0e, 11, 04, 11, 00, 19, 15, 03, 09, 00, 0e, 2f, 02, 0e, 00, 13, 2a, 01, 0f, 00, 16, 1d, 01, 15, 02, 0e, 21, 04, 11, 00, 19, 1d, 03, 09, 00, 0e, 43, 02, 0e, 00, 13, 3e, 01, 0c, 00, 13, 29, 01, 0d, 00, 15, 2d, 01, 0a, 01, 0e, 57, 03, 0e, 00, 13, 52, 01, 0f, 00, 16, 39, 01, 16, 02, 0e, 35, 03, 12, 02, 0e, 5f, 04, 09, 00, 0e, 6b, 02, 0e, 00, 13, 66, 01, 0f, 00, 16, 41, 01, 16, 02, 0e, 49, 04, 11, 00, 16, 41, 03, 09, 00, 0e, 6f, 02, 0d, 01, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 28
|
||||
|
|
@ -21,16 +21,16 @@ Number of expressions: 28
|
|||
- expression 15 operands: lhs = Expression(16, Add), rhs = Counter(12)
|
||||
- expression 16 operands: lhs = Expression(17, Add), rhs = Counter(11)
|
||||
- expression 17 operands: lhs = Counter(9), rhs = Counter(10)
|
||||
- expression 18 operands: lhs = Counter(12), rhs = Expression(23, Add)
|
||||
- expression 19 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 18 operands: lhs = Expression(22, Add), rhs = Counter(14)
|
||||
- expression 19 operands: lhs = Counter(12), rhs = Counter(13)
|
||||
- expression 20 operands: lhs = Expression(21, Add), rhs = Counter(15)
|
||||
- expression 21 operands: lhs = Counter(12), rhs = Expression(23, Add)
|
||||
- expression 22 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 21 operands: lhs = Expression(22, Add), rhs = Counter(14)
|
||||
- expression 22 operands: lhs = Counter(12), rhs = Counter(13)
|
||||
- expression 23 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 24 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 25 operands: lhs = Expression(26, Add), rhs = Counter(17)
|
||||
- expression 26 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 27 operands: lhs = Counter(18), rhs = Counter(17)
|
||||
- expression 27 operands: lhs = Counter(17), rhs = Counter(18)
|
||||
Number of file 0 mappings: 30
|
||||
- Code(Counter(0)) at (prev + 3, 1) to (start + 3, 18)
|
||||
- Code(Expression(0, Add)) at (prev + 4, 14) to (start + 0, 19)
|
||||
|
|
@ -60,9 +60,9 @@ Number of file 0 mappings: 30
|
|||
- Code(Counter(10)) at (prev + 1, 13) to (start + 0, 21)
|
||||
- Code(Counter(11)) at (prev + 1, 10) to (start + 1, 14)
|
||||
- Code(Expression(21, Add)) at (prev + 3, 14) to (start + 0, 19)
|
||||
= (c12 + (c13 + c14))
|
||||
= ((c12 + c13) + c14)
|
||||
- Code(Expression(20, Sub)) at (prev + 1, 15) to (start + 0, 22)
|
||||
= ((c12 + (c13 + c14)) - c15)
|
||||
= (((c12 + c13) + c14) - c15)
|
||||
- Code(Counter(14)) at (prev + 1, 22) to (start + 2, 14)
|
||||
- Code(Counter(13)) at (prev + 3, 18) to (start + 2, 14)
|
||||
- Code(Expression(23, Add)) at (prev + 4, 9) to (start + 0, 14)
|
||||
|
|
@ -75,6 +75,6 @@ Number of file 0 mappings: 30
|
|||
- Code(Counter(18)) at (prev + 4, 17) to (start + 0, 22)
|
||||
- Code(Counter(16)) at (prev + 3, 9) to (start + 0, 14)
|
||||
- Code(Expression(27, Add)) at (prev + 2, 13) to (start + 1, 2)
|
||||
= (c18 + c17)
|
||||
= (c17 + c18)
|
||||
Highest counter ID seen: c18
|
||||
|
||||
|
|
|
|||
|
|
@ -13,18 +13,18 @@ Number of file 0 mappings: 4
|
|||
Highest counter ID seen: c1
|
||||
|
||||
Function name: coroutine::main
|
||||
Raw bytes (65): 0x[01, 01, 08, 07, 0d, 05, 09, 11, 15, 1e, 19, 11, 15, 15, 19, 1e, 19, 11, 15, 09, 01, 13, 01, 02, 16, 01, 08, 0b, 00, 2e, 11, 01, 2b, 00, 2d, 03, 01, 0e, 00, 35, 11, 02, 0b, 00, 2e, 1e, 01, 22, 00, 27, 1a, 00, 2c, 00, 2e, 17, 01, 0e, 00, 35, 1a, 02, 01, 00, 02]
|
||||
Raw bytes (65): 0x[01, 01, 08, 07, 0d, 05, 09, 11, 15, 11, 1f, 15, 19, 15, 19, 11, 1f, 15, 19, 09, 01, 13, 01, 02, 16, 01, 08, 0b, 00, 2e, 11, 01, 2b, 00, 2d, 03, 01, 0e, 00, 35, 11, 02, 0b, 00, 2e, 0a, 01, 22, 00, 27, 1a, 00, 2c, 00, 2e, 1f, 01, 0e, 00, 35, 1a, 02, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 8
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 2 operands: lhs = Counter(4), rhs = Counter(5)
|
||||
- expression 3 operands: lhs = Expression(7, Sub), rhs = Counter(6)
|
||||
- expression 4 operands: lhs = Counter(4), rhs = Counter(5)
|
||||
- expression 3 operands: lhs = Counter(4), rhs = Expression(7, Add)
|
||||
- expression 4 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 5 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 6 operands: lhs = Expression(7, Sub), rhs = Counter(6)
|
||||
- expression 7 operands: lhs = Counter(4), rhs = Counter(5)
|
||||
- expression 6 operands: lhs = Counter(4), rhs = Expression(7, Add)
|
||||
- expression 7 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
Number of file 0 mappings: 9
|
||||
- Code(Counter(0)) at (prev + 19, 1) to (start + 2, 22)
|
||||
- Code(Counter(0)) at (prev + 8, 11) to (start + 0, 46)
|
||||
|
|
@ -32,14 +32,14 @@ Number of file 0 mappings: 9
|
|||
- Code(Expression(0, Add)) at (prev + 1, 14) to (start + 0, 53)
|
||||
= ((c1 + c2) + c3)
|
||||
- Code(Counter(4)) at (prev + 2, 11) to (start + 0, 46)
|
||||
- Code(Expression(7, Sub)) at (prev + 1, 34) to (start + 0, 39)
|
||||
- Code(Expression(2, Sub)) at (prev + 1, 34) to (start + 0, 39)
|
||||
= (c4 - c5)
|
||||
- Code(Expression(6, Sub)) at (prev + 0, 44) to (start + 0, 46)
|
||||
= ((c4 - c5) - c6)
|
||||
- Code(Expression(5, Add)) at (prev + 1, 14) to (start + 0, 53)
|
||||
= (c4 - (c5 + c6))
|
||||
- Code(Expression(7, Add)) at (prev + 1, 14) to (start + 0, 53)
|
||||
= (c5 + c6)
|
||||
- Code(Expression(6, Sub)) at (prev + 2, 1) to (start + 0, 2)
|
||||
= ((c4 - c5) - c6)
|
||||
= (c4 - (c5 + c6))
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: coroutine::main::{closure#0}
|
||||
|
|
|
|||
|
|
@ -32,16 +32,16 @@ Number of file 0 mappings: 2
|
|||
Highest counter ID seen: c0
|
||||
|
||||
Function name: inline_dead::main::{closure#0}
|
||||
Raw bytes (23): 0x[01, 01, 02, 00, 06, 01, 00, 03, 01, 07, 17, 01, 16, 00, 01, 17, 00, 18, 03, 01, 05, 00, 06]
|
||||
Raw bytes (23): 0x[01, 01, 02, 07, 00, 01, 00, 03, 01, 07, 17, 01, 16, 00, 01, 17, 00, 18, 02, 01, 05, 00, 06]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 2
|
||||
- expression 0 operands: lhs = Zero, rhs = Expression(1, Sub)
|
||||
- expression 0 operands: lhs = Expression(1, Add), rhs = Zero
|
||||
- expression 1 operands: lhs = Counter(0), rhs = Zero
|
||||
Number of file 0 mappings: 3
|
||||
- Code(Counter(0)) at (prev + 7, 23) to (start + 1, 22)
|
||||
- Code(Zero) at (prev + 1, 23) to (start + 0, 24)
|
||||
- Code(Expression(0, Add)) at (prev + 1, 5) to (start + 0, 6)
|
||||
= (Zero + (c0 - Zero))
|
||||
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 6)
|
||||
= ((c0 + Zero) - Zero)
|
||||
Highest counter ID seen: c0
|
||||
|
||||
|
|
|
|||
|
|
@ -41,14 +41,15 @@ Number of file 0 mappings: 1
|
|||
Highest counter ID seen: c0
|
||||
|
||||
Function name: inline::permutate::<char>
|
||||
Raw bytes (52): 0x[01, 01, 04, 01, 05, 02, 0d, 05, 0f, 09, 0d, 08, 01, 0f, 01, 02, 0e, 05, 02, 0f, 02, 06, 02, 02, 0f, 00, 14, 11, 01, 0d, 00, 0e, 06, 00, 12, 00, 16, 11, 00, 17, 04, 0a, 0d, 05, 0c, 02, 06, 0b, 03, 01, 00, 02]
|
||||
Raw bytes (54): 0x[01, 01, 05, 01, 05, 01, 0b, 05, 0d, 13, 0d, 05, 09, 08, 01, 0f, 01, 02, 0e, 05, 02, 0f, 02, 06, 02, 02, 0f, 00, 14, 11, 01, 0d, 00, 0e, 06, 00, 12, 00, 16, 11, 00, 17, 04, 0a, 0d, 05, 0c, 02, 06, 0f, 03, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 4
|
||||
Number of expressions: 5
|
||||
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
|
||||
- expression 1 operands: lhs = Expression(0, Sub), rhs = Counter(3)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Expression(3, Add)
|
||||
- expression 3 operands: lhs = Counter(2), rhs = Counter(3)
|
||||
- expression 1 operands: lhs = Counter(0), rhs = Expression(2, Add)
|
||||
- expression 2 operands: lhs = Counter(1), rhs = Counter(3)
|
||||
- expression 3 operands: lhs = Expression(4, Add), rhs = Counter(3)
|
||||
- expression 4 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
Number of file 0 mappings: 8
|
||||
- Code(Counter(0)) at (prev + 15, 1) to (start + 2, 14)
|
||||
- Code(Counter(1)) at (prev + 2, 15) to (start + 2, 6)
|
||||
|
|
@ -56,11 +57,11 @@ Number of file 0 mappings: 8
|
|||
= (c0 - c1)
|
||||
- Code(Counter(4)) at (prev + 1, 13) to (start + 0, 14)
|
||||
- Code(Expression(1, Sub)) at (prev + 0, 18) to (start + 0, 22)
|
||||
= ((c0 - c1) - c3)
|
||||
= (c0 - (c1 + c3))
|
||||
- Code(Counter(4)) at (prev + 0, 23) to (start + 4, 10)
|
||||
- Code(Counter(3)) at (prev + 5, 12) to (start + 2, 6)
|
||||
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
|
||||
= (c1 + (c2 + c3))
|
||||
- Code(Expression(3, Add)) at (prev + 3, 1) to (start + 0, 2)
|
||||
= ((c1 + c2) + c3)
|
||||
Highest counter ID seen: c4
|
||||
|
||||
Function name: inline::permutations::<char>
|
||||
|
|
|
|||
|
|
@ -59,69 +59,69 @@ Number of file 0 mappings: 1
|
|||
Highest counter ID seen: c0
|
||||
|
||||
Function name: issue_84561::test3
|
||||
Raw bytes (414): 0x[01, 01, 3b, 05, 09, 0d, 11, 15, 19, 1e, 1d, 15, 19, 1a, 21, 1e, 1d, 15, 19, 25, 2d, 21, 25, 29, 35, 32, 29, 21, 25, 31, 39, 3d, 41, 42, 45, 3d, 41, 66, 49, 45, 4d, 63, 51, 66, 49, 45, 4d, 5e, 55, 63, 51, 66, 49, 45, 4d, 9e, 01, 55, 51, 59, 9e, 01, 55, 51, 59, 9b, 01, 5d, 9e, 01, 55, 51, 59, 9b, 01, 61, 9e, 01, 55, 51, 59, 96, 01, 65, 9b, 01, 61, 9e, 01, 55, 51, 59, 75, e2, 01, e6, 01, 79, 69, 6d, 69, 6d, 69, 6d, e6, 01, 00, 69, 6d, e6, 01, 79, 69, 6d, df, 01, 7d, 75, e2, 01, e6, 01, 79, 69, 6d, da, 01, 81, 01, df, 01, 7d, 75, e2, 01, e6, 01, 79, 69, 6d, 81, 01, 85, 01, 33, 01, 08, 01, 03, 1c, 05, 04, 09, 01, 1c, 02, 02, 05, 04, 1f, 0d, 05, 05, 00, 1f, 06, 01, 05, 00, 1f, 15, 01, 09, 01, 1c, 1e, 02, 05, 00, 1f, 1a, 01, 05, 00, 0f, 16, 00, 20, 00, 30, 21, 01, 05, 03, 0f, 25, 03, 20, 00, 30, 2d, 00, 33, 00, 41, 22, 00, 4b, 00, 5a, 32, 01, 05, 00, 0f, 29, 05, 09, 03, 10, 35, 05, 0d, 00, 1b, 2a, 02, 0d, 00, 1c, 2e, 04, 09, 05, 06, 31, 06, 05, 03, 06, 36, 04, 05, 03, 06, 3d, 04, 09, 04, 06, 42, 05, 08, 00, 0f, 45, 01, 09, 03, 0a, 3e, 05, 09, 03, 0a, 63, 05, 08, 00, 0f, 51, 01, 09, 00, 13, 59, 03, 0d, 00, 1d, 5e, 03, 09, 00, 13, 5a, 03, 0d, 00, 1d, 9b, 01, 03, 05, 00, 0f, 9b, 01, 01, 0c, 00, 13, 5d, 01, 0d, 00, 13, 7a, 02, 0d, 00, 13, 96, 01, 04, 05, 02, 13, 65, 03, 0d, 00, 13, 92, 01, 02, 0d, 00, 13, df, 01, 03, 05, 00, 0f, 69, 01, 0c, 00, 13, 6d, 01, 0d, 03, 0e, 75, 04, 0d, 00, 13, e6, 01, 02, 0d, 00, 17, e6, 01, 01, 14, 00, 1b, 00, 01, 15, 00, 1b, b6, 01, 02, 15, 00, 1b, e2, 01, 04, 0d, 00, 13, 7d, 03, 09, 00, 19, da, 01, 02, 05, 00, 0f, d6, 01, 03, 09, 00, 22, 81, 01, 02, 05, 00, 0f, ea, 01, 03, 09, 00, 2c, 85, 01, 02, 01, 00, 02]
|
||||
Raw bytes (409): 0x[01, 01, 3b, 05, 09, 0d, 11, 15, 19, 15, 1f, 19, 1d, 15, 1b, 1f, 21, 19, 1d, 25, 29, 21, 25, 2d, 31, 21, 33, 25, 2d, 35, 39, 3d, 41, 3d, 43, 41, 45, 5f, 4d, 45, 49, 5f, 67, 45, 49, 4d, 51, 5f, 63, 45, 49, 67, 59, 4d, 51, 97, 01, 55, 51, 59, 97, 01, 55, 51, 59, 97, 01, 83, 01, 51, 59, 55, 5d, 97, 01, 9f, 01, 51, 59, 55, 61, 97, 01, 9b, 01, 51, 59, 9f, 01, 65, 55, 61, db, 01, e7, 01, 69, 71, 6d, 75, 69, 6d, 69, 6d, 69, bb, 01, 6d, 00, 69, e7, 01, 6d, 75, db, 01, e3, 01, 69, 71, e7, 01, 79, 6d, 75, db, 01, df, 01, 69, 71, e3, 01, 7d, e7, 01, 79, 6d, 75, 7d, 81, 01, 33, 01, 08, 01, 03, 1c, 05, 04, 09, 01, 1c, 02, 02, 05, 04, 1f, 0d, 05, 05, 00, 1f, 06, 01, 05, 00, 1f, 15, 01, 09, 01, 1c, 0a, 02, 05, 00, 1f, 0e, 01, 05, 00, 0f, 16, 00, 20, 00, 30, 21, 01, 05, 03, 0f, 25, 03, 20, 00, 30, 29, 00, 33, 00, 41, 22, 00, 4b, 00, 5a, 26, 01, 05, 00, 0f, 2d, 05, 09, 03, 10, 31, 05, 0d, 00, 1b, 2a, 02, 0d, 00, 1c, 2e, 04, 09, 05, 06, 35, 06, 05, 03, 06, 36, 04, 05, 03, 06, 3d, 04, 09, 04, 06, 3a, 05, 08, 00, 0f, 45, 01, 09, 03, 0a, 3e, 05, 09, 03, 0a, 46, 05, 08, 00, 0f, 51, 01, 09, 00, 13, 55, 03, 0d, 00, 1d, 4e, 03, 09, 00, 13, 5a, 03, 0d, 00, 1d, 72, 03, 05, 00, 0f, 72, 01, 0c, 00, 13, 5d, 01, 0d, 00, 13, 7a, 02, 0d, 00, 13, 86, 01, 04, 05, 02, 13, 65, 03, 0d, 00, 13, 92, 01, 02, 0d, 00, 13, a2, 01, 03, 05, 00, 0f, 69, 01, 0c, 00, 13, 6d, 01, 0d, 03, 0e, 71, 04, 0d, 00, 13, b2, 01, 02, 0d, 00, 17, b2, 01, 01, 14, 00, 1b, 00, 01, 15, 00, 1b, b6, 01, 02, 15, 00, 1b, be, 01, 04, 0d, 00, 13, 79, 03, 09, 00, 19, c6, 01, 02, 05, 00, 0f, d6, 01, 03, 09, 00, 22, 7d, 02, 05, 00, 0f, ea, 01, 03, 09, 00, 2c, 81, 01, 02, 01, 00, 02]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 59
|
||||
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
|
||||
- expression 1 operands: lhs = Counter(3), rhs = Counter(4)
|
||||
- expression 2 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 3 operands: lhs = Expression(7, Sub), rhs = Counter(7)
|
||||
- expression 4 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 5 operands: lhs = Expression(6, Sub), rhs = Counter(8)
|
||||
- expression 6 operands: lhs = Expression(7, Sub), rhs = Counter(7)
|
||||
- expression 7 operands: lhs = Counter(5), rhs = Counter(6)
|
||||
- expression 8 operands: lhs = Counter(9), rhs = Counter(11)
|
||||
- expression 3 operands: lhs = Counter(5), rhs = Expression(7, Add)
|
||||
- expression 4 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
- expression 5 operands: lhs = Counter(5), rhs = Expression(6, Add)
|
||||
- expression 6 operands: lhs = Expression(7, Add), rhs = Counter(8)
|
||||
- expression 7 operands: lhs = Counter(6), rhs = Counter(7)
|
||||
- expression 8 operands: lhs = Counter(9), rhs = Counter(10)
|
||||
- expression 9 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 10 operands: lhs = Counter(10), rhs = Counter(13)
|
||||
- expression 11 operands: lhs = Expression(12, Sub), rhs = Counter(10)
|
||||
- expression 12 operands: lhs = Counter(8), rhs = Counter(9)
|
||||
- expression 13 operands: lhs = Counter(12), rhs = Counter(14)
|
||||
- expression 10 operands: lhs = Counter(11), rhs = Counter(12)
|
||||
- expression 11 operands: lhs = Counter(8), rhs = Expression(12, Add)
|
||||
- expression 12 operands: lhs = Counter(9), rhs = Counter(11)
|
||||
- expression 13 operands: lhs = Counter(13), rhs = Counter(14)
|
||||
- expression 14 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 15 operands: lhs = Expression(16, Sub), rhs = Counter(17)
|
||||
- expression 16 operands: lhs = Counter(15), rhs = Counter(16)
|
||||
- expression 17 operands: lhs = Expression(25, Sub), rhs = Counter(18)
|
||||
- expression 18 operands: lhs = Counter(17), rhs = Counter(19)
|
||||
- expression 19 operands: lhs = Expression(24, Add), rhs = Counter(20)
|
||||
- expression 20 operands: lhs = Expression(25, Sub), rhs = Counter(18)
|
||||
- expression 21 operands: lhs = Counter(17), rhs = Counter(19)
|
||||
- expression 22 operands: lhs = Expression(23, Sub), rhs = Counter(21)
|
||||
- expression 23 operands: lhs = Expression(24, Add), rhs = Counter(20)
|
||||
- expression 24 operands: lhs = Expression(25, Sub), rhs = Counter(18)
|
||||
- expression 25 operands: lhs = Counter(17), rhs = Counter(19)
|
||||
- expression 26 operands: lhs = Expression(39, Sub), rhs = Counter(21)
|
||||
- expression 15 operands: lhs = Counter(15), rhs = Expression(16, Add)
|
||||
- expression 16 operands: lhs = Counter(16), rhs = Counter(17)
|
||||
- expression 17 operands: lhs = Expression(23, Add), rhs = Counter(19)
|
||||
- expression 18 operands: lhs = Counter(17), rhs = Counter(18)
|
||||
- expression 19 operands: lhs = Expression(23, Add), rhs = Expression(25, Add)
|
||||
- expression 20 operands: lhs = Counter(17), rhs = Counter(18)
|
||||
- expression 21 operands: lhs = Counter(19), rhs = Counter(20)
|
||||
- expression 22 operands: lhs = Expression(23, Add), rhs = Expression(24, Add)
|
||||
- expression 23 operands: lhs = Counter(17), rhs = Counter(18)
|
||||
- expression 24 operands: lhs = Expression(25, Add), rhs = Counter(22)
|
||||
- expression 25 operands: lhs = Counter(19), rhs = Counter(20)
|
||||
- expression 26 operands: lhs = Expression(37, Add), rhs = Counter(21)
|
||||
- expression 27 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 28 operands: lhs = Expression(39, Sub), rhs = Counter(21)
|
||||
- expression 28 operands: lhs = Expression(37, Add), rhs = Counter(21)
|
||||
- expression 29 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 30 operands: lhs = Expression(38, Add), rhs = Counter(23)
|
||||
- expression 31 operands: lhs = Expression(39, Sub), rhs = Counter(21)
|
||||
- expression 32 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 33 operands: lhs = Expression(38, Add), rhs = Counter(24)
|
||||
- expression 34 operands: lhs = Expression(39, Sub), rhs = Counter(21)
|
||||
- expression 35 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 36 operands: lhs = Expression(37, Sub), rhs = Counter(25)
|
||||
- expression 37 operands: lhs = Expression(38, Add), rhs = Counter(24)
|
||||
- expression 38 operands: lhs = Expression(39, Sub), rhs = Counter(21)
|
||||
- expression 39 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 40 operands: lhs = Counter(29), rhs = Expression(56, Sub)
|
||||
- expression 41 operands: lhs = Expression(57, Sub), rhs = Counter(30)
|
||||
- expression 42 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 30 operands: lhs = Expression(37, Add), rhs = Expression(32, Add)
|
||||
- expression 31 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 32 operands: lhs = Counter(21), rhs = Counter(23)
|
||||
- expression 33 operands: lhs = Expression(37, Add), rhs = Expression(39, Add)
|
||||
- expression 34 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 35 operands: lhs = Counter(21), rhs = Counter(24)
|
||||
- expression 36 operands: lhs = Expression(37, Add), rhs = Expression(38, Add)
|
||||
- expression 37 operands: lhs = Counter(20), rhs = Counter(22)
|
||||
- expression 38 operands: lhs = Expression(39, Add), rhs = Counter(25)
|
||||
- expression 39 operands: lhs = Counter(21), rhs = Counter(24)
|
||||
- expression 40 operands: lhs = Expression(54, Add), rhs = Expression(57, Add)
|
||||
- expression 41 operands: lhs = Counter(26), rhs = Counter(28)
|
||||
- expression 42 operands: lhs = Counter(27), rhs = Counter(29)
|
||||
- expression 43 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 44 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 45 operands: lhs = Expression(57, Sub), rhs = Zero
|
||||
- expression 46 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 47 operands: lhs = Expression(57, Sub), rhs = Counter(30)
|
||||
- expression 48 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 49 operands: lhs = Expression(55, Add), rhs = Counter(31)
|
||||
- expression 50 operands: lhs = Counter(29), rhs = Expression(56, Sub)
|
||||
- expression 51 operands: lhs = Expression(57, Sub), rhs = Counter(30)
|
||||
- expression 52 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 53 operands: lhs = Expression(54, Sub), rhs = Counter(32)
|
||||
- expression 54 operands: lhs = Expression(55, Add), rhs = Counter(31)
|
||||
- expression 55 operands: lhs = Counter(29), rhs = Expression(56, Sub)
|
||||
- expression 56 operands: lhs = Expression(57, Sub), rhs = Counter(30)
|
||||
- expression 57 operands: lhs = Counter(26), rhs = Counter(27)
|
||||
- expression 58 operands: lhs = Counter(32), rhs = Counter(33)
|
||||
- expression 45 operands: lhs = Counter(26), rhs = Expression(46, Add)
|
||||
- expression 46 operands: lhs = Counter(27), rhs = Zero
|
||||
- expression 47 operands: lhs = Counter(26), rhs = Expression(57, Add)
|
||||
- expression 48 operands: lhs = Counter(27), rhs = Counter(29)
|
||||
- expression 49 operands: lhs = Expression(54, Add), rhs = Expression(56, Add)
|
||||
- expression 50 operands: lhs = Counter(26), rhs = Counter(28)
|
||||
- expression 51 operands: lhs = Expression(57, Add), rhs = Counter(30)
|
||||
- expression 52 operands: lhs = Counter(27), rhs = Counter(29)
|
||||
- expression 53 operands: lhs = Expression(54, Add), rhs = Expression(55, Add)
|
||||
- expression 54 operands: lhs = Counter(26), rhs = Counter(28)
|
||||
- expression 55 operands: lhs = Expression(56, Add), rhs = Counter(31)
|
||||
- expression 56 operands: lhs = Expression(57, Add), rhs = Counter(30)
|
||||
- expression 57 operands: lhs = Counter(27), rhs = Counter(29)
|
||||
- expression 58 operands: lhs = Counter(31), rhs = Counter(32)
|
||||
Number of file 0 mappings: 51
|
||||
- Code(Counter(0)) at (prev + 8, 1) to (start + 3, 28)
|
||||
- Code(Counter(1)) at (prev + 4, 9) to (start + 1, 28)
|
||||
|
|
@ -131,76 +131,76 @@ Number of file 0 mappings: 51
|
|||
- Code(Expression(1, Sub)) at (prev + 1, 5) to (start + 0, 31)
|
||||
= (c3 - c4)
|
||||
- Code(Counter(5)) at (prev + 1, 9) to (start + 1, 28)
|
||||
- Code(Expression(7, Sub)) at (prev + 2, 5) to (start + 0, 31)
|
||||
- Code(Expression(2, Sub)) at (prev + 2, 5) to (start + 0, 31)
|
||||
= (c5 - c6)
|
||||
- Code(Expression(6, Sub)) at (prev + 1, 5) to (start + 0, 15)
|
||||
= ((c5 - c6) - c7)
|
||||
- Code(Expression(3, Sub)) at (prev + 1, 5) to (start + 0, 15)
|
||||
= (c5 - (c6 + c7))
|
||||
- Code(Expression(5, Sub)) at (prev + 0, 32) to (start + 0, 48)
|
||||
= (((c5 - c6) - c7) - c8)
|
||||
= (c5 - ((c6 + c7) + c8))
|
||||
- Code(Counter(8)) at (prev + 1, 5) to (start + 3, 15)
|
||||
- Code(Counter(9)) at (prev + 3, 32) to (start + 0, 48)
|
||||
- Code(Counter(11)) at (prev + 0, 51) to (start + 0, 65)
|
||||
- Code(Counter(10)) at (prev + 0, 51) to (start + 0, 65)
|
||||
- Code(Expression(8, Sub)) at (prev + 0, 75) to (start + 0, 90)
|
||||
= (c9 - c11)
|
||||
- Code(Expression(12, Sub)) at (prev + 1, 5) to (start + 0, 15)
|
||||
= (c9 - c10)
|
||||
- Code(Expression(9, Sub)) at (prev + 1, 5) to (start + 0, 15)
|
||||
= (c8 - c9)
|
||||
- Code(Counter(10)) at (prev + 5, 9) to (start + 3, 16)
|
||||
- Code(Counter(13)) at (prev + 5, 13) to (start + 0, 27)
|
||||
- Code(Counter(11)) at (prev + 5, 9) to (start + 3, 16)
|
||||
- Code(Counter(12)) at (prev + 5, 13) to (start + 0, 27)
|
||||
- Code(Expression(10, Sub)) at (prev + 2, 13) to (start + 0, 28)
|
||||
= (c10 - c13)
|
||||
= (c11 - c12)
|
||||
- Code(Expression(11, Sub)) at (prev + 4, 9) to (start + 5, 6)
|
||||
= ((c8 - c9) - c10)
|
||||
- Code(Counter(12)) at (prev + 6, 5) to (start + 3, 6)
|
||||
= (c8 - (c9 + c11))
|
||||
- Code(Counter(13)) at (prev + 6, 5) to (start + 3, 6)
|
||||
- Code(Expression(13, Sub)) at (prev + 4, 5) to (start + 3, 6)
|
||||
= (c12 - c14)
|
||||
= (c13 - c14)
|
||||
- Code(Counter(15)) at (prev + 4, 9) to (start + 4, 6)
|
||||
- Code(Expression(16, Sub)) at (prev + 5, 8) to (start + 0, 15)
|
||||
- Code(Expression(14, Sub)) at (prev + 5, 8) to (start + 0, 15)
|
||||
= (c15 - c16)
|
||||
- Code(Counter(17)) at (prev + 1, 9) to (start + 3, 10)
|
||||
- Code(Expression(15, Sub)) at (prev + 5, 9) to (start + 3, 10)
|
||||
= ((c15 - c16) - c17)
|
||||
- Code(Expression(24, Add)) at (prev + 5, 8) to (start + 0, 15)
|
||||
= ((c17 - c19) + c18)
|
||||
= (c15 - (c16 + c17))
|
||||
- Code(Expression(17, Sub)) at (prev + 5, 8) to (start + 0, 15)
|
||||
= ((c17 + c18) - c19)
|
||||
- Code(Counter(20)) at (prev + 1, 9) to (start + 0, 19)
|
||||
- Code(Counter(22)) at (prev + 3, 13) to (start + 0, 29)
|
||||
- Code(Expression(23, Sub)) at (prev + 3, 9) to (start + 0, 19)
|
||||
= (((c17 - c19) + c18) - c20)
|
||||
- Code(Counter(21)) at (prev + 3, 13) to (start + 0, 29)
|
||||
- Code(Expression(19, Sub)) at (prev + 3, 9) to (start + 0, 19)
|
||||
= ((c17 + c18) - (c19 + c20))
|
||||
- Code(Expression(22, Sub)) at (prev + 3, 13) to (start + 0, 29)
|
||||
= ((((c17 - c19) + c18) - c20) - c21)
|
||||
- Code(Expression(38, Add)) at (prev + 3, 5) to (start + 0, 15)
|
||||
= ((c20 - c22) + c21)
|
||||
- Code(Expression(38, Add)) at (prev + 1, 12) to (start + 0, 19)
|
||||
= ((c20 - c22) + c21)
|
||||
= ((c17 + c18) - ((c19 + c20) + c22))
|
||||
- Code(Expression(28, Sub)) at (prev + 3, 5) to (start + 0, 15)
|
||||
= ((c20 + c22) - c21)
|
||||
- Code(Expression(28, Sub)) at (prev + 1, 12) to (start + 0, 19)
|
||||
= ((c20 + c22) - c21)
|
||||
- Code(Counter(23)) at (prev + 1, 13) to (start + 0, 19)
|
||||
- Code(Expression(30, Sub)) at (prev + 2, 13) to (start + 0, 19)
|
||||
= (((c20 - c22) + c21) - c23)
|
||||
- Code(Expression(37, Sub)) at (prev + 4, 5) to (start + 2, 19)
|
||||
= (((c20 - c22) + c21) - c24)
|
||||
= ((c20 + c22) - (c21 + c23))
|
||||
- Code(Expression(33, Sub)) at (prev + 4, 5) to (start + 2, 19)
|
||||
= ((c20 + c22) - (c21 + c24))
|
||||
- Code(Counter(25)) at (prev + 3, 13) to (start + 0, 19)
|
||||
- Code(Expression(36, Sub)) at (prev + 2, 13) to (start + 0, 19)
|
||||
= ((((c20 - c22) + c21) - c24) - c25)
|
||||
- Code(Expression(55, Add)) at (prev + 3, 5) to (start + 0, 15)
|
||||
= (c29 + ((c26 - c27) - c30))
|
||||
= ((c20 + c22) - ((c21 + c24) + c25))
|
||||
- Code(Expression(40, Sub)) at (prev + 3, 5) to (start + 0, 15)
|
||||
= ((c26 + c28) - (c27 + c29))
|
||||
- Code(Counter(26)) at (prev + 1, 12) to (start + 0, 19)
|
||||
- Code(Counter(27)) at (prev + 1, 13) to (start + 3, 14)
|
||||
- Code(Counter(29)) at (prev + 4, 13) to (start + 0, 19)
|
||||
- Code(Expression(57, Sub)) at (prev + 2, 13) to (start + 0, 23)
|
||||
- Code(Counter(28)) at (prev + 4, 13) to (start + 0, 19)
|
||||
- Code(Expression(44, Sub)) at (prev + 2, 13) to (start + 0, 23)
|
||||
= (c26 - c27)
|
||||
- Code(Expression(57, Sub)) at (prev + 1, 20) to (start + 0, 27)
|
||||
- Code(Expression(44, Sub)) at (prev + 1, 20) to (start + 0, 27)
|
||||
= (c26 - c27)
|
||||
- Code(Zero) at (prev + 1, 21) to (start + 0, 27)
|
||||
- Code(Expression(45, Sub)) at (prev + 2, 21) to (start + 0, 27)
|
||||
= ((c26 - c27) - Zero)
|
||||
- Code(Expression(56, Sub)) at (prev + 4, 13) to (start + 0, 19)
|
||||
= ((c26 - c27) - c30)
|
||||
- Code(Counter(31)) at (prev + 3, 9) to (start + 0, 25)
|
||||
- Code(Expression(54, Sub)) at (prev + 2, 5) to (start + 0, 15)
|
||||
= ((c29 + ((c26 - c27) - c30)) - c31)
|
||||
= (c26 - (c27 + Zero))
|
||||
- Code(Expression(47, Sub)) at (prev + 4, 13) to (start + 0, 19)
|
||||
= (c26 - (c27 + c29))
|
||||
- Code(Counter(30)) at (prev + 3, 9) to (start + 0, 25)
|
||||
- Code(Expression(49, Sub)) at (prev + 2, 5) to (start + 0, 15)
|
||||
= ((c26 + c28) - ((c27 + c29) + c30))
|
||||
- Code(Expression(53, Sub)) at (prev + 3, 9) to (start + 0, 34)
|
||||
= (((c29 + ((c26 - c27) - c30)) - c31) - c32)
|
||||
- Code(Counter(32)) at (prev + 2, 5) to (start + 0, 15)
|
||||
= ((c26 + c28) - (((c27 + c29) + c30) + c31))
|
||||
- Code(Counter(31)) at (prev + 2, 5) to (start + 0, 15)
|
||||
- Code(Expression(58, Sub)) at (prev + 3, 9) to (start + 0, 44)
|
||||
= (c32 - c33)
|
||||
- Code(Counter(33)) at (prev + 2, 1) to (start + 0, 2)
|
||||
Highest counter ID seen: c33
|
||||
= (c31 - c32)
|
||||
- Code(Counter(32)) at (prev + 2, 1) to (start + 0, 2)
|
||||
Highest counter ID seen: c32
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue