diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b45246eb4ea..a917d9a7d55 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: pr: permissions: actions: write - name: PR + name: "PR - ${{ matrix.name }}" env: CI_JOB_NAME: "${{ matrix.name }}" CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse @@ -159,7 +159,7 @@ jobs: auto: permissions: actions: write - name: auto + name: "auto - ${{ matrix.name }}" env: CI_JOB_NAME: "${{ matrix.name }}" CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse @@ -578,7 +578,7 @@ jobs: try: permissions: actions: write - name: try + name: "try - ${{ matrix.name }}" env: CI_JOB_NAME: "${{ matrix.name }}" CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse diff --git a/compiler/rustc_middle/messages.ftl b/compiler/rustc_middle/messages.ftl index 4f4e5c6a2c9..bd9d89deee1 100644 --- a/compiler/rustc_middle/messages.ftl +++ b/compiler/rustc_middle/messages.ftl @@ -16,6 +16,10 @@ middle_limit_invalid = `limit` must be a non-negative integer .label = {$error_str} +middle_recursion_limit_reached = + reached the recursion limit finding the struct tail for `{$ty}` + .help = consider increasing the recursion limit by adding a `#![recursion_limit = "{$suggested_limit}"]` + middle_const_eval_non_int = constant evaluation of enum discriminant resulted in non-integer diff --git a/compiler/rustc_middle/src/error.rs b/compiler/rustc_middle/src/error.rs index 5e94da8cb4d..dc4aa18640f 100644 --- a/compiler/rustc_middle/src/error.rs +++ b/compiler/rustc_middle/src/error.rs @@ -49,6 +49,14 @@ pub struct LimitInvalid<'a> { pub error_str: &'a str, } +#[derive(Diagnostic)] +#[diag(middle_recursion_limit_reached)] +#[help] +pub struct RecursionLimitReached<'tcx> { + pub ty: Ty<'tcx>, + pub suggested_limit: rustc_session::Limit, +} + #[derive(Diagnostic)] #[diag(middle_const_eval_non_int)] pub struct ConstEvalNonIntError { diff --git a/compiler/rustc_middle/src/ty/util.rs b/compiler/rustc_middle/src/ty/util.rs index d3565b28ae5..4411bcd927d 100644 --- a/compiler/rustc_middle/src/ty/util.rs +++ b/compiler/rustc_middle/src/ty/util.rs @@ -19,7 +19,8 @@ use rustc_index::bit_set::GrowableBitSet; use rustc_index::vec::{Idx, IndexVec}; use rustc_macros::HashStable; -use rustc_span::{sym, DUMMY_SP}; +use rustc_session::Limit; +use rustc_span::sym; use rustc_target::abi::{Integer, IntegerType, Size, TargetDataLayout}; use rustc_target::spec::abi::Abi; use smallvec::SmallVec; @@ -225,10 +226,13 @@ pub fn struct_tail_with_normalize( let recursion_limit = self.recursion_limit(); for iteration in 0.. { if !recursion_limit.value_within_limit(iteration) { - return self.ty_error_with_message( - DUMMY_SP, - &format!("reached the recursion limit finding the struct tail for {}", ty), - ); + let suggested_limit = match recursion_limit { + Limit(0) => Limit(2), + limit => limit * 2, + }; + let reported = + self.sess.emit_err(crate::error::RecursionLimitReached { ty, suggested_limit }); + return self.ty_error(reported); } match *ty.kind() { ty::Adt(def, substs) => { diff --git a/library/std/src/sys/hermit/net.rs b/library/std/src/sys/hermit/net.rs index 5fb6281aa1e..d6f64a29719 100644 --- a/library/std/src/sys/hermit/net.rs +++ b/library/std/src/sys/hermit/net.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] use crate::cmp; -use crate::io::{self, IoSlice, IoSliceMut}; +use crate::io::{self, BorrowedBuf, BorrowedCursor, IoSlice, IoSliceMut}; use crate::mem; use crate::net::{Shutdown, SocketAddr}; use crate::os::hermit::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, RawFd}; @@ -146,18 +146,35 @@ pub fn duplicate(&self) -> io::Result { Ok(Socket(unsafe { FileDesc::from_raw_fd(fd) })) } - fn recv_with_flags(&self, buf: &mut [u8], flags: i32) -> io::Result { - let ret = - cvt(unsafe { netc::recv(self.0.as_raw_fd(), buf.as_mut_ptr(), buf.len(), flags) })?; - Ok(ret as usize) + fn recv_with_flags(&self, mut buf: BorrowedCursor<'_>, flags: i32) -> io::Result<()> { + let ret = cvt(unsafe { + netc::recv( + self.0.as_raw_fd(), + buf.as_mut().as_mut_ptr() as *mut u8, + buf.capacity(), + flags, + ) + })?; + unsafe { + buf.advance(ret as usize); + } + Ok(()) } pub fn read(&self, buf: &mut [u8]) -> io::Result { - self.recv_with_flags(buf, 0) + let mut buf = BorrowedBuf::from(buf); + self.recv_with_flags(buf.unfilled(), 0)?; + Ok(buf.len()) } pub fn peek(&self, buf: &mut [u8]) -> io::Result { - self.recv_with_flags(buf, netc::MSG_PEEK) + let mut buf = BorrowedBuf::from(buf); + self.recv_with_flags(buf.unfilled(), netc::MSG_PEEK)?; + Ok(buf.len()) + } + + pub fn read_buf(&self, buf: BorrowedCursor<'_>) -> io::Result<()> { + self.recv_with_flags(buf, 0) } pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result { diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 013d1ab525b..d12781cc33a 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -741,6 +741,9 @@ class RustBuild(object): env["LIBRARY_PATH"] = os.path.join(self.bin_root(), "lib") + \ (os.pathsep + env["LIBRARY_PATH"]) \ if "LIBRARY_PATH" in env else "" + env["LIBPATH"] = os.path.join(self.bin_root(), "lib") + \ + (os.pathsep + env["LIBPATH"]) \ + if "LIBPATH" in env else "" # Export Stage0 snapshot compiler related env variables build_section = "target.{}".format(self.build) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 15708bb183e..e3581943f2c 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -20,7 +20,7 @@ use crate::builder::crate_description; use crate::builder::Cargo; -use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; +use crate::builder::{Builder, Kind, PathSet, RunConfig, ShouldRun, Step, TaskPath}; use crate::cache::{Interned, INTERNER}; use crate::config::{LlvmLibunwind, RustcLto, TargetSelection}; use crate::dist; @@ -995,6 +995,44 @@ pub struct CodegenBackend { pub backend: Interned, } +fn needs_codegen_config(run: &RunConfig<'_>) -> bool { + let mut needs_codegen_cfg = false; + for path_set in &run.paths { + needs_codegen_cfg = match path_set { + PathSet::Set(set) => set.iter().any(|p| is_codegen_cfg_needed(p, run)), + PathSet::Suite(suite) => is_codegen_cfg_needed(&suite, run), + } + } + needs_codegen_cfg +} + +const CODEGEN_BACKEND_PREFIX: &str = "rustc_codegen_"; + +fn is_codegen_cfg_needed(path: &TaskPath, run: &RunConfig<'_>) -> bool { + if path.path.to_str().unwrap().contains(&CODEGEN_BACKEND_PREFIX) { + let mut needs_codegen_backend_config = true; + for &backend in &run.builder.config.rust_codegen_backends { + if path + .path + .to_str() + .unwrap() + .ends_with(&(CODEGEN_BACKEND_PREFIX.to_owned() + &backend)) + { + needs_codegen_backend_config = false; + } + } + if needs_codegen_backend_config { + run.builder.info( + "Warning: no codegen-backends config matched the requested path to build a codegen backend. \ + Help: add backend to codegen-backends in config.toml.", + ); + return true; + } + } + + return false; +} + impl Step for CodegenBackend { type Output = (); const ONLY_HOSTS: bool = true; @@ -1006,6 +1044,10 @@ fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { } fn make_run(run: RunConfig<'_>) { + if needs_codegen_config(&run) { + return; + } + for &backend in &run.builder.config.rust_codegen_backends { if backend == "llvm" { continue; // Already built as part of rustc diff --git a/src/bootstrap/dylib_util.rs b/src/bootstrap/dylib_util.rs index 6d75272c501..b14c0bed66c 100644 --- a/src/bootstrap/dylib_util.rs +++ b/src/bootstrap/dylib_util.rs @@ -12,6 +12,8 @@ pub fn dylib_path_var() -> &'static str { "DYLD_LIBRARY_PATH" } else if cfg!(target_os = "haiku") { "LIBRARY_PATH" + } else if cfg!(target_os = "aix") { + "LIBPATH" } else { "LD_LIBRARY_PATH" } diff --git a/src/bootstrap/metrics.rs b/src/bootstrap/metrics.rs index 5f254761aa1..82b123ec8a5 100644 --- a/src/bootstrap/metrics.rs +++ b/src/bootstrap/metrics.rs @@ -11,7 +11,7 @@ use std::cell::RefCell; use std::fs::File; use std::io::BufWriter; -use std::time::{Duration, Instant}; +use std::time::{Duration, Instant, SystemTime}; use sysinfo::{CpuExt, System, SystemExt}; pub(crate) struct BuildMetrics { @@ -27,6 +27,7 @@ pub(crate) fn init() -> Self { system_info: System::new(), timer_start: None, invocation_timer_start: Instant::now(), + invocation_start: SystemTime::now(), }); BuildMetrics { state } @@ -124,6 +125,11 @@ pub(crate) fn persist(&self, build: &Build) { } }; invocations.push(JsonInvocation { + start_time: state + .invocation_start + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), duration_including_children_sec: state.invocation_timer_start.elapsed().as_secs_f64(), children: steps.into_iter().map(|step| self.prepare_json_step(step)).collect(), }); @@ -166,6 +172,7 @@ struct MetricsState { system_info: System, timer_start: Option, invocation_timer_start: Instant, + invocation_start: SystemTime, } struct StepMetrics { @@ -194,6 +201,10 @@ struct JsonRoot { #[derive(Serialize, Deserialize)] #[serde(rename_all = "snake_case")] struct JsonInvocation { + // Unix timestamp in seconds + // + // This is necessary to easily correlate this invocation with logs or other data. + start_time: u64, duration_including_children_sec: f64, children: Vec, } diff --git a/src/ci/github-actions/ci.yml b/src/ci/github-actions/ci.yml index c594288dcf8..403953b5047 100644 --- a/src/ci/github-actions/ci.yml +++ b/src/ci/github-actions/ci.yml @@ -284,7 +284,7 @@ jobs: permissions: actions: write # for rust-lang/simpleinfra/github-actions/cancel-outdated-builds <<: *base-ci-job - name: PR + name: PR - ${{ matrix.name }} env: <<: [*shared-ci-variables, *public-variables] if: github.event_name == 'pull_request' @@ -312,7 +312,7 @@ jobs: permissions: actions: write # for rust-lang/simpleinfra/github-actions/cancel-outdated-builds <<: *base-ci-job - name: auto + name: auto - ${{ matrix.name }} env: <<: [*shared-ci-variables, *prod-variables] if: github.event_name == 'push' && github.ref == 'refs/heads/auto' && github.repository == 'rust-lang-ci/rust' @@ -741,7 +741,7 @@ jobs: permissions: actions: write # for rust-lang/simpleinfra/github-actions/cancel-outdated-builds <<: *base-ci-job - name: try + name: try - ${{ matrix.name }} env: <<: [*shared-ci-variables, *prod-variables] if: github.event_name == 'push' && (github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.repository == 'rust-lang-ci/rust' diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs index 5f6a27e5366..748240cc94b 100644 --- a/src/tools/compiletest/src/util.rs +++ b/src/tools/compiletest/src/util.rs @@ -156,6 +156,8 @@ pub fn dylib_env_var() -> &'static str { "DYLD_LIBRARY_PATH" } else if cfg!(target_os = "haiku") { "LIBRARY_PATH" + } else if cfg!(target_os = "aix") { + "LIBPATH" } else { "LD_LIBRARY_PATH" } diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs index 20b8a2c3b24..f582666ab28 100644 --- a/src/tools/tidy/src/ui_tests.rs +++ b/src/tools/tidy/src/ui_tests.rs @@ -9,7 +9,7 @@ const ENTRY_LIMIT: usize = 1000; // FIXME: The following limits should be reduced eventually. -const ROOT_ENTRY_LIMIT: usize = 940; +const ROOT_ENTRY_LIMIT: usize = 881; const ISSUES_ENTRY_LIMIT: usize = 1978; fn check_entries(tests_path: &Path, bad: &mut bool) { diff --git a/tests/ui/autoref-autoderef/issue-38940.rs b/tests/ui/autoref-autoderef/issue-38940.rs deleted file mode 100644 index d2f1c6e3271..00000000000 --- a/tests/ui/autoref-autoderef/issue-38940.rs +++ /dev/null @@ -1,52 +0,0 @@ -// issue-38940: error printed twice for deref recursion limit exceeded -// Test that the recursion limit can be changed. In this case, we have -// deeply nested types that will fail the `Send` check by overflow -// when the recursion limit is set very low. -// compile-flags: -Zdeduplicate-diagnostics=yes - -#![allow(dead_code)] -#![recursion_limit = "10"] -macro_rules! link { - ($outer:ident, $inner:ident) => { - struct $outer($inner); - impl $outer { - fn new() -> $outer { - $outer($inner::new()) - } - } - impl std::ops::Deref for $outer { - type Target = $inner; - fn deref(&self) -> &$inner { - &self.0 - } - } - }; -} - -struct Bottom; - -impl Bottom { - fn new() -> Bottom { - Bottom - } -} - -link!(Top, A); -link!(A, B); -link!(B, C); -link!(C, D); -link!(D, E); -link!(E, F); -link!(F, G); -link!(G, H); -link!(H, I); -link!(I, J); -link!(J, K); -link!(K, Bottom); - -fn main() { - let t = Top::new(); - let x: &Bottom = &t; - //~^ ERROR mismatched types - //~| ERROR reached the recursion limit while auto-dereferencing `J` -} diff --git a/tests/ui/autoref-autoderef/issue-38940.stderr b/tests/ui/autoref-autoderef/issue-38940.stderr deleted file mode 100644 index 8e98bfcd90f..00000000000 --- a/tests/ui/autoref-autoderef/issue-38940.stderr +++ /dev/null @@ -1,23 +0,0 @@ -error[E0055]: reached the recursion limit while auto-dereferencing `J` - --> $DIR/issue-38940.rs:49:22 - | -LL | let x: &Bottom = &t; - | ^^ deref recursion limit reached - | - = help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]` attribute to your crate (`issue_38940`) - -error[E0308]: mismatched types - --> $DIR/issue-38940.rs:49:22 - | -LL | let x: &Bottom = &t; - | ------- ^^ expected `&Bottom`, found `&Top` - | | - | expected due to this - | - = note: expected reference `&Bottom` - found reference `&Top` - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0055, E0308. -For more information about an error, try `rustc --explain E0055`. diff --git a/tests/ui/did_you_mean/recursion_limit_deref.stderr b/tests/ui/did_you_mean/recursion_limit_deref.stderr index 32fb628c470..b0c493faf1e 100644 --- a/tests/ui/did_you_mean/recursion_limit_deref.stderr +++ b/tests/ui/did_you_mean/recursion_limit_deref.stderr @@ -1,3 +1,7 @@ +error: reached the recursion limit finding the struct tail for `Bottom` + | + = help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]` + error[E0055]: reached the recursion limit while auto-dereferencing `J` --> $DIR/recursion_limit_deref.rs:51:22 | @@ -17,7 +21,7 @@ LL | let x: &Bottom = &t; = note: expected reference `&Bottom` found reference `&Top` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors Some errors have detailed explanations: E0055, E0308. For more information about an error, try `rustc --explain E0055`. diff --git a/tests/ui/slightly-nice-generic-literal-messages.rs b/tests/ui/generics/slightly-nice-generic-literal-messages.rs similarity index 100% rename from tests/ui/slightly-nice-generic-literal-messages.rs rename to tests/ui/generics/slightly-nice-generic-literal-messages.rs diff --git a/tests/ui/slightly-nice-generic-literal-messages.stderr b/tests/ui/generics/slightly-nice-generic-literal-messages.stderr similarity index 100% rename from tests/ui/slightly-nice-generic-literal-messages.stderr rename to tests/ui/generics/slightly-nice-generic-literal-messages.stderr diff --git a/tests/ui/unterminated-comment.rs b/tests/ui/lexer/unterminated-comment.rs similarity index 100% rename from tests/ui/unterminated-comment.rs rename to tests/ui/lexer/unterminated-comment.rs diff --git a/tests/ui/unterminated-comment.stderr b/tests/ui/lexer/unterminated-comment.stderr similarity index 100% rename from tests/ui/unterminated-comment.stderr rename to tests/ui/lexer/unterminated-comment.stderr diff --git a/tests/ui/unterminated-nested-comment.rs b/tests/ui/lexer/unterminated-nested-comment.rs similarity index 100% rename from tests/ui/unterminated-nested-comment.rs rename to tests/ui/lexer/unterminated-nested-comment.rs diff --git a/tests/ui/unterminated-nested-comment.stderr b/tests/ui/lexer/unterminated-nested-comment.stderr similarity index 100% rename from tests/ui/unterminated-nested-comment.stderr rename to tests/ui/lexer/unterminated-nested-comment.stderr diff --git a/tests/ui/auxiliary/xc-private-method-lib.rs b/tests/ui/privacy/auxiliary/xc-private-method-lib.rs similarity index 100% rename from tests/ui/auxiliary/xc-private-method-lib.rs rename to tests/ui/privacy/auxiliary/xc-private-method-lib.rs diff --git a/tests/ui/xc-private-method.rs b/tests/ui/privacy/xc-private-method.rs similarity index 100% rename from tests/ui/xc-private-method.rs rename to tests/ui/privacy/xc-private-method.rs diff --git a/tests/ui/xc-private-method.stderr b/tests/ui/privacy/xc-private-method.stderr similarity index 100% rename from tests/ui/xc-private-method.stderr rename to tests/ui/privacy/xc-private-method.stderr diff --git a/tests/ui/xc-private-method2.rs b/tests/ui/privacy/xc-private-method2.rs similarity index 100% rename from tests/ui/xc-private-method2.rs rename to tests/ui/privacy/xc-private-method2.rs diff --git a/tests/ui/xc-private-method2.stderr b/tests/ui/privacy/xc-private-method2.stderr similarity index 100% rename from tests/ui/xc-private-method2.stderr rename to tests/ui/privacy/xc-private-method2.stderr diff --git a/tests/ui/reachable-unnameable-type-alias.rs b/tests/ui/reachable/reachable-unnameable-type-alias.rs similarity index 100% rename from tests/ui/reachable-unnameable-type-alias.rs rename to tests/ui/reachable/reachable-unnameable-type-alias.rs diff --git a/tests/ui/disambiguate-identical-names.rs b/tests/ui/resolve/disambiguate-identical-names.rs similarity index 100% rename from tests/ui/disambiguate-identical-names.rs rename to tests/ui/resolve/disambiguate-identical-names.rs diff --git a/tests/ui/disambiguate-identical-names.stderr b/tests/ui/resolve/disambiguate-identical-names.stderr similarity index 100% rename from tests/ui/disambiguate-identical-names.stderr rename to tests/ui/resolve/disambiguate-identical-names.stderr diff --git a/tests/ui/thread-local-mutation.rs b/tests/ui/thread-local/thread-local-mutation.rs similarity index 100% rename from tests/ui/thread-local-mutation.rs rename to tests/ui/thread-local/thread-local-mutation.rs diff --git a/tests/ui/thread-local-mutation.stderr b/tests/ui/thread-local/thread-local-mutation.stderr similarity index 100% rename from tests/ui/thread-local-mutation.stderr rename to tests/ui/thread-local/thread-local-mutation.stderr diff --git a/tests/ui/thread-local-static.rs b/tests/ui/thread-local/thread-local-static.rs similarity index 100% rename from tests/ui/thread-local-static.rs rename to tests/ui/thread-local/thread-local-static.rs diff --git a/tests/ui/thread-local-static.stderr b/tests/ui/thread-local/thread-local-static.stderr similarity index 100% rename from tests/ui/thread-local-static.stderr rename to tests/ui/thread-local/thread-local-static.stderr diff --git a/tests/ui/wrong-mul-method-signature.rs b/tests/ui/traits/wrong-mul-method-signature.rs similarity index 100% rename from tests/ui/wrong-mul-method-signature.rs rename to tests/ui/traits/wrong-mul-method-signature.rs diff --git a/tests/ui/wrong-mul-method-signature.stderr b/tests/ui/traits/wrong-mul-method-signature.stderr similarity index 100% rename from tests/ui/wrong-mul-method-signature.stderr rename to tests/ui/traits/wrong-mul-method-signature.stderr diff --git a/tests/ui/tuple-index.rs b/tests/ui/tuple/tuple-index.rs similarity index 100% rename from tests/ui/tuple-index.rs rename to tests/ui/tuple/tuple-index.rs diff --git a/tests/ui/output-type-mismatch.rs b/tests/ui/typeck/output-type-mismatch.rs similarity index 100% rename from tests/ui/output-type-mismatch.rs rename to tests/ui/typeck/output-type-mismatch.rs diff --git a/tests/ui/output-type-mismatch.stderr b/tests/ui/typeck/output-type-mismatch.stderr similarity index 100% rename from tests/ui/output-type-mismatch.stderr rename to tests/ui/typeck/output-type-mismatch.stderr diff --git a/tests/ui/suppressed-error.rs b/tests/ui/typeck/suppressed-error.rs similarity index 100% rename from tests/ui/suppressed-error.rs rename to tests/ui/typeck/suppressed-error.rs diff --git a/tests/ui/suppressed-error.stderr b/tests/ui/typeck/suppressed-error.stderr similarity index 100% rename from tests/ui/suppressed-error.stderr rename to tests/ui/typeck/suppressed-error.stderr diff --git a/tests/ui/tag-that-dare-not-speak-its-name.rs b/tests/ui/typeck/tag-that-dare-not-speak-its-name.rs similarity index 100% rename from tests/ui/tag-that-dare-not-speak-its-name.rs rename to tests/ui/typeck/tag-that-dare-not-speak-its-name.rs diff --git a/tests/ui/tag-that-dare-not-speak-its-name.stderr b/tests/ui/typeck/tag-that-dare-not-speak-its-name.stderr similarity index 100% rename from tests/ui/tag-that-dare-not-speak-its-name.stderr rename to tests/ui/typeck/tag-that-dare-not-speak-its-name.stderr diff --git a/tests/ui/terr-in-field.rs b/tests/ui/typeck/terr-in-field.rs similarity index 100% rename from tests/ui/terr-in-field.rs rename to tests/ui/typeck/terr-in-field.rs diff --git a/tests/ui/terr-in-field.stderr b/tests/ui/typeck/terr-in-field.stderr similarity index 100% rename from tests/ui/terr-in-field.stderr rename to tests/ui/typeck/terr-in-field.stderr diff --git a/tests/ui/terr-sorts.rs b/tests/ui/typeck/terr-sorts.rs similarity index 100% rename from tests/ui/terr-sorts.rs rename to tests/ui/typeck/terr-sorts.rs diff --git a/tests/ui/terr-sorts.stderr b/tests/ui/typeck/terr-sorts.stderr similarity index 100% rename from tests/ui/terr-sorts.stderr rename to tests/ui/typeck/terr-sorts.stderr diff --git a/tests/ui/while-type-error.rs b/tests/ui/typeck/while-type-error.rs similarity index 100% rename from tests/ui/while-type-error.rs rename to tests/ui/typeck/while-type-error.rs diff --git a/tests/ui/while-type-error.stderr b/tests/ui/typeck/while-type-error.stderr similarity index 100% rename from tests/ui/while-type-error.stderr rename to tests/ui/typeck/while-type-error.stderr diff --git a/tests/ui/wrong-ret-type.rs b/tests/ui/typeck/wrong-ret-type.rs similarity index 100% rename from tests/ui/wrong-ret-type.rs rename to tests/ui/typeck/wrong-ret-type.rs diff --git a/tests/ui/wrong-ret-type.stderr b/tests/ui/typeck/wrong-ret-type.stderr similarity index 100% rename from tests/ui/wrong-ret-type.stderr rename to tests/ui/typeck/wrong-ret-type.stderr diff --git a/tests/ui/ufcs-polymorphic-paths.rs b/tests/ui/ufcs/ufcs-polymorphic-paths.rs similarity index 100% rename from tests/ui/ufcs-polymorphic-paths.rs rename to tests/ui/ufcs/ufcs-polymorphic-paths.rs diff --git a/tests/ui/expr-block-generic-unique1.rs b/tests/ui/unique/expr-block-generic-unique1.rs similarity index 100% rename from tests/ui/expr-block-generic-unique1.rs rename to tests/ui/unique/expr-block-generic-unique1.rs diff --git a/tests/ui/expr-block-generic-unique2.rs b/tests/ui/unique/expr-block-generic-unique2.rs similarity index 100% rename from tests/ui/expr-block-generic-unique2.rs rename to tests/ui/unique/expr-block-generic-unique2.rs diff --git a/tests/ui/expr-if-unique.rs b/tests/ui/unique/expr-if-unique.rs similarity index 100% rename from tests/ui/expr-if-unique.rs rename to tests/ui/unique/expr-if-unique.rs diff --git a/tests/ui/unique-object-noncopyable.rs b/tests/ui/unique/unique-object-noncopyable.rs similarity index 100% rename from tests/ui/unique-object-noncopyable.rs rename to tests/ui/unique/unique-object-noncopyable.rs diff --git a/tests/ui/unique-object-noncopyable.stderr b/tests/ui/unique/unique-object-noncopyable.stderr similarity index 100% rename from tests/ui/unique-object-noncopyable.stderr rename to tests/ui/unique/unique-object-noncopyable.stderr diff --git a/tests/ui/unique-pinned-nocopy.rs b/tests/ui/unique/unique-pinned-nocopy.rs similarity index 100% rename from tests/ui/unique-pinned-nocopy.rs rename to tests/ui/unique/unique-pinned-nocopy.rs diff --git a/tests/ui/unique-pinned-nocopy.stderr b/tests/ui/unique/unique-pinned-nocopy.stderr similarity index 100% rename from tests/ui/unique-pinned-nocopy.stderr rename to tests/ui/unique/unique-pinned-nocopy.stderr diff --git a/tests/ui/unwind-unique.rs b/tests/ui/unique/unwind-unique.rs similarity index 100% rename from tests/ui/unwind-unique.rs rename to tests/ui/unique/unwind-unique.rs diff --git a/tests/ui/mir-unpretty.rs b/tests/ui/unpretty/mir-unpretty.rs similarity index 100% rename from tests/ui/mir-unpretty.rs rename to tests/ui/unpretty/mir-unpretty.rs diff --git a/tests/ui/mir-unpretty.stderr b/tests/ui/unpretty/mir-unpretty.stderr similarity index 100% rename from tests/ui/mir-unpretty.stderr rename to tests/ui/unpretty/mir-unpretty.stderr diff --git a/tests/ui/unpretty-expr-fn-arg.rs b/tests/ui/unpretty/unpretty-expr-fn-arg.rs similarity index 100% rename from tests/ui/unpretty-expr-fn-arg.rs rename to tests/ui/unpretty/unpretty-expr-fn-arg.rs diff --git a/tests/ui/unpretty-expr-fn-arg.stdout b/tests/ui/unpretty/unpretty-expr-fn-arg.stdout similarity index 100% rename from tests/ui/unpretty-expr-fn-arg.stdout rename to tests/ui/unpretty/unpretty-expr-fn-arg.stdout diff --git a/tests/ui/foreign-unsafe-fn-called.mir.stderr b/tests/ui/unsafe/foreign-unsafe-fn-called.mir.stderr similarity index 100% rename from tests/ui/foreign-unsafe-fn-called.mir.stderr rename to tests/ui/unsafe/foreign-unsafe-fn-called.mir.stderr diff --git a/tests/ui/foreign-unsafe-fn-called.rs b/tests/ui/unsafe/foreign-unsafe-fn-called.rs similarity index 100% rename from tests/ui/foreign-unsafe-fn-called.rs rename to tests/ui/unsafe/foreign-unsafe-fn-called.rs diff --git a/tests/ui/foreign-unsafe-fn-called.thir.stderr b/tests/ui/unsafe/foreign-unsafe-fn-called.thir.stderr similarity index 100% rename from tests/ui/foreign-unsafe-fn-called.thir.stderr rename to tests/ui/unsafe/foreign-unsafe-fn-called.thir.stderr diff --git a/tests/ui/new-unsafe-pointers.rs b/tests/ui/unsafe/new-unsafe-pointers.rs similarity index 100% rename from tests/ui/new-unsafe-pointers.rs rename to tests/ui/unsafe/new-unsafe-pointers.rs diff --git a/tests/ui/unsafe-fn-called-from-unsafe-blk.rs b/tests/ui/unsafe/unsafe-fn-called-from-unsafe-blk.rs similarity index 100% rename from tests/ui/unsafe-fn-called-from-unsafe-blk.rs rename to tests/ui/unsafe/unsafe-fn-called-from-unsafe-blk.rs diff --git a/tests/ui/unsafe-fn-called-from-unsafe-fn.rs b/tests/ui/unsafe/unsafe-fn-called-from-unsafe-fn.rs similarity index 100% rename from tests/ui/unsafe-fn-called-from-unsafe-fn.rs rename to tests/ui/unsafe/unsafe-fn-called-from-unsafe-fn.rs diff --git a/tests/ui/unsafe-pointer-assignability.rs b/tests/ui/unsafe/unsafe-pointer-assignability.rs similarity index 100% rename from tests/ui/unsafe-pointer-assignability.rs rename to tests/ui/unsafe/unsafe-pointer-assignability.rs diff --git a/tests/ui/variance-intersection-of-ref-and-opt-ref.rs b/tests/ui/variance/variance-intersection-of-ref-and-opt-ref.rs similarity index 100% rename from tests/ui/variance-intersection-of-ref-and-opt-ref.rs rename to tests/ui/variance/variance-intersection-of-ref-and-opt-ref.rs diff --git a/tests/ui/variance-iterators-in-libcore.rs b/tests/ui/variance/variance-iterators-in-libcore.rs similarity index 100% rename from tests/ui/variance-iterators-in-libcore.rs rename to tests/ui/variance/variance-iterators-in-libcore.rs diff --git a/tests/ui/wasm-custom-section-relocations.rs b/tests/ui/wasm/wasm-custom-section-relocations.rs similarity index 100% rename from tests/ui/wasm-custom-section-relocations.rs rename to tests/ui/wasm/wasm-custom-section-relocations.rs diff --git a/tests/ui/wasm-custom-section-relocations.stderr b/tests/ui/wasm/wasm-custom-section-relocations.stderr similarity index 100% rename from tests/ui/wasm-custom-section-relocations.stderr rename to tests/ui/wasm/wasm-custom-section-relocations.stderr