Tweak detection of multiple crate versions to be more encompassing Previously, we only emitted the additional context if the type was in the same crate as the trait that appeared multiple times in the dependency tree. Now, we look at all traits looking for two with the same name in different crates with the same crate number, and we are more flexible looking for the types involved. This will work even if the type that implements the wrong trait version is from a different crate entirely. ``` error[E0277]: the trait bound `CustomErrorHandler: ErrorHandler` is not satisfied because the trait comes from a different crate version --> src/main.rs:5:17 | 5 | cnb_runtime(CustomErrorHandler {}); | ^^^^^^^^^^^^^^^^^^^^^ the trait `ErrorHandler` is not implemented for `CustomErrorHandler` | note: there are multiple different versions of crate `c` in the dependency graph --> /home/gh-estebank/testcase-rustc-crate-version-mismatch/c-v0.2/src/lib.rs:1:1 | 1 | pub trait ErrorHandler {} | ^^^^^^^^^^^^^^^^^^^^^^ this is the required trait | ::: src/main.rs:1:5 | 1 | use b::CustomErrorHandler; | - one version of crate `c` is used here, as a dependency of crate `b` 2 | use c::cnb_runtime; | - one version of crate `c` is used here, as a direct dependency of the current crate | ::: /home/gh-estebank/testcase-rustc-crate-version-mismatch/b/src/lib.rs:1:1 | 1 | pub struct CustomErrorHandler {} | ----------------------------- this type doesn't implement the required trait | ::: /home/gh-estebank/testcase-rustc-crate-version-mismatch/c-v0.1/src/lib.rs:1:1 | 1 | pub trait ErrorHandler {} | ---------------------- this is the found trait = note: two types coming from two different versions of the same crate are different types even if they look the same = help: you can use `cargo tree` to explore your dependency tree ``` Fix #89143.
The run-make
test suite
The run-make
test suite contains tests which are the most flexible out of all
the rust-lang/rust test suites. run-make
tests can basically contain arbitrary code, and are supported by the
run_make_support
library.
Infrastructure
There are two kinds of run-make tests:
- The new
rmake.rs
version: this allows run-make tests to be written in Rust (withrmake.rs
as the main test file). - The legacy
Makefile
version: this is what run-make tests were written with before support forrmake.rs
was introduced.
The implementation for collecting and building the rmake.rs
recipes (or
Makefile
s) are in
src/tools/compiletest/src/runtest.rs
,
in run_rmake_v2_test
and run_rmake_legacy_test
.
Rust-based run-make
tests: rmake.rs
The setup for the rmake.rs
version is a 3-stage process:
-
First, we build the
run_make_support
library in bootstrap as a tool lib. -
Then, we compile the
rmake.rs
"recipe" linking the support library and its dependencies in, and provide a bunch of env vars. We setup a directory structure withinbuild/<target>/test/run-make/
<test-name>/ rmake.exe # recipe binary rmake_out/ # sources from test sources copied over
and copy non-
rmake.rs
input support files over tormake_out/
. The support library is made available as an extern prelude. -
Finally, we run the recipe binary and set
rmake_out/
as the working directory.
Formatting
Note that files under tests/
are not formatted by ./x fmt
,
use rustfmt tests/path/to/file.rs
to format a specific file if desired.