Merge pull request #20318 from Veykril/push-vpqsrylmkqqm

fix: Ignore `Destruct` bounds again
This commit is contained in:
Lukas Wirth 2025-07-27 20:50:23 +00:00 committed by GitHub
commit e90966801e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 58 additions and 20 deletions

View file

@ -590,9 +590,14 @@ impl<'a> TyLoweringContext<'a> {
.resolve_trait(ctx.ty_ctx().db, ctx.ty_ctx().resolver.krate()); .resolve_trait(ctx.ty_ctx().db, ctx.ty_ctx().resolver.krate());
let pointee_sized = LangItem::PointeeSized let pointee_sized = LangItem::PointeeSized
.resolve_trait(ctx.ty_ctx().db, ctx.ty_ctx().resolver.krate()); .resolve_trait(ctx.ty_ctx().db, ctx.ty_ctx().resolver.krate());
if meta_sized.is_some_and(|it| it == trait_ref.hir_trait_id()) { let destruct = LangItem::Destruct
.resolve_trait(ctx.ty_ctx().db, ctx.ty_ctx().resolver.krate());
let hir_trait_id = trait_ref.hir_trait_id();
if meta_sized.is_some_and(|it| it == hir_trait_id)
|| destruct.is_some_and(|it| it == hir_trait_id)
{
// Ignore this bound // Ignore this bound
} else if pointee_sized.is_some_and(|it| it == trait_ref.hir_trait_id()) { } else if pointee_sized.is_some_and(|it| it == hir_trait_id) {
// Regard this as `?Sized` bound // Regard this as `?Sized` bound
ctx.ty_ctx().unsized_types.insert(self_ty); ctx.ty_ctx().unsized_types.insert(self_ty);
} else { } else {

View file

@ -2349,3 +2349,37 @@ fn test() {
"#]], "#]],
); );
} }
#[test]
fn rust_destruct_option_clone() {
check_types(
r#"
//- minicore: option, drop
fn test(o: &Option<i32>) {
o.my_clone();
//^^^^^^^^^^^^ Option<i32>
}
pub trait MyClone: Sized {
fn my_clone(&self) -> Self;
}
impl<T> const MyClone for Option<T>
where
T: ~const MyClone + ~const Destruct,
{
fn my_clone(&self) -> Self {
match self {
Some(x) => Some(x.my_clone()),
None => None,
}
}
}
impl const MyClone for i32 {
fn my_clone(&self) -> Self {
*self
}
}
#[lang = "destruct"]
pub trait Destruct {}
"#,
);
}

View file

@ -62,7 +62,10 @@ impl BuildScriptOutput {
self.cfgs.is_empty() self.cfgs.is_empty()
&& self.envs.is_empty() && self.envs.is_empty()
&& self.out_dir.is_none() && self.out_dir.is_none()
&& self.proc_macro_dylib_path == ProcMacroDylibPath::NotBuilt && matches!(
self.proc_macro_dylib_path,
ProcMacroDylibPath::NotBuilt | ProcMacroDylibPath::NotProcMacro
)
} }
} }
@ -462,10 +465,10 @@ impl WorkspaceBuildScripts {
let lockfile_path = let lockfile_path =
<_ as AsRef<Utf8Path>>::as_ref(manifest_path).with_extension("lock"); <_ as AsRef<Utf8Path>>::as_ref(manifest_path).with_extension("lock");
if let Some((temp_dir, target_lockfile)) = make_lockfile_copy(&lockfile_path) { if let Some((temp_dir, target_lockfile)) = make_lockfile_copy(&lockfile_path) {
requires_unstable_options = true;
temp_dir_guard = Some(temp_dir); temp_dir_guard = Some(temp_dir);
cmd.arg("--lockfile-path"); cmd.arg("--lockfile-path");
cmd.arg(target_lockfile.as_str()); cmd.arg(target_lockfile.as_str());
requires_unstable_options = true;
} }
} }
match &config.features { match &config.features {

View file

@ -601,7 +601,6 @@ impl FetchMetadata {
} }
command.current_dir(current_dir); command.current_dir(current_dir);
let mut needs_nightly = false;
let mut other_options = vec![]; let mut other_options = vec![];
// cargo metadata only supports a subset of flags of what cargo usually accepts, and usually // cargo metadata only supports a subset of flags of what cargo usually accepts, and usually
// the only relevant flags for metadata here are unstable ones, so we pass those along // the only relevant flags for metadata here are unstable ones, so we pass those along
@ -611,7 +610,6 @@ impl FetchMetadata {
if arg == "-Z" if arg == "-Z"
&& let Some(arg) = extra_args.next() && let Some(arg) = extra_args.next()
{ {
needs_nightly = true;
other_options.push("-Z".to_owned()); other_options.push("-Z".to_owned());
other_options.push(arg.to_owned()); other_options.push(arg.to_owned());
} }
@ -619,7 +617,6 @@ impl FetchMetadata {
let mut lockfile_path = None; let mut lockfile_path = None;
if cargo_toml.is_rust_manifest() { if cargo_toml.is_rust_manifest() {
needs_nightly = true;
other_options.push("-Zscript".to_owned()); other_options.push("-Zscript".to_owned());
} else if config } else if config
.toolchain_version .toolchain_version
@ -637,10 +634,6 @@ impl FetchMetadata {
command.other_options(other_options.clone()); command.other_options(other_options.clone());
if needs_nightly {
command.env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly");
}
// Pre-fetch basic metadata using `--no-deps`, which: // Pre-fetch basic metadata using `--no-deps`, which:
// - avoids fetching registries like crates.io, // - avoids fetching registries like crates.io,
// - skips dependency resolution and does not modify lockfiles, // - skips dependency resolution and does not modify lockfiles,
@ -710,7 +703,7 @@ impl FetchMetadata {
other_options.push(target_lockfile.to_string()); other_options.push(target_lockfile.to_string());
using_lockfile_copy = true; using_lockfile_copy = true;
} }
if using_lockfile_copy { if using_lockfile_copy || other_options.iter().any(|it| it.starts_with("-Z")) {
command.env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly"); command.env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly");
other_options.push("-Zunstable-options".to_owned()); other_options.push("-Zunstable-options".to_owned());
} }

View file

@ -1316,14 +1316,17 @@ fn cargo_to_crate_graph(
public_deps.add_to_crate_graph(crate_graph, from); public_deps.add_to_crate_graph(crate_graph, from);
// Add dep edge of all targets to the package's lib target // Add dep edge of all targets to the package's lib target
if let Some((to, name)) = lib_tgt.clone() { if let Some((to, name)) = lib_tgt.clone()
match to != from && kind != TargetKind::BuildScript { && to != from
true => { && kind != TargetKind::BuildScript
let name = CrateName::normalize_dashes(&name); {
add_dep(crate_graph, from, name, to); // (build script can not depend on its library target)
}
false => (), // For root projects with dashes in their name,
} // cargo metadata does not do any normalization,
// so we do it ourselves currently
let name = CrateName::normalize_dashes(&name);
add_dep(crate_graph, from, name, to);
} }
} }
} }