Skip to content

Rollup of 6 pull requests #141545

New issue

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

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

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
May 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions compiler/rustc_attr_data_structures/src/version.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::fmt::{self, Display};
use std::sync::OnceLock;

use rustc_macros::{
Decodable, Encodable, HashStable_Generic, PrintAttribute, current_rustc_version,
Expand All @@ -16,8 +17,29 @@ pub struct RustcVersion {

impl RustcVersion {
pub const CURRENT: Self = current_rustc_version!();
pub fn current_overridable() -> Self {
*CURRENT_OVERRIDABLE.get_or_init(|| {
if let Ok(override_var) = std::env::var("RUSTC_OVERRIDE_VERSION_STRING")
&& let Some(override_) = Self::parse_str(&override_var)
{
override_
} else {
Self::CURRENT
}
})
}
fn parse_str(value: &str) -> Option<Self> {
// Ignore any suffixes such as "-dev" or "-nightly".
let mut components = value.split('-').next().unwrap().splitn(3, '.');
let major = components.next()?.parse().ok()?;
let minor = components.next()?.parse().ok()?;
let patch = components.next().unwrap_or("0").parse().ok()?;
Some(RustcVersion { major, minor, patch })
}
}

static CURRENT_OVERRIDABLE: OnceLock<RustcVersion> = OnceLock::new();

impl Display for RustcVersion {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{}.{}.{}", self.major, self.minor, self.patch)
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_attr_parsing/src/attributes/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,9 @@ pub fn eval_condition(

// See https://github.com/rust-lang/rust/issues/64796#issuecomment-640851454 for details
if sess.psess.assume_incomplete_release {
RustcVersion::CURRENT > min_version
RustcVersion::current_overridable() > min_version
} else {
RustcVersion::CURRENT >= min_version
RustcVersion::current_overridable() >= min_version
}
}
MetaItemKind::List(mis) => {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_hir_typeck/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ hir_typeck_option_result_copied = use `{$def_path}::copied` to copy the value in

hir_typeck_pass_to_variadic_function = can't pass `{$ty}` to variadic function
.suggestion = cast the value to `{$cast_ty}`
.teach_help = certain types, like `{$ty}`, must be casted before passing them to a variadic function, because of arcane ABI rules dictated by the C standard
.teach_help = certain types, like `{$ty}`, must be cast before passing them to a variadic function to match the implicit cast that a C compiler would perform as part of C's numeric promotion rules

hir_typeck_ptr_cast_add_auto_to_object = cannot add {$traits_len ->
[1] auto trait {$traits}
Expand Down
6 changes: 1 addition & 5 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let tcx = self.tcx;
let rcvr_ty = self.resolve_vars_if_possible(rcvr_ty);
let mut ty_file = None;
let (mut ty_str, short_ty_str) =
let (ty_str, short_ty_str) =
if trait_missing_method && let ty::Dynamic(predicates, _, _) = rcvr_ty.kind() {
(predicates.to_string(), with_forced_trimmed_paths!(predicates.to_string()))
} else {
Expand Down Expand Up @@ -738,10 +738,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
err.span_label(within_macro_span, "due to this macro variable");
}

if short_ty_str.len() < ty_str.len() && ty_str.len() > 10 {
ty_str = short_ty_str;
}

if rcvr_ty.references_error() {
err.downgrade_to_delayed_bug();
}
Expand Down
10 changes: 5 additions & 5 deletions compiler/rustc_infer/src/infer/canonical/query_response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use crate::infer::canonical::{
QueryOutlivesConstraint, QueryRegionConstraints, QueryResponse,
};
use crate::infer::region_constraints::{Constraint, RegionConstraintData};
use crate::infer::{DefineOpaqueTypes, InferCtxt, InferOk, InferResult};
use crate::infer::{DefineOpaqueTypes, InferCtxt, InferOk, InferResult, SubregionOrigin};
use crate::traits::query::NoSolution;
use crate::traits::{
Obligation, ObligationCause, PredicateObligation, PredicateObligations, ScrubbedTraitError,
Expand Down Expand Up @@ -593,10 +593,10 @@ impl<'tcx> InferCtxt<'tcx> {
// no action needed
}
(GenericArgKind::Lifetime(v1), GenericArgKind::Lifetime(v2)) => {
obligations.extend(
self.at(cause, param_env)
.eq(DefineOpaqueTypes::Yes, v1, v2)?
.into_obligations(),
self.inner.borrow_mut().unwrap_region_constraints().make_eqregion(
SubregionOrigin::RelateRegionParamBound(cause.span, None),
v1,
v2,
);
}
(GenericArgKind::Const(v1), GenericArgKind::Const(v2)) => {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_trait_selection/src/solve/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use crate::solve::inspect::{self, ProofTreeInferCtxtExt};

#[extension(pub trait InferCtxtSelectExt<'tcx>)]
impl<'tcx> InferCtxt<'tcx> {
/// Do not use this directly. This is called from [`crate::traits::SelectionContext::select`].
fn select_in_new_trait_solver(
&self,
obligation: &TraitObligation<'tcx>,
Expand Down
19 changes: 18 additions & 1 deletion src/bootstrap/src/core/build_steps/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -739,7 +739,7 @@ impl Step for Clippy {
const DEFAULT: bool = false;

fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.path("src/tools/clippy")
run.suite_path("src/tools/clippy/tests").path("src/tools/clippy")
}

fn make_run(run: RunConfig<'_>) {
Expand Down Expand Up @@ -783,6 +783,23 @@ impl Step for Clippy {
let host_libs = builder.stage_out(compiler, Mode::ToolRustc).join(builder.cargo_dir());
cargo.env("HOST_LIBS", host_libs);

// Collect paths of tests to run
'partially_test: {
let paths = &builder.config.paths[..];
let mut test_names = Vec::new();
for path in paths {
if let Some(path) =
helpers::is_valid_test_suite_arg(path, "src/tools/clippy/tests", builder)
{
test_names.push(path);
} else if path.ends_with("src/tools/clippy") {
// When src/tools/clippy is called directly, all tests should be run.
break 'partially_test;
}
}
cargo.env("TESTNAME", test_names.join(","));
}

cargo.add_rustc_lib_path(builder);
let cargo = prepare_cargo_test(cargo, &[], &[], host, builder);

Expand Down
17 changes: 17 additions & 0 deletions src/tools/tidy/src/features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ pub struct Feature {
pub tracking_issue: Option<NonZeroU32>,
pub file: PathBuf,
pub line: usize,
pub description: Option<String>,
}
impl Feature {
fn tracking_issue_display(&self) -> impl fmt::Display {
Expand Down Expand Up @@ -296,6 +297,7 @@ fn collect_lang_features_in(features: &mut Features, base: &Path, file: &str, ba
let mut prev_names = vec![];

let lines = contents.lines().zip(1..);
let mut doc_comments: Vec<String> = Vec::new();
for (line, line_number) in lines {
let line = line.trim();

Expand Down Expand Up @@ -332,6 +334,13 @@ fn collect_lang_features_in(features: &mut Features, base: &Path, file: &str, ba
continue;
}

if in_feature_group {
if let Some(doc_comment) = line.strip_prefix("///") {
doc_comments.push(doc_comment.trim().to_string());
continue;
}
}

let mut parts = line.split(',');
let level = match parts.next().map(|l| l.trim().trim_start_matches('(')) {
Some("unstable") => Status::Unstable,
Expand Down Expand Up @@ -438,9 +447,15 @@ fn collect_lang_features_in(features: &mut Features, base: &Path, file: &str, ba
tracking_issue,
file: path.to_path_buf(),
line: line_number,
description: if doc_comments.is_empty() {
None
} else {
Some(doc_comments.join(" "))
},
});
}
}
doc_comments.clear();
}
}

Expand Down Expand Up @@ -564,6 +579,7 @@ fn map_lib_features(
tracking_issue: find_attr_val(line, "issue").and_then(handle_issue_none),
file: file.to_path_buf(),
line: i + 1,
description: None,
};
mf(Ok((feature_name, feature)), file, i + 1);
continue;
Expand Down Expand Up @@ -600,6 +616,7 @@ fn map_lib_features(
tracking_issue,
file: file.to_path_buf(),
line: i + 1,
description: None,
};
if line.contains(']') {
mf(Ok((feature_name, feature)), file, i + 1);
Expand Down
23 changes: 17 additions & 6 deletions src/tools/unstable-book-gen/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,18 @@ use tidy::unstable_book::{
collect_unstable_feature_names,
};

fn generate_stub_issue(path: &Path, name: &str, issue: u32) {
let content = format!(include_str!("stub-issue.md"), name = name, issue = issue);
fn generate_stub_issue(path: &Path, name: &str, issue: u32, description: &str) {
let content = format!(
include_str!("stub-issue.md"),
name = name,
issue = issue,
description = description
);
t!(write(path, content), path);
}

fn generate_stub_no_issue(path: &Path, name: &str) {
let content = format!(include_str!("stub-no-issue.md"), name = name);
fn generate_stub_no_issue(path: &Path, name: &str, description: &str) {
let content = format!(include_str!("stub-no-issue.md"), name = name, description = description);
t!(write(path, content), path);
}

Expand Down Expand Up @@ -58,11 +63,17 @@ fn generate_unstable_book_files(src: &Path, out: &Path, features: &Features) {
let file_name = format!("{feature_name}.md");
let out_file_path = out.join(&file_name);
let feature = &features[&feature_name_underscore];
let description = feature.description.as_deref().unwrap_or_default();

if let Some(issue) = feature.tracking_issue {
generate_stub_issue(&out_file_path, &feature_name_underscore, issue.get());
generate_stub_issue(
&out_file_path,
&feature_name_underscore,
issue.get(),
&description,
);
} else {
generate_stub_no_issue(&out_file_path, &feature_name_underscore);
generate_stub_no_issue(&out_file_path, &feature_name_underscore, &description);
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/tools/unstable-book-gen/src/stub-issue.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# `{name}`

{description}

The tracking issue for this feature is: [#{issue}]

[#{issue}]: https://github.com/rust-lang/rust/issues/{issue}
Expand Down
2 changes: 2 additions & 0 deletions src/tools/unstable-book-gen/src/stub-no-issue.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# `{name}`

{description}

This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.

------------------------
4 changes: 2 additions & 2 deletions tests/run-make/crate-loading/multiple-dep-versions.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ error[E0599]: no method named `foo` found for struct `dep_2_reexport::Type` in t
--> replaced
|
LL | Type.foo();
| ^^^ method not found in `Type`
| ^^^ method not found in `dep_2_reexport::Type`
|
note: there are multiple different versions of crate `dependency` in the dependency graph
--> replaced
Expand All @@ -63,7 +63,7 @@ error[E0599]: no function or associated item named `bar` found for struct `dep_2
--> replaced
|
LL | Type::bar();
| ^^^ function or associated item not found in `Type`
| ^^^ function or associated item not found in `dep_2_reexport::Type`
|
note: there are multiple different versions of crate `dependency` in the dependency graph
--> replaced
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/associated-types/issue-43924.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ error[E0599]: no function or associated item named `default` found for trait obj
--> $DIR/issue-43924.rs:14:39
|
LL | assert_eq!(<() as Foo<u32>>::Out::default().to_string(), "false");
| ^^^^^^^ function or associated item not found in `dyn ToString`
| ^^^^^^^ function or associated item not found in `(dyn ToString + 'static)`

error: aborting due to 2 previous errors

Expand Down
6 changes: 3 additions & 3 deletions tests/ui/attributes/rustc_confusables.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ error[E0599]: no method named `foo` found for struct `rustc_confusables_across_c
--> $DIR/rustc_confusables.rs:15:7
|
LL | x.foo();
| ^^^ method not found in `BTreeSet`
| ^^^ method not found in `rustc_confusables_across_crate::BTreeSet`

error[E0599]: no method named `push` found for struct `rustc_confusables_across_crate::BTreeSet` in the current scope
--> $DIR/rustc_confusables.rs:17:7
|
LL | x.push();
| ^^^^ method not found in `BTreeSet`
| ^^^^ method not found in `rustc_confusables_across_crate::BTreeSet`
|
help: you might have meant to use `insert`
|
Expand All @@ -60,7 +60,7 @@ error[E0599]: no method named `test` found for struct `rustc_confusables_across_
--> $DIR/rustc_confusables.rs:20:7
|
LL | x.test();
| ^^^^ method not found in `BTreeSet`
| ^^^^ method not found in `rustc_confusables_across_crate::BTreeSet`

error[E0599]: no method named `pulled` found for struct `rustc_confusables_across_crate::BTreeSet` in the current scope
--> $DIR/rustc_confusables.rs:22:7
Expand Down
30 changes: 30 additions & 0 deletions tests/ui/cfg/cfg-version/cfg-version-expand.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//@ run-pass
//@ rustc-env:RUSTC_OVERRIDE_VERSION_STRING=1.50.3

#![feature(cfg_version)]

#[cfg(version("1.49.0"))]
const ON_1_49_0: bool = true;
#[cfg(version("1.50"))]
const ON_1_50_0: bool = true;
#[cfg(not(version("1.51")))]
const ON_1_51_0: bool = false;

// This one uses the wrong syntax, so doesn't eval to true
#[warn(unexpected_cfgs)]
#[cfg(not(version = "1.48.0"))] //~ WARN unexpected `cfg` condition name: `version`
const ON_1_48_0: bool = false;

fn main() {
assert!(!ON_1_48_0);
assert!(ON_1_49_0);
assert!(ON_1_50_0);
assert!(!ON_1_51_0);
assert!(cfg!(version("1.1")));
assert!(cfg!(version("1.49")));
assert!(cfg!(version("1.50.0")));
assert!(cfg!(version("1.50.3")));
assert!(!cfg!(version("1.50.4")));
assert!(!cfg!(version("1.51")));
assert!(!cfg!(version("1.100")));
}
17 changes: 17 additions & 0 deletions tests/ui/cfg/cfg-version/cfg-version-expand.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
warning: unexpected `cfg` condition name: `version`
--> $DIR/cfg-version-expand.rs:15:11
|
LL | #[cfg(not(version = "1.48.0"))]
| ^^^^^^^^^^^^^^^^^^
|
= help: to expect this configuration use `--check-cfg=cfg(version, values("1.48.0"))`
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
= note: `#[warn(unexpected_cfgs)]` on by default
help: there is a similar config predicate: `version("..")`
|
LL - #[cfg(not(version = "1.48.0"))]
LL + #[cfg(not(version("1.48.0")))]
|

warning: 1 warning emitted

4 changes: 2 additions & 2 deletions tests/ui/empty/empty-struct-braces-expr.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ error[E0599]: no variant or associated item named `Empty3` found for enum `empty
--> $DIR/empty-struct-braces-expr.rs:25:19
|
LL | let xe3 = XE::Empty3;
| ^^^^^^ variant or associated item not found in `XE`
| ^^^^^^ variant or associated item not found in `empty_struct::XE`
|
help: there is a variant with a similar name
|
Expand All @@ -132,7 +132,7 @@ error[E0599]: no variant or associated item named `Empty3` found for enum `empty
--> $DIR/empty-struct-braces-expr.rs:26:19
|
LL | let xe3 = XE::Empty3();
| ^^^^^^ variant or associated item not found in `XE`
| ^^^^^^ variant or associated item not found in `empty_struct::XE`
|
help: there is a variant with a similar name
|
Expand Down
Loading