Skip to content

Rollup of 9 pull requests #136165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 87 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
4a7ec72
Make niches into nices
ThouCheese Jan 18, 2025
8b25ab0
Fix missing upmapping in trait impls completion
ChayimFriedman2 Jan 19, 2025
48d17b4
Move dual blanket impl logic from source analyzer to goto_def
Veykril Jan 20, 2025
4bc683d
Bring back goto def redirect for parse -> FromStr
Veykril Jan 20, 2025
ea3897b
Merge pull request #18984 from Veykril/push-nszlmxoxyxss
Veykril Jan 20, 2025
e9b410d
Goto `Display::fmt` when invoked on `to_string`
Veykril Jan 20, 2025
1d5af89
fix: Only refresh syntax tree view when the active document changes
Giga-Bowser Jan 20, 2025
f98e971
Fix another bug with completion of trait items inside macros
ChayimFriedman2 Jan 20, 2025
6291e1d
Merge pull request #18989 from Giga-Bowser/syntax-tree-refresh
Veykril Jan 21, 2025
0870bfb
Merge pull request #18977 from ChayimFriedman2/fix-upmapping
Veykril Jan 21, 2025
54d1d31
Cleanup `Name` string rendering
Veykril Jan 21, 2025
4b716bb
Merge pull request #18990 from Veykril/push-tqonnqxyrnsv
Veykril Jan 21, 2025
4308352
Merge pull request #18986 from Veykril/push-zlwvwlowpzqm
Veykril Jan 21, 2025
398cd2d
make large niche description more terse, switch to using u128::is_pow…
ThouCheese Jan 21, 2025
feb3fb5
Sort completion items that skip `await` and `iter()` behind those th…
ChayimFriedman2 Jan 20, 2025
a238ab8
Merge pull request #18988 from ChayimFriedman2/iter-relevance
ChayimFriedman2 Jan 21, 2025
f0f7204
Fix Param::as_local treating closures wrong
Veykril Jan 21, 2025
e08f6d4
switch from using leading zeros to trailing zeros
ThouCheese Jan 21, 2025
d8553c9
remove is_pwr2
ThouCheese Jan 21, 2025
284e0cd
Make `InlayHint::linked_location` computation lazy
Veykril Jan 21, 2025
802d9d5
Keep already computed inlay hint properties instead of late resolving…
Veykril Jan 21, 2025
5059c1a
Provide a config to control auto-insertion of `await` and `iter()`
ChayimFriedman2 Jan 21, 2025
c5ccf86
internal: Treat cfg fetching failures as a warning
Wilfred Jan 21, 2025
98582b2
manual: Document all rust-project.json fields
Wilfred Jan 8, 2025
fa272ed
Merge pull request #18878 from Wilfred/document_build_info
lnicola Jan 22, 2025
2eef052
increase `AUTODEREF_RECURSION_LIMIT` to 20
teoxoy Jan 22, 2025
3ca1066
Merge pull request #19004 from teoxoy/patch-1
ChayimFriedman2 Jan 22, 2025
a32f64d
Rephrase comment
lnicola Jan 23, 2025
7ba18da
Merge pull request #19009 from lnicola/dont-just-die
lnicola Jan 23, 2025
27084a2
Check cfg when collecting macro defs
darichey Jan 23, 2025
99b0ab5
Fix `ItemScope` not recording glob imports
Veykril Jan 24, 2025
a365f73
Merge pull request #19014 from darichey/fix-cfg-macro
Veykril Jan 24, 2025
dfd9490
fix: Fix flycheck panicking with "once" invocation strategy
Veykril Jan 24, 2025
2a9e6fb
Merge pull request #19016 from Veykril/push-moqnsytyrupu
Veykril Jan 24, 2025
5d9df43
Merge pull request #18994 from Wilfred/failed_rustc_cfg_as_warning
Veykril Jan 24, 2025
c3e88ae
Merge pull request #18993 from ChayimFriedman2/iter-config
Veykril Jan 24, 2025
b7997e0
Merge pull request #19017 from Veykril/push-uktrsknwmsvy
Veykril Jan 24, 2025
024da87
feat: Implement `arbitrary-self-types`
ShoyuVanilla Jan 23, 2025
3e6a933
Merge pull request #19012 from ShoyuVanilla/arbitrary-self
Veykril Jan 24, 2025
1dc34ee
Add a new failing test that overflows stack
ShoyuVanilla Jan 24, 2025
1e5f47b
Record the use tree index in glob imports
Veykril Jan 24, 2025
b44570f
Lazily compute location links in type hints again
Veykril Jan 24, 2025
51b323f
Merge pull request #18991 from Veykril/push-rmqmnrymwmoz
Veykril Jan 24, 2025
8063b1e
Merge pull request #19018 from Veykril/push-wxqqunxwrply
Veykril Jan 24, 2025
0a14e17
Explicitly add buildfiles when constructing ProjectFolders
darichey Jan 24, 2025
fff24d5
minor: Suggest better names when a type is a sequence
Wilfred Jan 24, 2025
165d78a
Merge pull request #19019 from darichey/add-buildfiles
Veykril Jan 25, 2025
7a7eb69
Merge pull request #19023 from Wilfred/sequence_type_names
Veykril Jan 25, 2025
37fc7ee
Merge pull request #18973 from ThouCheese/feat/nice-niches
Veykril Jan 25, 2025
592ecee
Only collect implicit visibile use symbols if they have renames
Veykril Jan 25, 2025
f45b8ad
Merge pull request #19026 from Veykril/push-wrxrutptywzx
Veykril Jan 25, 2025
0db8d05
Fix flyimport not filtering via stability of import path
Veykril Jan 25, 2025
58401ab
Merge pull request #19028 from Veykril/push-vuytpkvqzwzs
Veykril Jan 25, 2025
5d94c97
Skip redundant path search in `resolve_completion_edits`
Veykril Jan 25, 2025
a91b571
Merge pull request #19029 from Veykril/push-wklzwzqvkrou
Veykril Jan 25, 2025
105ea3b
Use `strict_provenance`
Veykril Jan 10, 2025
80615d9
Merge pull request #18909 from Veykril/push-rrpprwwzttkt
Veykril Jan 25, 2025
a5cd6c0
fix: Fix markdown horizontal ruler sometimes being treated as a heading
Veykril Jan 25, 2025
c1db5da
Merge pull request #19030 from Veykril/push-wuzvopyooznm
Veykril Jan 25, 2025
9691d22
fix: Prevent infinite recursion of bounds formatting
ShoyuVanilla Jan 24, 2025
2d94c69
Merge pull request #19020 from ShoyuVanilla/issues-19007
Veykril Jan 25, 2025
9ae0e7b
Don't complete doc(hidden) enum variants and use trees
ChayimFriedman2 Jan 25, 2025
3149e0f
Make proc_macro span's line & column 1-indexed, as documented
ChayimFriedman2 Jan 25, 2025
bbf9ff6
Merge pull request #19033 from ChayimFriedman2/span-1
ChayimFriedman2 Jan 26, 2025
176852b
Merge pull request #19034 from ChayimFriedman2/complete-hidden-variant
Veykril Jan 26, 2025
9ad5915
Update outdated permissions section in the README.md
Veykril Jan 26, 2025
a7cbe4b
Merge pull request #19035 from rust-lang/Veykril-patch-1
Veykril Jan 26, 2025
5297fc1
Document powf and powi calls that always return 1.0
hkBst Jan 26, 2025
d3cd832
Document purpose of closure in from_fn.rs more clearly
hkBst Jan 22, 2025
1ee7582
add NLL region graph to the polonius MIR dump
lqd Jan 26, 2025
052e9b4
add NLL SCCs to polonius MIR dump
lqd Jan 26, 2025
6bdc2dc
tidy up html structure
lqd Jan 26, 2025
581e0ac
Introduce a test for the `i128` calling convention on Windows
tgross35 Dec 14, 2024
a44a20e
Windows x86: Change `i128` to return via the vector ABI
tgross35 Dec 14, 2024
cedd3e2
Update books
rustbot Jan 27, 2025
5082fd8
Trim extra whitespace in fn ptr suggestion span
tyrone-wu Nov 17, 2024
fa4589b
Locate asan-odr-win with other sanitizer tests
tmiasko Jan 23, 2025
a721dd6
Remove -Zinline-in-all-cgus and clean up CGU partitioning tests
saethlin Dec 5, 2024
0697ee7
Rollup merge of #133151 - tyrone-wu:trim-fn-ptr-whitespace, r=compile…
Zalathar Jan 28, 2025
679e3af
Rollup merge of #133929 - saethlin:remove-inline-in-all-cgus, r=nneth…
Zalathar Jan 28, 2025
6d86809
Rollup merge of #134290 - tgross35:windows-i128-callconv, r=bjorn3,we…
Zalathar Jan 28, 2025
d960b9e
Rollup merge of #135886 - hkBst:patch-14, r=workingjubilee
Zalathar Jan 28, 2025
60ace31
Rollup merge of #136012 - hkBst:patch-22, r=workingjubilee
Zalathar Jan 28, 2025
b2df555
Rollup merge of #136104 - lqd:polonius-debugger-episode-2, r=matthewj…
Zalathar Jan 28, 2025
8f2b5bc
Rollup merge of #136117 - lnicola:sync-from-ra, r=lnicola
Zalathar Jan 28, 2025
9cdf13e
Rollup merge of #136143 - rustbot:docs-update, r=ehuss
Zalathar Jan 28, 2025
c12e2dd
Rollup merge of #136153 - tmiasko:mv-asan-test, r=lqd
Zalathar Jan 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 136 additions & 5 deletions compiler/rustc_borrowck/src/polonius/dump.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
use std::io;

use rustc_data_structures::fx::FxHashSet;
use rustc_index::IndexVec;
use rustc_middle::mir::pretty::{
PassWhere, PrettyPrintMirOptions, create_dump_file, dump_enabled, dump_mir_to_writer,
};
use rustc_middle::mir::{Body, ClosureRegionRequirements};
use rustc_middle::ty::TyCtxt;
use rustc_middle::ty::{RegionVid, TyCtxt};
use rustc_session::config::MirIncludeSpans;

use crate::borrow_set::BorrowSet;
use crate::constraints::OutlivesConstraint;
use crate::polonius::{LocalizedOutlivesConstraint, LocalizedOutlivesConstraintSet};
use crate::type_check::Locations;
use crate::{BorrowckInferCtxt, RegionInferenceContext};

/// `-Zdump-mir=polonius` dumps MIR annotated with NLL and polonius specific information.
Expand Down Expand Up @@ -50,6 +54,8 @@ pub(crate) fn dump_polonius_mir<'tcx>(
/// - the NLL MIR
/// - the list of polonius localized constraints
/// - a mermaid graph of the CFG
/// - a mermaid graph of the NLL regions and the constraints between them
/// - a mermaid graph of the NLL SCCs and the constraints between them
fn emit_polonius_dump<'tcx>(
tcx: TyCtxt<'tcx>,
body: &Body<'tcx>,
Expand All @@ -68,7 +74,7 @@ fn emit_polonius_dump<'tcx>(
// Section 1: the NLL + Polonius MIR.
writeln!(out, "<div>")?;
writeln!(out, "Raw MIR dump")?;
writeln!(out, "<code><pre>")?;
writeln!(out, "<pre><code>")?;
emit_html_mir(
tcx,
body,
Expand All @@ -78,15 +84,31 @@ fn emit_polonius_dump<'tcx>(
closure_region_requirements,
out,
)?;
writeln!(out, "</pre></code>")?;
writeln!(out, "</code></pre>")?;
writeln!(out, "</div>")?;

