mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Auto merge of #126463 - matthiaskrgr:rollup-lnkfibf, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #124884 (place explicit lifetime bound after generic param) - #126343 (Remove some msys2 utils) - #126351 (std::unix::fs::link using direct linkat call for Solaris.) - #126368 (Remove some unnecessary crate dependencies.) - #126386 (Migrate `run-make/allow-non-lint-warnings-cmdline` to `rmake.rs`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
63491e1012
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -95,8 +95,6 @@ jobs:
|
||||
path-type: inherit
|
||||
install: >
|
||||
make
|
||||
dos2unix
|
||||
diffutils
|
||||
|
||||
- name: disable git crlf conversion
|
||||
run: git config --global core.autocrlf false
|
||||
|
@ -4205,7 +4205,6 @@ dependencies = [
|
||||
"rustc_middle",
|
||||
"rustc_span",
|
||||
"rustc_target",
|
||||
"rustc_type_ir",
|
||||
"smallvec",
|
||||
"tracing",
|
||||
]
|
||||
|
@ -12,7 +12,6 @@ elsa = "=1.7.1"
|
||||
ena = "0.14.3"
|
||||
indexmap = { version = "2.0.0" }
|
||||
jobserver_crate = { version = "0.1.28", package = "jobserver" }
|
||||
libc = "0.2"
|
||||
measureme = "11"
|
||||
rustc-hash = "1.1.0"
|
||||
rustc-rayon = { version = "0.5.0", optional = true }
|
||||
@ -41,6 +40,11 @@ features = [
|
||||
"Win32_System_Threading",
|
||||
]
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
# tidy-alphabetical-start
|
||||
libc = "0.2"
|
||||
# tidy-alphabetical-end
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||
# tidy-alphabetical-start
|
||||
memmap2 = "0.2.1"
|
||||
|
@ -18,7 +18,6 @@ rustc_macros = { path = "../rustc_macros" }
|
||||
rustc_middle = { path = "../rustc_middle" }
|
||||
rustc_span = { path = "../rustc_span" }
|
||||
rustc_target = { path = "../rustc_target" }
|
||||
rustc_type_ir = { path = "../rustc_type_ir" }
|
||||
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
|
||||
tracing = "0.1"
|
||||
# tidy-alphabetical-end
|
||||
|
@ -64,11 +64,11 @@ use rustc_errors::{
|
||||
codes::*, pluralize, struct_span_code_err, Applicability, Diag, DiagCtxt, DiagStyledString,
|
||||
ErrorGuaranteed, IntoDiagArg, StringPart,
|
||||
};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::intravisit::Visitor;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{self as hir, ParamName};
|
||||
use rustc_macros::extension;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::dep_graph::DepContext;
|
||||
@ -2429,7 +2429,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let (type_scope, type_param_sugg_span) = match bound_kind {
|
||||
GenericKind::Param(param) => {
|
||||
let generics = self.tcx.generics_of(generic_param_scope);
|
||||
let def_id = generics.type_param(param, self.tcx).def_id.expect_local();
|
||||
let type_param = generics.type_param(param, self.tcx);
|
||||
let def_id = type_param.def_id.expect_local();
|
||||
let scope = self.tcx.local_def_id_to_hir_id(def_id).owner.def_id;
|
||||
// Get the `hir::Param` to verify whether it already has any bounds.
|
||||
// We do this to avoid suggesting code that ends up as `T: 'a'b`,
|
||||
@ -2439,7 +2440,18 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
Some((span, open_paren_sp)) => Some((span, true, open_paren_sp)),
|
||||
// If `param` corresponds to `Self`, no usable suggestion span.
|
||||
None if generics.has_self && param.index == 0 => None,
|
||||
None => Some((self.tcx.def_span(def_id).shrink_to_hi(), false, None)),
|
||||
None => {
|
||||
let span = if let Some(param) =
|
||||
hir_generics.params.iter().find(|param| param.def_id == def_id)
|
||||
&& let ParamName::Plain(ident) = param.name
|
||||
{
|
||||
ident.span.shrink_to_hi()
|
||||
} else {
|
||||
let span = self.tcx.def_span(def_id);
|
||||
span.shrink_to_hi()
|
||||
};
|
||||
Some((span, false, None))
|
||||
}
|
||||
};
|
||||
(scope, sugg_span)
|
||||
}
|
||||
|
@ -22,16 +22,12 @@ use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
|
||||
|
||||
#[cfg(any(all(target_os = "linux", target_env = "gnu"), target_vendor = "apple"))]
|
||||
use crate::sys::weak::syscall;
|
||||
#[cfg(any(target_os = "android", target_os = "macos", target_os = "solaris"))]
|
||||
#[cfg(target_os = "android")]
|
||||
use crate::sys::weak::weak;
|
||||
|
||||
use libc::{c_int, mode_t};
|
||||
|
||||
#[cfg(any(
|
||||
target_os = "solaris",
|
||||
all(target_os = "linux", target_env = "gnu"),
|
||||
target_vendor = "apple",
|
||||
))]
|
||||
#[cfg(any(all(target_os = "linux", target_env = "gnu"), target_vendor = "apple"))]
|
||||
use libc::c_char;
|
||||
#[cfg(any(
|
||||
all(target_os = "linux", not(target_env = "musl")),
|
||||
@ -1753,19 +1749,6 @@ pub fn link(original: &Path, link: &Path) -> io::Result<()> {
|
||||
// Android has `linkat` on newer versions, but we happen to know `link`
|
||||
// always has the correct behavior, so it's here as well.
|
||||
cvt(unsafe { libc::link(original.as_ptr(), link.as_ptr()) })?;
|
||||
} else if #[cfg(any(target_os = "macos", target_os = "solaris"))] {
|
||||
// MacOS (<=10.9) and Solaris 10 lack support for linkat while newer
|
||||
// versions have it. We want to use linkat if it is available, so we use weak!
|
||||
// to check. `linkat` is preferable to `link` because it gives us a flag to
|
||||
// specify how symlinks should be handled. We pass 0 as the flags argument,
|
||||
// meaning it shouldn't follow symlinks.
|
||||
weak!(fn linkat(c_int, *const c_char, c_int, *const c_char, c_int) -> c_int);
|
||||
|
||||
if let Some(f) = linkat.get() {
|
||||
cvt(unsafe { f(libc::AT_FDCWD, original.as_ptr(), libc::AT_FDCWD, link.as_ptr(), 0) })?;
|
||||
} else {
|
||||
cvt(unsafe { libc::link(original.as_ptr(), link.as_ptr()) })?;
|
||||
};
|
||||
} else {
|
||||
// Where we can, use `linkat` instead of `link`; see the comment above
|
||||
// this one for details on why.
|
||||
|
@ -6,7 +6,7 @@ use std::path::Path;
|
||||
use std::process::{Command as StdCommand, ExitStatus, Output, Stdio};
|
||||
|
||||
use crate::drop_bomb::DropBomb;
|
||||
use crate::{assert_not_contains, handle_failed_output};
|
||||
use crate::{assert_contains, assert_not_contains, handle_failed_output};
|
||||
|
||||
/// This is a custom command wrapper that simplifies working with commands and makes it easier to
|
||||
/// ensure that we check the exit status of executed processes.
|
||||
@ -170,6 +170,12 @@ impl CompletedProcess {
|
||||
self
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
pub fn assert_stdout_contains<S: AsRef<str>>(self, needle: S) -> Self {
|
||||
assert_contains(&self.stdout_utf8(), needle.as_ref());
|
||||
self
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
pub fn assert_stdout_not_contains<S: AsRef<str>>(&self, needle: S) -> &Self {
|
||||
assert_not_contains(&self.stdout_utf8(), needle.as_ref());
|
||||
@ -185,7 +191,7 @@ impl CompletedProcess {
|
||||
|
||||
#[track_caller]
|
||||
pub fn assert_stderr_contains<S: AsRef<str>>(&self, needle: S) -> &Self {
|
||||
assert!(self.stderr_utf8().contains(needle.as_ref()));
|
||||
assert_contains(&self.stderr_utf8(), needle.as_ref());
|
||||
self
|
||||
}
|
||||
|
||||
|
@ -332,6 +332,18 @@ pub fn read_dir<F: Fn(&Path)>(dir: impl AsRef<Path>, callback: F) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Check that `haystack` contains `needle`. Panic otherwise.
|
||||
#[track_caller]
|
||||
pub fn assert_contains(haystack: &str, needle: &str) {
|
||||
if !haystack.contains(needle) {
|
||||
eprintln!("=== HAYSTACK ===");
|
||||
eprintln!("{}", haystack);
|
||||
eprintln!("=== NEEDLE ===");
|
||||
eprintln!("{}", needle);
|
||||
panic!("needle was not found in haystack");
|
||||
}
|
||||
}
|
||||
|
||||
/// Check that `haystack` does not contain `needle`. Panic otherwise.
|
||||
#[track_caller]
|
||||
pub fn assert_not_contains(haystack: &str, needle: &str) {
|
||||
|
@ -1,5 +1,4 @@
|
||||
run-make/allocator-shim-circular-deps/Makefile
|
||||
run-make/allow-non-lint-warnings-cmdline/Makefile
|
||||
run-make/archive-duplicate-names/Makefile
|
||||
run-make/atomic-lock-free/Makefile
|
||||
run-make/branch-protection-check-IBT/Makefile
|
||||
|
@ -1,12 +0,0 @@
|
||||
# ignore-cross-compile
|
||||
include ../tools.mk
|
||||
|
||||
# Test that -A warnings makes the 'empty trait list for derive' warning go away
|
||||
OUT=$(shell $(RUSTC) foo.rs -A warnings 2>&1 | grep "warning" )
|
||||
|
||||
all: foo
|
||||
test -z '$(OUT)'
|
||||
|
||||
# This is just to make sure the above command actually succeeds
|
||||
foo:
|
||||
$(RUSTC) foo.rs -A warnings
|
@ -1,3 +1,6 @@
|
||||
//@ compile-flags: -Awarnings
|
||||
//@ check-pass
|
||||
|
||||
#[derive()]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Foo;
|
@ -0,0 +1,26 @@
|
||||
//@ error-pattern: r#T: 'static
|
||||
//@ error-pattern: r#K: 'static
|
||||
//@ error-pattern: T: 'static=
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/124785
|
||||
|
||||
struct Foo<T, K = i32>(&'static T, &'static K);
|
||||
//~^ ERROR: the parameter type `T` may not live long enough
|
||||
//~| ERROR: the parameter type `K` may not live long enough
|
||||
|
||||
struct Bar<r#T, r#K = i32>(&'static r#T, &'static r#K);
|
||||
//~^ ERROR: the parameter type `T` may not live long enough
|
||||
//~| ERROR: the parameter type `K` may not live long enough
|
||||
|
||||
struct Boo<T= i32>(&'static T);
|
||||
//~^ ERROR: the parameter type `T` may not live long enough
|
||||
|
||||
struct Far<T
|
||||
= i32>(&'static T);
|
||||
//~^ ERROR: the parameter type `T` may not live long enough
|
||||
|
||||
struct S<'a, K: 'a = i32>(&'static K);
|
||||
//~^ ERROR: lifetime parameter `'a` is never used
|
||||
//~| ERROR: the parameter type `K` may not live long enough
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,110 @@
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:7:24
|
||||
|
|
||||
LL | struct Foo<T, K = i32>(&'static T, &'static K);
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `T` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static T` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Foo<T: 'static, K = i32>(&'static T, &'static K);
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `K` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:7:36
|
||||
|
|
||||
LL | struct Foo<T, K = i32>(&'static T, &'static K);
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `K` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static K` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Foo<T, K: 'static = i32>(&'static T, &'static K);
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:11:28
|
||||
|
|
||||
LL | struct Bar<r#T, r#K = i32>(&'static r#T, &'static r#K);
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `T` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static T` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Bar<r#T: 'static, r#K = i32>(&'static r#T, &'static r#K);
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `K` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:11:42
|
||||
|
|
||||
LL | struct Bar<r#T, r#K = i32>(&'static r#T, &'static r#K);
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `K` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static K` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Bar<r#T, r#K: 'static = i32>(&'static r#T, &'static r#K);
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:15:20
|
||||
|
|
||||
LL | struct Boo<T= i32>(&'static T);
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `T` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static T` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Boo<T: 'static= i32>(&'static T);
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:19:8
|
||||
|
|
||||
LL | = i32>(&'static T);
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `T` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static T` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct Far<T: 'static
|
||||
| +++++++++
|
||||
|
||||
error[E0310]: the parameter type `K` may not live long enough
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:22:27
|
||||
|
|
||||
LL | struct S<'a, K: 'a = i32>(&'static K);
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| the parameter type `K` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static K` does not outlive the data it points at
|
||||
|
|
||||
help: consider adding an explicit lifetime bound
|
||||
|
|
||||
LL | struct S<'a, K: 'a + 'static = i32>(&'static K);
|
||||
| +++++++++
|
||||
|
||||
error[E0392]: lifetime parameter `'a` is never used
|
||||
--> $DIR/static-lifetime-tip-with-default-type.rs:22:10
|
||||
|
|
||||
LL | struct S<'a, K: 'a = i32>(&'static K);
|
||||
| ^^ unused lifetime parameter
|
||||
|
|
||||
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0310, E0392.
|
||||
For more information about an error, try `rustc --explain E0310`.
|
Loading…
Reference in New Issue
Block a user