diff --git a/crates/ruff_charon/src/lib.rs b/crates/ruff_charon/src/lib.rs index 7c93365814b75..1cc891b6de916 100644 --- a/crates/ruff_charon/src/lib.rs +++ b/crates/ruff_charon/src/lib.rs @@ -22,7 +22,7 @@ //! | Charon | Meaning | Relation | //! |---|---|---| //! | `FnPtrKind::Fun(id)` | a resolved function | `CALLS_RESOLVED` | -//! | `FnPtrKind::Trait` with `TraitRefKind::TraitImpl` | a known impl | `CALLS_RESOLVED` | +//! | `FnPtrKind::Trait` with `TraitRefKind::TraitImpl` | a known impl; the row names the impl's method (or the trait's default) | `CALLS_RESOLVED` | //! | `FnPtrKind::Trait`, any other trait-ref kind (`Clause`, `Dyn`, ...) | the impl is chosen later | `MAY_DISPATCH` | //! | `FnOperand::Dynamic` | a function pointer or vtable slot | `UNRESOLVED_CALL` | //! @@ -95,9 +95,14 @@ pub enum Callee { /// `FnPtrKind::Fun`: the function's id. Fun(FunDeclId), /// `FnPtrKind::Trait`: the trait reference's kind and the method's trait. + /// `impl_fun` is the function a `TraitImpl` reference resolves to: the + /// impl's own method, or the trait's default method when the impl does + /// not define it. `None` for every other kind, and when the impl or the + /// method is not in the LLBC. Trait { kind: String, trait_id: Option, + impl_fun: Option, }, /// `FnOperand::Dynamic`. Dynamic, @@ -173,14 +178,33 @@ fn has_deref(place: &Place) -> bool { } } -fn callee(call: &Call) -> Callee { +fn callee(krate: &TranslatedCrate, call: &Call) -> Callee { match &call.func { FnOperand::Regular(ptr) => match ptr.kind.as_ref() { FnPtrKind::Fun(id) => Callee::Fun(*id), - FnPtrKind::Trait(tr, _) => Callee::Trait { - kind: variant(format!("{:?}", tr.kind)), - trait_id: Some(tr.trait_decl_ref.id), - }, + FnPtrKind::Trait(tr, method) => { + let impl_fun = match &tr.kind { + TraitRefKind::TraitImpl(r) => krate + .trait_impls + .get(r.id) + .and_then(|i| i.methods.get(*method)) + .map(|b| b.skip_binder.id) + .or_else(|| { + krate + .trait_decls + .get(tr.trait_decl_ref.id) + .and_then(|t| t.methods.get(*method)) + .and_then(|m| m.skip_binder.default.as_ref()) + .map(|d| d.id) + }), + _ => None, + }; + Callee::Trait { + kind: variant(format!("{:?}", tr.kind)), + trait_id: Some(tr.trait_decl_ref.id), + impl_fun, + } + } }, FnOperand::Dynamic(..) => Callee::Dynamic, } @@ -211,7 +235,7 @@ pub fn fun_facts(krate: &TranslatedCrate, crate_name: &str) -> Vec { let mut calls = Vec::new(); body.body.dyn_visit(|st: &Statement| match &st.kind { StatementKind::Call { call, .. } => calls.push(CallSite { - callee: callee(call), + callee: callee(krate, call), site: site(krate, st.span), }), StatementKind::Assert { .. } => facts.asserts += 1, @@ -320,6 +344,10 @@ pub fn relations( site: f.site.clone(), }); let Some(calls) = f.calls else { + // The body is an item of its own: harvested here, represented by + // nothing, so it is the residual. The definition above stays + // represented by its DEFINES row. + receipt.harvested += 1; residual.push(Residual { reason: "BODY_NOT_STRUCTURED", subject: f.qualified.clone(), @@ -342,17 +370,36 @@ pub fn relations( } }, }, - Callee::Trait { kind, trait_id } => { - let tr = trait_id - .and_then(|t| krate.item_names.get(&ItemId::TraitDecl(t))) - .map(|n| qualified_name(krate, n)) - .unwrap_or_else(|| "?".to_owned()); - let p = if kind == "TraitImpl" { - "CALLS_RESOLVED" + Callee::Trait { + kind, + trait_id, + impl_fun, + } => { + if kind == "TraitImpl" { + // A known impl: the confirmed callee is the function + // it resolves to, never the trait. + let named = impl_fun.and_then(|id| match krate.fun_decls.get(id) { + Some(t) => Some(qualified_name(krate, &t.item_meta.name)), + None => krate + .item_names + .get(&ItemId::Fun(id)) + .map(|n| qualified_name(krate, n)), + }); + let Some(name) = named else { + residual.push(Residual { + reason: "TRAIT_IMPL_METHOD_NOT_FOUND", + subject: f.qualified.clone(), + }); + continue; + }; + ("CALLS_RESOLVED", name) } else { - "MAY_DISPATCH" - }; - (p, format!("{tr} via {kind}")) + let tr = trait_id + .and_then(|t| krate.item_names.get(&ItemId::TraitDecl(t))) + .map(|n| qualified_name(krate, n)) + .unwrap_or_else(|| "?".to_owned()); + ("MAY_DISPATCH", format!("{tr} via {kind}")) + } } Callee::Dynamic => ("UNRESOLVED_CALL", "dynamic".to_owned()), }; @@ -490,9 +537,9 @@ mod tests { #[test] fn base64_matches_the_standard_alphabet() { assert_eq!(b64(b""), ""); - assert_eq!(b64(b"f"), "Zg=="); - assert_eq!(b64(b"fo"), "Zm8="); - assert_eq!(b64(b"foo"), "Zm9v"); + assert_eq!(b64(b"a"), "YQ=="); + assert_eq!(b64(b"ab"), "YWI="); + assert_eq!(b64(b"abc"), "YWJj"); assert_eq!(b64(b"function"), "ZnVuY3Rpb24="); } diff --git a/crates/ruff_charon/src/store.rs b/crates/ruff_charon/src/store.rs index bc9abb70ac418..25d90e4c09826 100644 --- a/crates/ruff_charon/src/store.rs +++ b/crates/ruff_charon/src/store.rs @@ -23,6 +23,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::fs; use std::io::{self, BufRead, BufReader, Write}; use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicU64, Ordering}; use crate::{GRADE, Llbc, relations}; @@ -164,15 +165,46 @@ impl Store { /// Write `path` through a temporary file and a rename, so a reader never /// sees half an artifact. - #[expect( - clippy::disallowed_methods, - reason = "ruff/clippy.toml's list is directory-scoped and reaches this \ - workspace-excluded crate; there is no ty System here, plain std::fs is correct" - )] fn replace(path: &Path, body: &[u8]) -> io::Result<()> { - let tmp = path.with_extension("tmp"); - fs::write(&tmp, body)?; - fs::rename(&tmp, path) + // A temporary file of its own per call: two imports of one crate must + // not write into each other's file, or one of them publishes the + // other's half-written bytes (or fails when it was renamed away). + static NEXT: AtomicU64 = AtomicU64::new(0); + let name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("artifact"); + // A leftover from an interrupted import can hold the name this call + // picks (a restarted process may get the same id and its counter + // starts again at zero). Skip taken names; creation stays exclusive, + // so a concurrent writer is never written into. + let (tmp, mut file) = loop { + let tmp = path.with_file_name(format!( + ".{name}.{}.{}.tmp", + std::process::id(), + NEXT.fetch_add(1, Ordering::Relaxed) + )); + match fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&tmp) + { + Ok(file) => break (tmp, file), + Err(e) if e.kind() == io::ErrorKind::AlreadyExists => {} + Err(e) => return Err(e), + } + }; + let written = file + .write_all(body) + .and_then(|()| file.sync_all()) + .and_then(|()| { + drop(file); + fs::rename(&tmp, path) + }); + if written.is_err() { + let _ = fs::remove_file(&tmp); + } + written } /// Import (or refresh) one crate from its LLBC: replaces its rows, @@ -326,7 +358,9 @@ impl Store { } /// Call rows whose callee is a function of a stored crate that no stored - /// crate defines: edges left behind by an incomplete refresh. + /// crate defines: edges left behind by an incomplete refresh. A call + /// resolved through a known trait impl names the trait (` via + /// TraitImpl`), not a function, so it is not checked here. /// /// # Errors /// I/O or format errors. @@ -340,7 +374,7 @@ impl Store { .collect(); Ok(all .iter() - .filter(|r| r.predicate == "CALLS_RESOLVED") + .filter(|r| r.predicate == "CALLS_RESOLVED" && !r.object.contains(" via ")) .filter(|r| { let owner = r.object.split("::").next().unwrap_or(""); crates.iter().any(|c| c == owner) && !defined.contains(r.object.as_str()) diff --git a/crates/ruff_charon/tests/data/README.md b/crates/ruff_charon/tests/data/README.md index aaeaf708a893a..48411f79ee302 100644 --- a/crates/ruff_charon/tests/data/README.md +++ b/crates/ruff_charon/tests/data/README.md @@ -1,14 +1,13 @@ # ruff_charon test data -- `cg_lib.llbc`, `cg_app.llbc`: Charon LLBC of the two crates of lance-graph - `crates/sag-ra-probe/fixtures/codegraph/rev1`, produced with the AdaWorldAPI Charon fork - (`c69e231`, toolchain `nightly-2026-09-17`, built `--no-default-features --features rustc`): +- `cg_lib.llbc`, `cg_app.llbc`: Charon LLBC of the two crates of lance-graph `crates/sag-ra-probe/fixtures/codegraph/rev1`. +- `cg_lib_rev2.llbc`, `cg_app_rev2.llbc`: the same for `rev2`, which deletes `triple` and `area_dyn` from `cg_lib` and drops the `area_dyn` call from `cg_app` (the store tests). +- `trprobe.llbc`: Charon LLBC of `trprobe.rs` (a one-file crate with a trait, a default method and one impl), used to build calls through a known impl, which Charon does not emit for any of these sources. +- `*.llbc_calls.txt`: the reference output, written by lance-graph `crates/sag-ra-probe/tools/llbc_calls.py `, never by this crate. - cd rev1/cg_lib && charon cargo --no-dedup-serialized-ast --dest-file cg_lib.llbc - cd rev1/cg_app && charon cargo --no-dedup-serialized-ast --dest-file cg_app.llbc +The LLBC was produced with the AdaWorldAPI Charon fork (`c69e231`, toolchain `nightly-2026-09-17`, built `--no-default-features --features rustc`), from the fixture revision's directory: -- `cg_lib_rev2.llbc`, `cg_app_rev2.llbc`: the same for `rev2`, which deletes `triple` and - `area_dyn` from `cg_lib` and drops the `area_dyn` call from `cg_app` (the store tests). - -- `*.llbc_calls.txt`: the reference output, written by lance-graph - `crates/sag-ra-probe/tools/llbc_calls.py `, never by this crate. +```sh +cd cg_lib && charon cargo --no-dedup-serialized-ast --dest-file cg_lib.llbc +cd cg_app && charon cargo --no-dedup-serialized-ast --dest-file cg_app.llbc +``` diff --git a/crates/ruff_charon/tests/data/trprobe.llbc b/crates/ruff_charon/tests/data/trprobe.llbc new file mode 100644 index 0000000000000..683115e287abd --- /dev/null +++ b/crates/ruff_charon/tests/data/trprobe.llbc @@ -0,0 +1 @@ +{"charon_version":"0.1.297","translated":{"crate_name":"trprobe","options":{"ullbc":false,"no_code_duplication":false,"precise_drops":false,"mir":null,"rustc_args":[],"targets":[],"sysroot":null,"monomorphize":false,"monomorphize_mut":null,"start_from":[],"start_from_if_exists":[],"start_from_attribute":[],"start_from_pub":false,"include":[],"opaque":[],"exclude":[],"extract_opaque_bodies":false,"translate_all_methods":false,"eager_vtables":false,"duplicate_defaulted_methods":false,"lift_associated_types":[],"hide_marker_traits":false,"hide_allocator":false,"no_doc_comments":false,"remove_unused_clauses":false,"remove_unused_self_clauses":false,"remove_adt_clauses":false,"desugar_drops":false,"resugar_drops":false,"detect_drop_flags":false,"ops_to_function_calls":false,"index_to_function_calls":false,"treat_box_as_builtin":false,"no_gen_tuple_structs":false,"raw_consts":false,"inline_anon_consts":false,"consts":null,"unsized_strings":false,"reconstruct_fallible_operations":false,"reconstruct_panic_calls":false,"reconstruct_asserts":false,"reconstruct_matches":false,"deallocate_all_locals":false,"unbind_item_vars":false,"print_original_ullbc":false,"print_ullbc":false,"print_built_llbc":false,"print_llbc":false,"print_layouts":false,"print_safety":false,"dest_dir":null,"dest_file":"/tmp/claude-0/-home-user/d0a0bed8-379e-5aa8-9d05-0698680d647c/scratchpad/trprobe.llbc","no_dedup_serialized_ast":true,"format":null,"run_with_minirust":false,"no_serialize":false,"skip_borrowck":false,"erase_body_lifetimes":false,"no_typecheck":false,"no_normalize":false,"no_reorder_decls":false,"no_compute_layout_guarantees":false,"abort_on_error":false,"error_on_warnings":false,"preset":null},"target_information":[{"key":"x86_64-unknown-linux-gnu","value":{"arch":"X86_64","vendor":"unknown","os":"Linux","env":"Gnu","cfg_abi":"Unspecified","target_pointer_size":8,"is_little_endian":true,"c_enum_smallest_repr_ty":"I32","primitive_alignments":[{"key":"Bool","value":1},{"key":{"Integer":{"Signed":"I8"}},"value":1},{"key":{"Integer":{"Signed":"I16"}},"value":2},{"key":{"Integer":{"Signed":"I32"}},"value":4},{"key":{"Integer":{"Signed":"I64"}},"value":8},{"key":{"Integer":{"Signed":"I128"}},"value":16},{"key":{"Integer":{"Signed":"Isize"}},"value":8},{"key":{"Integer":{"Unsigned":"U8"}},"value":1},{"key":{"Integer":{"Unsigned":"U16"}},"value":2},{"key":{"Integer":{"Unsigned":"U32"}},"value":4},{"key":{"Integer":{"Unsigned":"U64"}},"value":8},{"key":{"Integer":{"Unsigned":"U128"}},"value":16},{"key":{"Integer":{"Unsigned":"Usize"}},"value":8},{"key":{"Float":"F16"},"value":2},{"key":{"Float":"F32"},"value":4},{"key":{"Float":"F64"},"value":8},{"key":{"Float":"F128"},"value":16},{"key":"Char","value":4}]}}],"runtime_checks":{"ub_checks":true,"overflow_checks":true,"contract_checks":false},"files":[{"id":0,"name":{"Local":"src/lib.rs"},"crate_name":"trprobe","contents":"pub trait Shape {\n fn area(&self) -> u32;\n fn twice(&self) -> u32 {\n self.area() * 2\n }\n}\npub struct Sq(pub u32);\nimpl Shape for Sq {\n fn area(&self) -> u32 {\n self.0\n }\n}\npub fn method_call() -> u32 {\n Sq(1).area()\n}\npub fn qualified_call() -> u32 {\n ::area(&Sq(2))\n}\npub fn default_method() -> u32 {\n Sq(3).twice()\n}\n"},{"id":1,"name":{"Local":"/rustc/library/core/src/lib.rs"},"crate_name":"core","contents":null},{"id":2,"name":{"Local":"/rustc/library/core/src/marker.rs"},"crate_name":"core","contents":null}],"item_names":[{"key":{"Type":0},"value":[{"Builtin":[{"Tuple":0},0]}]},{"key":{"TraitDecl":0},"value":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]}]},{"key":{"Type":1},"value":[{"Ident":["trprobe",0]},{"Ident":["Sq",0]}]},{"key":{"TraitImpl":0},"value":[{"Ident":["trprobe",0]},{"Impl":{"Trait":0}}]},{"key":{"Fun":0},"value":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]}]},{"key":{"Fun":1},"value":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]}]},{"key":{"Fun":2},"value":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]}]},{"key":{"TraitDecl":1},"value":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["MetaSized",0]}]},{"key":{"Type":2},"value":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]},{"Builtin":["VTable",0]}]},{"key":{"Fun":3},"value":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]},{"Ident":["twice",0]}]},{"key":{"Global":0},"value":[{"Ident":["trprobe",0]},{"Impl":{"Trait":0}},{"Builtin":["VTable",0]}]},{"key":{"Global":1},"value":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["MetaSized",0]},{"Builtin":["VTable",0]}]},{"key":{"Fun":4},"value":[{"Ident":["trprobe",0]},{"Impl":{"Trait":0}},{"Ident":["area",0]}]},{"key":{"Global":2},"value":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]},{"Builtin":["PromotedConst",0]}]},{"key":{"Global":3},"value":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]},{"Builtin":["PromotedConst",0]}]},{"key":{"Global":4},"value":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]},{"Builtin":["PromotedConst",0]}]},{"key":{"Type":3},"value":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["MetaSized",0]},{"Builtin":["VTable",0]}]},{"key":{"Type":4},"value":[{"Builtin":[{"Tuple":2},0]}]},{"key":{"TraitDecl":2},"value":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["Sized",0]}]},{"key":{"Fun":5},"value":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]},{"Builtin":["PromotedConst",0]}]},{"key":{"Fun":6},"value":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]},{"Builtin":["PromotedConst",0]}]},{"key":{"Fun":7},"value":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]},{"Builtin":["PromotedConst",0]}]}],"assoc_item_names":[{"types":[],"methods":["area","twice"],"consts":[]},{"types":[],"methods":[],"consts":[]},{"types":[],"methods":[],"consts":[]}],"short_names":[{"key":{"TraitImpl":0},"value":[{"Ident":["impl_Shape_for_Sq",0]}]},{"key":{"Global":0},"value":[{"Impl":{"Trait":0}},{"Builtin":["VTable",0]}]},{"key":{"Fun":4},"value":[{"Ident":["area",0]}]},{"key":{"Type":1},"value":[{"Ident":["Sq",0]}]},{"key":{"Fun":2},"value":[{"Ident":["default_method",0]}]},{"key":{"TraitDecl":1},"value":[{"Ident":["MetaSized",0]}]},{"key":{"Fun":0},"value":[{"Ident":["method_call",0]}]},{"key":{"Fun":1},"value":[{"Ident":["qualified_call",0]}]},{"key":{"TraitDecl":0},"value":[{"Ident":["Shape",0]}]},{"key":{"TraitDecl":2},"value":[{"Ident":["Sized",0]}]},{"key":{"Fun":3},"value":[{"Ident":["twice",0]}]}],"type_decls":[null,{"def_id":1,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["Sq",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":7,"col":0},"end":{"line":7,"col":23}},"generated_from_span":null}},"source_text":"pub struct Sq(pub u32);","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"src":"Normal","kind":{"Struct":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":7,"col":14},"end":{"line":7,"col":21}},"generated_from_span":null}},"attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"name":"_0","is_positional":true,"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}}]},"layout":[{"key":"x86_64-unknown-linux-gnu","value":{"size":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"Integer":{"Unsigned":["Usize","4"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":{"Untagged":{"AtLeast":{"Untagged":{"AlignTo":{"base":{"Untagged":{"Plus":[{"Untagged":{"Constant":{"Untagged":[{"OffsetOf":[{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null},null,0]},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}]}},"target_align":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}}}}}}},"align":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"Integer":{"Unsigned":["Usize","4"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":{"Untagged":{"AtLeast":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}}}},"discriminator":{"Known":0},"inhabited":{"Untagged":"True"},"variant_layouts":[{"field_offsets":[{"guarantee":{"GuaranteedAlignment":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}},"chosen":0}],"inhabited":{"Untagged":"True"},"tagger":[]}],"repr":{"repr_algo":"Rust","align_modif":null,"transparent":false,"explicit_discr_type":null}}}],"ptr_metadata":"None","marker_traits":{"is_sized":true,"is_send":true,"is_sync":true,"is_freeze":true,"is_unpin":true}},null,null,{"def_id":4,"item_meta":{"name":[{"Builtin":[{"Tuple":2},0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":1,"col":0}},"generated_from_span":null}},"source_text":null,"attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":false,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[{"index":0,"name":"A","variance":"Covariant"},{"index":1,"name":"B","variance":"Covariant"}],"const_generics":[],"trait_clauses":[{"clause_id":0,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":1,"col":0}},"generated_from_span":null}},"origin":"WhereClauseOnType","trait_":{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"src":{"Builtin":"Tuple"},"kind":{"Struct":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":1,"col":0}},"generated_from_span":null}},"attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"name":"_0","is_positional":true,"ty":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":1,"col":0}},"generated_from_span":null}},"attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"name":"_1","is_positional":true,"ty":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}}]},"layout":[{"key":"x86_64-unknown-linux-gnu","value":{"size":{"chosen":null,"guarantee":{"Untagged":{"AtLeast":{"Untagged":{"AlignTo":{"base":{"Untagged":{"Max":[{"Untagged":{"Plus":[{"Untagged":{"Constant":{"Untagged":[{"OffsetOf":[{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[0,0]}}},{"Untagged":{"TypeVar":{"Bound":[0,1]}}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"Clause":[{"Bound":[1,0]},{"regions":[]}]},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"},null,0]},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}]}},{"Untagged":{"Plus":[{"Untagged":{"Constant":{"Untagged":[{"OffsetOf":[{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[0,0]}}},{"Untagged":{"TypeVar":{"Bound":[0,1]}}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"Clause":[{"Bound":[1,0]},{"regions":[]}]},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"},null,1]},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}]}}]}},"target_align":{"Untagged":{"Max":[{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}]}}}}}}}},"align":{"chosen":null,"guarantee":{"Untagged":{"AtLeast":{"Untagged":{"Max":[{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}]}}}}},"discriminator":null,"inhabited":{"Untagged":{"And":[{"Untagged":{"GenericType":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}}},{"Untagged":{"GenericType":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}}}]}},"variant_layouts":[{"field_offsets":[{"guarantee":{"GuaranteedAlignment":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}},"chosen":null},{"guarantee":{"GuaranteedAlignment":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}}},"chosen":null}],"inhabited":{"Untagged":{"And":[{"Untagged":{"GenericType":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}}},{"Untagged":{"GenericType":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}}}]}},"tagger":[]}],"repr":{"repr_algo":"Rust","align_modif":null,"transparent":false,"explicit_discr_type":null}}}],"ptr_metadata":{"InheritFrom":{"Untagged":{"TypeVar":{"Bound":[0,1]}}}},"marker_traits":null}],"fun_decls":[{"def_id":0,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":13,"col":0},"end":{"line":15,"col":1}},"generated_from_span":null}},"source_text":"pub fn method_call() -> u32 {\n Sq(1).area()\n}","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"src":"Normal","body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":13,"col":0},"end":{"line":15,"col":1}},"generated_from_span":null}},"bound_body_regions":6,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":13,"col":24},"end":{"line":13,"col":27}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":2,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":15,"col":1}},"generated_from_span":null}},"id":3,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":0,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":1,"kind":{"StorageLive":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":2,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":3,"kind":{"Assign":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Use":[{"Copy":{"kind":{"Global":{"id":2,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"ty":{"Untagged":{"Ref":[{"Body":3},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}},"Yes"]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":4,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Projection":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":16}},"generated_from_span":null}},"id":6,"kind":{"Call":{"call":{"func":{"Regular":{"kind":{"Fun":4},"generics":{"regions":[{"Body":5}],"types":[],"const_generics":[],"trait_refs":[]}}},"args":[{"Move":{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}}],"dest":{"kind":{"Local":0},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"safety":"Inherit"},"on_unwind":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":13,"col":0},"end":{"line":15,"col":1}},"generated_from_span":null}},"id":0,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":13,"col":0},"end":{"line":15,"col":1}},"generated_from_span":null}},"id":5,"kind":"UnwindResume","comments_before":[]}]}}},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":15},"end":{"line":14,"col":16}},"generated_from_span":null}},"id":7,"kind":{"StorageDead":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":15,"col":1},"end":{"line":15,"col":1}},"generated_from_span":null}},"id":8,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":1,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":16,"col":0},"end":{"line":18,"col":1}},"generated_from_span":null}},"source_text":"pub fn qualified_call() -> u32 {\n ::area(&Sq(2))\n}","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"src":"Normal","body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":16,"col":0},"end":{"line":18,"col":1}},"generated_from_span":null}},"bound_body_regions":7,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":16,"col":27},"end":{"line":16,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":2,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":3,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":3},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":18,"col":1}},"generated_from_span":null}},"id":7,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":9,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":10,"kind":{"StorageLive":3},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":11,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":12,"kind":{"StorageLive":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":13,"kind":{"Assign":[{"kind":{"Local":3},"ty":{"Untagged":{"Ref":[{"Body":3},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Use":[{"Copy":{"kind":{"Global":{"id":3,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"ty":{"Untagged":{"Ref":[{"Body":4},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}},"Yes"]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":14,"kind":{"Assign":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Projection":[{"kind":{"Local":3},"ty":{"Untagged":{"Ref":[{"Body":3},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":15,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Projection":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":4},"end":{"line":17,"col":31}},"generated_from_span":null}},"id":17,"kind":{"Call":{"call":{"func":{"Regular":{"kind":{"Fun":4},"generics":{"regions":[{"Body":6}],"types":[],"const_generics":[],"trait_refs":[]}}},"args":[{"Move":{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}}],"dest":{"kind":{"Local":0},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"safety":"Inherit"},"on_unwind":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":16,"col":0},"end":{"line":18,"col":1}},"generated_from_span":null}},"id":4,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":16,"col":0},"end":{"line":18,"col":1}},"generated_from_span":null}},"id":16,"kind":"UnwindResume","comments_before":[]}]}}},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":30},"end":{"line":17,"col":31}},"generated_from_span":null}},"id":18,"kind":{"StorageDead":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":18,"col":0},"end":{"line":18,"col":1}},"generated_from_span":null}},"id":19,"kind":{"StorageDead":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":18,"col":1},"end":{"line":18,"col":1}},"generated_from_span":null}},"id":20,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":2,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":19,"col":0},"end":{"line":21,"col":1}},"generated_from_span":null}},"source_text":"pub fn default_method() -> u32 {\n Sq(3).twice()\n}","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"src":"Normal","body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":19,"col":0},"end":{"line":21,"col":1}},"generated_from_span":null}},"bound_body_regions":6,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":19,"col":27},"end":{"line":19,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":2,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":21,"col":1}},"generated_from_span":null}},"id":11,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":21,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":22,"kind":{"StorageLive":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":23,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":24,"kind":{"Assign":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Use":[{"Copy":{"kind":{"Global":{"id":4,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"ty":{"Untagged":{"Ref":[{"Body":3},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}},"Yes"]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":25,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Projection":[{"kind":{"Local":2},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":17}},"generated_from_span":null}},"id":27,"kind":{"Call":{"call":{"func":{"Regular":{"kind":{"Fun":3},"generics":{"regions":[{"Body":5}],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"TraitImpl":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"trait_decl_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}}}}}]}}},"args":[{"Move":{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}}}],"dest":{"kind":{"Local":0},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"safety":"Inherit"},"on_unwind":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":19,"col":0},"end":{"line":21,"col":1}},"generated_from_span":null}},"id":8,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":19,"col":0},"end":{"line":21,"col":1}},"generated_from_span":null}},"id":26,"kind":"UnwindResume","comments_before":[]}]}}},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":16},"end":{"line":20,"col":17}},"generated_from_span":null}},"id":28,"kind":{"StorageDead":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":21,"col":1},"end":{"line":21,"col":1}},"generated_from_span":null}},"id":29,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":3,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]},{"Ident":["twice",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"source_text":"fn twice(&self) -> u32 {\n self.area() * 2\n }","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[{"index":0,"name":"Self","variance":"Unknown"}],"const_generics":[],"trait_clauses":[{"clause_id":0,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":1,"col":0}},"generated_from_span":null}},"origin":"TraitSelf","trait_":{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}],"regions_outlive":[],"types_outlive":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}},{"Var":{"Bound":[1,0]}}]}],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[{"Untagged":{"Ref":[{"Var":{"Bound":[0,0]}},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}}],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"src":{"TraitDefault":{"trait_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[0,0]}}}],"const_generics":[],"trait_refs":[]}},"item_id":1}},"body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"bound_body_regions":4,"locals":{"arg_count":1,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":23},"end":{"line":3,"col":26}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":1,"name":"self","span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":13},"end":{"line":3,"col":18}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}},"drop_flag_for":null},{"index":2,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":19}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":3,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":12}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}},"drop_flag_for":null},{"index":4,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":23}},"generated_from_span":null}},"ty":{"Untagged":{"Adt":{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},{"Untagged":{"Scalar":"Bool"}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"Sized","parent_trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"MetaSized","parent_trait_refs":[],"types":[],"vtable":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}},"trait_decl_ref":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}],"types":[],"vtable":null}},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"}}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":18,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":19}},"generated_from_span":null}},"id":30,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":19}},"generated_from_span":null}},"id":31,"kind":{"StorageLive":4},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":19}},"generated_from_span":null}},"id":32,"kind":{"StorageLive":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":12}},"generated_from_span":null}},"id":33,"kind":{"StorageLive":3},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":12}},"generated_from_span":null}},"id":34,"kind":{"Assign":[{"kind":{"Local":3},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Projection":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}},"kind":"Shared","ptr_metadata":{"Copy":{"kind":{"Projection":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}}},"PtrMetadata"]},"ty":{"Untagged":{"PtrMetadata":{"Untagged":{"TypeVar":{"Bound":[0,0]}}}}}}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":19}},"generated_from_span":null}},"id":36,"kind":{"Call":{"call":{"func":{"Regular":{"kind":{"Trait":[{"Untagged":{"kind":{"Clause":[{"Bound":[0,0]},{"regions":[]}]},"trait_decl_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[0,0]}}}],"const_generics":[],"trait_refs":[]}}}},0]},"generics":{"regions":[{"Body":3}],"types":[],"const_generics":[],"trait_refs":[]}}},"args":[{"Move":{"kind":{"Local":3},"ty":{"Untagged":{"Ref":[{"Body":2},{"Untagged":{"TypeVar":{"Bound":[0,0]}}},"Shared"]}}}}],"dest":{"kind":{"Local":2},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"safety":"Inherit"},"on_unwind":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":12,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":35,"kind":"UnwindResume","comments_before":[]}]}}},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":18},"end":{"line":4,"col":19}},"generated_from_span":null}},"id":37,"kind":{"StorageDead":3},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":23}},"generated_from_span":null}},"id":38,"kind":{"Assign":[{"kind":{"Local":4},"ty":{"Untagged":{"Adt":{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},{"Untagged":{"Scalar":"Bool"}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"Sized","parent_trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"MetaSized","parent_trait_refs":[],"types":[],"vtable":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}},"trait_decl_ref":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}],"types":[],"vtable":null}},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"}}}},{"BinaryOp":["MulChecked",{"Copy":{"kind":{"Local":2},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}}},{"Const":{"Untagged":[{"Integer":{"Unsigned":["U32","2"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}]}}]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":23}},"generated_from_span":null}},"id":43,"kind":{"Assert":{"assert":{"cond":{"Move":{"kind":{"Projection":[{"kind":{"Local":4},"ty":{"Untagged":{"Adt":{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},{"Untagged":{"Scalar":"Bool"}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"Sized","parent_trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"MetaSized","parent_trait_refs":[],"types":[],"vtable":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}},"trait_decl_ref":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}],"types":[],"vtable":null}},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"}}}},{"Field":[null,1]}]},"ty":{"Untagged":{"Scalar":"Bool"}}}},"expected":false,"check_kind":{"Overflow":[{"Mul":"Wrap"},{"Move":{"kind":{"Local":2},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}}},{"Const":{"Untagged":[{"Integer":{"Unsigned":["U32","2"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}]}}]}},"on_failure":{"Panic":null},"on_unwind":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":13,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":39,"kind":"UnwindResume","comments_before":[]}]}}},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":8},"end":{"line":4,"col":23}},"generated_from_span":null}},"id":40,"kind":{"Assign":[{"kind":{"Local":0},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Use":[{"Move":{"kind":{"Projection":[{"kind":{"Local":4},"ty":{"Untagged":{"Adt":{"id":4,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},{"Untagged":{"Scalar":"Bool"}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"Sized","parent_trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"MetaSized","parent_trait_refs":[],"types":[],"vtable":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}},"trait_decl_ref":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}],"types":[],"vtable":null}},"trait_decl_ref":{"id":2,"generics":{"regions":[],"types":[{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}],"const_generics":[],"trait_refs":[]}}}}}]},"builtin":"Tuple"}}}},{"Field":[null,0]}]},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}}},"Yes"]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":4,"col":22},"end":{"line":4,"col":23}},"generated_from_span":null}},"id":41,"kind":{"StorageDead":2},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":5,"col":5},"end":{"line":5,"col":5}},"generated_from_span":null}},"id":42,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":4,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Impl":{"Trait":0}},{"Ident":["area",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":9,"col":4},"end":{"line":11,"col":5}},"generated_from_span":null}},"source_text":"fn area(&self) -> u32 {\n self.0\n }","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[{"Untagged":{"Ref":[{"Var":{"Bound":[0,0]}},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"src":{"TraitImpl":{"impl_ref":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}},"trait_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}},"item_id":0,"reuses_default":true}},"body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":9,"col":4},"end":{"line":11,"col":5}},"generated_from_span":null}},"bound_body_regions":2,"locals":{"arg_count":1,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":9,"col":22},"end":{"line":9,"col":25}},"generated_from_span":null}},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}},"drop_flag_for":null},{"index":1,"name":"self","span":{"Untagged":{"data":{"file_id":0,"beg":{"line":9,"col":12},"end":{"line":9,"col":17}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":10,"col":8},"end":{"line":11,"col":5}},"generated_from_span":null}},"id":20,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":10,"col":8},"end":{"line":10,"col":14}},"generated_from_span":null}},"id":44,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":10,"col":8},"end":{"line":10,"col":14}},"generated_from_span":null}},"id":45,"kind":{"Assign":[{"kind":{"Local":0},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},{"Use":[{"Copy":{"kind":{"Projection":[{"kind":{"Projection":[{"kind":{"Local":1},"ty":{"Untagged":{"Ref":[{"Body":1},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"Deref"]},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},{"Field":[null,0]}]},"ty":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}}},"Yes"]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":11,"col":5},"end":{"line":11,"col":5}},"generated_from_span":null}},"id":46,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":5,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"source_text":"Sq(1)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"src":{"GlobalInitializer":{"id":2,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"bound_body_regions":1,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":22,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":47,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":48,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":49,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},{"Aggregate":[{"Adt":[{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null},null,null]},[{"Const":{"Untagged":[{"Integer":{"Unsigned":["U32","1"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}]}}]]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":50,"kind":{"Assign":[{"kind":{"Local":0},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"id":51,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":6,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"source_text":"&Sq(2)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"src":{"GlobalInitializer":{"id":3,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"bound_body_regions":1,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":25},"end":{"line":17,"col":30}},"generated_from_span":null}},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":24,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":25},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":52,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":25},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":53,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":25},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":54,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},{"Aggregate":[{"Adt":[{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null},null,null]},[{"Const":{"Untagged":[{"Integer":{"Unsigned":["U32","2"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}]}}]]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":55,"kind":{"Assign":[{"kind":{"Local":0},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"id":56,"kind":"Return","comments_before":[]}]},"comments":[]}}},{"def_id":7,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"source_text":"Sq(3)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[],"output":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},"src":{"GlobalInitializer":{"id":4,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"body":{"Structured":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"bound_body_regions":1,"locals":{"arg_count":0,"locals":[{"index":0,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"drop_flag_for":null},{"index":1,"name":null,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"drop_flag_for":null}]},"body":{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":26,"statements":[{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":57,"kind":{"StorageLive":0},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":58,"kind":{"StorageLive":1},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":59,"kind":{"Assign":[{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},{"Aggregate":[{"Adt":[{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null},null,null]},[{"Const":{"Untagged":[{"Integer":{"Unsigned":["U32","3"]}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}]}}]]}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":60,"kind":{"Assign":[{"kind":{"Local":0},"ty":{"Untagged":{"Ref":[{"Body":0},{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Ref":{"place":{"kind":{"Local":1},"ty":{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}},"kind":"Shared","ptr_metadata":{"Const":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]}}}}]},"comments_before":[]},{"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"id":61,"kind":"Return","comments_before":[]}]},"comments":[]}}}],"global_decls":[null,null,{"def_id":2,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["method_call",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":14,"col":4},"end":{"line":14,"col":9}},"generated_from_span":null}},"source_text":"Sq(1)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"ty":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"size":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"align":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"ptr_metadata":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]},"src":"Normal","global_kind":"AnonConst","value":{"Untagged":[{"Call":[{"kind":{"Fun":5},"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}},[]]},{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}]}},{"def_id":3,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["qualified_call",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":17,"col":24},"end":{"line":17,"col":30}},"generated_from_span":null}},"source_text":"&Sq(2)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"ty":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"size":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"align":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"ptr_metadata":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]},"src":"Normal","global_kind":"AnonConst","value":{"Untagged":[{"Call":[{"kind":{"Fun":6},"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}},[]]},{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}]}},{"def_id":4,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["default_method",0]},{"Builtin":["PromotedConst",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":20,"col":4},"end":{"line":20,"col":9}},"generated_from_span":null}},"source_text":"Sq(3)","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"ty":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}},"size":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"SizeOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"align":{"chosen":{"Untagged":{"Constant":{"Untagged":[{"AlignOf":{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}},{"Untagged":{"Scalar":{"Integer":{"Unsigned":"Usize"}}}}]}}},"guarantee":null},"ptr_metadata":{"Untagged":[{"Adt":[null,[]]},{"Untagged":{"Adt":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":"Tuple"}}}]},"src":"Normal","global_kind":"AnonConst","value":{"Untagged":[{"Call":[{"kind":{"Fun":7},"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}},[]]},{"Untagged":{"Ref":["Erased",{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}},"Shared"]}}]}}],"trait_decls":[{"def_id":0,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":6,"col":1}},"generated_from_span":null}},"source_text":"pub trait Shape {\n fn area(&self) -> u32;\n fn twice(&self) -> u32 {\n self.area() * 2\n }\n}","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"src":"Normal","is_unsafe":false,"generics":{"regions":[],"types":[{"index":0,"name":"Self","variance":"Unknown"}],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"implied_clauses":[{"clause_id":0,"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":1,"col":0},"end":{"line":6,"col":1}},"generated_from_span":null}},"origin":"WhereClauseOnTrait","trait_":{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}],"consts":[],"types":[],"methods":[{"params":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"skip_binder":{"name":"area","item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]},{"Ident":["area",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":2,"col":4},"end":{"line":2,"col":26}},"generated_from_span":null}},"source_text":"fn area(&self) -> u32;","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[{"Untagged":{"Ref":[{"Var":{"Bound":[0,0]}},{"Untagged":{"TypeVar":{"Bound":[1,0]}}},"Shared"]}}],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"default":null},"kind":{"TraitMethod":[0,0]}},{"params":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"skip_binder":{"name":"twice","item_meta":{"name":[{"Ident":["trprobe",0]},{"Ident":["Shape",0]},{"Ident":["twice",0]}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":3,"col":4},"end":{"line":5,"col":5}},"generated_from_span":null}},"source_text":"fn twice(&self) -> u32 {\n self.area() * 2\n }","attr_info":{"attributes":[],"inline":null,"rename":null,"public":true},"is_local":true,"started_from":false,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"signature":{"is_unsafe":false,"abi":"Rust","is_variadic":false,"inputs":[{"Untagged":{"Ref":[{"Var":{"Bound":[0,0]}},{"Untagged":{"TypeVar":{"Bound":[1,0]}}},"Shared"]}}],"output":{"Untagged":{"Scalar":{"Integer":{"Unsigned":"U32"}}}}},"default":{"id":3,"generics":{"regions":[{"Var":{"Bound":[0,0]}}],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":"SelfId","trait_decl_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[2,0]}}}],"const_generics":[],"trait_refs":[]}}}}}]}}},"kind":{"TraitMethod":[0,1]}}],"vtable":{"id":2,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}},{"def_id":1,"item_meta":{"name":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["MetaSized",0]}],"span":{"Untagged":{"data":{"file_id":2,"beg":{"line":175,"col":0},"end":{"line":175,"col":33}},"generated_from_span":null}},"source_text":null,"attr_info":{"attributes":[{"DocComment":" Types with a size that can be determined from pointer metadata."},{"Builtin":"Fundamental"}],"inline":null,"rename":null,"public":true},"is_local":false,"started_from":false,"is_extern":false,"opacity":"Foreign","lang_item":"MetaSized","diagnostic_item":null,"has_errors":false},"src":"Normal","is_unsafe":false,"generics":{"regions":[],"types":[{"index":0,"name":"Self","variance":"Unknown"}],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"implied_clauses":[],"consts":[],"types":[],"methods":[],"vtable":{"id":3,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}},{"def_id":2,"item_meta":{"name":[{"Ident":["core",0]},{"Ident":["marker",0]},{"Ident":["Sized",0]}],"span":{"Untagged":{"data":{"file_id":2,"beg":{"line":158,"col":0},"end":{"line":158,"col":26}},"generated_from_span":null}},"source_text":null,"attr_info":{"attributes":[{"DocComment":" Types with a constant size known at compile time."},{"DocComment":""},{"DocComment":" All type parameters have an implicit bound of `Sized`. The special syntax"},{"DocComment":" `?Sized` can be used to remove this bound if it's not appropriate."},{"DocComment":""},{"DocComment":" ```"},{"DocComment":" # #![allow(dead_code)]"},{"DocComment":" struct Foo(T);"},{"DocComment":" struct Bar(T);"},{"DocComment":""},{"DocComment":" // struct FooUse(Foo<[i32]>); // error: Sized is not implemented for [i32]"},{"DocComment":" struct BarUse(Bar<[i32]>); // OK"},{"DocComment":" ```"},{"DocComment":""},{"DocComment":" The one exception is the implicit `Self` type of a trait. A trait does not"},{"DocComment":" have an implicit `Sized` bound as this is incompatible with [trait object]s"},{"DocComment":" where, by definition, the trait needs to work with all possible implementors,"},{"DocComment":" and thus could be any size."},{"DocComment":""},{"DocComment":" Although Rust will let you bind `Sized` to a trait, you won't"},{"DocComment":" be able to use it to form a trait object later:"},{"DocComment":""},{"DocComment":" ```"},{"DocComment":" # #![allow(unused_variables)]"},{"DocComment":" trait Foo { }"},{"DocComment":" trait Bar: Sized { }"},{"DocComment":""},{"DocComment":" struct Impl;"},{"DocComment":" impl Foo for Impl { }"},{"DocComment":" impl Bar for Impl { }"},{"DocComment":""},{"DocComment":" let x: &dyn Foo = &Impl; // OK"},{"DocComment":" // let y: &dyn Bar = &Impl; // error: the trait `Bar` cannot be made into an object"},{"DocComment":" ```"},{"DocComment":""},{"DocComment":" [trait object]: ../../book/ch17-02-trait-objects.html"},{"Builtin":"Fundamental"}],"inline":null,"rename":null,"public":true},"is_local":false,"started_from":false,"is_extern":false,"opacity":"Foreign","lang_item":"Sized","diagnostic_item":null,"has_errors":false},"src":"Normal","is_unsafe":false,"generics":{"regions":[],"types":[{"index":0,"name":"Self","variance":"Unknown"}],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"implied_clauses":[{"clause_id":0,"span":{"Untagged":{"data":{"file_id":2,"beg":{"line":158,"col":17},"end":{"line":158,"col":26}},"generated_from_span":null}},"origin":"WhereClauseOnTrait","trait_":{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"TypeVar":{"Bound":[1,0]}}}],"const_generics":[],"trait_refs":[]}}}}],"consts":[],"types":[],"methods":[],"vtable":null}],"trait_impls":[{"def_id":0,"item_meta":{"name":[{"Ident":["trprobe",0]},{"Impl":{"Trait":0}}],"span":{"Untagged":{"data":{"file_id":0,"beg":{"line":8,"col":0},"end":{"line":12,"col":1}},"generated_from_span":null}},"source_text":"impl Shape for Sq {\n fn area(&self) -> u32 {\n self.0\n }\n}","attr_info":{"attributes":[],"inline":null,"rename":null,"public":false},"is_local":true,"started_from":true,"is_extern":false,"opacity":"Transparent","lang_item":null,"diagnostic_item":null,"has_errors":false},"src":"Normal","impl_trait":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}},"is_negative":false,"is_unsafe":false,"generics":{"regions":[],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"implied_trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"BuiltinOrAuto":{"builtin_data":"MetaSized","parent_trait_refs":[],"types":[],"vtable":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}}}},"trait_decl_ref":{"id":1,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}}}}}],"consts":[],"types":[],"methods":[{"params":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"skip_binder":{"id":4,"generics":{"regions":[{"Var":{"Bound":[0,0]}}],"types":[],"const_generics":[],"trait_refs":[]}},"kind":{"TraitMethod":[0,0]}},{"params":{"regions":[{"index":0,"name":null,"variance":"Covariant","mutability":"Unknown","late_bound":true}],"types":[],"const_generics":[],"trait_clauses":[],"regions_outlive":[],"types_outlive":[],"trait_type_constraints":[]},"skip_binder":{"id":3,"generics":{"regions":[{"Var":{"Bound":[0,0]}}],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[{"regions":[],"regions_outlive":[],"types_outlive":[],"skip_binder":{"Untagged":{"kind":{"TraitImpl":{"id":0,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]}}},"trait_decl_ref":{"id":0,"generics":{"regions":[],"types":[{"Untagged":{"Adt":{"id":1,"generics":{"regions":[],"types":[],"const_generics":[],"trait_refs":[]},"builtin":null}}}],"const_generics":[],"trait_refs":[]}}}}}]}},"kind":{"TraitMethod":[0,1]}}],"vtable":"Lazy"}],"ordered_decls":[{"TraitDecl":{"NonRec":1}},{"TraitDecl":{"NonRec":2}},{"Type":{"NonRec":4}},{"TraitDecl":{"NonRec":0}},{"Fun":{"NonRec":3}},{"Type":{"NonRec":1}},{"Fun":{"NonRec":4}},{"TraitImpl":{"Rec":[0]}},{"Fun":{"NonRec":5}},{"Global":{"NonRec":2}},{"Fun":{"NonRec":0}},{"Fun":{"NonRec":6}},{"Global":{"NonRec":3}},{"Fun":{"NonRec":1}},{"Fun":{"NonRec":7}},{"Global":{"NonRec":4}},{"Fun":{"NonRec":2}}]},"has_errors":false} \ No newline at end of file diff --git a/crates/ruff_charon/tests/data/trprobe.rs b/crates/ruff_charon/tests/data/trprobe.rs new file mode 100644 index 0000000000000..99cfc01ec47c2 --- /dev/null +++ b/crates/ruff_charon/tests/data/trprobe.rs @@ -0,0 +1,21 @@ +pub trait Shape { + fn area(&self) -> u32; + fn twice(&self) -> u32 { + self.area() * 2 + } +} +pub struct Sq(pub u32); +impl Shape for Sq { + fn area(&self) -> u32 { + self.0 + } +} +pub fn method_call() -> u32 { + Sq(1).area() +} +pub fn qualified_call() -> u32 { + ::area(&Sq(2)) +} +pub fn default_method() -> u32 { + Sq(3).twice() +} diff --git a/crates/ruff_charon/tests/intake.rs b/crates/ruff_charon/tests/intake.rs index 072501a1eac49..e15697f60a02f 100644 --- a/crates/ruff_charon/tests/intake.rs +++ b/crates/ruff_charon/tests/intake.rs @@ -127,3 +127,228 @@ fn kythe_entries_carry_the_call_and_its_file() { && e.contains("\"path\":\"cg_lib/src/macro_use.rs\"")) ); } + +/// Rewrite every call in `fun` from `FnPtrKind::Fun(from)` into a call through +/// `TraitImpl(impl_id)` of trait `shape`, method `method`. Returns how many +/// calls were rewritten. +fn rewrite_to_trait_impl( + llbc: &mut ruff_charon::Llbc, + fun: &str, + from: charon_lib::ast::FunDeclId, + impl_id: charon_lib::ast::TraitImplId, + shape: charon_lib::ast::TraitDeclId, + method: charon_lib::ast::TraitMethodId, +) -> usize { + use charon_lib::ast::llbc_ast::{Statement, StatementKind}; + use charon_lib::ast::visitor::AstVisitable; + use charon_lib::ast::*; + let id = llbc + .krate + .fun_decls + .iter() + .find(|f| path_name(&f.item_meta.name) == fun) + .expect("fun") + .def_id; + let decl = llbc.krate.fun_decls.get_mut(id).expect("decl"); + let Body::Structured(body) = &mut decl.body else { + panic!("{fun} has no structured body") + }; + let mut n = 0; + body.body.dyn_visit_mut(|st: &mut Statement| { + if let StatementKind::Call { call, .. } = &mut st.kind + && let FnOperand::Regular(ptr) = &mut call.func + && matches!(ptr.kind.as_ref(), FnPtrKind::Fun(f) if *f == from) + { + let tr = TraitRef::new( + TraitRefKind::TraitImpl(TraitImplRef { + id: impl_id, + generics: Box::new(GenericArgs::empty()), + }), + TraitDeclRef { + id: shape, + generics: Box::new(GenericArgs::empty()), + }, + ); + *ptr.kind = FnPtrKind::Trait(tr, method); + n += 1; + } + }); + n +} + +/// A call through a known impl names the function it resolves to: the +/// impl's own method, or the trait's default when the impl lacks it. An impl +/// that is not in the LLBC is a residual, never a row pointing at the trait. +#[test] +fn a_call_through_a_known_impl_names_the_resolved_function() { + let mut llbc = load(&data("trprobe.llbc")).expect("llbc"); + let k = &llbc.krate; + let fun_id = |p: &str| { + k.fun_decls + .iter() + .find(|f| path_name(&f.item_meta.name) == p) + .unwrap_or_else(|| panic!("{p}")) + .def_id + }; + let (area_impl, twice) = ( + fun_id("trprobe::Impl::area"), + fun_id("trprobe::Shape::twice"), + ); + let shape = k + .trait_decls + .iter() + .find(|t| path_name(&t.item_meta.name) == "trprobe::Shape") + .expect("Shape") + .def_id; + let method = |name: &str| { + k.trait_decls + .get(shape) + .expect("decl") + .methods + .iter_indexed() + .find(|(_, m)| m.skip_binder.name.0.as_str() == name) + .expect("method") + .0 + }; + let (area, twice_m) = (method("area"), method("twice")); + let impl_id = k + .trait_impls + .iter() + .find(|i| i.impl_trait.id == shape) + .expect("impl") + .def_id; + let names = |llbc: &ruff_charon::Llbc| { + ( + qualified_name( + &llbc.krate, + &llbc + .krate + .fun_decls + .get(area_impl) + .expect("f") + .item_meta + .name, + ), + qualified_name( + &llbc.krate, + &llbc.krate.fun_decls.get(twice).expect("f").item_meta.name, + ), + ) + }; + let (area_name, twice_name) = names(&llbc); + assert_eq!( + rewrite_to_trait_impl( + &mut llbc, + "trprobe::method_call", + area_impl, + impl_id, + shape, + area + ), + 1 + ); + assert_eq!( + rewrite_to_trait_impl( + &mut llbc, + "trprobe::default_method", + twice, + impl_id, + shape, + twice_m + ), + 1 + ); + // An impl id the crate does not have. + let missing = charon_lib::ast::TraitImplId::new(10_000); + assert_eq!( + rewrite_to_trait_impl( + &mut llbc, + "trprobe::qualified_call", + area_impl, + missing, + shape, + area + ), + 1 + ); + let (rows, residual, receipt) = relations(&llbc.krate, "trprobe"); + let objects = |subject: &str| -> Vec { + find(&rows, "CALLS_RESOLVED", subject) + .iter() + .map(|r| r.object.clone()) + .collect() + }; + assert_eq!( + objects("trprobe::method_call"), + [area_name], + "the impl's own method" + ); + assert_eq!( + objects("trprobe::default_method"), + std::slice::from_ref(&twice_name), + "the trait's default method" + ); + assert!(objects("trprobe::qualified_call").is_empty()); + assert!( + rows.iter().all(|r| !r.object.contains(" via TraitImpl")), + "{rows:#?}" + ); + assert_eq!( + residual.iter().map(|r| r.reason).collect::>(), + ["TRAIT_IMPL_METHOD_NOT_FOUND"] + ); + assert!(receipt.conserved(), "{receipt:?}"); + + // Charon lists an inherited default method in the impl's own table, so + // the trait-default fallback is only reached when that entry is missing. + let table = &mut llbc + .krate + .trait_impls + .get_mut(impl_id) + .expect("impl") + .methods; + assert!( + table.remove(twice_m).is_some(), + "the impl lists the default method" + ); + let (rows, _, _) = relations(&llbc.krate, "trprobe"); + let objects: Vec<_> = find(&rows, "CALLS_RESOLVED", "trprobe::default_method") + .iter() + .map(|r| r.object.clone()) + .collect(); + assert_eq!( + objects, + std::slice::from_ref(&twice_name), + "falls back to the trait's default method" + ); +} + +/// A local function without a structured body is one definition (a DEFINES +/// row) plus one body nobody can read (a residual): the receipt still +/// conserves, and `rows` would not exit 3. +#[test] +fn an_opaque_body_keeps_the_receipt_conserved() { + let mut llbc = load(&data("cg_lib.llbc")).expect("llbc"); + let (_, _, before) = relations(&llbc.krate, "cg_lib"); + let id = llbc + .krate + .fun_decls + .iter() + .find(|f| path_name(&f.item_meta.name) == "cg_lib::util::unit") + .expect("unit") + .def_id; + llbc.krate.fun_decls.get_mut(id).expect("unit").body = charon_lib::ast::Body::Opaque; + let (rows, residual, receipt) = relations(&llbc.krate, "cg_lib"); + assert_eq!(residual.len(), 1); + assert_eq!(residual[0].reason, "BODY_NOT_STRUCTURED"); + assert!( + find(&rows, "DEFINES", &residual[0].subject).len() == 1, + "the definition stays represented" + ); + assert!(receipt.conserved(), "{receipt:?}"); + assert_eq!( + receipt.harvested, + before.harvested + 1, + "the body is harvested as its own item" + ); +} diff --git a/crates/ruff_charon/tests/store.rs b/crates/ruff_charon/tests/store.rs index e4485e990ed23..13f6f1b3372a0 100644 --- a/crates/ruff_charon/tests/store.rs +++ b/crates/ruff_charon/tests/store.rs @@ -210,3 +210,101 @@ fn readers_refuse_unknown_versions_and_missing_columns() { std::fs::write(&path, &text).expect("restore"); assert_eq!(store.rows("cg_lib").expect("rows"), rows); } + +/// A call resolved through a known trait impl names the trait, not a +/// function, so a consistent store must not report it as dangling, while a +/// call to a function nobody defines still is. +#[test] +fn trait_impl_calls_are_not_dangling() { + let dir = temp("traitimpl"); + let header = "#version 1\n#schema predicate\tsubject\tobject\tgrade\tfile\tstart\tend\n"; + std::fs::write( + dir.join("x.rows.tsv"), + format!( + "{header}DEFINES\tx::f\tx::f\tCOMPILER\t-\t-\t-\n\ + CALLS_RESOLVED\tx::f\tx::Shape via TraitImpl\tCOMPILER\t-\t-\t-\n" + ), + ) + .expect("rows"); + std::fs::write(dir.join("x.files.tsv"), "#version 1\n#schema path\tfnv64\n").expect("files"); + let store = Store::new(&dir); + assert!(store.dangling().expect("dangling").is_empty()); + // The check is still live for function targets. + std::fs::write( + dir.join("x.rows.tsv"), + format!( + "{header}DEFINES\tx::f\tx::f\tCOMPILER\t-\t-\t-\n\ + CALLS_RESOLVED\tx::f\tx::Shape via TraitImpl\tCOMPILER\t-\t-\t-\n\ + CALLS_RESOLVED\tx::f\tx::gone\tCOMPILER\t-\t-\t-\n" + ), + ) + .expect("rows"); + let objects: Vec<_> = store + .dangling() + .expect("dangling") + .into_iter() + .map(|r| r.object) + .collect(); + assert_eq!(objects, ["x::gone"]); +} + +/// Concurrent imports of one crate each write through their own temporary +/// file: all succeed, and the store ends with a whole, correct artifact. +#[test] +fn concurrent_imports_of_one_crate_do_not_collide() { + let dir = temp("concurrent"); + let lib = std::sync::Arc::new(llbc("cg_lib.llbc")); + let clean = store_of("concurrent_clean", &[("cg_lib.llbc", "cg_lib")]); + for _round in 0..10 { + let handles: Vec<_> = (0..8) + .map(|_| { + let (dir, lib) = (dir.clone(), lib.clone()); + std::thread::spawn(move || Store::new(dir).import(&lib, "cg_lib").map(|_| ())) + }) + .collect(); + for h in handles { + h.join().expect("thread").expect("import"); + } + } + assert_eq!( + Store::new(&dir).all_rows().expect("rows"), + clean.all_rows().expect("rows") + ); + let leftovers: Vec<_> = std::fs::read_dir(&dir) + .expect("dir") + .filter_map(Result::ok) + .filter(|e| e.file_name().to_string_lossy().ends_with(".tmp")) + .collect(); + assert!( + leftovers.is_empty(), + "temporary files left behind: {leftovers:?}" + ); +} + +/// Temporary files left by an interrupted import (same process id, counter +/// restarted at zero) do not block a later import. +#[test] +fn leftover_temporary_files_do_not_block_an_import() { + let dir = temp("leftover"); + let pid = std::process::id(); + // Every counter value this test binary can reach, for every artifact. + for artifact in ["rows.tsv", "residuals.tsv", "files.tsv"] { + for n in 0..4096 { + std::fs::write( + dir.join(format!(".cg_lib.{artifact}.{pid}.{n}.tmp")), + b"stale", + ) + .expect("plant"); + } + } + let store = Store::new(dir.clone()); + store + .import(&llbc("cg_lib.llbc"), "cg_lib") + .expect("import"); + assert_eq!( + store.rows("cg_lib").expect("rows"), + store_of("leftover_clean", &[("cg_lib.llbc", "cg_lib")]) + .rows("cg_lib") + .expect("rows") + ); +}