// Section 2: mermaid visualization of the CFG.
writeln!(out, "<div>")?;
writeln!(out, "Control-flow graph")?;
writeln!(out, "<code><pre class='mermaid'>")?;
writeln!(out, "<pre class='mermaid'>")?;
emit_mermaid_cfg(body, out)?;
writeln!(out, "</pre></code>")?;
writeln!(out, "</pre>")?;
writeln!(out, "</div>")?;

// Section 3: mermaid visualization of the NLL region graph.
writeln!(out, "<div>")?;
writeln!(out, "NLL regions")?;
writeln!(out, "<pre class='mermaid'>")?;
emit_mermaid_nll_regions(regioncx, out)?;
writeln!(out, "</pre>")?;
writeln!(out, "</div>")?;

// Section 4: mermaid visualization of the NLL SCC graph.
writeln!(out, "<div>")?;
writeln!(out, "NLL SCCs")?;
writeln!(out, "<pre class='mermaid'>")?;
emit_mermaid_nll_sccs(regioncx, out)?;
writeln!(out, "</pre>")?;
writeln!(out, "</div>")?;

// Finalize the dump with the HTML epilogue.
Expand Down Expand Up @@ -261,3 +283,112 @@ fn emit_mermaid_cfg(body: &Body<'_>, out: &mut dyn io::Write) -> io::Result<()>

Ok(())
}

/// Emits a region's label: index, universe, external name.
fn render_region(
region: RegionVid,
regioncx: &RegionInferenceContext<'_>,
out: &mut dyn io::Write,
) -> io::Result<()> {
let def = regioncx.region_definition(region);
let universe = def.universe;

write!(out, "'{}", region.as_usize())?;
if !universe.is_root() {
write!(out, "/{universe:?}")?;
}
if let Some(name) = def.external_name.and_then(|e| e.get_name()) {
write!(out, " ({name})")?;
}
Ok(())
}

/// Emits a mermaid flowchart of the NLL regions and the outlives constraints between them, similar
/// to the graphviz version.
fn emit_mermaid_nll_regions<'tcx>(
regioncx: &RegionInferenceContext<'tcx>,
out: &mut dyn io::Write,
) -> io::Result<()> {
// The mermaid chart type: a top-down flowchart.
writeln!(out, "flowchart TD")?;

// Emit the region nodes.
for region in regioncx.var_infos.indices() {
write!(out, "{}[\"", region.as_usize())?;
render_region(region, regioncx, out)?;
writeln!(out, "\"]")?;
}

// Get a set of edges to check for the reverse edge being present.
let edges: FxHashSet<_> = regioncx.outlives_constraints().map(|c| (c.sup, c.sub)).collect();

// Order (and deduplicate) edges for traversal, to display them in a generally increasing order.
let constraint_key = |c: &OutlivesConstraint<'_>| {
let min = c.sup.min(c.sub);
let max = c.sup.max(c.sub);
(min, max)
};
let mut ordered_edges: Vec<_> = regioncx.outlives_constraints().collect();
ordered_edges.sort_by_key(|c| constraint_key(c));
ordered_edges.dedup_by_key(|c| constraint_key(c));

for outlives in ordered_edges {
// Source node.
write!(out, "{} ", outlives.sup.as_usize())?;

// The kind of arrow: bidirectional if the opposite edge exists in the set.
if edges.contains(&(outlives.sub, outlives.sup)) {
write!(out, "&lt;")?;
}
write!(out, "-- ")?;

// Edge label from its `Locations`.
match outlives.locations {
Locations::All(_) => write!(out, "All")?,
Locations::Single(location) => write!(out, "{:?}", location)?,
}

// Target node.
writeln!(out, " --> {}", outlives.sub.as_usize())?;
}
Ok(())
}

