diff --git a/library/core/src/fmt/mod.rs b/library/core/src/fmt/mod.rs index 0c8e1495c62d4..ec7c1705fb860 100644 --- a/library/core/src/fmt/mod.rs +++ b/library/core/src/fmt/mod.rs @@ -3017,6 +3017,6 @@ impl Debug for SyncUnsafeCell { } } -// If you expected tests to be here, look instead at the core/tests/fmt.rs file, +// If you expected tests to be here, look instead at coretests/tests/fmt/; // it's a lot easier than creating all of the rt::Piece structures here. -// There are also tests in the alloc crate, for those that need allocations. +// There are also tests in alloctests/tests/fmt.rs, for those that need allocations. diff --git a/library/coretests/tests/str.rs b/library/coretests/tests/str.rs index f5066343af20a..5e23e910f0aeb 100644 --- a/library/coretests/tests/str.rs +++ b/library/coretests/tests/str.rs @@ -1 +1 @@ -// All `str` tests live in library/alloc/tests/str.rs +// All `str` tests live in library/alloctests/tests/str.rs diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 81f6b473c4593..8e42e845a8cb2 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -1624,9 +1624,6 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the builder.tool_exe(Tool::RunMakeSupport); } - // Also provide `rust_test_helpers` for the host. - builder.ensure(TestHelpers { target: compiler.host }); - // ensure that `libproc_macro` is available on the host. if suite == "mir-opt" { builder.ensure(compile::Std::new(compiler, compiler.host).is_for_mir_opt_tests(true)); @@ -1634,11 +1631,6 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the builder.ensure(compile::Std::new(compiler, compiler.host)); } - // As well as the target - if suite != "mir-opt" { - builder.ensure(TestHelpers { target }); - } - let mut cmd = builder.tool_cmd(Tool::Compiletest); if suite == "mir-opt" { @@ -1804,11 +1796,18 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the } let mut hostflags = flags.clone(); - hostflags.push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display())); hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No, compiler.stage)); let mut targetflags = flags; - targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display())); + + // Provide `rust_test_helpers` for both host and target. + if suite == "ui" || suite == "incremental" { + builder.ensure(TestHelpers { target: compiler.host }); + builder.ensure(TestHelpers { target }); + hostflags + .push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display())); + targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display())); + } for flag in hostflags { cmd.arg("--host-rustcflags").arg(flag); diff --git a/src/tools/tidy/src/unit_tests.rs b/src/tools/tidy/src/unit_tests.rs index 708e4ef808571..90ef36d5882da 100644 --- a/src/tools/tidy/src/unit_tests.rs +++ b/src/tools/tidy/src/unit_tests.rs @@ -1,11 +1,13 @@ -//! Tidy check to ensure `#[test]` and `#[bench]` are not used directly inside `core`. +//! Tidy check to ensure `#[test]` and `#[bench]` are not used directly inside +//! `core` or `alloc`. //! -//! `#![no_core]` libraries cannot be tested directly due to duplicating lang -//! items. All tests and benchmarks must be written externally in `core/{tests,benches}`. +//! `core` and `alloc` cannot be tested directly due to duplicating lang items. +//! All tests and benchmarks must be written externally in +//! `{coretests,alloctests}/{tests,benches}`. //! -//! Outside of core tests and benchmarks should be outlined into separate files -//! named `tests.rs` or `benches.rs`, or directories named `tests` or `benches` unconfigured -//! during normal build. +//! Outside of `core` and `alloc`, tests and benchmarks should be outlined into +//! separate files named `tests.rs` or `benches.rs`, or directories named +//! `tests` or `benches` unconfigured during normal build. use std::path::Path; @@ -14,40 +16,51 @@ use crate::walk::{filter_dirs, walk}; pub fn check(root_path: &Path, bad: &mut bool) { let core = root_path.join("core"); let core_copy = core.clone(); - let core_tests = core.join("tests"); - let core_benches = core.join("benches"); - let is_core = move |path: &Path| { - path.starts_with(&core) - && !(path.starts_with(&core_tests) || path.starts_with(&core_benches)) - }; + let is_core = move |path: &Path| path.starts_with(&core); + let alloc = root_path.join("alloc"); + let alloc_copy = alloc.clone(); + let is_alloc = move |path: &Path| path.starts_with(&alloc); let skip = move |path: &Path, is_dir| { let file_name = path.file_name().unwrap_or_default(); if is_dir { filter_dirs(path) || path.ends_with("src/doc") - || (file_name == "tests" || file_name == "benches") && !is_core(path) + || (file_name == "tests" || file_name == "benches") + && !is_core(path) + && !is_alloc(path) } else { let extension = path.extension().unwrap_or_default(); extension != "rs" - || (file_name == "tests.rs" || file_name == "benches.rs") && !is_core(path) - // UI tests with different names - || path.ends_with("src/thread/local/dynamic_tests.rs") - || path.ends_with("src/sync/mpsc/sync_tests.rs") + || (file_name == "tests.rs" || file_name == "benches.rs") + && !is_core(path) + && !is_alloc(path) + // Tests which use non-public internals and, as such, need to + // have the types in the same crate as the tests themselves. See + // the comment in alloctests/lib.rs. + || path.ends_with("library/alloc/src/collections/btree/borrow/tests.rs") + || path.ends_with("library/alloc/src/collections/btree/map/tests.rs") + || path.ends_with("library/alloc/src/collections/btree/node/tests.rs") + || path.ends_with("library/alloc/src/collections/btree/set/tests.rs") + || path.ends_with("library/alloc/src/collections/linked_list/tests.rs") + || path.ends_with("library/alloc/src/collections/vec_deque/tests.rs") + || path.ends_with("library/alloc/src/raw_vec/tests.rs") } }; walk(root_path, skip, &mut |entry, contents| { let path = entry.path(); let is_core = path.starts_with(&core_copy); + let is_alloc = path.starts_with(&alloc_copy); for (i, line) in contents.lines().enumerate() { let line = line.trim(); let is_test = || line.contains("#[test]") && !line.contains("`#[test]"); let is_bench = || line.contains("#[bench]") && !line.contains("`#[bench]"); if !line.starts_with("//") && (is_test() || is_bench()) { let explanation = if is_core { - "core unit tests and benchmarks must be placed into \ - `core/tests` or `core/benches`" + "`core` unit tests and benchmarks must be placed into `coretests`" + } else if is_alloc { + "`alloc` unit tests and benchmarks must be placed into `alloctests`" } else { "unit tests and benchmarks must be placed into \ separate files or directories named \ diff --git a/tests/codegen/issues/issue-122600-ptr-discriminant-update.rs b/tests/codegen/issues/issue-122600-ptr-discriminant-update.rs index 2414c54e4b79e..853a1ff36b109 100644 --- a/tests/codegen/issues/issue-122600-ptr-discriminant-update.rs +++ b/tests/codegen/issues/issue-122600-ptr-discriminant-update.rs @@ -36,6 +36,8 @@ pub unsafe fn update(s: *mut State) { // CHECK-NOT: store // CHECK-NOT: memcpy // CHECK-NOT: 75{{3|4}} + + // CHECK: ret let State::A(v) = s.read() else { std::hint::unreachable_unchecked() }; s.write(State::B(v)); }