From f8a7f82bdab57302ca07ea5f3b3fa5173ed9f9ae Mon Sep 17 00:00:00 2001 From: Sidney Cammeresi Date: Fri, 15 Aug 2025 08:45:50 -0700 Subject: Stabilize BTree{Map,Set}::extract_if --- library/alloc/src/collections/btree/map.rs | 11 +++++------ library/alloc/src/collections/btree/set.rs | 11 +++++------ library/alloctests/benches/lib.rs | 1 - library/alloctests/tests/lib.rs | 1 - src/tools/miri/tests/pass/btreemap.rs | 1 - .../run_pass/lit-pattern-matching-with-methods.rs | 1 - 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 8b6d86a2888..98f11e2ea57 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -1433,7 +1433,6 @@ impl BTreeMap { /// # Examples /// /// ``` - /// #![feature(btree_extract_if)] /// use std::collections::BTreeMap; /// /// // Splitting a map into even and odd keys, reusing the original map: @@ -1450,7 +1449,7 @@ impl BTreeMap { /// assert_eq!(low.keys().copied().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.keys().copied().collect::>(), [4, 5, 6, 7]); /// ``` - #[unstable(feature = "btree_extract_if", issue = "70530")] + #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F, A> where K: Ord, @@ -1937,7 +1936,7 @@ impl Default for Values<'_, K, V> { } /// An iterator produced by calling `extract_if` on BTreeMap. -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1970,7 +1969,7 @@ pub(super) struct ExtractIfInner<'a, K, V, R> { range: R, } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl fmt::Debug for ExtractIf<'_, K, V, R, F, A> where K: fmt::Debug, @@ -1982,7 +1981,7 @@ where } } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl Iterator for ExtractIf<'_, K, V, R, F, A> where K: PartialOrd, @@ -2056,7 +2055,7 @@ impl<'a, K, V, R> ExtractIfInner<'a, K, V, R> { } } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl FusedIterator for ExtractIf<'_, K, V, R, F> where K: PartialOrd, diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index d50ce02bda7..e6b0a1f6323 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -1202,7 +1202,6 @@ impl BTreeSet { /// # Examples /// /// ``` - /// #![feature(btree_extract_if)] /// use std::collections::BTreeSet; /// /// // Splitting a set into even and odd values, reusing the original set: @@ -1219,7 +1218,7 @@ impl BTreeSet { /// assert_eq!(low.into_iter().collect::>(), [0, 1, 2, 3]); /// assert_eq!(high.into_iter().collect::>(), [4, 5, 6, 7]); /// ``` - #[unstable(feature = "btree_extract_if", issue = "70530")] + #[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] pub fn extract_if(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A> where T: Ord, @@ -1554,7 +1553,7 @@ impl<'a, T, A: Allocator + Clone> IntoIterator for &'a BTreeSet { } /// An iterator produced by calling `extract_if` on BTreeSet. -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] #[must_use = "iterators are lazy and do nothing unless consumed"] pub struct ExtractIf< 'a, @@ -1569,7 +1568,7 @@ pub struct ExtractIf< alloc: A, } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl fmt::Debug for ExtractIf<'_, T, R, F, A> where T: fmt::Debug, @@ -1582,7 +1581,7 @@ where } } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl Iterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, @@ -1602,7 +1601,7 @@ where } } -#[unstable(feature = "btree_extract_if", issue = "70530")] +#[stable(feature = "btree_extract_if", since = "CURRENT_RUSTC_VERSION")] impl FusedIterator for ExtractIf<'_, T, R, F, A> where T: PartialOrd, diff --git a/library/alloctests/benches/lib.rs b/library/alloctests/benches/lib.rs index 2633154318c..721d685527f 100644 --- a/library/alloctests/benches/lib.rs +++ b/library/alloctests/benches/lib.rs @@ -1,6 +1,5 @@ // Disabling in Miri as these would take too long. #![cfg(not(miri))] -#![feature(btree_extract_if)] #![feature(iter_next_chunk)] #![feature(repr_simd)] #![feature(slice_partition_dedup)] diff --git a/library/alloctests/tests/lib.rs b/library/alloctests/tests/lib.rs index 447af240a4b..c0a0022c008 100644 --- a/library/alloctests/tests/lib.rs +++ b/library/alloctests/tests/lib.rs @@ -2,7 +2,6 @@ #![feature(alloc_layout_extra)] #![feature(iter_array_chunks)] #![feature(assert_matches)] -#![feature(btree_extract_if)] #![feature(wtf8_internals)] #![feature(char_max_len)] #![feature(cow_is_borrowed)] diff --git a/src/tools/miri/tests/pass/btreemap.rs b/src/tools/miri/tests/pass/btreemap.rs index 1d65e69bf72..7af6d7b5551 100644 --- a/src/tools/miri/tests/pass/btreemap.rs +++ b/src/tools/miri/tests/pass/btreemap.rs @@ -1,7 +1,6 @@ //@revisions: stack tree //@[tree]compile-flags: -Zmiri-tree-borrows //@compile-flags: -Zmiri-strict-provenance -#![feature(btree_extract_if)] use std::collections::{BTreeMap, BTreeSet}; use std::mem; diff --git a/tests/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs b/tests/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs index afb16cf58e8..4ae77ab6439 100644 --- a/tests/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs +++ b/tests/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs @@ -2,7 +2,6 @@ //@check-pass #![warn(unused)] #![feature(rustc_attrs)] -#![feature(btree_extract_if)] use std::collections::BTreeMap; use std::panic::{catch_unwind, AssertUnwindSafe}; -- cgit 1.4.1-3-g733a5 From 472721b34f73e7a5e6870c9443c35e3ab29958d9 Mon Sep 17 00:00:00 2001 From: binarycat Date: Thu, 11 Sep 2025 12:47:22 -0500 Subject: bootstrap: rustdoc-js tests can now be filtered by js files --- src/bootstrap/src/core/build_steps/test.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 4f839bdf7b8..723ba80eaf8 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -2086,11 +2086,25 @@ HELP: You can add it into `bootstrap.toml` in `rust.codegen-backends = [{name:?} } // Get paths from cmd args - let paths = match &builder.config.cmd { + let mut paths = match &builder.config.cmd { Subcommand::Test { .. } => &builder.config.paths[..], _ => &[], }; + // in rustdoc-js mode, allow filters to be rs files or js files. + // use a late-initialized Vec to avoid cloning for other modes. + let mut paths_v; + if mode == "rustdoc-js" { + paths_v = paths.to_vec(); + for p in &mut paths_v { + if let Some(ext) = p.extension() + && ext == "js" + { + p.set_extension("rs"); + } + } + paths = &paths_v; + } // Get test-args by striping suite path let mut test_args: Vec<&str> = paths .iter() -- cgit 1.4.1-3-g733a5 From 43a6b1041819c5f5b70faf1ad5833400087dc1b0 Mon Sep 17 00:00:00 2001 From: IoaNNUwU Date: Fri, 12 Sep 2025 00:01:38 +0200 Subject: Use raw fmt str in format macro --- compiler/rustc_builtin_macros/src/format.rs | 14 +++++-- .../missing-format-specifiers-issue-68293.rs | 29 +++++++++++++ .../missing-format-specifiers-issue-68293.stderr | 49 +++++++++++++++++++++- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs index a6c8e7d29cc..d70888205a5 100644 --- a/compiler/rustc_builtin_macros/src/format.rs +++ b/compiler/rustc_builtin_macros/src/format.rs @@ -569,6 +569,7 @@ fn make_format_args( detect_foreign_fmt, str_style, fmt_str, + uncooked_fmt_str.1.as_str(), fmt_span, ); } @@ -650,6 +651,7 @@ fn report_missing_placeholders( detect_foreign_fmt: bool, str_style: Option, fmt_str: &str, + uncooked_fmt_str: &str, fmt_span: Span, ) { let mut diag = if let &[(span, named)] = &unused[..] { @@ -773,16 +775,20 @@ fn report_missing_placeholders( diag.note(format!("consider adding {} format specifiers", unused.len())); } } else { - let original_fmt_str = - if fmt_str.len() >= 1 { &fmt_str[..fmt_str.len() - 1] } else { "" }; - let msg = if unused.len() == 1 { "a format specifier".to_string() } else { format!("{} format specifiers", unused.len()) }; - let sugg = format!("\"{}{}\"", original_fmt_str, "{}".repeat(unused.len())); + let sugg = match str_style { + None => format!("\"{}{}\"", uncooked_fmt_str, "{}".repeat(unused.len())), + Some(n_hashes) => format!( + "r{hashes}\"{uncooked_fmt_str}{fmt_specifiers}\"{hashes}", + hashes = "#".repeat(n_hashes), + fmt_specifiers = "{}".repeat(unused.len()) + ), + }; let msg = format!("format specifiers use curly braces, consider adding {msg}"); diag.span_suggestion_verbose(fmt_span, msg, sugg, Applicability::MaybeIncorrect); diff --git a/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs b/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs index 29799624d78..fbede7c41cb 100644 --- a/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs +++ b/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs @@ -32,4 +32,33 @@ fn missing_format_specifiers_multiple_unused_args() { //~| NOTE consider adding 2 format specifiers } +fn unicode_unused_args() { + panic!("๐Ÿ‘†", "๐Ÿ‘†", 1); + //~^ ERROR multiple unused formatting arguments + //~| NOTE multiple missing formatting specifiers + //~| NOTE argument never used + //~| NOTE argument never used + //~| HELP format specifiers use curly braces, consider adding 2 format specifiers +} + +fn raw_str_unused_arg() { + format_args!(r##"lJ๐ฟร†๏ฟฝ.๐ฟ๏ฟฝ"##, r#"r}J๐ฟร†" {}"#, 1); + //~^ ERROR multiple unused formatting arguments + //~| NOTE multiple missing formatting specifiers + //~| NOTE argument never used + //~| NOTE argument never used + //~| HELP format specifiers use curly braces, consider adding 2 format specifiers +} + +fn valid_new_lines_unused_args() { + panic!("Expect 2 newlines + +", "๐Ÿ‘†", 1); + //~^ ERROR multiple unused formatting arguments + //~| NOTE argument never used + //~| NOTE argument never used + //~^^^^^^ NOTE multiple missing formatting specifiers + //~| HELP format specifiers use curly braces, consider adding 2 format specifiers +} + fn main() { } diff --git a/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr b/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr index 081409789f5..7e997241698 100644 --- a/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr +++ b/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr @@ -45,5 +45,52 @@ LL | println!("list: {}", 1, 2, 3); | = note: consider adding 2 format specifiers -error: aborting due to 4 previous errors +error: multiple unused formatting arguments + --> $DIR/missing-format-specifiers-issue-68293.rs:36:17 + | +LL | panic!("๐Ÿ‘†", "๐Ÿ‘†", 1); + | ---- ^^^^ ^ argument never used + | | | + | | argument never used + | multiple missing formatting specifiers + | +help: format specifiers use curly braces, consider adding 2 format specifiers + | +LL | panic!("๐Ÿ‘†{}{}", "๐Ÿ‘†", 1); + | ++++ + +error: multiple unused formatting arguments + --> $DIR/missing-format-specifiers-issue-68293.rs:45:35 + | +LL | format_args!(r##"lJ๐ฟร†๏ฟฝ.๐ฟ๏ฟฝ"##, r#"r}J๐ฟร†" {}"#, 1); + | --------------- ^^^^^^^^^^^^^^ ^ argument never used + | | | + | | argument never used + | multiple missing formatting specifiers + | +help: format specifiers use curly braces, consider adding 2 format specifiers + | +LL | format_args!(r##"lJ๐ฟร†๏ฟฝ.๐ฟ๏ฟฝ{}{}"##, r#"r}J๐ฟร†" {}"#, 1); + | ++++ + +error: multiple unused formatting arguments + --> $DIR/missing-format-specifiers-issue-68293.rs:56:4 + | +LL | panic!("Expect 2 newlines + | ____________- +LL | | +LL | | ", "๐Ÿ‘†", 1); + | | - ^^^^ ^ argument never used + | | | | + | |_| argument never used + | multiple missing formatting specifiers + | +help: format specifiers use curly braces, consider adding 2 format specifiers + | +LL | panic!("Expect 2 newlines +LL | +LL ~ {}{}", "๐Ÿ‘†", 1); + | + +error: aborting due to 7 previous errors -- cgit 1.4.1-3-g733a5 From a0bb9cc57db551289cba9fefde086e45cb82733f Mon Sep 17 00:00:00 2001 From: Noratrieb <48135649+Noratrieb@users.noreply.github.com> Date: Sat, 26 Jul 2025 12:15:19 +0200 Subject: Introduce `target_spec_enum` macro to avoid duplication With this macro we only need to enumerate every variant once. This saves a lot of duplication already between the definition, the `FromStr` impl and the `ToJson` impl. It also enables us to do further things with it like JSON schema generation. --- compiler/rustc_target/src/lib.rs | 60 +++ compiler/rustc_target/src/spec/mod.rs | 899 +++++++--------------------------- 2 files changed, 244 insertions(+), 715 deletions(-) diff --git a/compiler/rustc_target/src/lib.rs b/compiler/rustc_target/src/lib.rs index 91657fef803..c6a23745b04 100644 --- a/compiler/rustc_target/src/lib.rs +++ b/compiler/rustc_target/src/lib.rs @@ -72,3 +72,63 @@ fn find_relative_libdir(sysroot: &Path) -> std::borrow::Cow<'static, str> { Some(libdir) => libdir.into(), } } + +macro_rules! target_spec_enum { + ( + $( #[$attr:meta] )* + pub enum $name:ident { + $( + $( #[$variant_attr:meta] )* + $variant:ident = $string:literal, + )* + } + parse_error_type = $parse_error_type:literal; + ) => { + $( #[$attr] )* + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] + pub enum $name { + $( + $( #[$variant_attr] )* + $variant, + )* + } + + impl FromStr for $name { + type Err = String; + + fn from_str(s: &str) -> Result { + Ok(match s { + $( $string => Self::$variant, )* + _ => { + let all = [$( concat!("'", $string, "'") ),*].join(", "); + return Err(format!("invalid {}: '{s}'. allowed values: {all}", $parse_error_type)); + } + }) + } + } + + impl $name { + pub fn desc(&self) -> &'static str { + match self { + $( Self::$variant => $string, )* + } + } + } + + impl crate::json::ToJson for $name { + fn to_json(&self) -> crate::json::Json { + self.desc().to_json() + } + } + + crate::json::serde_deserialize_from_str!($name); + + + impl std::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.desc()) + } + } + }; +} +use target_spec_enum; diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 4d9f06c568b..239ac7bf5c4 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -183,50 +183,15 @@ impl LinkerFlavorCli { } } -#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] -pub enum LldFlavor { - Wasm, - Ld64, - Ld, - Link, -} - -impl LldFlavor { - pub fn as_str(&self) -> &'static str { - match self { - LldFlavor::Wasm => "wasm", - LldFlavor::Ld64 => "darwin", - LldFlavor::Ld => "gnu", - LldFlavor::Link => "link", - } +crate::target_spec_enum! { + pub enum LldFlavor { + Wasm = "wasm", + Ld64 = "darwin", + Ld = "gnu", + Link = "link", } -} - -impl FromStr for LldFlavor { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "darwin" => LldFlavor::Ld64, - "gnu" => LldFlavor::Ld, - "link" => LldFlavor::Link, - "wasm" => LldFlavor::Wasm, - _ => { - return Err( - "invalid value for lld flavor: '{s}', expected one of 'darwin', 'gnu', 'link', 'wasm'" - .into(), - ); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(LldFlavor); -impl ToJson for LldFlavor { - fn to_json(&self) -> Json { - self.as_str().to_json() - } + parse_error_type = "LLD flavor"; } impl LinkerFlavor { @@ -823,10 +788,14 @@ impl LinkerFeatures { } } -#[derive(Clone, Copy, Debug, PartialEq, Hash, Encodable, Decodable, HashStable_Generic)] -pub enum PanicStrategy { - Unwind, - Abort, +crate::target_spec_enum! { + #[derive(Encodable, Decodable, HashStable_Generic)] + pub enum PanicStrategy { + Unwind = "unwind", + Abort = "abort", + } + + parse_error_type = "panic strategy"; } #[derive(Clone, Copy, Debug, PartialEq, Hash, Encodable, Decodable, HashStable_Generic)] @@ -838,13 +807,6 @@ pub enum OnBrokenPipe { } impl PanicStrategy { - pub fn desc(&self) -> &str { - match *self { - PanicStrategy::Unwind => "unwind", - PanicStrategy::Abort => "abort", - } - } - pub const fn desc_symbol(&self) -> Symbol { match *self { PanicStrategy::Unwind => sym::unwind, @@ -857,24 +819,16 @@ impl PanicStrategy { } } -impl FromStr for PanicStrategy { - type Err = String; - fn from_str(s: &str) -> Result { - Ok(match s { - "unwind" => PanicStrategy::Unwind, - "abort" => PanicStrategy::Abort, - _ => { - return Err(format!( - "'{}' is not a valid value for \ - panic-strategy. Use 'unwind' or 'abort'.", - s - )); - } - }) +crate::target_spec_enum! { + pub enum RelroLevel { + Full = "full", + Partial = "partial", + Off = "off", + None = "none", } -} -crate::json::serde_deserialize_from_str!(PanicStrategy); + parse_error_type = "relro level"; +} impl IntoDiagArg for PanicStrategy { fn into_diag_arg(self, _: &mut Option) -> DiagArgValue { @@ -882,110 +836,16 @@ impl IntoDiagArg for PanicStrategy { } } -impl ToJson for PanicStrategy { - fn to_json(&self) -> Json { - match *self { - PanicStrategy::Abort => "abort".to_json(), - PanicStrategy::Unwind => "unwind".to_json(), - } +crate::target_spec_enum! { + pub enum SymbolVisibility { + Hidden = "hidden", + Protected = "protected", + Interposable = "interposable", } -} -#[derive(Clone, Copy, Debug, PartialEq, Hash)] -pub enum RelroLevel { - Full, - Partial, - Off, - None, + parse_error_type = "symbol visibility"; } -impl RelroLevel { - pub fn desc(&self) -> &str { - match *self { - RelroLevel::Full => "full", - RelroLevel::Partial => "partial", - RelroLevel::Off => "off", - RelroLevel::None => "none", - } - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Hash)] -pub enum SymbolVisibility { - Hidden, - Protected, - Interposable, -} - -impl SymbolVisibility { - pub fn desc(&self) -> &str { - match *self { - SymbolVisibility::Hidden => "hidden", - SymbolVisibility::Protected => "protected", - SymbolVisibility::Interposable => "interposable", - } - } -} - -impl FromStr for SymbolVisibility { - type Err = String; - - fn from_str(s: &str) -> Result { - match s { - "hidden" => Ok(SymbolVisibility::Hidden), - "protected" => Ok(SymbolVisibility::Protected), - "interposable" => Ok(SymbolVisibility::Interposable), - _ => Err(format!( - "'{}' is not a valid value for \ - symbol-visibility. Use 'hidden', 'protected, or 'interposable'.", - s - )), - } - } -} - -crate::json::serde_deserialize_from_str!(SymbolVisibility); - -impl ToJson for SymbolVisibility { - fn to_json(&self) -> Json { - match *self { - SymbolVisibility::Hidden => "hidden".to_json(), - SymbolVisibility::Protected => "protected".to_json(), - SymbolVisibility::Interposable => "interposable".to_json(), - } - } -} - -impl FromStr for RelroLevel { - type Err = String; - - fn from_str(s: &str) -> Result { - match s { - "full" => Ok(RelroLevel::Full), - "partial" => Ok(RelroLevel::Partial), - "off" => Ok(RelroLevel::Off), - "none" => Ok(RelroLevel::None), - _ => Err(format!( - "'{}' is not a valid value for \ - relro-level. Use 'full', 'partial, 'off', or 'none'.", - s - )), - } - } -} - -crate::json::serde_deserialize_from_str!(RelroLevel); - -impl ToJson for RelroLevel { - fn to_json(&self) -> Json { - match *self { - RelroLevel::Full => "full".to_json(), - RelroLevel::Partial => "partial".to_json(), - RelroLevel::Off => "off".to_json(), - RelroLevel::None => "None".to_json(), - } - } -} #[derive(Clone, Debug, PartialEq, Hash)] pub enum SmallDataThresholdSupport { @@ -1026,76 +886,31 @@ impl ToJson for SmallDataThresholdSupport { } } -#[derive(Clone, Copy, Debug, PartialEq, Hash)] -pub enum MergeFunctions { - Disabled, - Trampolines, - Aliases, -} - -impl MergeFunctions { - pub fn desc(&self) -> &str { - match *self { - MergeFunctions::Disabled => "disabled", - MergeFunctions::Trampolines => "trampolines", - MergeFunctions::Aliases => "aliases", - } +crate::target_spec_enum! { + pub enum MergeFunctions { + Disabled = "disabled", + Trampolines = "trampolines", + Aliases = "aliases", } -} -impl FromStr for MergeFunctions { - type Err = String; - - fn from_str(s: &str) -> Result { - match s { - "disabled" => Ok(MergeFunctions::Disabled), - "trampolines" => Ok(MergeFunctions::Trampolines), - "aliases" => Ok(MergeFunctions::Aliases), - _ => Err(format!( - "'{}' is not a valid value for \ - merge-functions. Use 'disabled', \ - 'trampolines', or 'aliases'.", - s - )), - } - } + parse_error_type = "value for merge-functions"; } -crate::json::serde_deserialize_from_str!(MergeFunctions); - -impl ToJson for MergeFunctions { - fn to_json(&self) -> Json { - match *self { - MergeFunctions::Disabled => "disabled".to_json(), - MergeFunctions::Trampolines => "trampolines".to_json(), - MergeFunctions::Aliases => "aliases".to_json(), - } +crate::target_spec_enum! { + pub enum RelocModel { + Static = "static", + Pic = "pic", + Pie = "pie", + DynamicNoPic = "dynamic-no-pic", + Ropi = "ropi", + Rwpi = "rwpi", + RopiRwpi = "ropi-rwpi", } -} -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum RelocModel { - Static, - Pic, - Pie, - DynamicNoPic, - Ropi, - Rwpi, - RopiRwpi, + parse_error_type = "relocation model"; } impl RelocModel { - pub fn desc(&self) -> &str { - match *self { - RelocModel::Static => "static", - RelocModel::Pic => "pic", - RelocModel::Pie => "pie", - RelocModel::DynamicNoPic => "dynamic-no-pic", - RelocModel::Ropi => "ropi", - RelocModel::Rwpi => "rwpi", - RelocModel::RopiRwpi => "ropi-rwpi", - } - } pub const fn desc_symbol(&self) -> Symbol { match *self { RelocModel::Static => kw::Static, @@ -1121,236 +936,75 @@ impl RelocModel { } } -impl FromStr for RelocModel { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "static" => RelocModel::Static, - "pic" => RelocModel::Pic, - "pie" => RelocModel::Pie, - "dynamic-no-pic" => RelocModel::DynamicNoPic, - "ropi" => RelocModel::Ropi, - "rwpi" => RelocModel::Rwpi, - "ropi-rwpi" => RelocModel::RopiRwpi, - _ => { - return Err(format!( - "invalid relocation model '{s}'. - Run `rustc --print relocation-models` to \ - see the list of supported values.'" - )); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(RelocModel); - -impl ToJson for RelocModel { - fn to_json(&self) -> Json { - self.desc().to_json() +crate::target_spec_enum! { + pub enum CodeModel { + Tiny = "tiny", + Small = "small", + Kernel = "kernel", + Medium = "medium", + Large = "large", } -} -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum CodeModel { - Tiny, - Small, - Kernel, - Medium, - Large, + parse_error_type = "code model"; } -impl FromStr for CodeModel { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "tiny" => CodeModel::Tiny, - "small" => CodeModel::Small, - "kernel" => CodeModel::Kernel, - "medium" => CodeModel::Medium, - "large" => CodeModel::Large, - _ => { - return Err(format!( - "'{s}' is not a valid code model. \ - Run `rustc --print code-models` to \ - see the list of supported values." - )); - } - }) +crate::target_spec_enum! { + /// The float ABI setting to be configured in the LLVM target machine. + pub enum FloatAbi { + Soft = "soft", + Hard = "hard", } -} - -crate::json::serde_deserialize_from_str!(CodeModel); -impl ToJson for CodeModel { - fn to_json(&self) -> Json { - match *self { - CodeModel::Tiny => "tiny", - CodeModel::Small => "small", - CodeModel::Kernel => "kernel", - CodeModel::Medium => "medium", - CodeModel::Large => "large", - } - .to_json() - } + parse_error_type = "float abi"; } -/// The float ABI setting to be configured in the LLVM target machine. -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum FloatAbi { - Soft, - Hard, -} - -impl FromStr for FloatAbi { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "soft" => FloatAbi::Soft, - "hard" => FloatAbi::Hard, - _ => { - return Err(format!( - "'{}' is not a valid value for \ - llvm-floatabi. Use 'soft' or 'hard'.", - s - )); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(FloatAbi); - -impl ToJson for FloatAbi { - fn to_json(&self) -> Json { - match *self { - FloatAbi::Soft => "soft", - FloatAbi::Hard => "hard", - } - .to_json() +crate::target_spec_enum! { + /// The Rustc-specific variant of the ABI used for this target. + pub enum RustcAbi { + /// On x86-32 only: make use of SSE and SSE2 for ABI purposes. + X86Sse2 = "x86-sse2", + /// On x86-32/64 only: do not use any FPU or SIMD registers for the ABI. + X86Softfloat = "x86-softfloat", } -} -/// The Rustc-specific variant of the ABI used for this target. -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum RustcAbi { - /// On x86-32 only: make use of SSE and SSE2 for ABI purposes. - X86Sse2, - /// On x86-32/64 only: do not use any FPU or SIMD registers for the ABI. - X86Softfloat, -} - -impl FromStr for RustcAbi { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "x86-sse2" => RustcAbi::X86Sse2, - "x86-softfloat" => RustcAbi::X86Softfloat, - _ => { - return Err(format!( - "'{s}' is not a valid value for rustc-abi. \ - Use 'x86-softfloat' or leave the field unset." - )); - } - }) - } + parse_error_type = "rustc abi"; } -crate::json::serde_deserialize_from_str!(RustcAbi); - -impl ToJson for RustcAbi { - fn to_json(&self) -> Json { - match *self { - RustcAbi::X86Sse2 => "x86-sse2", - RustcAbi::X86Softfloat => "x86-softfloat", - } - .to_json() +crate::target_spec_enum! { + pub enum TlsModel { + GeneralDynamic = "global-dynamic", + LocalDynamic = "local-dynamic", + InitialExec = "initial-exec", + LocalExec = "local-exec", + Emulated = "emulated", } -} - -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum TlsModel { - GeneralDynamic, - LocalDynamic, - InitialExec, - LocalExec, - Emulated, -} - -impl FromStr for TlsModel { - type Err = String; - fn from_str(s: &str) -> Result { - Ok(match s { - // Note the difference "general" vs "global" difference. The model name is "general", - // but the user-facing option name is "global" for consistency with other compilers. - "global-dynamic" => TlsModel::GeneralDynamic, - "local-dynamic" => TlsModel::LocalDynamic, - "initial-exec" => TlsModel::InitialExec, - "local-exec" => TlsModel::LocalExec, - "emulated" => TlsModel::Emulated, - _ => { - return Err(format!( - "'{s}' is not a valid TLS model. \ - Run `rustc --print tls-models` to \ - see the list of supported values." - )); - } - }) - } + parse_error_type = "TLS model"; } -crate::json::serde_deserialize_from_str!(TlsModel); - -impl ToJson for TlsModel { - fn to_json(&self) -> Json { - match *self { - TlsModel::GeneralDynamic => "global-dynamic", - TlsModel::LocalDynamic => "local-dynamic", - TlsModel::InitialExec => "initial-exec", - TlsModel::LocalExec => "local-exec", - TlsModel::Emulated => "emulated", - } - .to_json() +crate::target_spec_enum! { + /// Everything is flattened to a single enum to make the json encoding/decoding less annoying. + pub enum LinkOutputKind { + /// Dynamically linked non position-independent executable. + DynamicNoPicExe = "dynamic-nopic-exe", + /// Dynamically linked position-independent executable. + DynamicPicExe = "dynamic-pic-exe", + /// Statically linked non position-independent executable. + StaticNoPicExe = "static-nopic-exe", + /// Statically linked position-independent executable. + StaticPicExe = "static-pic-exe", + /// Regular dynamic library ("dynamically linked"). + DynamicDylib = "dynamic-dylib", + /// Dynamic library with bundled libc ("statically linked"). + StaticDylib = "static-dylib", + /// WASI module with a lifetime past the _initialize entry point + WasiReactorExe = "wasi-reactor-exe", } -} -/// Everything is flattened to a single enum to make the json encoding/decoding less annoying. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] -pub enum LinkOutputKind { - /// Dynamically linked non position-independent executable. - DynamicNoPicExe, - /// Dynamically linked position-independent executable. - DynamicPicExe, - /// Statically linked non position-independent executable. - StaticNoPicExe, - /// Statically linked position-independent executable. - StaticPicExe, - /// Regular dynamic library ("dynamically linked"). - DynamicDylib, - /// Dynamic library with bundled libc ("statically linked"). - StaticDylib, - /// WASI module with a lifetime past the _initialize entry point - WasiReactorExe, + parse_error_type = "CRT object kind"; } impl LinkOutputKind { - fn as_str(&self) -> &'static str { - match self { - LinkOutputKind::DynamicNoPicExe => "dynamic-nopic-exe", - LinkOutputKind::DynamicPicExe => "dynamic-pic-exe", - LinkOutputKind::StaticNoPicExe => "static-nopic-exe", - LinkOutputKind::StaticPicExe => "static-pic-exe", - LinkOutputKind::DynamicDylib => "dynamic-dylib", - LinkOutputKind::StaticDylib => "static-dylib", - LinkOutputKind::WasiReactorExe => "wasi-reactor-exe", - } - } - pub fn can_link_dylib(self) -> bool { match self { LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false, @@ -1363,166 +1017,59 @@ impl LinkOutputKind { } } -impl FromStr for LinkOutputKind { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "dynamic-nopic-exe" => LinkOutputKind::DynamicNoPicExe, - "dynamic-pic-exe" => LinkOutputKind::DynamicPicExe, - "static-nopic-exe" => LinkOutputKind::StaticNoPicExe, - "static-pic-exe" => LinkOutputKind::StaticPicExe, - "dynamic-dylib" => LinkOutputKind::DynamicDylib, - "static-dylib" => LinkOutputKind::StaticDylib, - "wasi-reactor-exe" => LinkOutputKind::WasiReactorExe, - _ => { - return Err(format!( - "invalid value for CRT object kind. \ - Use '(dynamic,static)-(nopic,pic)-exe' or \ - '(dynamic,static)-dylib' or 'wasi-reactor-exe'" - )); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(LinkOutputKind); - -impl fmt::Display for LinkOutputKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.as_str()) - } -} - pub type LinkArgs = BTreeMap>>; pub type LinkArgsCli = BTreeMap>>; -/// Which kind of debuginfo does the target use? -/// -/// Useful in determining whether a target supports Split DWARF (a target with -/// `DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example). -#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)] -pub enum DebuginfoKind { - /// DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`). - #[default] - Dwarf, - /// DWARF debuginfo in dSYM files (such as on Apple platforms). - DwarfDsym, - /// Program database files (such as on Windows). - Pdb, -} - -impl DebuginfoKind { - fn as_str(&self) -> &'static str { - match self { - DebuginfoKind::Dwarf => "dwarf", - DebuginfoKind::DwarfDsym => "dwarf-dsym", - DebuginfoKind::Pdb => "pdb", - } - } -} - -impl FromStr for DebuginfoKind { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "dwarf" => DebuginfoKind::Dwarf, - "dwarf-dsym" => DebuginfoKind::DwarfDsym, - "pdb" => DebuginfoKind::Pdb, - _ => { - return Err(format!( - "'{s}' is not a valid value for debuginfo-kind. Use 'dwarf', \ - 'dwarf-dsym' or 'pdb'." - )); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(DebuginfoKind); - -impl ToJson for DebuginfoKind { - fn to_json(&self) -> Json { - self.as_str().to_json() - } -} - -impl fmt::Display for DebuginfoKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.as_str()) - } -} - -#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)] -pub enum SplitDebuginfo { - /// Split debug-information is disabled, meaning that on supported platforms - /// you can find all debug information in the executable itself. This is - /// only supported for ELF effectively. - /// - /// * Windows - not supported - /// * macOS - don't run `dsymutil` - /// * ELF - `.debug_*` sections - #[default] - Off, - - /// Split debug-information can be found in a "packed" location separate - /// from the final artifact. This is supported on all platforms. +crate::target_spec_enum! { + /// Which kind of debuginfo does the target use? /// - /// * Windows - `*.pdb` - /// * macOS - `*.dSYM` (run `dsymutil`) - /// * ELF - `*.dwp` (run `thorin`) - Packed, - - /// Split debug-information can be found in individual object files on the - /// filesystem. The main executable may point to the object files. - /// - /// * Windows - not supported - /// * macOS - supported, scattered object files - /// * ELF - supported, scattered `*.dwo` or `*.o` files (see `SplitDwarfKind`) - Unpacked, -} - -impl SplitDebuginfo { - fn as_str(&self) -> &'static str { - match self { - SplitDebuginfo::Off => "off", - SplitDebuginfo::Packed => "packed", - SplitDebuginfo::Unpacked => "unpacked", - } - } -} - -impl FromStr for SplitDebuginfo { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s { - "off" => SplitDebuginfo::Off, - "unpacked" => SplitDebuginfo::Unpacked, - "packed" => SplitDebuginfo::Packed, - _ => { - return Err(format!( - "'{s}' is not a valid value for \ - split-debuginfo. Use 'off', 'unpacked', or 'packed'.", - )); - } - }) - } -} - -crate::json::serde_deserialize_from_str!(SplitDebuginfo); - -impl ToJson for SplitDebuginfo { - fn to_json(&self) -> Json { - self.as_str().to_json() - } -} - -impl fmt::Display for SplitDebuginfo { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.as_str()) - } + /// Useful in determining whether a target supports Split DWARF (a target with + /// `DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example). + #[derive(Default)] + pub enum DebuginfoKind { + /// DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`). + #[default] + Dwarf = "dwarf", + /// DWARF debuginfo in dSYM files (such as on Apple platforms). + DwarfDsym = "dwarf-dsym", + /// Program database files (such as on Windows). + Pdb = "pdb", + } + + parse_error_type = "debuginfo kind"; +} + +crate::target_spec_enum! { + #[derive(Default)] + pub enum SplitDebuginfo { + /// Split debug-information is disabled, meaning that on supported platforms + /// you can find all debug information in the executable itself. This is + /// only supported for ELF effectively. + /// + /// * Windows - not supported + /// * macOS - don't run `dsymutil` + /// * ELF - `.debug_*` sections + #[default] + Off = "off", + + /// Split debug-information can be found in a "packed" location separate + /// from the final artifact. This is supported on all platforms. + /// + /// * Windows - `*.pdb` + /// * macOS - `*.dSYM` (run `dsymutil`) + /// * ELF - `*.dwp` (run `thorin`) + Packed = "packed", + + /// Split debug-information can be found in individual object files on the + /// filesystem. The main executable may point to the object files. + /// + /// * Windows - not supported + /// * macOS - supported, scattered object files + /// * ELF - supported, scattered `*.dwo` or `*.o` files (see `SplitDwarfKind`) + Unpacked = "unpacked", + } + + parse_error_type = "split debuginfo"; } into_diag_arg_using_display!(SplitDebuginfo); @@ -1699,17 +1246,20 @@ impl ToJson for SanitizerSet { } } -#[derive(Clone, Copy, PartialEq, Hash, Debug)] -pub enum FramePointer { - /// Forces the machine code generator to always preserve the frame pointers. - Always, - /// Forces the machine code generator to preserve the frame pointers except for the leaf - /// functions (i.e. those that don't call other functions). - NonLeaf, - /// Allows the machine code generator to omit the frame pointers. - /// - /// This option does not guarantee that the frame pointers will be omitted. - MayOmit, +crate::target_spec_enum! { + pub enum FramePointer { + /// Forces the machine code generator to always preserve the frame pointers. + Always = "always", + /// Forces the machine code generator to preserve the frame pointers except for the leaf + /// functions (i.e. those that don't call other functions). + NonLeaf = "non-leaf", + /// Allows the machine code generator to omit the frame pointers. + /// + /// This option does not guarantee that the frame pointers will be omitted. + MayOmit = "may-omit", + } + + parse_error_type = "frame pointer"; } impl FramePointer { @@ -1726,93 +1276,43 @@ impl FramePointer { } } -impl FromStr for FramePointer { - type Err = String; - fn from_str(s: &str) -> Result { - Ok(match s { - "always" => Self::Always, - "non-leaf" => Self::NonLeaf, - "may-omit" => Self::MayOmit, - _ => return Err(format!("'{s}' is not a valid value for frame-pointer")), - }) - } -} - -crate::json::serde_deserialize_from_str!(FramePointer); - -impl ToJson for FramePointer { - fn to_json(&self) -> Json { - match *self { - Self::Always => "always", - Self::NonLeaf => "non-leaf", - Self::MayOmit => "may-omit", - } - .to_json() - } -} - -/// Controls use of stack canaries. -#[derive(Clone, Copy, Debug, PartialEq, Hash, Eq)] -pub enum StackProtector { - /// Disable stack canary generation. - None, +crate::target_spec_enum! { + /// Controls use of stack canaries. + pub enum StackProtector { + /// Disable stack canary generation. + None = "none", - /// On LLVM, mark all generated LLVM functions with the `ssp` attribute (see - /// llvm/docs/LangRef.rst). This triggers stack canary generation in - /// functions which contain an array of a byte-sized type with more than - /// eight elements. - Basic, + /// On LLVM, mark all generated LLVM functions with the `ssp` attribute (see + /// llvm/docs/LangRef.rst). This triggers stack canary generation in + /// functions which contain an array of a byte-sized type with more than + /// eight elements. + Basic = "basic", - /// On LLVM, mark all generated LLVM functions with the `sspstrong` - /// attribute (see llvm/docs/LangRef.rst). This triggers stack canary - /// generation in functions which either contain an array, or which take - /// the address of a local variable. - Strong, + /// On LLVM, mark all generated LLVM functions with the `sspstrong` + /// attribute (see llvm/docs/LangRef.rst). This triggers stack canary + /// generation in functions which either contain an array, or which take + /// the address of a local variable. + Strong = "strong", - /// Generate stack canaries in all functions. - All, -} - -impl StackProtector { - fn as_str(&self) -> &'static str { - match self { - StackProtector::None => "none", - StackProtector::Basic => "basic", - StackProtector::Strong => "strong", - StackProtector::All => "all", - } + /// Generate stack canaries in all functions. + All = "all", } -} - -impl FromStr for StackProtector { - type Err = (); - fn from_str(s: &str) -> Result { - Ok(match s { - "none" => StackProtector::None, - "basic" => StackProtector::Basic, - "strong" => StackProtector::Strong, - "all" => StackProtector::All, - _ => return Err(()), - }) - } -} - -impl fmt::Display for StackProtector { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.as_str()) - } + parse_error_type = "stack protector"; } into_diag_arg_using_display!(StackProtector); -#[derive(PartialEq, Clone, Debug)] -pub enum BinaryFormat { - Coff, - Elf, - MachO, - Wasm, - Xcoff, +crate::target_spec_enum! { + pub enum BinaryFormat { + Coff = "coff", + Elf = "elf", + MachO = "mach-o", + Wasm = "wasm", + Xcoff = "xcoff", + } + + parse_error_type = "binary format"; } impl BinaryFormat { @@ -1828,37 +1328,6 @@ impl BinaryFormat { } } -impl FromStr for BinaryFormat { - type Err = String; - fn from_str(s: &str) -> Result { - match s { - "coff" => Ok(Self::Coff), - "elf" => Ok(Self::Elf), - "mach-o" => Ok(Self::MachO), - "wasm" => Ok(Self::Wasm), - "xcoff" => Ok(Self::Xcoff), - _ => Err(format!( - "'{s}' is not a valid value for binary_format. \ - Use 'coff', 'elf', 'mach-o', 'wasm' or 'xcoff' " - )), - } - } -} - -crate::json::serde_deserialize_from_str!(BinaryFormat); - -impl ToJson for BinaryFormat { - fn to_json(&self) -> Json { - match self { - Self::Coff => "coff", - Self::Elf => "elf", - Self::MachO => "mach-o", - Self::Wasm => "wasm", - Self::Xcoff => "xcoff", - } - .to_json() - } -} impl ToJson for Align { fn to_json(&self) -> Json { -- cgit 1.4.1-3-g733a5 From 957fa10d50787a4c6c6d8a35be5af6bd43ba1770 Mon Sep 17 00:00:00 2001 From: Oneirical Date: Wed, 20 Aug 2025 14:02:50 -0400 Subject: Add test batch 3 --- tests/ui/abi/invalid-self-parameter-type-56806.rs | 7 ++ .../abi/invalid-self-parameter-type-56806.stderr | 12 +++ .../traits-associated-consts-ice-56870.rs | 39 ++++++++ .../duplicate-associated-type-resolution-59326.rs | 27 ++++++ .../impl-trait-member-type-resolution-57399.rs | 22 +++++ tests/ui/binop/function-comparison-errors-59488.rs | 35 +++++++ .../binop/function-comparison-errors-59488.stderr | 105 +++++++++++++++++++++ tests/ui/box/boxed-value-matching-57741.rs | 19 ++++ tests/ui/box/boxed-value-matching-57741.stderr | 25 +++++ .../dereferencing-boxed-enum-in-match-57741.fixed | 32 +++++++ .../box/dereferencing-boxed-enum-in-match-57741.rs | 32 +++++++ .../dereferencing-boxed-enum-in-match-57741.stderr | 63 +++++++++++++ .../generic-typed-nested-closures-59494.rs | 24 +++++ .../generic-typed-nested-closures-59494.stderr | 9 ++ .../mono-item-collector-default-impl-58375.rs | 25 +++++ .../trait-implementation-coherence-check-57162.rs | 8 ++ tests/ui/consts/oncecell-const-init-57781.rs | 21 +++++ .../impl-copy-function-debuginfo-58463.rs | 10 ++ .../spurious-dyn-compat-errors-58734.rs | 25 +++++ .../spurious-dyn-compat-errors-58734.stderr | 42 +++++++++ .../generic-associated-type-deref-target-56237.rs | 14 +++ .../hrtb-associated-type-leak-check-55731.rs | 53 +++++++++++ .../hrtb-associated-type-leak-check-55731.stderr | 14 +++ .../ui/imports/auxiliary/reexported-trait-56175.rs | 17 ++++ ...e-types-suggested-without-extern-crate-56175.rs | 10 ++ ...pes-suggested-without-extern-crate-56175.stderr | 46 +++++++++ tests/ui/infinite/auxiliary/aux-57271-lib.rs | 11 +++ .../mutually-recursive-infinite-types-57271.rs | 25 +++++ .../mutually-recursive-infinite-types-57271.stderr | 27 ++++++ tests/ui/issues/auxiliary/issue-56943.rs | 3 - tests/ui/issues/auxiliary/issue-57271-lib.rs | 11 --- tests/ui/issues/issue-55587.rs | 5 - tests/ui/issues/issue-55587.stderr | 11 --- tests/ui/issues/issue-55731.rs | 52 ---------- tests/ui/issues/issue-55731.stderr | 14 --- tests/ui/issues/issue-56128.rs | 15 --- tests/ui/issues/issue-56175.rs | 9 -- tests/ui/issues/issue-56175.stderr | 46 --------- tests/ui/issues/issue-56199.rs | 22 ----- tests/ui/issues/issue-56199.stderr | 30 ------ tests/ui/issues/issue-56229.rs | 35 ------- tests/ui/issues/issue-56237.rs | 13 --- tests/ui/issues/issue-56806.rs | 6 -- tests/ui/issues/issue-56806.stderr | 12 --- tests/ui/issues/issue-56835.rs | 9 -- tests/ui/issues/issue-56835.stderr | 15 --- tests/ui/issues/issue-56870.rs | 38 -------- tests/ui/issues/issue-56943.rs | 8 -- tests/ui/issues/issue-56943.stderr | 11 --- tests/ui/issues/issue-57156.rs | 23 ----- tests/ui/issues/issue-57162.rs | 7 -- tests/ui/issues/issue-57198-pass.rs | 9 -- tests/ui/issues/issue-57271.rs | 24 ----- tests/ui/issues/issue-57271.stderr | 27 ------ .../issues/issue-57399-self-return-impl-trait.rs | 22 ----- .../issue-57741-1.rs | 18 ---- .../issue-57741-1.stderr | 25 ----- .../issue-57741.fixed | 31 ------ .../issue-57741.rs | 31 ------ .../issue-57741.stderr | 63 ------------- tests/ui/issues/issue-57781.rs | 20 ---- tests/ui/issues/issue-57924.rs | 10 -- tests/ui/issues/issue-57924.stderr | 11 --- tests/ui/issues/issue-58212.rs | 15 --- .../issue-58375-monomorphize-default-impls.rs | 24 ----- tests/ui/issues/issue-58463.rs | 9 -- tests/ui/issues/issue-58712.rs | 14 --- tests/ui/issues/issue-58712.stderr | 20 ---- tests/ui/issues/issue-58734.rs | 24 ----- tests/ui/issues/issue-58734.stderr | 42 --------- tests/ui/issues/issue-58857.rs | 7 -- tests/ui/issues/issue-58857.stderr | 8 -- tests/ui/issues/issue-59020.rs | 27 ------ tests/ui/issues/issue-59326.rs | 26 ----- tests/ui/issues/issue-59488.rs | 34 ------- tests/ui/issues/issue-59488.stderr | 105 --------------------- tests/ui/issues/issue-59494.rs | 23 ----- tests/ui/issues/issue-59494.stderr | 9 -- tests/ui/issues/issue-59756.fixed | 17 ---- tests/ui/issues/issue-59756.rs | 21 ----- tests/ui/issues/issue-59756.stderr | 20 ---- .../keyword/raw-identifier-for-function-57198.rs | 10 ++ tests/ui/mismatched_types/auxiliary/aux-56943.rs | 3 + .../type-mismatch-in-extern-crate-56943.rs | 9 ++ .../type-mismatch-in-extern-crate-56943.stderr | 11 +++ .../modules/pub-use-handling-in-modules-56128.rs | 15 +++ .../ui/parser/invalid-variable-definition-55587.rs | 6 ++ .../invalid-variable-definition-55587.stderr | 11 +++ tests/ui/resolve/missing-type-in-scope-58712.rs | 15 +++ .../ui/resolve/missing-type-in-scope-58712.stderr | 20 ++++ tests/ui/std/park-timeout-wakeup-59020.rs | 28 ++++++ tests/ui/structs/invalid-self-constructor-56835.rs | 10 ++ .../structs/invalid-self-constructor-56835.stderr | 15 +++ ...ncompatible-types-in-try-expression-59756.fixed | 17 ++++ .../incompatible-types-in-try-expression-59756.rs | 22 +++++ ...compatible-types-in-try-expression-59756.stderr | 20 ++++ .../negative-bound-not-supported-58857.rs | 8 ++ .../negative-bound-not-supported-58857.stderr | 8 ++ .../generic-trait-impl-aliased-array-58212.rs | 16 ++++ .../traits/trait-object-lifetime-bounds-57156.rs | 24 +++++ .../traits/trait-objects-with-supertraits-56229.rs | 36 +++++++ ...self-constructor-type-args-not-allowed-57924.rs | 11 +++ ...-constructor-type-args-not-allowed-57924.stderr | 11 +++ .../ui/typeck/self-constructor-type-error-56199.rs | 23 +++++ .../self-constructor-type-error-56199.stderr | 30 ++++++ 105 files changed, 1178 insertions(+), 1131 deletions(-) create mode 100644 tests/ui/abi/invalid-self-parameter-type-56806.rs create mode 100644 tests/ui/abi/invalid-self-parameter-type-56806.stderr create mode 100644 tests/ui/associated-consts/traits-associated-consts-ice-56870.rs create mode 100644 tests/ui/associated-types/duplicate-associated-type-resolution-59326.rs create mode 100644 tests/ui/associated-types/impl-trait-member-type-resolution-57399.rs create mode 100644 tests/ui/binop/function-comparison-errors-59488.rs create mode 100644 tests/ui/binop/function-comparison-errors-59488.stderr create mode 100644 tests/ui/box/boxed-value-matching-57741.rs create mode 100644 tests/ui/box/boxed-value-matching-57741.stderr create mode 100644 tests/ui/box/dereferencing-boxed-enum-in-match-57741.fixed create mode 100644 tests/ui/box/dereferencing-boxed-enum-in-match-57741.rs create mode 100644 tests/ui/box/dereferencing-boxed-enum-in-match-57741.stderr create mode 100644 tests/ui/closures/generic-typed-nested-closures-59494.rs create mode 100644 tests/ui/closures/generic-typed-nested-closures-59494.stderr create mode 100644 tests/ui/codegen/mono-item-collector-default-impl-58375.rs create mode 100644 tests/ui/coherence/trait-implementation-coherence-check-57162.rs create mode 100644 tests/ui/consts/oncecell-const-init-57781.rs create mode 100644 tests/ui/debuginfo/impl-copy-function-debuginfo-58463.rs create mode 100644 tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.rs create mode 100644 tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.stderr create mode 100644 tests/ui/generics/generic-associated-type-deref-target-56237.rs create mode 100644 tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.rs create mode 100644 tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.stderr create mode 100644 tests/ui/imports/auxiliary/reexported-trait-56175.rs create mode 100644 tests/ui/imports/private-types-suggested-without-extern-crate-56175.rs create mode 100644 tests/ui/imports/private-types-suggested-without-extern-crate-56175.stderr create mode 100644 tests/ui/infinite/auxiliary/aux-57271-lib.rs create mode 100644 tests/ui/infinite/mutually-recursive-infinite-types-57271.rs create mode 100644 tests/ui/infinite/mutually-recursive-infinite-types-57271.stderr delete mode 100644 tests/ui/issues/auxiliary/issue-56943.rs delete mode 100644 tests/ui/issues/auxiliary/issue-57271-lib.rs delete mode 100644 tests/ui/issues/issue-55587.rs delete mode 100644 tests/ui/issues/issue-55587.stderr delete mode 100644 tests/ui/issues/issue-55731.rs delete mode 100644 tests/ui/issues/issue-55731.stderr delete mode 100644 tests/ui/issues/issue-56128.rs delete mode 100644 tests/ui/issues/issue-56175.rs delete mode 100644 tests/ui/issues/issue-56175.stderr delete mode 100644 tests/ui/issues/issue-56199.rs delete mode 100644 tests/ui/issues/issue-56199.stderr delete mode 100644 tests/ui/issues/issue-56229.rs delete mode 100644 tests/ui/issues/issue-56237.rs delete mode 100644 tests/ui/issues/issue-56806.rs delete mode 100644 tests/ui/issues/issue-56806.stderr delete mode 100644 tests/ui/issues/issue-56835.rs delete mode 100644 tests/ui/issues/issue-56835.stderr delete mode 100644 tests/ui/issues/issue-56870.rs delete mode 100644 tests/ui/issues/issue-56943.rs delete mode 100644 tests/ui/issues/issue-56943.stderr delete mode 100644 tests/ui/issues/issue-57156.rs delete mode 100644 tests/ui/issues/issue-57162.rs delete mode 100644 tests/ui/issues/issue-57198-pass.rs delete mode 100644 tests/ui/issues/issue-57271.rs delete mode 100644 tests/ui/issues/issue-57271.stderr delete mode 100644 tests/ui/issues/issue-57399-self-return-impl-trait.rs delete mode 100644 tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.rs delete mode 100644 tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.stderr delete mode 100644 tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.fixed delete mode 100644 tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.rs delete mode 100644 tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.stderr delete mode 100644 tests/ui/issues/issue-57781.rs delete mode 100644 tests/ui/issues/issue-57924.rs delete mode 100644 tests/ui/issues/issue-57924.stderr delete mode 100644 tests/ui/issues/issue-58212.rs delete mode 100644 tests/ui/issues/issue-58375-monomorphize-default-impls.rs delete mode 100644 tests/ui/issues/issue-58463.rs delete mode 100644 tests/ui/issues/issue-58712.rs delete mode 100644 tests/ui/issues/issue-58712.stderr delete mode 100644 tests/ui/issues/issue-58734.rs delete mode 100644 tests/ui/issues/issue-58734.stderr delete mode 100644 tests/ui/issues/issue-58857.rs delete mode 100644 tests/ui/issues/issue-58857.stderr delete mode 100644 tests/ui/issues/issue-59020.rs delete mode 100644 tests/ui/issues/issue-59326.rs delete mode 100644 tests/ui/issues/issue-59488.rs delete mode 100644 tests/ui/issues/issue-59488.stderr delete mode 100644 tests/ui/issues/issue-59494.rs delete mode 100644 tests/ui/issues/issue-59494.stderr delete mode 100644 tests/ui/issues/issue-59756.fixed delete mode 100644 tests/ui/issues/issue-59756.rs delete mode 100644 tests/ui/issues/issue-59756.stderr create mode 100644 tests/ui/keyword/raw-identifier-for-function-57198.rs create mode 100644 tests/ui/mismatched_types/auxiliary/aux-56943.rs create mode 100644 tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.rs create mode 100644 tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.stderr create mode 100644 tests/ui/modules/pub-use-handling-in-modules-56128.rs create mode 100644 tests/ui/parser/invalid-variable-definition-55587.rs create mode 100644 tests/ui/parser/invalid-variable-definition-55587.stderr create mode 100644 tests/ui/resolve/missing-type-in-scope-58712.rs create mode 100644 tests/ui/resolve/missing-type-in-scope-58712.stderr create mode 100644 tests/ui/std/park-timeout-wakeup-59020.rs create mode 100644 tests/ui/structs/invalid-self-constructor-56835.rs create mode 100644 tests/ui/structs/invalid-self-constructor-56835.stderr create mode 100644 tests/ui/suggestions/incompatible-types-in-try-expression-59756.fixed create mode 100644 tests/ui/suggestions/incompatible-types-in-try-expression-59756.rs create mode 100644 tests/ui/suggestions/incompatible-types-in-try-expression-59756.stderr create mode 100644 tests/ui/trait-bounds/negative-bound-not-supported-58857.rs create mode 100644 tests/ui/trait-bounds/negative-bound-not-supported-58857.stderr create mode 100644 tests/ui/traits/generic-trait-impl-aliased-array-58212.rs create mode 100644 tests/ui/traits/trait-object-lifetime-bounds-57156.rs create mode 100644 tests/ui/traits/trait-objects-with-supertraits-56229.rs create mode 100644 tests/ui/typeck/self-constructor-type-args-not-allowed-57924.rs create mode 100644 tests/ui/typeck/self-constructor-type-args-not-allowed-57924.stderr create mode 100644 tests/ui/typeck/self-constructor-type-error-56199.rs create mode 100644 tests/ui/typeck/self-constructor-type-error-56199.stderr diff --git a/tests/ui/abi/invalid-self-parameter-type-56806.rs b/tests/ui/abi/invalid-self-parameter-type-56806.rs new file mode 100644 index 00000000000..60229df3005 --- /dev/null +++ b/tests/ui/abi/invalid-self-parameter-type-56806.rs @@ -0,0 +1,7 @@ +// https://github.com/rust-lang/rust/issues/56806 +pub trait Trait { + fn dyn_instead_of_self(self: Box); + //~^ ERROR invalid `self` parameter type +} + +pub fn main() {} diff --git a/tests/ui/abi/invalid-self-parameter-type-56806.stderr b/tests/ui/abi/invalid-self-parameter-type-56806.stderr new file mode 100644 index 00000000000..ac249b8f108 --- /dev/null +++ b/tests/ui/abi/invalid-self-parameter-type-56806.stderr @@ -0,0 +1,12 @@ +error[E0307]: invalid `self` parameter type: `Box<(dyn Trait + 'static)>` + --> $DIR/invalid-self-parameter-type-56806.rs:3:34 + | +LL | fn dyn_instead_of_self(self: Box); + | ^^^^^^^^^^^^^^ + | + = note: type of `self` must be `Self` or a type that dereferences to it + = help: consider changing to `self`, `&self`, `&mut self`, `self: Box`, `self: Rc`, `self: Arc`, or `self: Pin

` (where P is one of the previous types except `Self`) + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0307`. diff --git a/tests/ui/associated-consts/traits-associated-consts-ice-56870.rs b/tests/ui/associated-consts/traits-associated-consts-ice-56870.rs new file mode 100644 index 00000000000..0c5a2b84773 --- /dev/null +++ b/tests/ui/associated-consts/traits-associated-consts-ice-56870.rs @@ -0,0 +1,39 @@ +// https://github.com/rust-lang/rust/issues/56870 +//@ build-pass +// Regression test for #56870: Internal compiler error (traits & associated consts) + +use std::fmt::Debug; + +pub trait Foo { + const FOO: *const u8; +} + +impl Foo for dyn Debug { + const FOO: *const u8 = ::fmt as *const u8; +} + +pub trait Bar { + const BAR: *const u8; +} + +pub trait Baz { + type Data: Debug; +} + +pub struct BarStruct(S); + +impl Bar for BarStruct { + const BAR: *const u8 = ::Data>>::FOO; +} + +struct AnotherStruct; +#[derive(Debug)] +struct SomeStruct; + +impl Baz for AnotherStruct { + type Data = SomeStruct; +} + +fn main() { + let _x = as Bar>::BAR; +} diff --git a/tests/ui/associated-types/duplicate-associated-type-resolution-59326.rs b/tests/ui/associated-types/duplicate-associated-type-resolution-59326.rs new file mode 100644 index 00000000000..0439e229e14 --- /dev/null +++ b/tests/ui/associated-types/duplicate-associated-type-resolution-59326.rs @@ -0,0 +1,27 @@ +// https://github.com/rust-lang/rust/issues/59326 +//@ check-pass +trait Service { + type S; +} + +trait Framing { + type F; +} + +impl Framing for () { + type F = (); +} + +trait HttpService: Service {} + +type BoxService = Box>; + +fn build_server BoxService>(_: F) {} + +fn make_server() -> Box> { + unimplemented!() +} + +fn main() { + build_server(|| make_server()) +} diff --git a/tests/ui/associated-types/impl-trait-member-type-resolution-57399.rs b/tests/ui/associated-types/impl-trait-member-type-resolution-57399.rs new file mode 100644 index 00000000000..3342dd0631a --- /dev/null +++ b/tests/ui/associated-types/impl-trait-member-type-resolution-57399.rs @@ -0,0 +1,22 @@ +// https://github.com/rust-lang/rust/issues/57399 +//@ check-pass + +trait T { + type T; +} + +impl T for i32 { + type T = u32; +} + +struct S { + a: A, +} + +impl From for S<::T> { + fn from(a: u32) -> Self { + Self { a } + } +} + +fn main() {} diff --git a/tests/ui/binop/function-comparison-errors-59488.rs b/tests/ui/binop/function-comparison-errors-59488.rs new file mode 100644 index 00000000000..8ded781ef95 --- /dev/null +++ b/tests/ui/binop/function-comparison-errors-59488.rs @@ -0,0 +1,35 @@ +// https://github.com/rust-lang/rust/issues/59488 +fn foo() -> i32 { + 42 +} + +fn bar(a: i64) -> i64 { + 43 +} + +enum Foo { + Bar(usize), +} + +fn main() { + foo > 12; + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + //~| ERROR mismatched types [E0308] + + bar > 13; + //~^ ERROR binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` [E0369] + //~| ERROR mismatched types [E0308] + + foo > foo; + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + + foo > bar; + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + //~| ERROR mismatched types [E0308] + + let i = Foo::Bar; + assert_eq!(Foo::Bar, i); + //~^ ERROR binary operation `==` cannot be applied to type `fn(usize) -> Foo {Foo::Bar}` [E0369] + //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] + //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] +} diff --git a/tests/ui/binop/function-comparison-errors-59488.stderr b/tests/ui/binop/function-comparison-errors-59488.stderr new file mode 100644 index 00000000000..615458bc45b --- /dev/null +++ b/tests/ui/binop/function-comparison-errors-59488.stderr @@ -0,0 +1,105 @@ +error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` + --> $DIR/function-comparison-errors-59488.rs:15:9 + | +LL | foo > 12; + | --- ^ -- {integer} + | | + | fn() -> i32 {foo} + | +help: use parentheses to call this function + | +LL | foo() > 12; + | ++ + +error[E0308]: mismatched types + --> $DIR/function-comparison-errors-59488.rs:15:11 + | +LL | foo > 12; + | ^^ expected fn item, found `i32` + | + = note: expected fn item `fn() -> i32 {foo}` + found type `i32` + +error[E0369]: binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` + --> $DIR/function-comparison-errors-59488.rs:19:9 + | +LL | bar > 13; + | --- ^ -- {integer} + | | + | fn(i64) -> i64 {bar} + | +help: use parentheses to call this function + | +LL | bar(/* i64 */) > 13; + | +++++++++++ + +error[E0308]: mismatched types + --> $DIR/function-comparison-errors-59488.rs:19:11 + | +LL | bar > 13; + | ^^ expected fn item, found `i64` + | + = note: expected fn item `fn(i64) -> i64 {bar}` + found type `i64` + +error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` + --> $DIR/function-comparison-errors-59488.rs:23:9 + | +LL | foo > foo; + | --- ^ --- fn() -> i32 {foo} + | | + | fn() -> i32 {foo} + | +help: use parentheses to call these + | +LL | foo() > foo(); + | ++ ++ + +error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` + --> $DIR/function-comparison-errors-59488.rs:26:9 + | +LL | foo > bar; + | --- ^ --- fn(i64) -> i64 {bar} + | | + | fn() -> i32 {foo} + +error[E0308]: mismatched types + --> $DIR/function-comparison-errors-59488.rs:26:11 + | +LL | foo > bar; + | ^^^ expected fn item, found a different fn item + | + = note: expected fn item `fn() -> i32 {foo}` + found fn item `fn(i64) -> i64 {bar}` + +error[E0369]: binary operation `==` cannot be applied to type `fn(usize) -> Foo {Foo::Bar}` + --> $DIR/function-comparison-errors-59488.rs:31:5 + | +LL | assert_eq!(Foo::Bar, i); + | ^^^^^^^^^^^^^^^^^^^^^^^ + | | + | fn(usize) -> Foo {Foo::Bar} + | fn(usize) -> Foo {Foo::Bar} + | + = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` + --> $DIR/function-comparison-errors-59488.rs:31:5 + | +LL | assert_eq!(Foo::Bar, i); + | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for fn item `fn(usize) -> Foo {Foo::Bar}` + | + = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` + --> $DIR/function-comparison-errors-59488.rs:31:5 + | +LL | assert_eq!(Foo::Bar, i); + | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for fn item `fn(usize) -> Foo {Foo::Bar}` + | + = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 10 previous errors + +Some errors have detailed explanations: E0277, E0308, E0369. +For more information about an error, try `rustc --explain E0277`. diff --git a/tests/ui/box/boxed-value-matching-57741.rs b/tests/ui/box/boxed-value-matching-57741.rs new file mode 100644 index 00000000000..7e2f089dad8 --- /dev/null +++ b/tests/ui/box/boxed-value-matching-57741.rs @@ -0,0 +1,19 @@ +// https://github.com/rust-lang/rust/issues/57741 +#![allow(warnings)] + +// This tests that the `help: consider dereferencing the boxed value` suggestion isn't made +// because the box doesn't deref to the type of the arm. + +enum S { + A { a: usize }, + B { b: usize }, +} + +fn main() { + let x = Box::new(3u32); + let y = match x { + S::A { a } | S::B { b: a } => a, + //~^ ERROR mismatched types [E0308] + //~^^ ERROR mismatched types [E0308] + }; +} diff --git a/tests/ui/box/boxed-value-matching-57741.stderr b/tests/ui/box/boxed-value-matching-57741.stderr new file mode 100644 index 00000000000..33d7a6759ad --- /dev/null +++ b/tests/ui/box/boxed-value-matching-57741.stderr @@ -0,0 +1,25 @@ +error[E0308]: mismatched types + --> $DIR/boxed-value-matching-57741.rs:15:9 + | +LL | let y = match x { + | - this expression has type `Box` +LL | S::A { a } | S::B { b: a } => a, + | ^^^^^^^^^^ expected `Box`, found `S` + | + = note: expected struct `Box` + found enum `S` + +error[E0308]: mismatched types + --> $DIR/boxed-value-matching-57741.rs:15:22 + | +LL | let y = match x { + | - this expression has type `Box` +LL | S::A { a } | S::B { b: a } => a, + | ^^^^^^^^^^^^^ expected `Box`, found `S` + | + = note: expected struct `Box` + found enum `S` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/box/dereferencing-boxed-enum-in-match-57741.fixed b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.fixed new file mode 100644 index 00000000000..ee796b56272 --- /dev/null +++ b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.fixed @@ -0,0 +1,32 @@ +// https://github.com/rust-lang/rust/issues/57741 +//@ run-rustfix + +#![allow(warnings)] + +// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works. + +enum S { + A { a: usize }, + B { b: usize }, +} + +enum T { + A(usize), + B(usize), +} + +fn main() { + let x = Box::new(T::A(3)); + let y = match *x { + T::A(a) | T::B(a) => a, + //~^ ERROR mismatched types [E0308] + //~^^ ERROR mismatched types [E0308] + }; + + let x = Box::new(S::A { a: 3 }); + let y = match *x { + S::A { a } | S::B { b: a } => a, + //~^ ERROR mismatched types [E0308] + //~^^ ERROR mismatched types [E0308] + }; +} diff --git a/tests/ui/box/dereferencing-boxed-enum-in-match-57741.rs b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.rs new file mode 100644 index 00000000000..3a45a8b56ff --- /dev/null +++ b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.rs @@ -0,0 +1,32 @@ +// https://github.com/rust-lang/rust/issues/57741 +//@ run-rustfix + +#![allow(warnings)] + +// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works. + +enum S { + A { a: usize }, + B { b: usize }, +} + +enum T { + A(usize), + B(usize), +} + +fn main() { + let x = Box::new(T::A(3)); + let y = match x { + T::A(a) | T::B(a) => a, + //~^ ERROR mismatched types [E0308] + //~^^ ERROR mismatched types [E0308] + }; + + let x = Box::new(S::A { a: 3 }); + let y = match x { + S::A { a } | S::B { b: a } => a, + //~^ ERROR mismatched types [E0308] + //~^^ ERROR mismatched types [E0308] + }; +} diff --git a/tests/ui/box/dereferencing-boxed-enum-in-match-57741.stderr b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.stderr new file mode 100644 index 00000000000..c07387b21bd --- /dev/null +++ b/tests/ui/box/dereferencing-boxed-enum-in-match-57741.stderr @@ -0,0 +1,63 @@ +error[E0308]: mismatched types + --> $DIR/dereferencing-boxed-enum-in-match-57741.rs:21:9 + | +LL | let y = match x { + | - this expression has type `Box` +LL | T::A(a) | T::B(a) => a, + | ^^^^^^^ expected `Box`, found `T` + | + = note: expected struct `Box` + found enum `T` +help: consider dereferencing the boxed value + | +LL | let y = match *x { + | + + +error[E0308]: mismatched types + --> $DIR/dereferencing-boxed-enum-in-match-57741.rs:21:19 + | +LL | let y = match x { + | - this expression has type `Box` +LL | T::A(a) | T::B(a) => a, + | ^^^^^^^ expected `Box`, found `T` + | + = note: expected struct `Box` + found enum `T` +help: consider dereferencing the boxed value + | +LL | let y = match *x { + | + + +error[E0308]: mismatched types + --> $DIR/dereferencing-boxed-enum-in-match-57741.rs:28:9 + | +LL | let y = match x { + | - this expression has type `Box` +LL | S::A { a } | S::B { b: a } => a, + | ^^^^^^^^^^ expected `Box`, found `S` + | + = note: expected struct `Box` + found enum `S` +help: consider dereferencing the boxed value + | +LL | let y = match *x { + | + + +error[E0308]: mismatched types + --> $DIR/dereferencing-boxed-enum-in-match-57741.rs:28:22 + | +LL | let y = match x { + | - this expression has type `Box` +LL | S::A { a } | S::B { b: a } => a, + | ^^^^^^^^^^^^^ expected `Box`, found `S` + | + = note: expected struct `Box` + found enum `S` +help: consider dereferencing the boxed value + | +LL | let y = match *x { + | + + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/closures/generic-typed-nested-closures-59494.rs b/tests/ui/closures/generic-typed-nested-closures-59494.rs new file mode 100644 index 00000000000..04d7b00ff7f --- /dev/null +++ b/tests/ui/closures/generic-typed-nested-closures-59494.rs @@ -0,0 +1,24 @@ +// https://github.com/rust-lang/rust/issues/59494 +fn t7p(f: impl Fn(B) -> C, g: impl Fn(A) -> B) -> impl Fn(A) -> C { + move |a: A| -> C { f(g(a)) } +} + +fn t8n(f: impl Fn(A) -> B, g: impl Fn(A) -> C) -> impl Fn(A) -> (B, C) +where + A: Copy, +{ + move |a: A| -> (B, C) { + let b = a; + let fa = f(a); + let ga = g(b); + (fa, ga) + } +} + +fn main() { + let f = |(_, _)| {}; + let g = |(a, _)| a; + let t7 = |env| |a| |b| t7p(f, g)(((env, a), b)); + //~^ ERROR mismatched types + let t8 = t8n(t7, t7p(f, g)); +} diff --git a/tests/ui/closures/generic-typed-nested-closures-59494.stderr b/tests/ui/closures/generic-typed-nested-closures-59494.stderr new file mode 100644 index 00000000000..9706fea82a3 --- /dev/null +++ b/tests/ui/closures/generic-typed-nested-closures-59494.stderr @@ -0,0 +1,9 @@ +error[E0308]: mismatched types + --> $DIR/generic-typed-nested-closures-59494.rs:21:40 + | +LL | let t7 = |env| |a| |b| t7p(f, g)(((env, a), b)); + | ^^^ cyclic type of infinite size + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/codegen/mono-item-collector-default-impl-58375.rs b/tests/ui/codegen/mono-item-collector-default-impl-58375.rs new file mode 100644 index 00000000000..f00e79e0dc5 --- /dev/null +++ b/tests/ui/codegen/mono-item-collector-default-impl-58375.rs @@ -0,0 +1,25 @@ +// https://github.com/rust-lang/rust/issues/58375 +// Make sure that the mono-item collector does not crash when trying to +// instantiate a default impl for DecodeUtf16<::Item> +// See https://github.com/rust-lang/rust/issues/58375 + +//@ build-pass +//@ compile-flags:-C link-dead-code + +#![crate_type = "rlib"] + +pub struct DecodeUtf16(I); + +pub trait Arbitrary { + fn arbitrary() {} +} + +pub trait A { + type Item; +} + +impl A for u8 { + type Item = char; +} + +impl Arbitrary for DecodeUtf16<::Item> {} diff --git a/tests/ui/coherence/trait-implementation-coherence-check-57162.rs b/tests/ui/coherence/trait-implementation-coherence-check-57162.rs new file mode 100644 index 00000000000..a57e827ca8b --- /dev/null +++ b/tests/ui/coherence/trait-implementation-coherence-check-57162.rs @@ -0,0 +1,8 @@ +// https://github.com/rust-lang/rust/issues/57162 +//@ check-pass + +trait Foo {} +impl Foo for dyn Send {} + +impl Foo for T {} +fn main() {} diff --git a/tests/ui/consts/oncecell-const-init-57781.rs b/tests/ui/consts/oncecell-const-init-57781.rs new file mode 100644 index 00000000000..27426ef2549 --- /dev/null +++ b/tests/ui/consts/oncecell-const-init-57781.rs @@ -0,0 +1,21 @@ +// https://github.com/rust-lang/rust/issues/57781 +//@ run-pass + +use std::cell::UnsafeCell; +use std::collections::HashMap; + +struct OnceCell { + _value: UnsafeCell>, +} + +impl OnceCell { + const INIT: OnceCell = OnceCell { + _value: UnsafeCell::new(None), + }; +} + +pub fn crash() { + let _ = OnceCell::>::INIT; +} + +fn main() {} diff --git a/tests/ui/debuginfo/impl-copy-function-debuginfo-58463.rs b/tests/ui/debuginfo/impl-copy-function-debuginfo-58463.rs new file mode 100644 index 00000000000..72388c36ce4 --- /dev/null +++ b/tests/ui/debuginfo/impl-copy-function-debuginfo-58463.rs @@ -0,0 +1,10 @@ +// https://github.com/rust-lang/rust/issues/58463 +//@ run-pass +//@ compile-flags:-C debuginfo=2 + +fn foo() -> impl Copy { + foo +} +fn main() { + foo(); +} diff --git a/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.rs b/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.rs new file mode 100644 index 00000000000..3e9ebb497a2 --- /dev/null +++ b/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.rs @@ -0,0 +1,25 @@ +// https://github.com/rust-lang/rust/issues/58734 +trait Trait { + fn exists(self) -> (); + + fn dyn_incompatible() -> Self; +} + +impl Trait for () { + fn exists(self) -> () { + } + + fn dyn_incompatible() -> Self { + () + } +} + +fn main() { + // dyn-compatible or not, this call is OK + Trait::exists(()); + // no dyn-compatibility error + Trait::nonexistent(()); + //~^ WARN trait objects without an explicit `dyn` are deprecated + //~| WARN this is accepted in the current edition + //~| ERROR the trait `Trait` is not dyn compatible +} diff --git a/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.stderr b/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.stderr new file mode 100644 index 00000000000..140461283f3 --- /dev/null +++ b/tests/ui/dyn-compatibility/spurious-dyn-compat-errors-58734.stderr @@ -0,0 +1,42 @@ +warning: trait objects without an explicit `dyn` are deprecated + --> $DIR/spurious-dyn-compat-errors-58734.rs:21:5 + | +LL | Trait::nonexistent(()); + | ^^^^^ + | + = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! + = note: for more information, see + = note: `#[warn(bare_trait_objects)]` (part of `#[warn(rust_2021_compatibility)]`) on by default +help: if this is a dyn-compatible trait, use `dyn` + | +LL | ::nonexistent(()); + | ++++ + + +error[E0038]: the trait `Trait` is not dyn compatible + --> $DIR/spurious-dyn-compat-errors-58734.rs:21:5 + | +LL | Trait::nonexistent(()); + | ^^^^^ `Trait` is not dyn compatible + | +note: for a trait to be dyn compatible it needs to allow building a vtable + for more information, visit + --> $DIR/spurious-dyn-compat-errors-58734.rs:5:8 + | +LL | trait Trait { + | ----- this trait is not dyn compatible... +... +LL | fn dyn_incompatible() -> Self; + | ^^^^^^^^^^^^^^^^ ...because associated function `dyn_incompatible` has no `self` parameter + = help: only type `()` implements `Trait`; consider using it directly instead. +help: consider turning `dyn_incompatible` into a method by giving it a `&self` argument + | +LL | fn dyn_incompatible(&self) -> Self; + | +++++ +help: alternatively, consider constraining `dyn_incompatible` so it does not apply to trait objects + | +LL | fn dyn_incompatible() -> Self where Self: Sized; + | +++++++++++++++++ + +error: aborting due to 1 previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0038`. diff --git a/tests/ui/generics/generic-associated-type-deref-target-56237.rs b/tests/ui/generics/generic-associated-type-deref-target-56237.rs new file mode 100644 index 00000000000..2050ca377e8 --- /dev/null +++ b/tests/ui/generics/generic-associated-type-deref-target-56237.rs @@ -0,0 +1,14 @@ +// https://github.com/rust-lang/rust/issues/56237 +//@ run-pass + +use std::ops::Deref; + +fn foo

(_value:

::Target) +where + P: Deref, +

::Target: Sized, +{} + +fn main() { + foo::>(2); +} diff --git a/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.rs b/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.rs new file mode 100644 index 00000000000..978abd9fcf5 --- /dev/null +++ b/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.rs @@ -0,0 +1,53 @@ +// https://github.com/rust-lang/rust/issues/55731 +use std::marker::PhantomData; + +trait DistributedIterator { + fn reduce(self) + where + Self: Sized, + { + unreachable!() + } +} + +trait DistributedIteratorMulti { + type Item; +} + +struct Connect(PhantomData); +impl DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect where {} + +struct Cloned(PhantomData); +impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> { + type Item = (); +} + +struct Map { + i: I, + f: F, +} +impl, F, Source> DistributedIteratorMulti for Map +where + F: A<>::Item>, +{ + type Item = (); +} + +trait A {} + +struct X; +impl A<()> for X {} + +fn multi(_reducer: I) +where + I: for<'a> DistributedIteratorMulti<&'a ()>, +{ + DistributedIterator::reduce(Connect::(PhantomData)) +} + +fn main() { + multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough + i: Cloned(PhantomData), + f: X, + }); +} diff --git a/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.stderr b/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.stderr new file mode 100644 index 00000000000..40ac1d9d041 --- /dev/null +++ b/tests/ui/higher-ranked/hrtb-associated-type-leak-check-55731.stderr @@ -0,0 +1,14 @@ +error: implementation of `DistributedIteratorMulti` is not general enough + --> $DIR/hrtb-associated-type-leak-check-55731.rs:49:5 + | +LL | / multi(Map { +LL | | i: Cloned(PhantomData), +LL | | f: X, +LL | | }); + | |______^ implementation of `DistributedIteratorMulti` is not general enough + | + = note: `DistributedIteratorMulti<&'0 ()>` would have to be implemented for the type `Cloned<&()>`, for any lifetime `'0`... + = note: ...but `DistributedIteratorMulti<&'1 ()>` is actually implemented for the type `Cloned<&'1 ()>`, for some specific lifetime `'1` + +error: aborting due to 1 previous error + diff --git a/tests/ui/imports/auxiliary/reexported-trait-56175.rs b/tests/ui/imports/auxiliary/reexported-trait-56175.rs new file mode 100644 index 00000000000..51a991bef59 --- /dev/null +++ b/tests/ui/imports/auxiliary/reexported-trait-56175.rs @@ -0,0 +1,17 @@ +mod private { + pub trait Trait { + fn trait_method(&self) { + } + } + pub trait TraitB { + fn trait_method_b(&self) { + } + } +} + +pub struct FooStruct; +pub use crate::private::Trait; +impl crate::private::Trait for FooStruct {} + +pub use crate::private::TraitB as TraitBRename; +impl crate::private::TraitB for FooStruct {} diff --git a/tests/ui/imports/private-types-suggested-without-extern-crate-56175.rs b/tests/ui/imports/private-types-suggested-without-extern-crate-56175.rs new file mode 100644 index 00000000000..ce001edad1b --- /dev/null +++ b/tests/ui/imports/private-types-suggested-without-extern-crate-56175.rs @@ -0,0 +1,10 @@ +// https://github.com/rust-lang/rust/issues/56175 +//@ edition:2018 +//@ aux-crate:reexported_trait=reexported-trait-56175.rs + +fn main() { + reexported_trait::FooStruct.trait_method(); + //~^ ERROR + reexported_trait::FooStruct.trait_method_b(); + //~^ ERROR +} diff --git a/tests/ui/imports/private-types-suggested-without-extern-crate-56175.stderr b/tests/ui/imports/private-types-suggested-without-extern-crate-56175.stderr new file mode 100644 index 00000000000..1e8285c80ac --- /dev/null +++ b/tests/ui/imports/private-types-suggested-without-extern-crate-56175.stderr @@ -0,0 +1,46 @@ +error[E0599]: no method named `trait_method` found for struct `FooStruct` in the current scope + --> $DIR/private-types-suggested-without-extern-crate-56175.rs:6:33 + | +LL | reexported_trait::FooStruct.trait_method(); + | ^^^^^^^^^^^^ + | + ::: $DIR/auxiliary/reexported-trait-56175.rs:3:12 + | +LL | fn trait_method(&self) { + | ------------ the method is available for `FooStruct` here + | + = help: items from traits can only be used if the trait is in scope +help: trait `Trait` which provides `trait_method` is implemented but not in scope; perhaps you want to import it + | +LL + use reexported_trait_56175::Trait; + | +help: there is a method `trait_method_b` with a similar name + | +LL | reexported_trait::FooStruct.trait_method_b(); + | ++ + +error[E0599]: no method named `trait_method_b` found for struct `FooStruct` in the current scope + --> $DIR/private-types-suggested-without-extern-crate-56175.rs:8:33 + | +LL | reexported_trait::FooStruct.trait_method_b(); + | ^^^^^^^^^^^^^^ + | + ::: $DIR/auxiliary/reexported-trait-56175.rs:7:12 + | +LL | fn trait_method_b(&self) { + | -------------- the method is available for `FooStruct` here + | + = help: items from traits can only be used if the trait is in scope +help: trait `TraitB` which provides `trait_method_b` is implemented but not in scope; perhaps you want to import it + | +LL + use reexported_trait_56175::TraitBRename; + | +help: there is a method `trait_method` with a similar name + | +LL - reexported_trait::FooStruct.trait_method_b(); +LL + reexported_trait::FooStruct.trait_method(); + | + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0599`. diff --git a/tests/ui/infinite/auxiliary/aux-57271-lib.rs b/tests/ui/infinite/auxiliary/aux-57271-lib.rs new file mode 100644 index 00000000000..ff625668a9d --- /dev/null +++ b/tests/ui/infinite/auxiliary/aux-57271-lib.rs @@ -0,0 +1,11 @@ +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] +pub enum BaseType { + Byte, + Char, + Double, + Float, + Int, + Long, + Short, + Boolean, +} diff --git a/tests/ui/infinite/mutually-recursive-infinite-types-57271.rs b/tests/ui/infinite/mutually-recursive-infinite-types-57271.rs new file mode 100644 index 00000000000..cb20770b486 --- /dev/null +++ b/tests/ui/infinite/mutually-recursive-infinite-types-57271.rs @@ -0,0 +1,25 @@ +// https://github.com/rust-lang/rust/issues/57271 +//@ aux-build:aux-57271-lib.rs + +extern crate aux_57271_lib; + +use aux_57271_lib::BaseType; + +pub enum ObjectType { //~ ERROR recursive types `ObjectType` and `TypeSignature` have infinite size + Class(ClassTypeSignature), + Array(TypeSignature), + TypeVariable(()), +} + +pub struct ClassTypeSignature { + pub package: (), + pub class: (), + pub inner: (), +} + +pub enum TypeSignature { + Base(BaseType), + Object(ObjectType), +} + +fn main() {} diff --git a/tests/ui/infinite/mutually-recursive-infinite-types-57271.stderr b/tests/ui/infinite/mutually-recursive-infinite-types-57271.stderr new file mode 100644 index 00000000000..8bf1b470062 --- /dev/null +++ b/tests/ui/infinite/mutually-recursive-infinite-types-57271.stderr @@ -0,0 +1,27 @@ +error[E0072]: recursive types `ObjectType` and `TypeSignature` have infinite size + --> $DIR/mutually-recursive-infinite-types-57271.rs:8:1 + | +LL | pub enum ObjectType { + | ^^^^^^^^^^^^^^^^^^^ +LL | Class(ClassTypeSignature), +LL | Array(TypeSignature), + | ------------- recursive without indirection +... +LL | pub enum TypeSignature { + | ^^^^^^^^^^^^^^^^^^^^^^ +LL | Base(BaseType), +LL | Object(ObjectType), + | ---------- recursive without indirection + | +help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle + | +LL ~ Array(Box), +LL | TypeVariable(()), +... +LL | Base(BaseType), +LL ~ Object(Box), + | + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0072`. diff --git a/tests/ui/issues/auxiliary/issue-56943.rs b/tests/ui/issues/auxiliary/issue-56943.rs deleted file mode 100644 index 65b9beb91f9..00000000000 --- a/tests/ui/issues/auxiliary/issue-56943.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct S; -mod m { pub struct S; } -pub use crate::m::S as S2; diff --git a/tests/ui/issues/auxiliary/issue-57271-lib.rs b/tests/ui/issues/auxiliary/issue-57271-lib.rs deleted file mode 100644 index ff625668a9d..00000000000 --- a/tests/ui/issues/auxiliary/issue-57271-lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub enum BaseType { - Byte, - Char, - Double, - Float, - Int, - Long, - Short, - Boolean, -} diff --git a/tests/ui/issues/issue-55587.rs b/tests/ui/issues/issue-55587.rs deleted file mode 100644 index d9100cf555b..00000000000 --- a/tests/ui/issues/issue-55587.rs +++ /dev/null @@ -1,5 +0,0 @@ -use std::path::Path; - -fn main() { - let Path::new(); //~ ERROR expected tuple struct or tuple variant -} diff --git a/tests/ui/issues/issue-55587.stderr b/tests/ui/issues/issue-55587.stderr deleted file mode 100644 index 7a5d0e28100..00000000000 --- a/tests/ui/issues/issue-55587.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0164]: expected tuple struct or tuple variant, found associated function `Path::new` - --> $DIR/issue-55587.rs:4:9 - | -LL | let Path::new(); - | ^^^^^^^^^^^ `fn` calls are not allowed in patterns - | - = help: for more information, visit https://doc.rust-lang.org/book/ch19-00-patterns.html - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0164`. diff --git a/tests/ui/issues/issue-55731.rs b/tests/ui/issues/issue-55731.rs deleted file mode 100644 index 7b4f4e2cd3b..00000000000 --- a/tests/ui/issues/issue-55731.rs +++ /dev/null @@ -1,52 +0,0 @@ -use std::marker::PhantomData; - -trait DistributedIterator { - fn reduce(self) - where - Self: Sized, - { - unreachable!() - } -} - -trait DistributedIteratorMulti { - type Item; -} - -struct Connect(PhantomData); -impl DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect where {} - -struct Cloned(PhantomData); -impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> { - type Item = (); -} - -struct Map { - i: I, - f: F, -} -impl, F, Source> DistributedIteratorMulti for Map -where - F: A<>::Item>, -{ - type Item = (); -} - -trait A {} - -struct X; -impl A<()> for X {} - -fn multi(_reducer: I) -where - I: for<'a> DistributedIteratorMulti<&'a ()>, -{ - DistributedIterator::reduce(Connect::(PhantomData)) -} - -fn main() { - multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough - i: Cloned(PhantomData), - f: X, - }); -} diff --git a/tests/ui/issues/issue-55731.stderr b/tests/ui/issues/issue-55731.stderr deleted file mode 100644 index 2c38041642d..00000000000 --- a/tests/ui/issues/issue-55731.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: implementation of `DistributedIteratorMulti` is not general enough - --> $DIR/issue-55731.rs:48:5 - | -LL | / multi(Map { -LL | | i: Cloned(PhantomData), -LL | | f: X, -LL | | }); - | |______^ implementation of `DistributedIteratorMulti` is not general enough - | - = note: `DistributedIteratorMulti<&'0 ()>` would have to be implemented for the type `Cloned<&()>`, for any lifetime `'0`... - = note: ...but `DistributedIteratorMulti<&'1 ()>` is actually implemented for the type `Cloned<&'1 ()>`, for some specific lifetime `'1` - -error: aborting due to 1 previous error - diff --git a/tests/ui/issues/issue-56128.rs b/tests/ui/issues/issue-56128.rs deleted file mode 100644 index cc170f60250..00000000000 --- a/tests/ui/issues/issue-56128.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Regression test for #56128. When this `pub(super) use...` gets -// exploded in the HIR, we were not handling ids correctly. -// -//@ check-pass - -mod bar { - pub(super) use self::baz::{x, y}; - - mod baz { - pub fn x() { } - pub fn y() { } - } -} - -fn main() { } diff --git a/tests/ui/issues/issue-56175.rs b/tests/ui/issues/issue-56175.rs deleted file mode 100644 index daffe806a90..00000000000 --- a/tests/ui/issues/issue-56175.rs +++ /dev/null @@ -1,9 +0,0 @@ -//@ edition:2018 -//@ aux-crate:reexported_trait=reexported-trait.rs - -fn main() { - reexported_trait::FooStruct.trait_method(); - //~^ ERROR - reexported_trait::FooStruct.trait_method_b(); - //~^ ERROR -} diff --git a/tests/ui/issues/issue-56175.stderr b/tests/ui/issues/issue-56175.stderr deleted file mode 100644 index df4cd6ce8a7..00000000000 --- a/tests/ui/issues/issue-56175.stderr +++ /dev/null @@ -1,46 +0,0 @@ -error[E0599]: no method named `trait_method` found for struct `FooStruct` in the current scope - --> $DIR/issue-56175.rs:5:33 - | -LL | reexported_trait::FooStruct.trait_method(); - | ^^^^^^^^^^^^ - | - ::: $DIR/auxiliary/reexported-trait.rs:3:12 - | -LL | fn trait_method(&self) { - | ------------ the method is available for `FooStruct` here - | - = help: items from traits can only be used if the trait is in scope -help: trait `Trait` which provides `trait_method` is implemented but not in scope; perhaps you want to import it - | -LL + use reexported_trait::Trait; - | -help: there is a method `trait_method_b` with a similar name - | -LL | reexported_trait::FooStruct.trait_method_b(); - | ++ - -error[E0599]: no method named `trait_method_b` found for struct `FooStruct` in the current scope - --> $DIR/issue-56175.rs:7:33 - | -LL | reexported_trait::FooStruct.trait_method_b(); - | ^^^^^^^^^^^^^^ - | - ::: $DIR/auxiliary/reexported-trait.rs:7:12 - | -LL | fn trait_method_b(&self) { - | -------------- the method is available for `FooStruct` here - | - = help: items from traits can only be used if the trait is in scope -help: trait `TraitB` which provides `trait_method_b` is implemented but not in scope; perhaps you want to import it - | -LL + use reexported_trait::TraitBRename; - | -help: there is a method `trait_method` with a similar name - | -LL - reexported_trait::FooStruct.trait_method_b(); -LL + reexported_trait::FooStruct.trait_method(); - | - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0599`. diff --git a/tests/ui/issues/issue-56199.rs b/tests/ui/issues/issue-56199.rs deleted file mode 100644 index ba11582a9d5..00000000000 --- a/tests/ui/issues/issue-56199.rs +++ /dev/null @@ -1,22 +0,0 @@ -enum Foo {} -struct Bar {} - -impl Foo { - fn foo() { - let _ = Self; - //~^ ERROR the `Self` constructor can only be used with tuple or unit structs - let _ = Self(); - //~^ ERROR the `Self` constructor can only be used with tuple or unit structs - } -} - -impl Bar { - fn bar() { - let _ = Self; - //~^ ERROR the `Self` constructor can only be used with tuple or unit structs - let _ = Self(); - //~^ ERROR the `Self` constructor can only be used with tuple or unit structs - } -} - -fn main() {} diff --git a/tests/ui/issues/issue-56199.stderr b/tests/ui/issues/issue-56199.stderr deleted file mode 100644 index eb6d7005979..00000000000 --- a/tests/ui/issues/issue-56199.stderr +++ /dev/null @@ -1,30 +0,0 @@ -error: the `Self` constructor can only be used with tuple or unit structs - --> $DIR/issue-56199.rs:6:17 - | -LL | let _ = Self; - | ^^^^ - | - = help: did you mean to use one of the enum's variants? - -error: the `Self` constructor can only be used with tuple or unit structs - --> $DIR/issue-56199.rs:8:17 - | -LL | let _ = Self(); - | ^^^^^^ - | - = help: did you mean to use one of the enum's variants? - -error: the `Self` constructor can only be used with tuple or unit structs - --> $DIR/issue-56199.rs:15:17 - | -LL | let _ = Self; - | ^^^^ help: use curly brackets: `Self { /* fields */ }` - -error: the `Self` constructor can only be used with tuple or unit structs - --> $DIR/issue-56199.rs:17:17 - | -LL | let _ = Self(); - | ^^^^^^ help: use curly brackets: `Self { /* fields */ }` - -error: aborting due to 4 previous errors - diff --git a/tests/ui/issues/issue-56229.rs b/tests/ui/issues/issue-56229.rs deleted file mode 100644 index 1c6dd72ed2d..00000000000 --- a/tests/ui/issues/issue-56229.rs +++ /dev/null @@ -1,35 +0,0 @@ -//@ check-pass - -trait Mirror { - type Other; -} - -#[derive(Debug)] -struct Even(usize); -struct Odd; - -impl Mirror for Even { - type Other = Odd; -} - -impl Mirror for Odd { - type Other = Even; -} - -trait Dyn: AsRef<::Other> {} - -impl Dyn for Even {} - -impl AsRef for Even { - fn as_ref(&self) -> &Even { - self - } -} - -fn code(d: &dyn Dyn) -> &T::Other { - d.as_ref() -} - -fn main() { - println!("{:?}", code(&Even(22))); -} diff --git a/tests/ui/issues/issue-56237.rs b/tests/ui/issues/issue-56237.rs deleted file mode 100644 index 3c0a235f3ec..00000000000 --- a/tests/ui/issues/issue-56237.rs +++ /dev/null @@ -1,13 +0,0 @@ -//@ run-pass - -use std::ops::Deref; - -fn foo

(_value:

::Target) -where - P: Deref, -

::Target: Sized, -{} - -fn main() { - foo::>(2); -} diff --git a/tests/ui/issues/issue-56806.rs b/tests/ui/issues/issue-56806.rs deleted file mode 100644 index b1dac26d65a..00000000000 --- a/tests/ui/issues/issue-56806.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub trait Trait { - fn dyn_instead_of_self(self: Box); - //~^ ERROR invalid `self` parameter type -} - -pub fn main() {} diff --git a/tests/ui/issues/issue-56806.stderr b/tests/ui/issues/issue-56806.stderr deleted file mode 100644 index ec50d863758..00000000000 --- a/tests/ui/issues/issue-56806.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0307]: invalid `self` parameter type: `Box<(dyn Trait + 'static)>` - --> $DIR/issue-56806.rs:2:34 - | -LL | fn dyn_instead_of_self(self: Box); - | ^^^^^^^^^^^^^^ - | - = note: type of `self` must be `Self` or a type that dereferences to it - = help: consider changing to `self`, `&self`, `&mut self`, `self: Box`, `self: Rc`, `self: Arc`, or `self: Pin

` (where P is one of the previous types except `Self`) - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0307`. diff --git a/tests/ui/issues/issue-56835.rs b/tests/ui/issues/issue-56835.rs deleted file mode 100644 index 7132d15ee5f..00000000000 --- a/tests/ui/issues/issue-56835.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub struct Foo {} - -impl Foo { - fn bar(Self(foo): Self) {} - //~^ ERROR the `Self` constructor can only be used with tuple or unit structs - //~^^ ERROR expected tuple struct or tuple variant, found self constructor `Self` [E0164] -} - -fn main() {} diff --git a/tests/ui/issues/issue-56835.stderr b/tests/ui/issues/issue-56835.stderr deleted file mode 100644 index e949ae7b324..00000000000 --- a/tests/ui/issues/issue-56835.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: the `Self` constructor can only be used with tuple or unit structs - --> $DIR/issue-56835.rs:4:12 - | -LL | fn bar(Self(foo): Self) {} - | ^^^^^^^^^ help: use curly brackets: `Self { /* fields */ }` - -error[E0164]: expected tuple struct or tuple variant, found self constructor `Self` - --> $DIR/issue-56835.rs:4:12 - | -LL | fn bar(Self(foo): Self) {} - | ^^^^^^^^^ not a tuple struct or tuple variant - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0164`. diff --git a/tests/ui/issues/issue-56870.rs b/tests/ui/issues/issue-56870.rs deleted file mode 100644 index fc6deedd029..00000000000 --- a/tests/ui/issues/issue-56870.rs +++ /dev/null @@ -1,38 +0,0 @@ -//@ build-pass -// Regression test for #56870: Internal compiler error (traits & associated consts) - -use std::fmt::Debug; - -pub trait Foo { - const FOO: *const u8; -} - -impl Foo for dyn Debug { - const FOO: *const u8 = ::fmt as *const u8; -} - -pub trait Bar { - const BAR: *const u8; -} - -pub trait Baz { - type Data: Debug; -} - -pub struct BarStruct(S); - -impl Bar for BarStruct { - const BAR: *const u8 = ::Data>>::FOO; -} - -struct AnotherStruct; -#[derive(Debug)] -struct SomeStruct; - -impl Baz for AnotherStruct { - type Data = SomeStruct; -} - -fn main() { - let _x = as Bar>::BAR; -} diff --git a/tests/ui/issues/issue-56943.rs b/tests/ui/issues/issue-56943.rs deleted file mode 100644 index 9664567ec9e..00000000000 --- a/tests/ui/issues/issue-56943.rs +++ /dev/null @@ -1,8 +0,0 @@ -//@ aux-build:issue-56943.rs - -extern crate issue_56943; - -fn main() { - let _: issue_56943::S = issue_56943::S2; - //~^ ERROR mismatched types [E0308] -} diff --git a/tests/ui/issues/issue-56943.stderr b/tests/ui/issues/issue-56943.stderr deleted file mode 100644 index 60a2e92dc71..00000000000 --- a/tests/ui/issues/issue-56943.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/issue-56943.rs:6:29 - | -LL | let _: issue_56943::S = issue_56943::S2; - | -------------- ^^^^^^^^^^^^^^^ expected `S`, found `S2` - | | - | expected due to this - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/issues/issue-57156.rs b/tests/ui/issues/issue-57156.rs deleted file mode 100644 index 12251509abd..00000000000 --- a/tests/ui/issues/issue-57156.rs +++ /dev/null @@ -1,23 +0,0 @@ -//@ check-pass - -trait Foo { - type Output; -} - -trait Bar<'a, T>: for<'s> Foo<&'s T, Output=bool> { - fn cb(&self) -> Box>; -} - -impl<'s> Foo<&'s ()> for () { - type Output = bool; -} - -impl<'a> Bar<'a, ()> for () { - fn cb(&self) -> Box> { - Box::new(*self) - } -} - -fn main() { - let _t = ().cb(); -} diff --git a/tests/ui/issues/issue-57162.rs b/tests/ui/issues/issue-57162.rs deleted file mode 100644 index 5e62d0eb010..00000000000 --- a/tests/ui/issues/issue-57162.rs +++ /dev/null @@ -1,7 +0,0 @@ -//@ check-pass - -trait Foo {} -impl Foo for dyn Send {} - -impl Foo for T {} -fn main() {} diff --git a/tests/ui/issues/issue-57198-pass.rs b/tests/ui/issues/issue-57198-pass.rs deleted file mode 100644 index 06f30603c31..00000000000 --- a/tests/ui/issues/issue-57198-pass.rs +++ /dev/null @@ -1,9 +0,0 @@ -//@ run-pass - -mod m { - pub fn r#for() {} -} - -fn main() { - m::r#for(); -} diff --git a/tests/ui/issues/issue-57271.rs b/tests/ui/issues/issue-57271.rs deleted file mode 100644 index 20d081ecb3c..00000000000 --- a/tests/ui/issues/issue-57271.rs +++ /dev/null @@ -1,24 +0,0 @@ -//@ aux-build:issue-57271-lib.rs - -extern crate issue_57271_lib; - -use issue_57271_lib::BaseType; - -pub enum ObjectType { //~ ERROR recursive types `ObjectType` and `TypeSignature` have infinite size - Class(ClassTypeSignature), - Array(TypeSignature), - TypeVariable(()), -} - -pub struct ClassTypeSignature { - pub package: (), - pub class: (), - pub inner: (), -} - -pub enum TypeSignature { - Base(BaseType), - Object(ObjectType), -} - -fn main() {} diff --git a/tests/ui/issues/issue-57271.stderr b/tests/ui/issues/issue-57271.stderr deleted file mode 100644 index a61419c61d7..00000000000 --- a/tests/ui/issues/issue-57271.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error[E0072]: recursive types `ObjectType` and `TypeSignature` have infinite size - --> $DIR/issue-57271.rs:7:1 - | -LL | pub enum ObjectType { - | ^^^^^^^^^^^^^^^^^^^ -LL | Class(ClassTypeSignature), -LL | Array(TypeSignature), - | ------------- recursive without indirection -... -LL | pub enum TypeSignature { - | ^^^^^^^^^^^^^^^^^^^^^^ -LL | Base(BaseType), -LL | Object(ObjectType), - | ---------- recursive without indirection - | -help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle - | -LL ~ Array(Box), -LL | TypeVariable(()), -... -LL | Base(BaseType), -LL ~ Object(Box), - | - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0072`. diff --git a/tests/ui/issues/issue-57399-self-return-impl-trait.rs b/tests/ui/issues/issue-57399-self-return-impl-trait.rs deleted file mode 100644 index bcf1b18a9ff..00000000000 --- a/tests/ui/issues/issue-57399-self-return-impl-trait.rs +++ /dev/null @@ -1,22 +0,0 @@ -//@ check-pass - -trait T { - type T; -} - -impl T for i32 { - type T = u32; -} - -struct S { - a: A, -} - - -impl From for S<::T> { - fn from(a: u32) -> Self { - Self { a } - } -} - -fn main() {} diff --git a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.rs b/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.rs deleted file mode 100644 index d0aae23b2fc..00000000000 --- a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![allow(warnings)] - -// This tests that the `help: consider dereferencing the boxed value` suggestion isn't made -// because the box doesn't deref to the type of the arm. - -enum S { - A { a: usize }, - B { b: usize }, -} - -fn main() { - let x = Box::new(3u32); - let y = match x { - S::A { a } | S::B { b: a } => a, - //~^ ERROR mismatched types [E0308] - //~^^ ERROR mismatched types [E0308] - }; -} diff --git a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.stderr b/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.stderr deleted file mode 100644 index 76f03bab6d1..00000000000 --- a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741-1.stderr +++ /dev/null @@ -1,25 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/issue-57741-1.rs:14:9 - | -LL | let y = match x { - | - this expression has type `Box` -LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^ expected `Box`, found `S` - | - = note: expected struct `Box` - found enum `S` - -error[E0308]: mismatched types - --> $DIR/issue-57741-1.rs:14:22 - | -LL | let y = match x { - | - this expression has type `Box` -LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^^^^ expected `Box`, found `S` - | - = note: expected struct `Box` - found enum `S` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.fixed b/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.fixed deleted file mode 100644 index 1823f0d3d4c..00000000000 --- a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.fixed +++ /dev/null @@ -1,31 +0,0 @@ -//@ run-rustfix - -#![allow(warnings)] - -// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works. - -enum S { - A { a: usize }, - B { b: usize }, -} - -enum T { - A(usize), - B(usize), -} - -fn main() { - let x = Box::new(T::A(3)); - let y = match *x { - T::A(a) | T::B(a) => a, - //~^ ERROR mismatched types [E0308] - //~^^ ERROR mismatched types [E0308] - }; - - let x = Box::new(S::A { a: 3 }); - let y = match *x { - S::A { a } | S::B { b: a } => a, - //~^ ERROR mismatched types [E0308] - //~^^ ERROR mismatched types [E0308] - }; -} diff --git a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.rs b/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.rs deleted file mode 100644 index 47ab91177e0..00000000000 --- a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.rs +++ /dev/null @@ -1,31 +0,0 @@ -//@ run-rustfix - -#![allow(warnings)] - -// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works. - -enum S { - A { a: usize }, - B { b: usize }, -} - -enum T { - A(usize), - B(usize), -} - -fn main() { - let x = Box::new(T::A(3)); - let y = match x { - T::A(a) | T::B(a) => a, - //~^ ERROR mismatched types [E0308] - //~^^ ERROR mismatched types [E0308] - }; - - let x = Box::new(S::A { a: 3 }); - let y = match x { - S::A { a } | S::B { b: a } => a, - //~^ ERROR mismatched types [E0308] - //~^^ ERROR mismatched types [E0308] - }; -} diff --git a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.stderr b/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.stderr deleted file mode 100644 index 62d83a54614..00000000000 --- a/tests/ui/issues/issue-57741-dereference-boxed-value/issue-57741.stderr +++ /dev/null @@ -1,63 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/issue-57741.rs:20:9 - | -LL | let y = match x { - | - this expression has type `Box` -LL | T::A(a) | T::B(a) => a, - | ^^^^^^^ expected `Box`, found `T` - | - = note: expected struct `Box` - found enum `T` -help: consider dereferencing the boxed value - | -LL | let y = match *x { - | + - -error[E0308]: mismatched types - --> $DIR/issue-57741.rs:20:19 - | -LL | let y = match x { - | - this expression has type `Box` -LL | T::A(a) | T::B(a) => a, - | ^^^^^^^ expected `Box`, found `T` - | - = note: expected struct `Box` - found enum `T` -help: consider dereferencing the boxed value - | -LL | let y = match *x { - | + - -error[E0308]: mismatched types - --> $DIR/issue-57741.rs:27:9 - | -LL | let y = match x { - | - this expression has type `Box` -LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^ expected `Box`, found `S` - | - = note: expected struct `Box` - found enum `S` -help: consider dereferencing the boxed value - | -LL | let y = match *x { - | + - -error[E0308]: mismatched types - --> $DIR/issue-57741.rs:27:22 - | -LL | let y = match x { - | - this expression has type `Box` -LL | S::A { a } | S::B { b: a } => a, - | ^^^^^^^^^^^^^ expected `Box`, found `S` - | - = note: expected struct `Box` - found enum `S` -help: consider dereferencing the boxed value - | -LL | let y = match *x { - | + - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/issues/issue-57781.rs b/tests/ui/issues/issue-57781.rs deleted file mode 100644 index 7f0d2eda9bb..00000000000 --- a/tests/ui/issues/issue-57781.rs +++ /dev/null @@ -1,20 +0,0 @@ -//@ run-pass - -use std::cell::UnsafeCell; -use std::collections::HashMap; - -struct OnceCell { - _value: UnsafeCell>, -} - -impl OnceCell { - const INIT: OnceCell = OnceCell { - _value: UnsafeCell::new(None), - }; -} - -pub fn crash() { - let _ = OnceCell::>::INIT; -} - -fn main() {} diff --git a/tests/ui/issues/issue-57924.rs b/tests/ui/issues/issue-57924.rs deleted file mode 100644 index 8846912a8ff..00000000000 --- a/tests/ui/issues/issue-57924.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub struct Gcm(E); - -impl Gcm { - pub fn crash(e: E) -> Self { - Self::(e) - //~^ ERROR type arguments are not allowed on self constructor - } -} - -fn main() {} diff --git a/tests/ui/issues/issue-57924.stderr b/tests/ui/issues/issue-57924.stderr deleted file mode 100644 index 40435fd0f0a..00000000000 --- a/tests/ui/issues/issue-57924.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0109]: type arguments are not allowed on self constructor - --> $DIR/issue-57924.rs:5:16 - | -LL | Self::(e) - | ---- ^ type argument not allowed - | | - | not allowed on self constructor - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0109`. diff --git a/tests/ui/issues/issue-58212.rs b/tests/ui/issues/issue-58212.rs deleted file mode 100644 index f266db603bf..00000000000 --- a/tests/ui/issues/issue-58212.rs +++ /dev/null @@ -1,15 +0,0 @@ -//@ check-pass - -trait FromUnchecked { - fn from_unchecked(); -} - -impl FromUnchecked for [u8; 1] { - fn from_unchecked() { - let mut array: Self = [0; 1]; - let _ptr = &mut array as *mut [u8] as *mut u8; - } -} - -fn main() { -} diff --git a/tests/ui/issues/issue-58375-monomorphize-default-impls.rs b/tests/ui/issues/issue-58375-monomorphize-default-impls.rs deleted file mode 100644 index 769a1176edd..00000000000 --- a/tests/ui/issues/issue-58375-monomorphize-default-impls.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Make sure that the mono-item collector does not crash when trying to -// instantiate a default impl for DecodeUtf16<::Item> -// See https://github.com/rust-lang/rust/issues/58375 - -//@ build-pass -//@ compile-flags:-C link-dead-code - -#![crate_type = "rlib"] - -pub struct DecodeUtf16(I); - -pub trait Arbitrary { - fn arbitrary() {} -} - -pub trait A { - type Item; -} - -impl A for u8 { - type Item = char; -} - -impl Arbitrary for DecodeUtf16<::Item> {} diff --git a/tests/ui/issues/issue-58463.rs b/tests/ui/issues/issue-58463.rs deleted file mode 100644 index 6e4b909bc38..00000000000 --- a/tests/ui/issues/issue-58463.rs +++ /dev/null @@ -1,9 +0,0 @@ -//@ run-pass -//@ compile-flags:-C debuginfo=2 - -fn foo() -> impl Copy { - foo -} -fn main() { - foo(); -} diff --git a/tests/ui/issues/issue-58712.rs b/tests/ui/issues/issue-58712.rs deleted file mode 100644 index 930bec6889b..00000000000 --- a/tests/ui/issues/issue-58712.rs +++ /dev/null @@ -1,14 +0,0 @@ -struct AddrVec { - h: H, - a: A, -} - -impl AddrVec { - //~^ ERROR cannot find type `DeviceId` in this scope - pub fn device(&self) -> DeviceId { - //~^ ERROR cannot find type `DeviceId` in this scope - self.tail() - } -} - -fn main() {} diff --git a/tests/ui/issues/issue-58712.stderr b/tests/ui/issues/issue-58712.stderr deleted file mode 100644 index f4bd4d1e826..00000000000 --- a/tests/ui/issues/issue-58712.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0412]: cannot find type `DeviceId` in this scope - --> $DIR/issue-58712.rs:6:20 - | -LL | impl AddrVec { - | ^^^^^^^^ not found in this scope - | -help: you might be missing a type parameter - | -LL | impl AddrVec { - | ++++++++++ - -error[E0412]: cannot find type `DeviceId` in this scope - --> $DIR/issue-58712.rs:8:29 - | -LL | pub fn device(&self) -> DeviceId { - | ^^^^^^^^ not found in this scope - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0412`. diff --git a/tests/ui/issues/issue-58734.rs b/tests/ui/issues/issue-58734.rs deleted file mode 100644 index e5b371f5530..00000000000 --- a/tests/ui/issues/issue-58734.rs +++ /dev/null @@ -1,24 +0,0 @@ -trait Trait { - fn exists(self) -> (); - - fn dyn_incompatible() -> Self; -} - -impl Trait for () { - fn exists(self) -> () { - } - - fn dyn_incompatible() -> Self { - () - } -} - -fn main() { - // dyn-compatible or not, this call is OK - Trait::exists(()); - // no dyn-compatibility error - Trait::nonexistent(()); - //~^ WARN trait objects without an explicit `dyn` are deprecated - //~| WARN this is accepted in the current edition - //~| ERROR the trait `Trait` is not dyn compatible -} diff --git a/tests/ui/issues/issue-58734.stderr b/tests/ui/issues/issue-58734.stderr deleted file mode 100644 index 2336a94f150..00000000000 --- a/tests/ui/issues/issue-58734.stderr +++ /dev/null @@ -1,42 +0,0 @@ -warning: trait objects without an explicit `dyn` are deprecated - --> $DIR/issue-58734.rs:20:5 - | -LL | Trait::nonexistent(()); - | ^^^^^ - | - = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! - = note: for more information, see - = note: `#[warn(bare_trait_objects)]` (part of `#[warn(rust_2021_compatibility)]`) on by default -help: if this is a dyn-compatible trait, use `dyn` - | -LL | ::nonexistent(()); - | ++++ + - -error[E0038]: the trait `Trait` is not dyn compatible - --> $DIR/issue-58734.rs:20:5 - | -LL | Trait::nonexistent(()); - | ^^^^^ `Trait` is not dyn compatible - | -note: for a trait to be dyn compatible it needs to allow building a vtable - for more information, visit - --> $DIR/issue-58734.rs:4:8 - | -LL | trait Trait { - | ----- this trait is not dyn compatible... -... -LL | fn dyn_incompatible() -> Self; - | ^^^^^^^^^^^^^^^^ ...because associated function `dyn_incompatible` has no `self` parameter - = help: only type `()` implements `Trait`; consider using it directly instead. -help: consider turning `dyn_incompatible` into a method by giving it a `&self` argument - | -LL | fn dyn_incompatible(&self) -> Self; - | +++++ -help: alternatively, consider constraining `dyn_incompatible` so it does not apply to trait objects - | -LL | fn dyn_incompatible() -> Self where Self: Sized; - | +++++++++++++++++ - -error: aborting due to 1 previous error; 1 warning emitted - -For more information about this error, try `rustc --explain E0038`. diff --git a/tests/ui/issues/issue-58857.rs b/tests/ui/issues/issue-58857.rs deleted file mode 100644 index 4350d7e5b40..00000000000 --- a/tests/ui/issues/issue-58857.rs +++ /dev/null @@ -1,7 +0,0 @@ -struct Conj {a : A} -trait Valid {} - -impl Conj{} -//~^ ERROR negative bounds are not supported - -fn main() {} diff --git a/tests/ui/issues/issue-58857.stderr b/tests/ui/issues/issue-58857.stderr deleted file mode 100644 index ac70bc725e2..00000000000 --- a/tests/ui/issues/issue-58857.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: negative bounds are not supported - --> $DIR/issue-58857.rs:4:9 - | -LL | impl Conj{} - | ^ - -error: aborting due to 1 previous error - diff --git a/tests/ui/issues/issue-59020.rs b/tests/ui/issues/issue-59020.rs deleted file mode 100644 index 2a34ba52b88..00000000000 --- a/tests/ui/issues/issue-59020.rs +++ /dev/null @@ -1,27 +0,0 @@ -//@ edition:2018 -//@ run-pass -//@ needs-threads - -use std::thread; -use std::time::Duration; - -fn main() { - let t1 = thread::spawn(|| { - let sleep = Duration::new(0,100_000); - for _ in 0..100 { - println!("Parking1"); - thread::park_timeout(sleep); - } - }); - - let t2 = thread::spawn(|| { - let sleep = Duration::new(0,100_000); - for _ in 0..100 { - println!("Parking2"); - thread::park_timeout(sleep); - } - }); - - t1.join().expect("Couldn't join thread 1"); - t2.join().expect("Couldn't join thread 2"); -} diff --git a/tests/ui/issues/issue-59326.rs b/tests/ui/issues/issue-59326.rs deleted file mode 100644 index e9634ad9fd8..00000000000 --- a/tests/ui/issues/issue-59326.rs +++ /dev/null @@ -1,26 +0,0 @@ -//@ check-pass -trait Service { - type S; -} - -trait Framing { - type F; -} - -impl Framing for () { - type F = (); -} - -trait HttpService: Service {} - -type BoxService = Box>; - -fn build_server BoxService>(_: F) {} - -fn make_server() -> Box> { - unimplemented!() -} - -fn main() { - build_server(|| make_server()) -} diff --git a/tests/ui/issues/issue-59488.rs b/tests/ui/issues/issue-59488.rs deleted file mode 100644 index 384501e3e5d..00000000000 --- a/tests/ui/issues/issue-59488.rs +++ /dev/null @@ -1,34 +0,0 @@ -fn foo() -> i32 { - 42 -} - -fn bar(a: i64) -> i64 { - 43 -} - -enum Foo { - Bar(usize), -} - -fn main() { - foo > 12; - //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] - //~| ERROR mismatched types [E0308] - - bar > 13; - //~^ ERROR binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` [E0369] - //~| ERROR mismatched types [E0308] - - foo > foo; - //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] - - foo > bar; - //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] - //~| ERROR mismatched types [E0308] - - let i = Foo::Bar; - assert_eq!(Foo::Bar, i); - //~^ ERROR binary operation `==` cannot be applied to type `fn(usize) -> Foo {Foo::Bar}` [E0369] - //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] - //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] -} diff --git a/tests/ui/issues/issue-59488.stderr b/tests/ui/issues/issue-59488.stderr deleted file mode 100644 index b6611ad63a8..00000000000 --- a/tests/ui/issues/issue-59488.stderr +++ /dev/null @@ -1,105 +0,0 @@ -error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` - --> $DIR/issue-59488.rs:14:9 - | -LL | foo > 12; - | --- ^ -- {integer} - | | - | fn() -> i32 {foo} - | -help: use parentheses to call this function - | -LL | foo() > 12; - | ++ - -error[E0308]: mismatched types - --> $DIR/issue-59488.rs:14:11 - | -LL | foo > 12; - | ^^ expected fn item, found `i32` - | - = note: expected fn item `fn() -> i32 {foo}` - found type `i32` - -error[E0369]: binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` - --> $DIR/issue-59488.rs:18:9 - | -LL | bar > 13; - | --- ^ -- {integer} - | | - | fn(i64) -> i64 {bar} - | -help: use parentheses to call this function - | -LL | bar(/* i64 */) > 13; - | +++++++++++ - -error[E0308]: mismatched types - --> $DIR/issue-59488.rs:18:11 - | -LL | bar > 13; - | ^^ expected fn item, found `i64` - | - = note: expected fn item `fn(i64) -> i64 {bar}` - found type `i64` - -error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` - --> $DIR/issue-59488.rs:22:9 - | -LL | foo > foo; - | --- ^ --- fn() -> i32 {foo} - | | - | fn() -> i32 {foo} - | -help: use parentheses to call these - | -LL | foo() > foo(); - | ++ ++ - -error[E0369]: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` - --> $DIR/issue-59488.rs:25:9 - | -LL | foo > bar; - | --- ^ --- fn(i64) -> i64 {bar} - | | - | fn() -> i32 {foo} - -error[E0308]: mismatched types - --> $DIR/issue-59488.rs:25:11 - | -LL | foo > bar; - | ^^^ expected fn item, found a different fn item - | - = note: expected fn item `fn() -> i32 {foo}` - found fn item `fn(i64) -> i64 {bar}` - -error[E0369]: binary operation `==` cannot be applied to type `fn(usize) -> Foo {Foo::Bar}` - --> $DIR/issue-59488.rs:30:5 - | -LL | assert_eq!(Foo::Bar, i); - | ^^^^^^^^^^^^^^^^^^^^^^^ - | | - | fn(usize) -> Foo {Foo::Bar} - | fn(usize) -> Foo {Foo::Bar} - | - = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` - --> $DIR/issue-59488.rs:30:5 - | -LL | assert_eq!(Foo::Bar, i); - | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for fn item `fn(usize) -> Foo {Foo::Bar}` - | - = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` - --> $DIR/issue-59488.rs:30:5 - | -LL | assert_eq!(Foo::Bar, i); - | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Debug` is not implemented for fn item `fn(usize) -> Foo {Foo::Bar}` - | - = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 10 previous errors - -Some errors have detailed explanations: E0277, E0308, E0369. -For more information about an error, try `rustc --explain E0277`. diff --git a/tests/ui/issues/issue-59494.rs b/tests/ui/issues/issue-59494.rs deleted file mode 100644 index b4d50bd4ce7..00000000000 --- a/tests/ui/issues/issue-59494.rs +++ /dev/null @@ -1,23 +0,0 @@ -fn t7p(f: impl Fn(B) -> C, g: impl Fn(A) -> B) -> impl Fn(A) -> C { - move |a: A| -> C { f(g(a)) } -} - -fn t8n(f: impl Fn(A) -> B, g: impl Fn(A) -> C) -> impl Fn(A) -> (B, C) -where - A: Copy, -{ - move |a: A| -> (B, C) { - let b = a; - let fa = f(a); - let ga = g(b); - (fa, ga) - } -} - -fn main() { - let f = |(_, _)| {}; - let g = |(a, _)| a; - let t7 = |env| |a| |b| t7p(f, g)(((env, a), b)); - //~^ ERROR mismatched types - let t8 = t8n(t7, t7p(f, g)); -} diff --git a/tests/ui/issues/issue-59494.stderr b/tests/ui/issues/issue-59494.stderr deleted file mode 100644 index 33d3e48c1aa..00000000000 --- a/tests/ui/issues/issue-59494.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/issue-59494.rs:20:40 - | -LL | let t7 = |env| |a| |b| t7p(f, g)(((env, a), b)); - | ^^^ cyclic type of infinite size - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/issues/issue-59756.fixed b/tests/ui/issues/issue-59756.fixed deleted file mode 100644 index 954ba917626..00000000000 --- a/tests/ui/issues/issue-59756.fixed +++ /dev/null @@ -1,17 +0,0 @@ -//@ run-rustfix - -#![allow(warnings)] - -struct A; -struct B; - -fn foo() -> Result { - Ok(A) -} - -fn bar() -> Result { - foo() - //~^ ERROR try expression alternatives have incompatible types [E0308] -} - -fn main() {} diff --git a/tests/ui/issues/issue-59756.rs b/tests/ui/issues/issue-59756.rs deleted file mode 100644 index de349f43f46..00000000000 --- a/tests/ui/issues/issue-59756.rs +++ /dev/null @@ -1,21 +0,0 @@ -//@ run-rustfix -//@ ignore-test (rustfix needs multiple suggestions) -// -// FIXME: Re-enable this test once we support choosing -// between multiple mutually exclusive suggestions for the same span - -#![allow(warnings)] - -struct A; -struct B; - -fn foo() -> Result { - Ok(A) -} - -fn bar() -> Result { - foo()? - //~^ ERROR try expression alternatives have incompatible types [E0308] -} - -fn main() {} diff --git a/tests/ui/issues/issue-59756.stderr b/tests/ui/issues/issue-59756.stderr deleted file mode 100644 index 27c07fecd5b..00000000000 --- a/tests/ui/issues/issue-59756.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0308]: try expression alternatives have incompatible types - --> $DIR/issue-59756.rs:13:5 - | -LL | foo()? - | ^^^^^^ expected enum `std::result::Result`, found struct `A` - | - = note: expected enum `std::result::Result` - found struct `A` -help: try removing this `?` - | -LL | foo() - | -- -help: try using a variant of the expected enum - | -LL | Ok(foo()?) - | - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/keyword/raw-identifier-for-function-57198.rs b/tests/ui/keyword/raw-identifier-for-function-57198.rs new file mode 100644 index 00000000000..41a0cbf4619 --- /dev/null +++ b/tests/ui/keyword/raw-identifier-for-function-57198.rs @@ -0,0 +1,10 @@ +// https://github.com/rust-lang/rust/issues/57198 +//@ run-pass + +mod m { + pub fn r#for() {} +} + +fn main() { + m::r#for(); +} diff --git a/tests/ui/mismatched_types/auxiliary/aux-56943.rs b/tests/ui/mismatched_types/auxiliary/aux-56943.rs new file mode 100644 index 00000000000..65b9beb91f9 --- /dev/null +++ b/tests/ui/mismatched_types/auxiliary/aux-56943.rs @@ -0,0 +1,3 @@ +pub struct S; +mod m { pub struct S; } +pub use crate::m::S as S2; diff --git a/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.rs b/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.rs new file mode 100644 index 00000000000..9970b27c847 --- /dev/null +++ b/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.rs @@ -0,0 +1,9 @@ +// https://github.com/rust-lang/rust/issues/56943 +//@ aux-build:aux-56943.rs + +extern crate aux_56943; + +fn main() { + let _: aux_56943::S = aux_56943::S2; + //~^ ERROR mismatched types [E0308] +} diff --git a/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.stderr b/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.stderr new file mode 100644 index 00000000000..2315267701d --- /dev/null +++ b/tests/ui/mismatched_types/type-mismatch-in-extern-crate-56943.stderr @@ -0,0 +1,11 @@ +error[E0308]: mismatched types + --> $DIR/type-mismatch-in-extern-crate-56943.rs:7:27 + | +LL | let _: aux_56943::S = aux_56943::S2; + | ------------ ^^^^^^^^^^^^^ expected `S`, found `S2` + | | + | expected due to this + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/modules/pub-use-handling-in-modules-56128.rs b/tests/ui/modules/pub-use-handling-in-modules-56128.rs new file mode 100644 index 00000000000..cc170f60250 --- /dev/null +++ b/tests/ui/modules/pub-use-handling-in-modules-56128.rs @@ -0,0 +1,15 @@ +// Regression test for #56128. When this `pub(super) use...` gets +// exploded in the HIR, we were not handling ids correctly. +// +//@ check-pass + +mod bar { + pub(super) use self::baz::{x, y}; + + mod baz { + pub fn x() { } + pub fn y() { } + } +} + +fn main() { } diff --git a/tests/ui/parser/invalid-variable-definition-55587.rs b/tests/ui/parser/invalid-variable-definition-55587.rs new file mode 100644 index 00000000000..f2c7c0a8e6c --- /dev/null +++ b/tests/ui/parser/invalid-variable-definition-55587.rs @@ -0,0 +1,6 @@ +// https://github.com/rust-lang/rust/issues/55587 +use std::path::Path; + +fn main() { + let Path::new(); //~ ERROR expected tuple struct or tuple variant +} diff --git a/tests/ui/parser/invalid-variable-definition-55587.stderr b/tests/ui/parser/invalid-variable-definition-55587.stderr new file mode 100644 index 00000000000..08c951582e3 --- /dev/null +++ b/tests/ui/parser/invalid-variable-definition-55587.stderr @@ -0,0 +1,11 @@ +error[E0164]: expected tuple struct or tuple variant, found associated function `Path::new` + --> $DIR/invalid-variable-definition-55587.rs:5:9 + | +LL | let Path::new(); + | ^^^^^^^^^^^ `fn` calls are not allowed in patterns + | + = help: for more information, visit https://doc.rust-lang.org/book/ch19-00-patterns.html + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0164`. diff --git a/tests/ui/resolve/missing-type-in-scope-58712.rs b/tests/ui/resolve/missing-type-in-scope-58712.rs new file mode 100644 index 00000000000..b9ff74e426d --- /dev/null +++ b/tests/ui/resolve/missing-type-in-scope-58712.rs @@ -0,0 +1,15 @@ +// https://github.com/rust-lang/rust/issues/58712 +struct AddrVec { + h: H, + a: A, +} + +impl AddrVec { + //~^ ERROR cannot find type `DeviceId` in this scope + pub fn device(&self) -> DeviceId { + //~^ ERROR cannot find type `DeviceId` in this scope + self.tail() + } +} + +fn main() {} diff --git a/tests/ui/resolve/missing-type-in-scope-58712.stderr b/tests/ui/resolve/missing-type-in-scope-58712.stderr new file mode 100644 index 00000000000..d7e06eee856 --- /dev/null +++ b/tests/ui/resolve/missing-type-in-scope-58712.stderr @@ -0,0 +1,20 @@ +error[E0412]: cannot find type `DeviceId` in this scope + --> $DIR/missing-type-in-scope-58712.rs:7:20 + | +LL | impl AddrVec { + | ^^^^^^^^ not found in this scope + | +help: you might be missing a type parameter + | +LL | impl AddrVec { + | ++++++++++ + +error[E0412]: cannot find type `DeviceId` in this scope + --> $DIR/missing-type-in-scope-58712.rs:9:29 + | +LL | pub fn device(&self) -> DeviceId { + | ^^^^^^^^ not found in this scope + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0412`. diff --git a/tests/ui/std/park-timeout-wakeup-59020.rs b/tests/ui/std/park-timeout-wakeup-59020.rs new file mode 100644 index 00000000000..af530bb586c --- /dev/null +++ b/tests/ui/std/park-timeout-wakeup-59020.rs @@ -0,0 +1,28 @@ +// https://github.com/rust-lang/rust/issues/59020 +//@ edition:2018 +//@ run-pass +//@ needs-threads + +use std::thread; +use std::time::Duration; + +fn main() { + let t1 = thread::spawn(|| { + let sleep = Duration::new(0,100_000); + for _ in 0..100 { + println!("Parking1"); + thread::park_timeout(sleep); + } + }); + + let t2 = thread::spawn(|| { + let sleep = Duration::new(0,100_000); + for _ in 0..100 { + println!("Parking2"); + thread::park_timeout(sleep); + } + }); + + t1.join().expect("Couldn't join thread 1"); + t2.join().expect("Couldn't join thread 2"); +} diff --git a/tests/ui/structs/invalid-self-constructor-56835.rs b/tests/ui/structs/invalid-self-constructor-56835.rs new file mode 100644 index 00000000000..fd8763443f0 --- /dev/null +++ b/tests/ui/structs/invalid-self-constructor-56835.rs @@ -0,0 +1,10 @@ +// https://github.com/rust-lang/rust/issues/56835 +pub struct Foo {} + +impl Foo { + fn bar(Self(foo): Self) {} + //~^ ERROR the `Self` constructor can only be used with tuple or unit structs + //~^^ ERROR expected tuple struct or tuple variant, found self constructor `Self` [E0164] +} + +fn main() {} diff --git a/tests/ui/structs/invalid-self-constructor-56835.stderr b/tests/ui/structs/invalid-self-constructor-56835.stderr new file mode 100644 index 00000000000..045781ec42b --- /dev/null +++ b/tests/ui/structs/invalid-self-constructor-56835.stderr @@ -0,0 +1,15 @@ +error: the `Self` constructor can only be used with tuple or unit structs + --> $DIR/invalid-self-constructor-56835.rs:5:12 + | +LL | fn bar(Self(foo): Self) {} + | ^^^^^^^^^ help: use curly brackets: `Self { /* fields */ }` + +error[E0164]: expected tuple struct or tuple variant, found self constructor `Self` + --> $DIR/invalid-self-constructor-56835.rs:5:12 + | +LL | fn bar(Self(foo): Self) {} + | ^^^^^^^^^ not a tuple struct or tuple variant + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0164`. diff --git a/tests/ui/suggestions/incompatible-types-in-try-expression-59756.fixed b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.fixed new file mode 100644 index 00000000000..954ba917626 --- /dev/null +++ b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.fixed @@ -0,0 +1,17 @@ +//@ run-rustfix + +#![allow(warnings)] + +struct A; +struct B; + +fn foo() -> Result { + Ok(A) +} + +fn bar() -> Result { + foo() + //~^ ERROR try expression alternatives have incompatible types [E0308] +} + +fn main() {} diff --git a/tests/ui/suggestions/incompatible-types-in-try-expression-59756.rs b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.rs new file mode 100644 index 00000000000..570aa7d373b --- /dev/null +++ b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.rs @@ -0,0 +1,22 @@ +// https://github.com/rust-lang/rust/issues/59756 +//@ run-rustfix +//@ ignore-test (rustfix needs multiple suggestions) +// +// FIXME: Re-enable this test once we support choosing +// between multiple mutually exclusive suggestions for the same span + +#![allow(warnings)] + +struct A; +struct B; + +fn foo() -> Result { + Ok(A) +} + +fn bar() -> Result { + foo()? + //~^ ERROR try expression alternatives have incompatible types [E0308] +} + +fn main() {} diff --git a/tests/ui/suggestions/incompatible-types-in-try-expression-59756.stderr b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.stderr new file mode 100644 index 00000000000..7182109b5a0 --- /dev/null +++ b/tests/ui/suggestions/incompatible-types-in-try-expression-59756.stderr @@ -0,0 +1,20 @@ +error[E0308]: try expression alternatives have incompatible types + --> $DIR/incompatible-types-in-try-expression-59756.rs:13:5 + | +LL | foo()? + | ^^^^^^ expected enum `std::result::Result`, found struct `A` + | + = note: expected enum `std::result::Result` + found struct `A` +help: try removing this `?` + | +LL | foo() + | -- +help: try using a variant of the expected enum + | +LL | Ok(foo()?) + | + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/trait-bounds/negative-bound-not-supported-58857.rs b/tests/ui/trait-bounds/negative-bound-not-supported-58857.rs new file mode 100644 index 00000000000..0a0b70a216b --- /dev/null +++ b/tests/ui/trait-bounds/negative-bound-not-supported-58857.rs @@ -0,0 +1,8 @@ +// https://github.com/rust-lang/rust/issues/58857 +struct Conj {a : A} +trait Valid {} + +impl Conj{} +//~^ ERROR negative bounds are not supported + +fn main() {} diff --git a/tests/ui/trait-bounds/negative-bound-not-supported-58857.stderr b/tests/ui/trait-bounds/negative-bound-not-supported-58857.stderr new file mode 100644 index 00000000000..05347a891b4 --- /dev/null +++ b/tests/ui/trait-bounds/negative-bound-not-supported-58857.stderr @@ -0,0 +1,8 @@ +error: negative bounds are not supported + --> $DIR/negative-bound-not-supported-58857.rs:5:9 + | +LL | impl Conj{} + | ^ + +error: aborting due to 1 previous error + diff --git a/tests/ui/traits/generic-trait-impl-aliased-array-58212.rs b/tests/ui/traits/generic-trait-impl-aliased-array-58212.rs new file mode 100644 index 00000000000..a71194ba806 --- /dev/null +++ b/tests/ui/traits/generic-trait-impl-aliased-array-58212.rs @@ -0,0 +1,16 @@ +// https://github.com/rust-lang/rust/issues/58212 +//@ check-pass + +trait FromUnchecked { + fn from_unchecked(); +} + +impl FromUnchecked for [u8; 1] { + fn from_unchecked() { + let mut array: Self = [0; 1]; + let _ptr = &mut array as *mut [u8] as *mut u8; + } +} + +fn main() { +} diff --git a/tests/ui/traits/trait-object-lifetime-bounds-57156.rs b/tests/ui/traits/trait-object-lifetime-bounds-57156.rs new file mode 100644 index 00000000000..8f5bef7fe13 --- /dev/null +++ b/tests/ui/traits/trait-object-lifetime-bounds-57156.rs @@ -0,0 +1,24 @@ +// https://github.com/rust-lang/rust/issues/57156 +//@ check-pass + +trait Foo { + type Output; +} + +trait Bar<'a, T>: for<'s> Foo<&'s T, Output=bool> { + fn cb(&self) -> Box>; +} + +impl<'s> Foo<&'s ()> for () { + type Output = bool; +} + +impl<'a> Bar<'a, ()> for () { + fn cb(&self) -> Box> { + Box::new(*self) + } +} + +fn main() { + let _t = ().cb(); +} diff --git a/tests/ui/traits/trait-objects-with-supertraits-56229.rs b/tests/ui/traits/trait-objects-with-supertraits-56229.rs new file mode 100644 index 00000000000..27cae968a6a --- /dev/null +++ b/tests/ui/traits/trait-objects-with-supertraits-56229.rs @@ -0,0 +1,36 @@ +// https://github.com/rust-lang/rust/issues/56229 +//@ check-pass + +trait Mirror { + type Other; +} + +#[derive(Debug)] +struct Even(usize); +struct Odd; + +impl Mirror for Even { + type Other = Odd; +} + +impl Mirror for Odd { + type Other = Even; +} + +trait Dyn: AsRef<::Other> {} + +impl Dyn for Even {} + +impl AsRef for Even { + fn as_ref(&self) -> &Even { + self + } +} + +fn code(d: &dyn Dyn) -> &T::Other { + d.as_ref() +} + +fn main() { + println!("{:?}", code(&Even(22))); +} diff --git a/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.rs b/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.rs new file mode 100644 index 00000000000..2b3b11c3f38 --- /dev/null +++ b/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.rs @@ -0,0 +1,11 @@ +// https://github.com/rust-lang/rust/issues/57924 +pub struct Gcm(E); + +impl Gcm { + pub fn crash(e: E) -> Self { + Self::(e) + //~^ ERROR type arguments are not allowed on self constructor + } +} + +fn main() {} diff --git a/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.stderr b/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.stderr new file mode 100644 index 00000000000..b5be5b39eb8 --- /dev/null +++ b/tests/ui/typeck/self-constructor-type-args-not-allowed-57924.stderr @@ -0,0 +1,11 @@ +error[E0109]: type arguments are not allowed on self constructor + --> $DIR/self-constructor-type-args-not-allowed-57924.rs:6:16 + | +LL | Self::(e) + | ---- ^ type argument not allowed + | | + | not allowed on self constructor + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0109`. diff --git a/tests/ui/typeck/self-constructor-type-error-56199.rs b/tests/ui/typeck/self-constructor-type-error-56199.rs new file mode 100644 index 00000000000..b08d6918980 --- /dev/null +++ b/tests/ui/typeck/self-constructor-type-error-56199.rs @@ -0,0 +1,23 @@ +// https://github.com/rust-lang/rust/issues/56199 +enum Foo {} +struct Bar {} + +impl Foo { + fn foo() { + let _ = Self; + //~^ ERROR the `Self` constructor can only be used with tuple or unit structs + let _ = Self(); + //~^ ERROR the `Self` constructor can only be used with tuple or unit structs + } +} + +impl Bar { + fn bar() { + let _ = Self; + //~^ ERROR the `Self` constructor can only be used with tuple or unit structs + let _ = Self(); + //~^ ERROR the `Self` constructor can only be used with tuple or unit structs + } +} + +fn main() {} diff --git a/tests/ui/typeck/self-constructor-type-error-56199.stderr b/tests/ui/typeck/self-constructor-type-error-56199.stderr new file mode 100644 index 00000000000..6e9d0fcd90c --- /dev/null +++ b/tests/ui/typeck/self-constructor-type-error-56199.stderr @@ -0,0 +1,30 @@ +error: the `Self` constructor can only be used with tuple or unit structs + --> $DIR/self-constructor-type-error-56199.rs:7:17 + | +LL | let _ = Self; + | ^^^^ + | + = help: did you mean to use one of the enum's variants? + +error: the `Self` constructor can only be used with tuple or unit structs + --> $DIR/self-constructor-type-error-56199.rs:9:17 + | +LL | let _ = Self(); + | ^^^^^^ + | + = help: did you mean to use one of the enum's variants? + +error: the `Self` constructor can only be used with tuple or unit structs + --> $DIR/self-constructor-type-error-56199.rs:16:17 + | +LL | let _ = Self; + | ^^^^ help: use curly brackets: `Self { /* fields */ }` + +error: the `Self` constructor can only be used with tuple or unit structs + --> $DIR/self-constructor-type-error-56199.rs:18:17 + | +LL | let _ = Self(); + | ^^^^^^ help: use curly brackets: `Self { /* fields */ }` + +error: aborting due to 4 previous errors + -- cgit 1.4.1-3-g733a5 From f157ce994ea45e9faea9eff89c5f8b3d4ea77b6e Mon Sep 17 00:00:00 2001 From: Noratrieb <48135649+Noratrieb@users.noreply.github.com> Date: Sat, 26 Jul 2025 12:39:31 +0200 Subject: Add --print target-spec-json-schema This schema is helpful for people writing custom target spec JSON. It can provide autocomplete in the editor, and also serves as documentation when there are documentation comments on the structs, as `schemars` will put them in the schema. --- Cargo.lock | 63 +++++++++++++++++++ compiler/rustc_codegen_ssa/src/back/command.rs | 2 +- compiler/rustc_driver_impl/src/lib.rs | 4 ++ compiler/rustc_session/src/config.rs | 5 +- compiler/rustc_target/Cargo.toml | 1 + compiler/rustc_target/src/lib.rs | 2 + compiler/rustc_target/src/spec/json.rs | 38 ++++++++++-- compiler/rustc_target/src/spec/mod.rs | 70 +++++++++++++++++++++- src/bootstrap/src/core/build_steps/dist.rs | 24 ++++++++ src/bootstrap/src/utils/proc_macro_deps.rs | 1 + src/doc/rustc/src/targets/custom.md | 15 +++++ src/tools/tidy/src/deps.rs | 6 ++ .../help-diff.diff | 2 +- .../unstable-invalid-print-request-help.err | 2 +- tests/run-make/rustc-help/help-v.stdout | 2 +- tests/run-make/rustc-help/help.stdout | 2 +- .../invalid-compile-flags/print-without-arg.stderr | 2 +- tests/ui/invalid-compile-flags/print.stderr | 2 +- tests/ui/print-request/print-lints-help.stderr | 2 +- 19 files changed, 229 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2dc6e8ff103..4677d34d2a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1191,6 +1191,12 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8975ffdaa0ef3661bfe02dbdcc06c9f829dfafe6a3c474de366a8d5e44276921" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "either" version = "1.15.0" @@ -3122,6 +3128,26 @@ dependencies = [ "thiserror 2.0.15", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "regex" version = "1.11.1" @@ -4577,6 +4603,7 @@ dependencies = [ "rustc_macros", "rustc_serialize", "rustc_span", + "schemars", "serde", "serde_derive", "serde_json", @@ -4900,6 +4927,31 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.106", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -4974,6 +5026,17 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "serde_json" version = "1.0.142" diff --git a/compiler/rustc_codegen_ssa/src/back/command.rs b/compiler/rustc_codegen_ssa/src/back/command.rs index 05351bd6ca3..7420f18aacb 100644 --- a/compiler/rustc_codegen_ssa/src/back/command.rs +++ b/compiler/rustc_codegen_ssa/src/back/command.rs @@ -109,7 +109,7 @@ impl Command { } Program::Lld(ref p, flavor) => { let mut c = process::Command::new(p); - c.arg("-flavor").arg(flavor.as_str()); + c.arg("-flavor").arg(flavor.desc()); c } }; diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index d00a4c35834..4f875cf99ec 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -668,6 +668,10 @@ fn print_crate_info( TargetSpecJson => { println_info!("{}", serde_json::to_string_pretty(&sess.target.to_json()).unwrap()); } + TargetSpecJsonSchema => { + let schema = rustc_target::spec::json_schema(); + println_info!("{}", serde_json::to_string_pretty(&schema).unwrap()); + } AllTargetSpecsJson => { let mut targets = BTreeMap::new(); for name in rustc_target::spec::TARGETS { diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index 9793d8091e2..297df7c2c97 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -70,6 +70,7 @@ pub const PRINT_KINDS: &[(&str, PrintKind)] = &[ ("target-libdir", PrintKind::TargetLibdir), ("target-list", PrintKind::TargetList), ("target-spec-json", PrintKind::TargetSpecJson), + ("target-spec-json-schema", PrintKind::TargetSpecJsonSchema), ("tls-models", PrintKind::TlsModels), // tidy-alphabetical-end ]; @@ -1043,6 +1044,7 @@ pub enum PrintKind { TargetLibdir, TargetList, TargetSpecJson, + TargetSpecJsonSchema, TlsModels, // tidy-alphabetical-end } @@ -2323,7 +2325,8 @@ fn is_print_request_stable(print_kind: PrintKind) -> bool { | PrintKind::CheckCfg | PrintKind::CrateRootLintLevels | PrintKind::SupportedCrateTypes - | PrintKind::TargetSpecJson => false, + | PrintKind::TargetSpecJson + | PrintKind::TargetSpecJsonSchema => false, _ => true, } } diff --git a/compiler/rustc_target/Cargo.toml b/compiler/rustc_target/Cargo.toml index 7fabb227d9a..ecdb6ab5a57 100644 --- a/compiler/rustc_target/Cargo.toml +++ b/compiler/rustc_target/Cargo.toml @@ -14,6 +14,7 @@ rustc_fs_util = { path = "../rustc_fs_util" } rustc_macros = { path = "../rustc_macros" } rustc_serialize = { path = "../rustc_serialize" } rustc_span = { path = "../rustc_span" } +schemars = "1.0.4" serde = "1.0.219" serde_derive = "1.0.219" serde_json = "1.0.59" diff --git a/compiler/rustc_target/src/lib.rs b/compiler/rustc_target/src/lib.rs index c6a23745b04..b3fe1fffcce 100644 --- a/compiler/rustc_target/src/lib.rs +++ b/compiler/rustc_target/src/lib.rs @@ -86,9 +86,11 @@ macro_rules! target_spec_enum { ) => { $( #[$attr] )* #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] + #[derive(schemars::JsonSchema)] pub enum $name { $( $( #[$variant_attr] )* + #[serde(rename = $string)] // for JSON schema generation only $variant, )* } diff --git a/compiler/rustc_target/src/spec/json.rs b/compiler/rustc_target/src/spec/json.rs index e9ae5734d5b..f236be92b3b 100644 --- a/compiler/rustc_target/src/spec/json.rs +++ b/compiler/rustc_target/src/spec/json.rs @@ -408,12 +408,12 @@ impl ToJson for Target { } } -#[derive(serde_derive::Deserialize)] +#[derive(serde_derive::Deserialize, schemars::JsonSchema)] struct LinkSelfContainedComponentsWrapper { components: Vec, } -#[derive(serde_derive::Deserialize)] +#[derive(serde_derive::Deserialize, schemars::JsonSchema)] #[serde(untagged)] enum TargetFamiliesJson { Array(StaticCow<[StaticCow]>), @@ -429,6 +429,18 @@ impl FromStr for EndianWrapper { } } crate::json::serde_deserialize_from_str!(EndianWrapper); +impl schemars::JsonSchema for EndianWrapper { + fn schema_name() -> std::borrow::Cow<'static, str> { + "Endian".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + schemars::json_schema! ({ + "type": "string", + "enum": ["big", "little"] + }) + .into() + } +} /// `ExternAbi` is in `rustc_abi`, which doesn't have access to the macro and serde. struct ExternAbiWrapper(rustc_abi::ExternAbi); @@ -441,8 +453,22 @@ impl FromStr for ExternAbiWrapper { } } crate::json::serde_deserialize_from_str!(ExternAbiWrapper); +impl schemars::JsonSchema for ExternAbiWrapper { + fn schema_name() -> std::borrow::Cow<'static, str> { + "ExternAbi".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + let all = + rustc_abi::ExternAbi::ALL_VARIANTS.iter().map(|abi| abi.as_str()).collect::>(); + schemars::json_schema! ({ + "type": "string", + "enum": all, + }) + .into() + } +} -#[derive(serde_derive::Deserialize)] +#[derive(serde_derive::Deserialize, schemars::JsonSchema)] struct TargetSpecJsonMetadata { description: Option>, tier: Option, @@ -450,7 +476,7 @@ struct TargetSpecJsonMetadata { std: Option, } -#[derive(serde_derive::Deserialize)] +#[derive(serde_derive::Deserialize, schemars::JsonSchema)] #[serde(rename_all = "kebab-case")] // Ensure that all unexpected fields get turned into errors. // This helps users stay up to date when the schema changes instead of silently @@ -593,3 +619,7 @@ struct TargetSpecJson { supports_xray: Option, entry_abi: Option, } + +pub fn json_schema() -> schemars::Schema { + schemars::schema_for!(TargetSpecJson) +} diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 239ac7bf5c4..07fb1ce63f7 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -70,6 +70,7 @@ mod json; pub use abi_map::{AbiMap, AbiMapping}; pub use base::apple; pub use base::avr::ef_avr_arch; +pub use json::json_schema; /// Linker is called through a C/C++ compiler. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] @@ -523,6 +524,20 @@ linker_flavor_cli_impls! { } crate::json::serde_deserialize_from_str!(LinkerFlavorCli); +impl schemars::JsonSchema for LinkerFlavorCli { + fn schema_name() -> std::borrow::Cow<'static, str> { + "LinkerFlavor".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + let all: Vec<&'static str> = + Self::all().iter().map(|flavor| flavor.desc()).collect::>(); + schemars::json_schema! ({ + "type": "string", + "enum": all + }) + .into() + } +} impl ToJson for LinkerFlavorCli { fn to_json(&self) -> Json { @@ -576,6 +591,18 @@ impl FromStr for LinkSelfContainedDefault { } crate::json::serde_deserialize_from_str!(LinkSelfContainedDefault); +impl schemars::JsonSchema for LinkSelfContainedDefault { + fn schema_name() -> std::borrow::Cow<'static, str> { + "LinkSelfContainedDefault".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + schemars::json_schema! ({ + "type": "string", + "enum": ["false", "true", "wasm", "musl", "mingw"] + }) + .into() + } +} impl ToJson for LinkSelfContainedDefault { fn to_json(&self) -> Json { @@ -708,6 +735,20 @@ impl FromStr for LinkSelfContainedComponents { } crate::json::serde_deserialize_from_str!(LinkSelfContainedComponents); +impl schemars::JsonSchema for LinkSelfContainedComponents { + fn schema_name() -> std::borrow::Cow<'static, str> { + "LinkSelfContainedComponents".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + let all = + Self::all_components().iter().map(|component| component.as_str()).collect::>(); + schemars::json_schema! ({ + "type": "string", + "enum": all, + }) + .into() + } +} impl ToJson for LinkSelfContainedComponents { fn to_json(&self) -> Json { @@ -846,7 +887,6 @@ crate::target_spec_enum! { parse_error_type = "symbol visibility"; } - #[derive(Clone, Debug, PartialEq, Hash)] pub enum SmallDataThresholdSupport { None, @@ -874,6 +914,18 @@ impl FromStr for SmallDataThresholdSupport { } crate::json::serde_deserialize_from_str!(SmallDataThresholdSupport); +impl schemars::JsonSchema for SmallDataThresholdSupport { + fn schema_name() -> std::borrow::Cow<'static, str> { + "SmallDataThresholdSupport".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + schemars::json_schema! ({ + "type": "string", + "pattern": r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#, + }) + .into() + } +} impl ToJson for SmallDataThresholdSupport { fn to_json(&self) -> Value { @@ -1074,7 +1126,7 @@ crate::target_spec_enum! { into_diag_arg_using_display!(SplitDebuginfo); -#[derive(Clone, Debug, PartialEq, Eq, serde_derive::Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, serde_derive::Deserialize, schemars::JsonSchema)] #[serde(tag = "kind")] #[serde(rename_all = "kebab-case")] pub enum StackProbeType { @@ -1235,6 +1287,19 @@ impl FromStr for SanitizerSet { } crate::json::serde_deserialize_from_str!(SanitizerSet); +impl schemars::JsonSchema for SanitizerSet { + fn schema_name() -> std::borrow::Cow<'static, str> { + "SanitizerSet".into() + } + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + let all = Self::all().iter().map(|sanitizer| sanitizer.as_str()).collect::>(); + schemars::json_schema! ({ + "type": "string", + "enum": all, + }) + .into() + } +} impl ToJson for SanitizerSet { fn to_json(&self) -> Json { @@ -1328,7 +1393,6 @@ impl BinaryFormat { } } - impl ToJson for Align { fn to_json(&self) -> Json { self.bits().to_json() diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index a5f0718bc01..99a1062109a 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -590,6 +590,8 @@ impl Step for Rustc { // Debugger scripts builder.ensure(DebuggerScripts { sysroot: image.to_owned(), target }); + generate_target_spec_json_schema(builder, image); + // HTML copyright files let file_list = builder.ensure(super::run::GenerateCopyright); for file in file_list { @@ -618,6 +620,28 @@ impl Step for Rustc { } } +fn generate_target_spec_json_schema(builder: &Builder<'_>, sysroot: &Path) { + // Since we run rustc in bootstrap, we need to ensure that we use the host compiler. + // We do this by using the stage 1 compiler, which is always compiled for the host, + // even in a cross build. + let stage1_host = builder.compiler(1, builder.host_target); + let mut rustc = command(builder.rustc(stage1_host)).fail_fast(); + rustc + .env("RUSTC_BOOTSTRAP", "1") + .args(["--print=target-spec-json-schema", "-Zunstable-options"]); + let schema = rustc.run_capture(builder).stdout(); + + let schema_dir = tmpdir(builder); + t!(fs::create_dir_all(&schema_dir)); + let schema_file = schema_dir.join("target-spec-json-schema.json"); + t!(std::fs::write(&schema_file, schema)); + + let dst = sysroot.join("etc"); + t!(fs::create_dir_all(&dst)); + + builder.install(&schema_file, &dst, FileType::Regular); +} + /// Copies debugger scripts for `target` into the given compiler `sysroot`. #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub struct DebuggerScripts { diff --git a/src/bootstrap/src/utils/proc_macro_deps.rs b/src/bootstrap/src/utils/proc_macro_deps.rs index 777c8601aa1..db2369097d6 100644 --- a/src/bootstrap/src/utils/proc_macro_deps.rs +++ b/src/bootstrap/src/utils/proc_macro_deps.rs @@ -43,6 +43,7 @@ pub static CRATES: &[&str] = &[ "rustc-hash", "self_cell", "serde", + "serde_derive_internals", "sha2", "smallvec", "stable_deref_trait", diff --git a/src/doc/rustc/src/targets/custom.md b/src/doc/rustc/src/targets/custom.md index 6c1494186a4..e1750e27f0b 100644 --- a/src/doc/rustc/src/targets/custom.md +++ b/src/doc/rustc/src/targets/custom.md @@ -16,6 +16,21 @@ rustc +nightly -Z unstable-options --target=wasm32-unknown-unknown --print targe To use a custom target, see the (unstable) [`build-std` feature](../../cargo/reference/unstable.html#build-std) of `cargo`. +

+ +## JSON Schema + +`rustc` provides a JSON schema for the custom target JSON specification. +Because the schema is subject to change, you should always use the schema from the version of rustc which you are passing the target to. + +It can be found in `etc/target-spec-json-schema.json` in the sysroot (`rustc --print sysroot`) or printed with `rustc +nightly -Zunstable-options --print target-spec-json-schema`. +The existence and name of this schema is, just like the properties of the JSON specification, not stable and subject to change. + ## Custom Target Lookup Path When `rustc` is given an option `--target=TARGET` (where `TARGET` is any string), it uses the following logic: diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index 60347b2ea64..a9804761400 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -267,6 +267,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "digest", "displaydoc", "dissimilar", + "dyn-clone", "either", "elsa", "ena", @@ -346,6 +347,8 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "rand_xorshift", // dependency for doc-tests in rustc_thread_pool "rand_xoshiro", "redox_syscall", + "ref-cast", + "ref-cast-impl", "regex", "regex-automata", "regex-syntax", @@ -357,11 +360,14 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[ "rustix", "ruzstd", // via object in thorin-dwp "ryu", + "schemars", + "schemars_derive", "scoped-tls", "scopeguard", "self_cell", "serde", "serde_derive", + "serde_derive_internals", "serde_json", "serde_path_to_error", "sha1", diff --git a/tests/run-make/print-request-help-stable-unstable/help-diff.diff b/tests/run-make/print-request-help-stable-unstable/help-diff.diff index 07eafca3271..044302a19a0 100644 --- a/tests/run-make/print-request-help-stable-unstable/help-diff.diff +++ b/tests/run-make/print-request-help-stable-unstable/help-diff.diff @@ -2,6 +2,6 @@ error: unknown print request: `xxx` | - = help: valid print requests are: `calling-conventions`, `cfg`, `code-models`, `crate-name`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `tls-models` -+ = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models` ++ = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `target-spec-json-schema`, `tls-models` = help: for more information, see the rustc book: https://doc.rust-lang.org/rustc/command-line-arguments.html#--print-print-compiler-information diff --git a/tests/run-make/print-request-help-stable-unstable/unstable-invalid-print-request-help.err b/tests/run-make/print-request-help-stable-unstable/unstable-invalid-print-request-help.err index 50ef340e3dd..cc6c3c909b3 100644 --- a/tests/run-make/print-request-help-stable-unstable/unstable-invalid-print-request-help.err +++ b/tests/run-make/print-request-help-stable-unstable/unstable-invalid-print-request-help.err @@ -1,5 +1,5 @@ error: unknown print request: `xxx` | - = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models` + = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `target-spec-json-schema`, `tls-models` = help: for more information, see the rustc book: https://doc.rust-lang.org/rustc/command-line-arguments.html#--print-print-compiler-information diff --git a/tests/run-make/rustc-help/help-v.stdout b/tests/run-make/rustc-help/help-v.stdout index 3fc297fb08e..cd161c51ee3 100644 --- a/tests/run-make/rustc-help/help-v.stdout +++ b/tests/run-make/rustc-help/help-v.stdout @@ -43,7 +43,7 @@ Options: --print [=] Compiler information to print on stdout (or to a file) INFO may be one of - . + . -g Equivalent to -C debuginfo=2 -O Equivalent to -C opt-level=3 -o Write output to FILENAME diff --git a/tests/run-make/rustc-help/help.stdout b/tests/run-make/rustc-help/help.stdout index caffe28f498..74ec083bdee 100644 --- a/tests/run-make/rustc-help/help.stdout +++ b/tests/run-make/rustc-help/help.stdout @@ -43,7 +43,7 @@ Options: --print [=] Compiler information to print on stdout (or to a file) INFO may be one of - . + . -g Equivalent to -C debuginfo=2 -O Equivalent to -C opt-level=3 -o Write output to FILENAME diff --git a/tests/ui/invalid-compile-flags/print-without-arg.stderr b/tests/ui/invalid-compile-flags/print-without-arg.stderr index 3048a59d0d0..4163d4e0602 100644 --- a/tests/ui/invalid-compile-flags/print-without-arg.stderr +++ b/tests/ui/invalid-compile-flags/print-without-arg.stderr @@ -3,5 +3,5 @@ error: Argument to option 'print' missing --print [=] Compiler information to print on stdout (or to a file) INFO may be one of - . + . diff --git a/tests/ui/invalid-compile-flags/print.stderr b/tests/ui/invalid-compile-flags/print.stderr index e3374eb1e6e..e8adbfd87d7 100644 --- a/tests/ui/invalid-compile-flags/print.stderr +++ b/tests/ui/invalid-compile-flags/print.stderr @@ -1,5 +1,5 @@ error: unknown print request: `yyyy` | - = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models` + = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `target-spec-json-schema`, `tls-models` = help: for more information, see the rustc book: https://doc.rust-lang.org/rustc/command-line-arguments.html#--print-print-compiler-information diff --git a/tests/ui/print-request/print-lints-help.stderr b/tests/ui/print-request/print-lints-help.stderr index bc48b2fa73c..297a3aa79e1 100644 --- a/tests/ui/print-request/print-lints-help.stderr +++ b/tests/ui/print-request/print-lints-help.stderr @@ -1,6 +1,6 @@ error: unknown print request: `lints` | - = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `tls-models` + = help: valid print requests are: `all-target-specs-json`, `calling-conventions`, `cfg`, `check-cfg`, `code-models`, `crate-name`, `crate-root-lint-levels`, `deployment-target`, `file-names`, `host-tuple`, `link-args`, `native-static-libs`, `relocation-models`, `split-debuginfo`, `stack-protector-strategies`, `supported-crate-types`, `sysroot`, `target-cpus`, `target-features`, `target-libdir`, `target-list`, `target-spec-json`, `target-spec-json-schema`, `tls-models` = help: use `-Whelp` to print a list of lints = help: for more information, see the rustc book: https://doc.rust-lang.org/rustc/command-line-arguments.html#--print-print-compiler-information -- cgit 1.4.1-3-g733a5