/// Emits a mermaid flowchart of the NLL SCCs and the outlives constraints between them, similar
/// to the graphviz version.
fn emit_mermaid_nll_sccs<'tcx>(
regioncx: &RegionInferenceContext<'tcx>,
out: &mut dyn io::Write,
) -> io::Result<()> {
// The mermaid chart type: a top-down flowchart.
writeln!(out, "flowchart TD")?;

// Gather and emit the SCC nodes.
let mut nodes_per_scc: IndexVec<_, _> =
regioncx.constraint_sccs().all_sccs().map(|_| Vec::new()).collect();
for region in regioncx.var_infos.indices() {
let scc = regioncx.constraint_sccs().scc(region);
nodes_per_scc[scc].push(region);
}
for (scc, regions) in nodes_per_scc.iter_enumerated() {
// The node label: the regions contained in the SCC.
write!(out, "{scc}[\"SCC({scc}) = {{", scc = scc.as_usize())?;
for (idx, &region) in regions.iter().enumerate() {
render_region(region, regioncx, out)?;
if idx < regions.len() - 1 {
write!(out, ",")?;
}
}
writeln!(out, "}}\"]")?;
}

// Emit the edges between SCCs.
let edges = regioncx.constraint_sccs().all_sccs().flat_map(|source| {
regioncx.constraint_sccs().successors(source).iter().map(move |&target| (source, target))
});
for (source, target) in edges {
writeln!(out, "{} --> {}", source.as_usize(), target.as_usize())?;
}

Ok(())
}
22 changes: 13 additions & 9 deletions compiler/rustc_codegen_cranelift/src/abi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
&mut self,
name: &str,
params: Vec<AbiParam>,
returns: Vec<AbiParam>,
mut returns: Vec<AbiParam>,
args: &[Value],
) -> Cow<'_, [Value]> {
// Pass i128 arguments by-ref on Windows.
Expand All @@ -150,15 +150,19 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
(params, args.into())
};

