Skip to content
New issue

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

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

Already on GitHub? # to your account

better support for running libcore tests with Miri #87255

Merged
merged 1 commit into from
Jul 23, 2021

Conversation

RalfJung
Copy link
Member

See rust-lang/miri-test-libstd#4 for a description of the problem that this fixes.
Thanks to @hyd-dev for suggesting this patch!

@rust-highfive
Copy link
Collaborator

r? @Mark-Simulacrum

(rust-highfive has picked a reviewer for you, use r? to override)

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jul 18, 2021
@ghost
Copy link

ghost commented Jul 18, 2021

liballoc also defines some lang and diagnostic items. It might need the same #![cfg] (plus test).

@RalfJung
Copy link
Member Author

liballoc doesn't have the #![cfg(not(test))] though, so maybe there's something that makes it less of an issue there?

@ghost
Copy link

ghost commented Jul 18, 2021

liballoc doesn't have the #![cfg(not(test))] though, so maybe there's something that makes it less of an issue there?

I found that many lang and diagnostic items in liballoc are #[cfg(not(test))] at module/item-level or in #[cfg_attr(not(test), ...)].

@RalfJung
Copy link
Member Author

I found that many lang and diagnostic items in liballoc are #[cfg(not(test))] at module/item-level or in #[cfg_attr(not(test), ...)].

Ah yes. The #! approach does not work there as that would disable unit tests (which liballoc has but libcore does not).

@ghost
Copy link

ghost commented Jul 18, 2021

I can indeed reproduce the issue in liballoc with this diff:

diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs
index e8bd4bcb..3634756a 100644
--- a/library/alloc/src/lib.rs
+++ b/library/alloc/src/lib.rs
@@ -55,6 +55,9 @@
 //! [`Cell`]: core::cell
 //! [`Rc`]: rc
 //! [`RefCell`]: core::cell
+//! ```
+//! match x {}
+//! ```
 
 #![allow(unused_attributes)]
 #![stable(feature = "alloc", since = "1.36.0")]
Output
failures:

---- ../liballoc/src/lib.rs - (line 58) stdout ----
error[E0425]: cannot find value `x` in this scope
 --> ../liballoc/src/lib.rs:59:7
  |
4 | match x {}
  |       ^ not found in this scope

error: duplicate lang item in crate `alloc_miri_test`: `str_alloc`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: duplicate lang item in crate `alloc_miri_test`: `slice_alloc`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: duplicate lang item in crate `alloc_miri_test`: `slice_u8_alloc`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: duplicate lang item in crate `alloc_miri_test`: `exchange_malloc`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: duplicate lang item in crate `alloc_miri_test`: `box_free`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: duplicate lang item in crate `alloc_miri_test`: `owned_box`.
  |
  = note: the lang item is first defined in crate `alloc` (which `std` depends on)
  = note: first definition in `alloc` loaded from /home/hyd-dev/.cache/miri/HOST/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd991b19f11a4e51.rmeta
  = note: second definition in `alloc_miri_test` loaded from /somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/liballoc_miri_test-b48d33359c7e89e2.rmeta

error: aborting due to 7 previous errors

For more information about this error, try `rustc --explain E0425`.
Couldn't compile the test.

failures:
    ../liballoc/src/lib.rs - (line 58)

test result: FAILED. 581 passed; 1 failed; 1 ignored; 0 measured; 0 filtered out; finished in 60.56s

error: test failed, to rerun pass '--doc'

@RalfJung
Copy link
Member Author

RalfJung commented Jul 18, 2021

Does adding

#![cfg(any(not(feature = "miri-test"), test, doctest))]

in liballoc help? (I think this needs the test, otherwise there'll be no unit tests.)

@ghost
Copy link

ghost commented Jul 18, 2021

Yes, that helps, and I confirmed that unit tests are still run.

Doctest output
failures:

---- ../liballoc/src/lib.rs - (line 58) stdout ----
error[E0425]: cannot find value `x` in this scope
 --> ../liballoc/src/lib.rs:59:7
  |
4 | match x {}
  |       ^ not found in this scope

error: aborting due to previous error

For more information about this error, try `rustc --explain E0425`.
Couldn't compile the test.

failures:
    ../liballoc/src/lib.rs - (line 58)

test result: FAILED. 581 passed; 1 failed; 1 ignored; 0 measured; 0 filtered out; finished in 70.29s

error: test failed, to rerun pass '--doc'
Partial unit test output
## Testing alloc (symbolic alignment)

0.172678   A libstd for Miri is now available in `/home/hyd-dev/.cache/miri/HOST`.
0.237599      Compiling libc v0.2.98
0.000211      Compiling getrandom v0.1.16
0.000120      Compiling cfg-if v1.0.0
0.000112      Compiling ppv-lite86 v0.2.10
0.090269      Compiling alloc_miri_test v0.0.0 (/somewhere/Code/rust-lang/miri-test-libstd/alloc_miri_test)
2.198054      Compiling rand_core v0.5.1
0.217777      Compiling rand_chacha v0.2.2
0.000221      Compiling rand_xorshift v0.2.0
0.213803      Compiling rand v0.7.3
1.308381       Finished test [unoptimized + debuginfo] target(s) in 4.20s
0.001043        Running unittests (/somewhere/miri-test-libstd/target/miri/x86_64-unknown-linux-gnu/debug/deps/alloc_miri_test-6eee054372adb77e)
11.202184   
0.000072   running 254 tests
0.945389   test alloc::tests::alloc_owned_small ... ignored
0.280983   test alloc::tests::allocate_zeroed ... ok
0.200594   test collections::btree::borrow::tests::test_borrow ... ok
1.001750   test collections::btree::map::tests::test_append_12 ... ok
0.928070   test collections::btree::map::tests::test_append_14 ... ok

@RalfJung RalfJung force-pushed the miri-test-libcore branch from 2259def to 6cba798 Compare July 18, 2021 17:12
@RalfJung
Copy link
Member Author

Great, thanks for checking! I updated the PR.

@Mark-Simulacrum
Copy link
Member

@bors r+

@bors
Copy link
Contributor

bors commented Jul 23, 2021

📌 Commit 6cba798 has been approved by Mark-Simulacrum

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 23, 2021
bors added a commit to rust-lang-ci/rust that referenced this pull request Jul 23, 2021
Rollup of 14 pull requests

Successful merges:

 - rust-lang#86410 (VecMap::get_value_matching should return just one element)
 - rust-lang#86790 (Document iteration order of `retain` functions)
 - rust-lang#87171 (Remove Option from BufWriter)
 - rust-lang#87175 (Stabilize `into_parts()` and `into_error()`)
 - rust-lang#87185 (Fix panics on Windows when the build was cancelled)
 - rust-lang#87191 (Package LLVM libs for the target rather than the build host)
 - rust-lang#87255 (better support for running libcore tests with Miri)
 - rust-lang#87266 (Add testcase for 87076)
 - rust-lang#87283 (Add `--codegen-backends=foo,bar` configure flag)
 - rust-lang#87322 (fix: clarify suggestion that `&T` must refer to `T: Sync` for `&T: Send`)
 - rust-lang#87358 (Fix `--dry-run` when download-ci-llvm is set)
 - rust-lang#87380 (Don't default to `submodules = true` unless the rust repo has a .git directory)
 - rust-lang#87398 (Add test for fonts used for module items)
 - rust-lang#87412 (Add missing article)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 1a2b90b into rust-lang:master Jul 23, 2021
@rustbot rustbot added this to the 1.55.0 milestone Jul 23, 2021
@RalfJung RalfJung deleted the miri-test-libcore branch July 24, 2021 10:28
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants