From 641927f748918be4679582acd72b69ae3fa53af2 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Thu, 11 May 2023 10:53:16 +0000 Subject: [PATCH 1/9] Add `./miri run-dep` for running a file with test dependencies available --- src/tools/miri/miri | 10 ++++++-- src/tools/miri/tests/compiletest.rs | 38 +++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/tools/miri/miri b/src/tools/miri/miri index 4be970b398d..9e33f525c8f 100755 --- a/src/tools/miri/miri +++ b/src/tools/miri/miri @@ -306,7 +306,7 @@ test|bless) # Only in root project as `cargo-miri` has no tests. $CARGO test $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml "$@" ;; -run) +run|run-dep) # Scan for "--target" to overwrite the "MIRI_TEST_TARGET" env var so # that we set the MIRI_SYSROOT up the right way. FOUND_TARGET_OPT=0 @@ -323,11 +323,17 @@ run) # Make sure Miri actually uses this target. MIRIFLAGS="$MIRIFLAGS --target $MIRI_TEST_TARGET" fi + # First build and get a sysroot. $CARGO build $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml find_sysroot # Then run the actual command. - exec $CARGO run $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@" + + if [ "$COMMAND" = "run-dep" ]; then + exec $CARGO test --test compiletest -- miri-run-dep-mode $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@" + else + exec $CARGO run $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@" + fi ;; fmt) find "$MIRIDIR" -not \( -name target -prune \) -name '*.rs' \ diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index e6388c56331..688b6519cbd 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -1,5 +1,6 @@ use colored::*; use regex::bytes::Regex; +use std::io::Write; use std::path::{Path, PathBuf}; use std::{env, process::Command}; use ui_test::status_emitter::StatusEmitter; @@ -45,7 +46,13 @@ fn build_so_for_c_ffi_tests() -> PathBuf { so_file_path } -fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { +fn run_test_config( + args: impl Iterator, + target: &str, + path: &str, + mode: Mode, + with_dependencies: bool, +) -> Config { // Miri is rustc-like, so we create a default builder for rustc and modify it let mut program = CommandBuilder::rustc(); program.program = miri_path(); @@ -105,7 +112,7 @@ fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> R // Handle command-line arguments. let mut after_dashdash = false; - config.path_filter.extend(std::env::args().skip(1).filter(|arg| { + config.path_filter.extend(args.filter(|arg| { if after_dashdash { // Just propagate everything. return true; @@ -140,6 +147,11 @@ fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> R "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. ]; } + config +} + +fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { + let config = run_test_config(std::env::args().skip(1), target, path, mode, with_dependencies); eprintln!(" Compiler: {}", config.program.display()); ui_test::run_tests_generic( @@ -226,8 +238,15 @@ fn get_target() -> String { fn main() -> Result<()> { ui_test::color_eyre::install()?; + let target = get_target(); + if let Some(first) = std::env::args().nth(1) { + if first == "miri-run-dep-mode" { + return run_dep_mode(target); + } + } + // Add a test env var to do environment communication tests. env::set_var("MIRI_ENV_VAR_TEST", "0"); // Let the tests know where to store temp files (they might run for a different target, which can make this hard to find). @@ -250,6 +269,21 @@ fn main() -> Result<()> { Ok(()) } +fn run_dep_mode(target: String) -> Result<()> { + let files = std::env::args().skip_while(|arg| arg != "--").skip(1); + for path in files { + let mut config = run_test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); + config.program.args.remove(0); // remove the `--error-format=json` argument + config.program.args.push("--color".into()); + config.program.args.push("always".into()); + let output = ui_test::run_file(config, Path::new(&path))?; + std::io::stderr().write_all(&output.stderr)?; + std::io::stdout().write_all(&output.stdout)?; + std::process::exit(output.status.code().unwrap()); + } + Ok(()) +} + /// This is a custom renderer for `ui_test` output that does not emit github actions /// `group`s, while still producing regular github actions messages on test failures. struct TextAndGha; From 49e4c8dc0de9bbe9815b0d255c11b0ad8a90392a Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Thu, 11 May 2023 16:40:42 +0000 Subject: [PATCH 2/9] Stop ignoring the `--manifest-path` --- src/tools/miri/miri | 2 +- src/tools/miri/tests/compiletest.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tools/miri/miri b/src/tools/miri/miri index 9e33f525c8f..48a46a76a12 100755 --- a/src/tools/miri/miri +++ b/src/tools/miri/miri @@ -330,7 +330,7 @@ run|run-dep) # Then run the actual command. if [ "$COMMAND" = "run-dep" ]; then - exec $CARGO test --test compiletest -- miri-run-dep-mode $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@" + exec $CARGO test --test compiletest $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- --miri-run-dep-mode $MIRIFLAGS "$@" else exec $CARGO run $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@" fi diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index 688b6519cbd..c027c7a7779 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -242,7 +242,7 @@ fn main() -> Result<()> { let target = get_target(); if let Some(first) = std::env::args().nth(1) { - if first == "miri-run-dep-mode" { + if first == "--miri-run-dep-mode" { return run_dep_mode(target); } } @@ -270,7 +270,7 @@ fn main() -> Result<()> { } fn run_dep_mode(target: String) -> Result<()> { - let files = std::env::args().skip_while(|arg| arg != "--").skip(1); + let files = std::env::args().skip(2); for path in files { let mut config = run_test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); config.program.args.remove(0); // remove the `--error-format=json` argument From 9642e40076b0bf9480d8a090de64ed8dd4e4a8b5 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Thu, 11 May 2023 16:41:46 +0000 Subject: [PATCH 3/9] Remove a misleading part of a function name --- src/tools/miri/tests/compiletest.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index c027c7a7779..d57d3d22d5e 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -46,7 +46,7 @@ fn build_so_for_c_ffi_tests() -> PathBuf { so_file_path } -fn run_test_config( +fn test_config( args: impl Iterator, target: &str, path: &str, @@ -151,7 +151,7 @@ fn run_test_config( } fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { - let config = run_test_config(std::env::args().skip(1), target, path, mode, with_dependencies); + let config = test_config(std::env::args().skip(1), target, path, mode, with_dependencies); eprintln!(" Compiler: {}", config.program.display()); ui_test::run_tests_generic( @@ -272,7 +272,7 @@ fn main() -> Result<()> { fn run_dep_mode(target: String) -> Result<()> { let files = std::env::args().skip(2); for path in files { - let mut config = run_test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); + let mut config = test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); config.program.args.remove(0); // remove the `--error-format=json` argument config.program.args.push("--color".into()); config.program.args.push("always".into()); From 756c243e50dafea95d78d11890a8e7d33e7ce06f Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Fri, 12 May 2023 10:04:55 +0000 Subject: [PATCH 4/9] Pass arguments to the interpreted program via `run-dep` --- src/tools/miri/Cargo.lock | 4 +- src/tools/miri/Cargo.toml | 2 +- src/tools/miri/tests/compiletest.rs | 83 ++++++++++++++--------------- 3 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/tools/miri/Cargo.lock b/src/tools/miri/Cargo.lock index e2a7d484c23..737423a2cd1 100644 --- a/src/tools/miri/Cargo.lock +++ b/src/tools/miri/Cargo.lock @@ -820,9 +820,9 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33" +checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2" dependencies = [ "bstr", "cargo-platform", diff --git a/src/tools/miri/Cargo.toml b/src/tools/miri/Cargo.toml index f6f81836804..5987b0df8d6 100644 --- a/src/tools/miri/Cargo.toml +++ b/src/tools/miri/Cargo.toml @@ -39,7 +39,7 @@ libloading = "0.7" [dev-dependencies] colored = "2" -ui_test = "0.9" +ui_test = "0.10" rustc_version = "0.4" # Features chosen to match those required by env_logger, to avoid rebuilds regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] } diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index d57d3d22d5e..435771c2f39 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -1,6 +1,6 @@ use colored::*; use regex::bytes::Regex; -use std::io::Write; +use std::ffi::OsString; use std::path::{Path, PathBuf}; use std::{env, process::Command}; use ui_test::status_emitter::StatusEmitter; @@ -46,13 +46,7 @@ fn build_so_for_c_ffi_tests() -> PathBuf { so_file_path } -fn test_config( - args: impl Iterator, - target: &str, - path: &str, - mode: Mode, - with_dependencies: bool, -) -> Config { +fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) -> Config { // Miri is rustc-like, so we create a default builder for rustc and modify it let mut program = CommandBuilder::rustc(); program.program = miri_path(); @@ -110,9 +104,29 @@ fn test_config( ..Config::default() }; + let use_std = env::var_os("MIRI_NO_STD").is_none(); + + if with_dependencies && use_std { + config.dependencies_crate_manifest_path = + Some(Path::new("test_dependencies").join("Cargo.toml")); + config.dependency_builder.args = vec![ + "run".into(), + "--manifest-path".into(), + "cargo-miri/Cargo.toml".into(), + "--".into(), + "miri".into(), + "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. + ]; + } + config +} + +fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { + let mut config = test_config(target, path, mode, with_dependencies); + // Handle command-line arguments. let mut after_dashdash = false; - config.path_filter.extend(args.filter(|arg| { + config.path_filter.extend(std::env::args().skip(1).filter(|arg| { if after_dashdash { // Just propagate everything. return true; @@ -133,26 +147,6 @@ fn test_config( } })); - let use_std = env::var_os("MIRI_NO_STD").is_none(); - - if with_dependencies && use_std { - config.dependencies_crate_manifest_path = - Some(Path::new("test_dependencies").join("Cargo.toml")); - config.dependency_builder.args = vec![ - "run".into(), - "--manifest-path".into(), - "cargo-miri/Cargo.toml".into(), - "--".into(), - "miri".into(), - "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. - ]; - } - config -} - -fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { - let config = test_config(std::env::args().skip(1), target, path, mode, with_dependencies); - eprintln!(" Compiler: {}", config.program.display()); ui_test::run_tests_generic( config, @@ -241,9 +235,12 @@ fn main() -> Result<()> { let target = get_target(); - if let Some(first) = std::env::args().nth(1) { + let mut args = std::env::args_os(); + + // Skip the program name and check whether this is a `./miri run-dep` invocation + if let Some(first) = args.nth(1) { if first == "--miri-run-dep-mode" { - return run_dep_mode(target); + return run_dep_mode(target, args); } } @@ -269,19 +266,17 @@ fn main() -> Result<()> { Ok(()) } -fn run_dep_mode(target: String) -> Result<()> { - let files = std::env::args().skip(2); - for path in files { - let mut config = test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); - config.program.args.remove(0); // remove the `--error-format=json` argument - config.program.args.push("--color".into()); - config.program.args.push("always".into()); - let output = ui_test::run_file(config, Path::new(&path))?; - std::io::stderr().write_all(&output.stderr)?; - std::io::stdout().write_all(&output.stdout)?; - std::process::exit(output.status.code().unwrap()); - } - Ok(()) +fn run_dep_mode(target: String, mut args: impl Iterator) -> Result<()> { + let path = args.next().expect("./miri run-dep must be followed by a file name"); + let mut config = test_config(&target, "", Mode::Yolo, true); + config.program.args.remove(0); // remove the `--error-format=json` argument + config.program.args.push("--color".into()); + config.program.args.push("always".into()); + let mut cmd = ui_test::test_command(config, Path::new(&path))?; + cmd.arg("--"); + cmd.args(args); + println!("{cmd:?}"); + if cmd.spawn()?.wait()?.success() { Ok(()) } else { std::process::exit(1) } } /// This is a custom renderer for `ui_test` output that does not emit github actions From 2f187343b9959f67fd058773fe18ede4e04d1383 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Fri, 12 May 2023 14:19:34 +0000 Subject: [PATCH 5/9] Document arguments and interesting flags --- src/tools/miri/tests/compiletest.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index 435771c2f39..fa06c4b6a12 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -268,11 +268,13 @@ fn main() -> Result<()> { fn run_dep_mode(target: String, mut args: impl Iterator) -> Result<()> { let path = args.next().expect("./miri run-dep must be followed by a file name"); - let mut config = test_config(&target, "", Mode::Yolo, true); + let mut config = test_config(&target, "", Mode::Yolo, /* with dependencies */ true); config.program.args.remove(0); // remove the `--error-format=json` argument config.program.args.push("--color".into()); config.program.args.push("always".into()); let mut cmd = ui_test::test_command(config, Path::new(&path))?; + // Separate the arguments to the `cargo miri` invocation from + // the arguments to the interpreted prog cmd.arg("--"); cmd.args(args); println!("{cmd:?}"); From b0a621e62c63e4e768b32f3668881ca9210183ec Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 13 May 2023 10:52:26 +0200 Subject: [PATCH 6/9] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index 42687826b02..b450f986149 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -0b795044c6f0854445f1f2bb6443e87848e150d1 +69fef92ab2f287f072b66fb7b4f62c8bb4acba43 From 74319707581d99ee6609622aa03f42136cf0c197 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 13 May 2023 10:55:42 +0200 Subject: [PATCH 7/9] fmt and fix lint --- src/tools/miri/src/borrow_tracker/stacked_borrows/stack.rs | 2 +- src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/tools/miri/src/borrow_tracker/stacked_borrows/stack.rs b/src/tools/miri/src/borrow_tracker/stacked_borrows/stack.rs index 064dbe025af..a1e949183ad 100644 --- a/src/tools/miri/src/borrow_tracker/stacked_borrows/stack.rs +++ b/src/tools/miri/src/borrow_tracker/stacked_borrows/stack.rs @@ -83,7 +83,7 @@ impl Stack { self.borrows.truncate(write_idx); #[cfg(not(feature = "stack-cache"))] - drop(first_removed); // This is only needed for the stack-cache + let _unused = first_removed; // This is only needed for the stack-cache #[cfg(feature = "stack-cache")] if let Some(first_removed) = first_removed { diff --git a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs b/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs index e4d9404c2ba..443f481c087 100644 --- a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs +++ b/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs @@ -1,7 +1,6 @@ //@error-in-other-file: memory is uninitialized at [0x4..0x8] //@normalize-stderr-test: "a[0-9]+" -> "ALLOC" #![feature(strict_provenance)] - #![allow(drop_copy)] // Test printing allocations that contain single-byte provenance. From 10540a2c798c2453835376809f35f4032269990f Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 13 May 2023 13:49:11 +0200 Subject: [PATCH 8/9] implement SIMD ptr casts --- src/tools/miri/src/shims/intrinsics/simd.rs | 26 +++++++++++++++---- .../miri/tests/pass/portable-simd-ptrs.rs | 12 +++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 src/tools/miri/tests/pass/portable-simd-ptrs.rs diff --git a/src/tools/miri/src/shims/intrinsics/simd.rs b/src/tools/miri/src/shims/intrinsics/simd.rs index d101f8d3111..114c66253f7 100644 --- a/src/tools/miri/src/shims/intrinsics/simd.rs +++ b/src/tools/miri/src/shims/intrinsics/simd.rs @@ -421,14 +421,18 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { } } #[rustfmt::skip] - "cast" | "as" => { + "cast" | "as" | "cast_ptr" | "expose_addr" | "from_exposed_addr" => { let [op] = check_arg_count(args)?; let (op, op_len) = this.operand_to_simd(op)?; let (dest, dest_len) = this.place_to_simd(dest)?; assert_eq!(dest_len, op_len); + let unsafe_cast = intrinsic_name == "cast"; let safe_cast = intrinsic_name == "as"; + let ptr_cast = intrinsic_name == "cast_ptr"; + let expose_cast = intrinsic_name == "expose_addr"; + let from_exposed_cast = intrinsic_name == "from_exposed_addr"; for i in 0..dest_len { let op = this.read_immediate(&this.mplace_index(&op, i)?.into())?; @@ -436,19 +440,31 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { let val = match (op.layout.ty.kind(), dest.layout.ty.kind()) { // Int-to-(int|float): always safe - (ty::Int(_) | ty::Uint(_), ty::Int(_) | ty::Uint(_) | ty::Float(_)) => + (ty::Int(_) | ty::Uint(_), ty::Int(_) | ty::Uint(_) | ty::Float(_)) if safe_cast || unsafe_cast => this.int_to_int_or_float(&op, dest.layout.ty)?, // Float-to-float: always safe - (ty::Float(_), ty::Float(_)) => + (ty::Float(_), ty::Float(_)) if safe_cast || unsafe_cast => this.float_to_float_or_int(&op, dest.layout.ty)?, // Float-to-int in safe mode (ty::Float(_), ty::Int(_) | ty::Uint(_)) if safe_cast => this.float_to_float_or_int(&op, dest.layout.ty)?, // Float-to-int in unchecked mode - (ty::Float(FloatTy::F32), ty::Int(_) | ty::Uint(_)) if !safe_cast => + (ty::Float(FloatTy::F32), ty::Int(_) | ty::Uint(_)) if unsafe_cast => this.float_to_int_unchecked(op.to_scalar().to_f32()?, dest.layout.ty)?.into(), - (ty::Float(FloatTy::F64), ty::Int(_) | ty::Uint(_)) if !safe_cast => + (ty::Float(FloatTy::F64), ty::Int(_) | ty::Uint(_)) if unsafe_cast => this.float_to_int_unchecked(op.to_scalar().to_f64()?, dest.layout.ty)?.into(), + // Ptr-to-ptr cast + (ty::RawPtr(..), ty::RawPtr(..)) if ptr_cast => { + this.ptr_to_ptr(&op, dest.layout.ty)? + } + // Ptr/Int casts + (ty::RawPtr(..), ty::Int(_) | ty::Uint(_)) if expose_cast => { + this.pointer_expose_address_cast(&op, dest.layout.ty)? + } + (ty::Int(_) | ty::Uint(_), ty::RawPtr(..)) if from_exposed_cast => { + this.pointer_from_exposed_address_cast(&op, dest.layout.ty)? + } + // Error otherwise _ => throw_unsup_format!( "Unsupported SIMD cast from element type {from_ty} to {to_ty}", diff --git a/src/tools/miri/tests/pass/portable-simd-ptrs.rs b/src/tools/miri/tests/pass/portable-simd-ptrs.rs new file mode 100644 index 00000000000..303c99834f5 --- /dev/null +++ b/src/tools/miri/tests/pass/portable-simd-ptrs.rs @@ -0,0 +1,12 @@ +// Separate test without strict provenance +//@compile-flags: -Zmiri-permissive-provenance +#![feature(portable_simd, platform_intrinsics)] +use std::ptr; +use std::simd::*; + +fn main() { + // Pointer casts + let _val: Simd<*const u8, 4> = Simd::<*const i32, 4>::splat(ptr::null()).cast_ptr(); + let addrs = Simd::<*const i32, 4>::splat(ptr::null()).expose_addr(); + let _ptrs = Simd::<*const i32, 4>::from_exposed_addr(addrs); +} From d8815efdae5d9cf20c75f454f0b44673437ef695 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 13 May 2023 15:45:54 +0200 Subject: [PATCH 9/9] update lockfile --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb37fee98e4..7bb33c4e39c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5122,9 +5122,9 @@ checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "ui_test" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33" +checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2" dependencies = [ "bstr 1.3.0", "cargo-platform",