// Return i128 using a return area pointer on Windows and s390x.
let adjust_ret_param =
if self.tcx.sess.target.is_like_windows || self.tcx.sess.target.arch == "s390x" {
returns.len() == 1 && returns[0].value_type == types::I128
} else {
false
};
let ret_single_i128 = returns.len() == 1 && returns[0].value_type == types::I128;
if ret_single_i128 && self.tcx.sess.target.is_like_windows {
// Return i128 using the vector ABI on Windows
returns[0].value_type = types::I64X2;

let ret = self.lib_call_unadjusted(name, params, returns, &args)[0];

if adjust_ret_param {
// FIXME(bytecodealliance/wasmtime#6104) use bitcast instead of store to get from i64x2 to i128
let ret_ptr = self.create_stack_slot(16, 16);
ret_ptr.store(self, ret, MemFlags::trusted());
Cow::Owned(vec![ret_ptr.load(self, types::I128, MemFlags::trusted())])
} else if ret_single_i128 && self.tcx.sess.target.arch == "s390x" {
// Return i128 using a return area pointer on s390x.
let mut params = params;
let mut args = args.to_vec();

Expand Down
22 changes: 3 additions & 19 deletions compiler/rustc_codegen_cranelift/src/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,25 +96,9 @@ pub(crate) fn clif_int_or_float_cast(
},
);

if fx.tcx.sess.target.is_like_windows {
let ret = fx.lib_call(
&name,
vec![AbiParam::new(from_ty)],
vec![AbiParam::new(types::I64X2)],
&[from],
)[0];
// FIXME(bytecodealliance/wasmtime#6104) use bitcast instead of store to get from i64x2 to i128
let ret_ptr = fx.create_stack_slot(16, 16);
ret_ptr.store(fx, ret, MemFlags::trusted());
ret_ptr.load(fx, types::I128, MemFlags::trusted())
} else {
fx.lib_call(
&name,
vec![AbiParam::new(from_ty)],
vec![AbiParam::new(types::I128)],
&[from],
)[0]
}
fx.lib_call(&name, vec![AbiParam::new(from_ty)], vec![AbiParam::new(types::I128)], &[
from,
])[0]
} else if to_ty == types::I8 || to_ty == types::I16 {
// FIXME implement fcvt_to_*int_sat.i8/i16
let val = if to_signed {
Expand Down
30 changes: 8 additions & 22 deletions compiler/rustc_codegen_cranelift/src/codegen_i128.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,28 +33,14 @@ pub(crate) fn maybe_codegen<'tcx>(
(BinOp::Rem, true) => "__modti3",
_ => unreachable!(),
};
if fx.tcx.sess.target.is_like_windows {
let args = [lhs.load_scalar(fx), rhs.load_scalar(fx)];
let ret = fx.lib_call(
name,
vec![AbiParam::new(types::I128), AbiParam::new(types::I128)],
vec![AbiParam::new(types::I64X2)],
&args,
)[0];
// FIXME(bytecodealliance/wasmtime#6104) use bitcast instead of store to get from i64x2 to i128
let ret_place = CPlace::new_stack_slot(fx, lhs.layout());
ret_place.to_ptr().store(fx, ret, MemFlags::trusted());
Some(ret_place.to_cvalue(fx))
} else {
let args = [lhs.load_scalar(fx), rhs.load_scalar(fx)];
let ret_val = fx.lib_call(
name,
vec![AbiParam::new(types::I128), AbiParam::new(types::I128)],
vec![AbiParam::new(types::I128)],
&args,
)[0];
Some(CValue::by_val(ret_val, lhs.layout()))
}
let args = [lhs.load_scalar(fx), rhs.load_scalar(fx)];
let ret_val = fx.lib_call(
name,
vec![AbiParam::new(types::I128), AbiParam::new(types::I128)],
vec![AbiParam::new(types::I128)],
&args,
)[0];
Some(CValue::by_val(ret_val, lhs.layout()))
}
BinOp::Lt | BinOp::Le | BinOp::Eq | BinOp::Ge | BinOp::Gt | BinOp::Ne | BinOp::Cmp => None,
BinOp::Shl | BinOp::ShlUnchecked | BinOp::Shr | BinOp::ShrUnchecked => None,
Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_interface/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,6 @@ fn test_unstable_options_tracking_hash() {
tracked!(function_sections, Some(false));
tracked!(human_readable_cgu_names, true);
tracked!(incremental_ignore_spans, true);
tracked!(inline_in_all_cgus, Some(true));
tracked!(inline_mir, Some(true));
tracked!(inline_mir_hint_threshold, Some(123));
tracked!(inline_mir_threshold, Some(123));
Expand Down
13 changes: 4 additions & 9 deletions compiler/rustc_middle/src/mir/mono.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,8 @@ impl<'tcx> MonoItem<'tcx> {
}

pub fn instantiation_mode(&self, tcx: TyCtxt<'tcx>) -> InstantiationMode {
let generate_cgu_internal_copies = tcx
.sess
.opts
.unstable_opts
.inline_in_all_cgus
.unwrap_or_else(|| tcx.sess.opts.optimize != OptLevel::No)
&& !tcx.sess.link_dead_code();
let generate_cgu_internal_copies =
(tcx.sess.opts.optimize != OptLevel::No) && !tcx.sess.link_dead_code();

match *self {
MonoItem::Fn(ref instance) => {
Expand All @@ -121,8 +116,8 @@ impl<'tcx> MonoItem<'tcx> {
}

// At this point we don't have explicit linkage and we're an
// inlined function. If we're inlining into all CGUs then we'll
// be creating a local copy per CGU.
// inlined function. If this crate's build settings permit,
// we'll be creating a local copy per CGU.
if generate_cgu_internal_copies {
return InstantiationMode::LocalCopy;
}
Expand Down
6 changes: 4 additions & 2 deletions compiler/rustc_parse/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2830,19 +2830,21 @@ pub(crate) struct DynAfterMut {
pub(crate) struct FnPointerCannotBeConst {
#[primary_span]
pub span: Span,
#[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
#[label]
pub qualifier: Span,
#[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
pub suggestion: Span,
}

#[derive(Diagnostic)]
#[diag(parse_fn_pointer_cannot_be_async)]
pub(crate) struct FnPointerCannotBeAsync {
#[primary_span]
pub span: Span,
#[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
#[label]
pub qualifier: Span,
#[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
pub suggestion: Span,
}

#[derive(Diagnostic)]
Expand Down
Loading
Loading