Auto merge of #112839 - GuillaumeGomez:rollup-jc5nqug, r=GuillaumeGomez
Rollup of 6 pull requests Successful merges: - #112464 (Fix windows `Socket::connect_timeout` overflow) - #112720 (Rustdoc: search: color item type and reduce size to avoid clashing) - #112762 (Sort the errors from arguments checking so that suggestions are handled properly) - #112786 (change binders from tuple structs to named fields) - #112794 (Fix linker failures when #[global_allocator] is used in a dependency) - #112819 (Disable feature(unboxed_closures, fn_traits) in weird-exprs) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
1b6d4cdc4d
@ -13,7 +13,7 @@ use crate::mir::place::PlaceRef;
|
||||
use crate::traits::*;
|
||||
use crate::{CachedModuleCodegen, CompiledModule, CrateInfo, MemFlags, ModuleCodegen, ModuleKind};
|
||||
|
||||
use rustc_ast::expand::allocator::AllocatorKind;
|
||||
use rustc_ast::expand::allocator::{global_fn_name, AllocatorKind, ALLOCATOR_METHODS};
|
||||
use rustc_attr as attr;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
|
||||
@ -921,7 +921,21 @@ impl CrateInfo {
|
||||
missing_weak_lang_items
|
||||
.iter()
|
||||
.map(|item| (format!("{prefix}{item}"), SymbolExportKind::Text)),
|
||||
)
|
||||
);
|
||||
if tcx.allocator_kind(()).is_some() {
|
||||
// At least one crate needs a global allocator. This crate may be placed
|
||||
// after the crate that defines it in the linker order, in which case some
|
||||
// linkers return an error. By adding the global allocator shim methods to
|
||||
// the linked_symbols list, linking the generated symbols.o will ensure that
|
||||
// circular dependencies involving the global allocator don't lead to linker
|
||||
// errors.
|
||||
linked_symbols.extend(ALLOCATOR_METHODS.iter().map(|method| {
|
||||
(
|
||||
format!("{prefix}{}", global_fn_name(method.name).as_str()),
|
||||
SymbolExportKind::Text,
|
||||
)
|
||||
}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
use std::cmp;
|
||||
|
||||
use core::cmp::Ordering;
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_middle::ty::error::TypeError;
|
||||
use std::cmp;
|
||||
|
||||
rustc_index::newtype_index! {
|
||||
#[debug_format = "ExpectedIdx({})"]
|
||||
@ -34,14 +34,14 @@ enum Issue {
|
||||
Permutation(Vec<Option<usize>>),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub(crate) enum Compatibility<'tcx> {
|
||||
Compatible,
|
||||
Incompatible(Option<TypeError<'tcx>>),
|
||||
}
|
||||
|
||||
/// Similar to `Issue`, but contains some extra information
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) enum Error<'tcx> {
|
||||
/// The provided argument is the invalid type for the expected input
|
||||
Invalid(ProvidedIdx, ExpectedIdx, Compatibility<'tcx>),
|
||||
@ -55,6 +55,34 @@ pub(crate) enum Error<'tcx> {
|
||||
Permutation(Vec<(ExpectedIdx, ProvidedIdx)>),
|
||||
}
|
||||
|
||||
impl Ord for Error<'_> {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
let key = |error: &Error<'_>| -> usize {
|
||||
match error {
|
||||
Error::Invalid(..) => 0,
|
||||
Error::Extra(_) => 1,
|
||||
Error::Missing(_) => 2,
|
||||
Error::Swap(..) => 3,
|
||||
Error::Permutation(..) => 4,
|
||||
}
|
||||
};
|
||||
match (self, other) {
|
||||
(Error::Invalid(a, _, _), Error::Invalid(b, _, _)) => a.cmp(b),
|
||||
(Error::Extra(a), Error::Extra(b)) => a.cmp(b),
|
||||
(Error::Missing(a), Error::Missing(b)) => a.cmp(b),
|
||||
(Error::Swap(a, b, ..), Error::Swap(c, d, ..)) => a.cmp(c).then(b.cmp(d)),
|
||||
(Error::Permutation(a), Error::Permutation(b)) => a.cmp(b),
|
||||
_ => key(self).cmp(&key(other)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Error<'_> {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct ArgMatrix<'tcx> {
|
||||
/// Maps the indices in the `compatibility_matrix` rows to the indices of
|
||||
/// the *user provided* inputs
|
||||
@ -177,7 +205,7 @@ impl<'tcx> ArgMatrix<'tcx> {
|
||||
// If an argument is unsatisfied, and the input in its position is useless
|
||||
// then the most likely explanation is that we just got the types wrong
|
||||
(true, true, true, true) => return Some(Issue::Invalid(i)),
|
||||
// Otherwise, if an input is useless, then indicate that this is an extra argument
|
||||
// Otherwise, if an input is useless then indicate that this is an extra input
|
||||
(true, _, true, _) => return Some(Issue::Extra(i)),
|
||||
// Otherwise, if an argument is unsatisfiable, indicate that it's missing
|
||||
(_, true, _, true) => return Some(Issue::Missing(i)),
|
||||
@ -376,6 +404,9 @@ impl<'tcx> ArgMatrix<'tcx> {
|
||||
};
|
||||
}
|
||||
|
||||
// sort errors with same type by the order they appear in the source
|
||||
// so that suggestion will be handled properly, see #112507
|
||||
errors.sort();
|
||||
return (errors, matched_inputs);
|
||||
}
|
||||
}
|
||||
|
@ -1007,7 +1007,10 @@ impl BoundVariableKind {
|
||||
/// `Decodable` and `Encodable` are implemented for `Binder<T>` using the `impl_binder_encode_decode!` macro.
|
||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
|
||||
#[derive(HashStable, Lift)]
|
||||
pub struct Binder<'tcx, T>(T, &'tcx List<BoundVariableKind>);
|
||||
pub struct Binder<'tcx, T> {
|
||||
value: T,
|
||||
bound_vars: &'tcx List<BoundVariableKind>,
|
||||
}
|
||||
|
||||
impl<'tcx, T> Binder<'tcx, T>
|
||||
where
|
||||
@ -1023,15 +1026,15 @@ where
|
||||
!value.has_escaping_bound_vars(),
|
||||
"`{value:?}` has escaping bound vars, so it cannot be wrapped in a dummy binder."
|
||||
);
|
||||
Binder(value, ty::List::empty())
|
||||
Binder { value, bound_vars: ty::List::empty() }
|
||||
}
|
||||
|
||||
pub fn bind_with_vars(value: T, vars: &'tcx List<BoundVariableKind>) -> Binder<'tcx, T> {
|
||||
pub fn bind_with_vars(value: T, bound_vars: &'tcx List<BoundVariableKind>) -> Binder<'tcx, T> {
|
||||
if cfg!(debug_assertions) {
|
||||
let mut validator = ValidateBoundVars::new(vars);
|
||||
let mut validator = ValidateBoundVars::new(bound_vars);
|
||||
value.visit_with(&mut validator);
|
||||
}
|
||||
Binder(value, vars)
|
||||
Binder { value, bound_vars }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1053,30 +1056,30 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
/// - comparing the self type of a PolyTraitRef to see if it is equal to
|
||||
/// a type parameter `X`, since the type `X` does not reference any regions
|
||||
pub fn skip_binder(self) -> T {
|
||||
self.0
|
||||
self.value
|
||||
}
|
||||
|
||||
pub fn bound_vars(&self) -> &'tcx List<BoundVariableKind> {
|
||||
self.1
|
||||
self.bound_vars
|
||||
}
|
||||
|
||||
pub fn as_ref(&self) -> Binder<'tcx, &T> {
|
||||
Binder(&self.0, self.1)
|
||||
Binder { value: &self.value, bound_vars: self.bound_vars }
|
||||
}
|
||||
|
||||
pub fn as_deref(&self) -> Binder<'tcx, &T::Target>
|
||||
where
|
||||
T: Deref,
|
||||
{
|
||||
Binder(&self.0, self.1)
|
||||
Binder { value: &self.value, bound_vars: self.bound_vars }
|
||||
}
|
||||
|
||||
pub fn map_bound_ref_unchecked<F, U>(&self, f: F) -> Binder<'tcx, U>
|
||||
where
|
||||
F: FnOnce(&T) -> U,
|
||||
{
|
||||
let value = f(&self.0);
|
||||
Binder(value, self.1)
|
||||
let value = f(&self.value);
|
||||
Binder { value, bound_vars: self.bound_vars }
|
||||
}
|
||||
|
||||
pub fn map_bound_ref<F, U: TypeVisitable<TyCtxt<'tcx>>>(&self, f: F) -> Binder<'tcx, U>
|
||||
@ -1090,12 +1093,13 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
where
|
||||
F: FnOnce(T) -> U,
|
||||
{
|
||||
let value = f(self.0);
|
||||
let Binder { value, bound_vars } = self;
|
||||
let value = f(value);
|
||||
if cfg!(debug_assertions) {
|
||||
let mut validator = ValidateBoundVars::new(self.1);
|
||||
let mut validator = ValidateBoundVars::new(bound_vars);
|
||||
value.visit_with(&mut validator);
|
||||
}
|
||||
Binder(value, self.1)
|
||||
Binder { value, bound_vars }
|
||||
}
|
||||
|
||||
pub fn try_map_bound<F, U: TypeVisitable<TyCtxt<'tcx>>, E>(
|
||||
@ -1105,12 +1109,13 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
where
|
||||
F: FnOnce(T) -> Result<U, E>,
|
||||
{
|
||||
let value = f(self.0)?;
|
||||
let Binder { value, bound_vars } = self;
|
||||
let value = f(value)?;
|
||||
if cfg!(debug_assertions) {
|
||||
let mut validator = ValidateBoundVars::new(self.1);
|
||||
let mut validator = ValidateBoundVars::new(bound_vars);
|
||||
value.visit_with(&mut validator);
|
||||
}
|
||||
Ok(Binder(value, self.1))
|
||||
Ok(Binder { value, bound_vars })
|
||||
}
|
||||
|
||||
/// Wraps a `value` in a binder, using the same bound variables as the
|
||||
@ -1126,11 +1131,7 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
where
|
||||
U: TypeVisitable<TyCtxt<'tcx>>,
|
||||
{
|
||||
if cfg!(debug_assertions) {
|
||||
let mut validator = ValidateBoundVars::new(self.bound_vars());
|
||||
value.visit_with(&mut validator);
|
||||
}
|
||||
Binder(value, self.1)
|
||||
Binder::bind_with_vars(value, self.bound_vars)
|
||||
}
|
||||
|
||||
/// Unwraps and returns the value within, but only if it contains
|
||||
@ -1147,7 +1148,7 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
where
|
||||
T: TypeVisitable<TyCtxt<'tcx>>,
|
||||
{
|
||||
if self.0.has_escaping_bound_vars() { None } else { Some(self.skip_binder()) }
|
||||
if self.value.has_escaping_bound_vars() { None } else { Some(self.skip_binder()) }
|
||||
}
|
||||
|
||||
/// Splits the contents into two things that share the same binder
|
||||
@ -1160,22 +1161,23 @@ impl<'tcx, T> Binder<'tcx, T> {
|
||||
where
|
||||
F: FnOnce(T) -> (U, V),
|
||||
{
|
||||
let (u, v) = f(self.0);
|
||||
(Binder(u, self.1), Binder(v, self.1))
|
||||
let Binder { value, bound_vars } = self;
|
||||
let (u, v) = f(value);
|
||||
(Binder { value: u, bound_vars }, Binder { value: v, bound_vars })
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, T> Binder<'tcx, Option<T>> {
|
||||
pub fn transpose(self) -> Option<Binder<'tcx, T>> {
|
||||
let bound_vars = self.1;
|
||||
self.0.map(|v| Binder(v, bound_vars))
|
||||
let Binder { value, bound_vars } = self;
|
||||
value.map(|value| Binder { value, bound_vars })
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, T: IntoIterator> Binder<'tcx, T> {
|
||||
pub fn iter(self) -> impl Iterator<Item = ty::Binder<'tcx, T::Item>> {
|
||||
let bound_vars = self.1;
|
||||
self.0.into_iter().map(|v| Binder(v, bound_vars))
|
||||
let Binder { value, bound_vars } = self;
|
||||
value.into_iter().map(|value| Binder { value, bound_vars })
|
||||
}
|
||||
}
|
||||
|
||||
@ -1184,7 +1186,7 @@ where
|
||||
T: IntoDiagnosticArg,
|
||||
{
|
||||
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
||||
self.0.into_diagnostic_arg()
|
||||
self.value.into_diagnostic_arg()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -538,19 +538,21 @@ impl<'tcx, T: TypeVisitable<TyCtxt<'tcx>>> TypeVisitable<TyCtxt<'tcx>> for &'tcx
|
||||
/// [`subst_identity`](EarlyBinder::subst_identity) or [`skip_binder`](EarlyBinder::skip_binder).
|
||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
|
||||
#[derive(Encodable, Decodable, HashStable)]
|
||||
pub struct EarlyBinder<T>(T);
|
||||
pub struct EarlyBinder<T> {
|
||||
value: T,
|
||||
}
|
||||
|
||||
/// For early binders, you should first call `subst` before using any visitors.
|
||||
impl<'tcx, T> !TypeFoldable<TyCtxt<'tcx>> for ty::EarlyBinder<T> {}
|
||||
impl<'tcx, T> !TypeVisitable<TyCtxt<'tcx>> for ty::EarlyBinder<T> {}
|
||||
|
||||
impl<T> EarlyBinder<T> {
|
||||
pub fn bind(inner: T) -> EarlyBinder<T> {
|
||||
EarlyBinder(inner)
|
||||
pub fn bind(value: T) -> EarlyBinder<T> {
|
||||
EarlyBinder { value }
|
||||
}
|
||||
|
||||
pub fn as_ref(&self) -> EarlyBinder<&T> {
|
||||
EarlyBinder(&self.0)
|
||||
EarlyBinder { value: &self.value }
|
||||
}
|
||||
|
||||
pub fn map_bound_ref<F, U>(&self, f: F) -> EarlyBinder<U>
|
||||
@ -564,20 +566,20 @@ impl<T> EarlyBinder<T> {
|
||||
where
|
||||
F: FnOnce(T) -> U,
|
||||
{
|
||||
let value = f(self.0);
|
||||
EarlyBinder(value)
|
||||
let value = f(self.value);
|
||||
EarlyBinder { value }
|
||||
}
|
||||
|
||||
pub fn try_map_bound<F, U, E>(self, f: F) -> Result<EarlyBinder<U>, E>
|
||||
where
|
||||
F: FnOnce(T) -> Result<U, E>,
|
||||
{
|
||||
let value = f(self.0)?;
|
||||
Ok(EarlyBinder(value))
|
||||
let value = f(self.value)?;
|
||||
Ok(EarlyBinder { value })
|
||||
}
|
||||
|
||||
pub fn rebind<U>(&self, value: U) -> EarlyBinder<U> {
|
||||
EarlyBinder(value)
|
||||
EarlyBinder { value }
|
||||
}
|
||||
|
||||
/// Skips the binder and returns the "bound" value.
|
||||
@ -592,19 +594,20 @@ impl<T> EarlyBinder<T> {
|
||||
/// See also [`Binder::skip_binder`](super::Binder::skip_binder), which is
|
||||
/// the analogous operation on [`super::Binder`].
|
||||
pub fn skip_binder(self) -> T {
|
||||
self.0
|
||||
self.value
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> EarlyBinder<Option<T>> {
|
||||
pub fn transpose(self) -> Option<EarlyBinder<T>> {
|
||||
self.0.map(|v| EarlyBinder(v))
|
||||
self.value.map(|value| EarlyBinder { value })
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, U> EarlyBinder<(T, U)> {
|
||||
pub fn transpose_tuple2(self) -> (EarlyBinder<T>, EarlyBinder<U>) {
|
||||
(EarlyBinder(self.0.0), EarlyBinder(self.0.1))
|
||||
let EarlyBinder { value: (lhs, rhs) } = self;
|
||||
(EarlyBinder { value: lhs }, EarlyBinder { value: rhs })
|
||||
}
|
||||
}
|
||||
|
||||
@ -617,13 +620,13 @@ where
|
||||
tcx: TyCtxt<'tcx>,
|
||||
substs: &'s [GenericArg<'tcx>],
|
||||
) -> SubstIter<'s, 'tcx, I> {
|
||||
SubstIter { it: self.0.into_iter(), tcx, substs }
|
||||
SubstIter { it: self.value.into_iter(), tcx, substs }
|
||||
}
|
||||
|
||||
/// Similar to [`subst_identity`](EarlyBinder::subst_identity),
|
||||
/// but on an iterator of `TypeFoldable` values.
|
||||
pub fn subst_identity_iter(self) -> I::IntoIter {
|
||||
self.0.into_iter()
|
||||
self.value.into_iter()
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,7 +643,7 @@ where
|
||||
type Item = I::Item;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
Some(EarlyBinder(self.it.next()?).subst(self.tcx, self.substs))
|
||||
Some(EarlyBinder { value: self.it.next()? }.subst(self.tcx, self.substs))
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
@ -654,7 +657,7 @@ where
|
||||
I::Item: TypeFoldable<TyCtxt<'tcx>>,
|
||||
{
|
||||
fn next_back(&mut self) -> Option<Self::Item> {
|
||||
Some(EarlyBinder(self.it.next_back()?).subst(self.tcx, self.substs))
|
||||
Some(EarlyBinder { value: self.it.next_back()? }.subst(self.tcx, self.substs))
|
||||
}
|
||||
}
|
||||
|
||||
@ -675,13 +678,13 @@ where
|
||||
tcx: TyCtxt<'tcx>,
|
||||
substs: &'s [GenericArg<'tcx>],
|
||||
) -> SubstIterCopied<'s, 'tcx, I> {
|
||||
SubstIterCopied { it: self.0.into_iter(), tcx, substs }
|
||||
SubstIterCopied { it: self.value.into_iter(), tcx, substs }
|
||||
}
|
||||
|
||||
/// Similar to [`subst_identity`](EarlyBinder::subst_identity),
|
||||
/// but on an iterator of values that deref to a `TypeFoldable`.
|
||||
pub fn subst_identity_iter_copied(self) -> impl Iterator<Item = <I::Item as Deref>::Target> {
|
||||
self.0.into_iter().map(|v| *v)
|
||||
self.value.into_iter().map(|v| *v)
|
||||
}
|
||||
}
|
||||
|
||||
@ -699,7 +702,7 @@ where
|
||||
type Item = <I::Item as Deref>::Target;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
Some(EarlyBinder(*self.it.next()?).subst(self.tcx, self.substs))
|
||||
self.it.next().map(|value| EarlyBinder { value: *value }.subst(self.tcx, self.substs))
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
@ -714,7 +717,7 @@ where
|
||||
<I::Item as Deref>::Target: Copy + TypeFoldable<TyCtxt<'tcx>>,
|
||||
{
|
||||
fn next_back(&mut self) -> Option<Self::Item> {
|
||||
Some(EarlyBinder(*self.it.next_back()?).subst(self.tcx, self.substs))
|
||||
self.it.next_back().map(|value| EarlyBinder { value: *value }.subst(self.tcx, self.substs))
|
||||
}
|
||||
}
|
||||
|
||||
@ -732,7 +735,7 @@ pub struct EarlyBinderIter<T> {
|
||||
|
||||
impl<T: IntoIterator> EarlyBinder<T> {
|
||||
pub fn transpose_iter(self) -> EarlyBinderIter<T::IntoIter> {
|
||||
EarlyBinderIter { t: self.0.into_iter() }
|
||||
EarlyBinderIter { t: self.value.into_iter() }
|
||||
}
|
||||
}
|
||||
|
||||
@ -740,7 +743,7 @@ impl<T: Iterator> Iterator for EarlyBinderIter<T> {
|
||||
type Item = EarlyBinder<T::Item>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.t.next().map(|i| EarlyBinder(i))
|
||||
self.t.next().map(|value| EarlyBinder { value })
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
@ -751,7 +754,7 @@ impl<T: Iterator> Iterator for EarlyBinderIter<T> {
|
||||
impl<'tcx, T: TypeFoldable<TyCtxt<'tcx>>> ty::EarlyBinder<T> {
|
||||
pub fn subst(self, tcx: TyCtxt<'tcx>, substs: &[GenericArg<'tcx>]) -> T {
|
||||
let mut folder = SubstFolder { tcx, substs, binders_passed: 0 };
|
||||
self.0.fold_with(&mut folder)
|
||||
self.value.fold_with(&mut folder)
|
||||
}
|
||||
|
||||
/// Makes the identity substitution `T0 => T0, ..., TN => TN`.
|
||||
@ -763,12 +766,12 @@ impl<'tcx, T: TypeFoldable<TyCtxt<'tcx>>> ty::EarlyBinder<T> {
|
||||
/// - Inside of the body of `foo`, we treat `T` as a placeholder by calling
|
||||
/// `subst_identity` to discharge the `EarlyBinder`.
|
||||
pub fn subst_identity(self) -> T {
|
||||
self.0
|
||||
self.value
|
||||
}
|
||||
|
||||
/// Returns the inner value, but only if it contains no bound vars.
|
||||
pub fn no_bound_vars(self) -> Option<T> {
|
||||
if !self.0.has_param() { Some(self.0) } else { None }
|
||||
if !self.value.has_param() { Some(self.value) } else { None }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,6 +46,17 @@ fn connect_error() {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(target_env = "sgx", ignore)] // FIXME: https://github.com/fortanix/rust-sgx/issues/31
|
||||
fn connect_timeout_error() {
|
||||
let socket_addr = next_test_ip4();
|
||||
let result = TcpStream::connect_timeout(&socket_addr, Duration::MAX);
|
||||
assert!(!matches!(result, Err(e) if e.kind() == ErrorKind::TimedOut));
|
||||
|
||||
let _listener = TcpListener::bind(&socket_addr).unwrap();
|
||||
assert!(TcpStream::connect_timeout(&socket_addr, Duration::MAX).is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn listen_localhost() {
|
||||
let socket_addr = next_test_ip4();
|
||||
|
@ -159,7 +159,7 @@ impl Socket {
|
||||
}
|
||||
|
||||
let mut timeout = c::timeval {
|
||||
tv_sec: timeout.as_secs() as c_long,
|
||||
tv_sec: cmp::min(timeout.as_secs(), c_long::MAX as u64) as c_long,
|
||||
tv_usec: (timeout.subsec_nanos() / 1000) as c_long,
|
||||
};
|
||||
|
||||
|
@ -890,6 +890,10 @@ so that we can apply CSS-filters to change the arrow color in themes */
|
||||
.search-results .result-name .grey {
|
||||
color: var(--search-results-grey-color);
|
||||
}
|
||||
.search-results .result-name .typename {
|
||||
color: var(--search-results-grey-color);
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.popover {
|
||||
position: absolute;
|
||||
|
@ -2024,7 +2024,9 @@ function initSearch(rawSearchIndex) {
|
||||
|
||||
resultName.insertAdjacentHTML(
|
||||
"beforeend",
|
||||
`${typeName} ${item.displayPath}<span class="${type}">${name}</span>`);
|
||||
`<span class="typename">${typeName}</span>`
|
||||
+ ` ${item.displayPath}<span class="${type}">${name}</span>`
|
||||
);
|
||||
link.appendChild(resultName);
|
||||
|
||||
const description = document.createElement("div");
|
||||
|
7
tests/run-make/allocator-shim-circular-deps/Makefile
Normal file
7
tests/run-make/allocator-shim-circular-deps/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
# ignore-cross-compile
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
rm -rf $(TMPDIR) && mkdir $(TMPDIR)
|
||||
$(RUSTC) my_lib.rs
|
||||
$(RUSTC) main.rs --test --extern my_lib=$(TMPDIR)/libmy_lib.rlib
|
5
tests/run-make/allocator-shim-circular-deps/main.rs
Normal file
5
tests/run-make/allocator-shim-circular-deps/main.rs
Normal file
@ -0,0 +1,5 @@
|
||||
#![crate_type = "bin"]
|
||||
|
||||
fn main() {
|
||||
my_lib::do_something();
|
||||
}
|
10
tests/run-make/allocator-shim-circular-deps/my_lib.rs
Normal file
10
tests/run-make/allocator-shim-circular-deps/my_lib.rs
Normal file
@ -0,0 +1,10 @@
|
||||
#![crate_type = "lib"]
|
||||
|
||||
use std::alloc::System;
|
||||
|
||||
#[global_allocator]
|
||||
static ALLOCATOR: System = System;
|
||||
|
||||
pub fn do_something() {
|
||||
format!("allocating a string!");
|
||||
}
|
@ -28,6 +28,12 @@ define-function: (
|
||||
".result-" + |result_kind| + ":focus ." + |result_kind|,
|
||||
{"color": |hover_color|},
|
||||
)
|
||||
// color of the typename (struct, module, method, ...) before search results
|
||||
assert-css: (
|
||||
".result-name .typename",
|
||||
{"color": "#888"},
|
||||
ALL,
|
||||
)
|
||||
},
|
||||
)
|
||||
|
||||
|
12
tests/ui/argument-suggestions/issue-112507.rs
Normal file
12
tests/ui/argument-suggestions/issue-112507.rs
Normal file
@ -0,0 +1,12 @@
|
||||
pub enum Value {
|
||||
Float(Option<f64>),
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _a = Value::Float( //~ ERROR this enum variant takes 1 argument but 4 arguments were supplied
|
||||
0,
|
||||
None,
|
||||
None,
|
||||
0,
|
||||
);
|
||||
}
|
27
tests/ui/argument-suggestions/issue-112507.stderr
Normal file
27
tests/ui/argument-suggestions/issue-112507.stderr
Normal file
@ -0,0 +1,27 @@
|
||||
error[E0061]: this enum variant takes 1 argument but 4 arguments were supplied
|
||||
--> $DIR/issue-112507.rs:6:14
|
||||
|
|
||||
LL | let _a = Value::Float(
|
||||
| ^^^^^^^^^^^^
|
||||
LL | 0,
|
||||
| - unexpected argument of type `{integer}`
|
||||
LL | None,
|
||||
LL | None,
|
||||
| ---- unexpected argument of type `Option<_>`
|
||||
LL | 0,
|
||||
| - unexpected argument of type `{integer}`
|
||||
|
|
||||
note: tuple variant defined here
|
||||
--> $DIR/issue-112507.rs:2:5
|
||||
|
|
||||
LL | Float(Option<f64>),
|
||||
| ^^^^^
|
||||
help: remove the extra arguments
|
||||
|
|
||||
LL ~ ,
|
||||
LL ~ None);
|
||||
|
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0061`.
|
@ -7,7 +7,7 @@ LL | async fn foo(x: u32) -> u32 {
|
||||
= help: the trait `Future` is not implemented for `[async fn body@$DIR/async.rs:23:29: 25:2]`
|
||||
= note: [async fn body@$DIR/async.rs:23:29: 25:2] must be a future or must implement `IntoFuture` to be awaited
|
||||
|
||||
error: internal compiler error: projection clauses should be implied from elsewhere. obligation: `Obligation(predicate=Binder(ProjectionPredicate(AliasTy { substs: [[async fn body@$DIR/async.rs:23:29: 25:2]], def_id: ... }, Term::Ty(u32)), []), depth=0)`
|
||||
error: internal compiler error: projection clauses should be implied from elsewhere. obligation: `Obligation(predicate=Binder { value: ProjectionPredicate(AliasTy { substs: [[async fn body@$DIR/async.rs:23:29: 25:2]], def_id: ... }, Term::Ty(u32)), bound_vars: [] }, depth=0)`
|
||||
--> $DIR/async.rs:23:25
|
||||
|
|
||||
LL | async fn foo(x: u32) -> u32 {
|
||||
|
@ -41,5 +41,5 @@ fn test<X: ?Sized + Send>() {}
|
||||
|
||||
fn main() {
|
||||
test::<A>();
|
||||
//~^ ERROR evaluate(Binder(TraitPredicate(<A as std::marker::Send>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//~^ ERROR evaluate(Binder { value: TraitPredicate(<A as std::marker::Send>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: evaluate(Binder(TraitPredicate(<A as std::marker::Send>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<A as std::marker::Send>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/cache-reached-depth-ice.rs:43:5
|
||||
|
|
||||
LL | fn test<X: ?Sized + Send>() {}
|
||||
|
@ -57,10 +57,10 @@ fn main() {
|
||||
// Key is that Vec<First> is "ok" and Third<'_, Ty> is "ok modulo regions":
|
||||
|
||||
forward();
|
||||
//~^ ERROR evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
//~^ ERROR evaluate(Binder { value: TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder { value: TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
|
||||
reverse();
|
||||
//~^ ERROR evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
//~^ ERROR evaluate(Binder { value: TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder { value: TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:59:5
|
||||
|
|
||||
LL | Vec<First>: Unpin,
|
||||
@ -7,7 +7,7 @@ LL | Vec<First>: Unpin,
|
||||
LL | forward();
|
||||
| ^^^^^^^
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
error: evaluate(Binder { value: TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:59:5
|
||||
|
|
||||
LL | Third<'a, Ty>: Unpin,
|
||||
@ -16,7 +16,7 @@ LL | Third<'a, Ty>: Unpin,
|
||||
LL | forward();
|
||||
| ^^^^^^^
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
error: evaluate(Binder { value: TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:63:5
|
||||
|
|
||||
LL | Third<'a, Ty>: Unpin,
|
||||
@ -25,7 +25,7 @@ LL | Third<'a, Ty>: Unpin,
|
||||
LL | reverse();
|
||||
| ^^^^^^^
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:63:5
|
||||
|
|
||||
LL | Vec<First>: Unpin,
|
||||
|
@ -7,12 +7,12 @@ use core::marker::PhantomData;
|
||||
|
||||
fn main() {
|
||||
test::<MaskedStorage<GenericComp<Pos>>>(make());
|
||||
//~^ ERROR evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//~^ ERROR evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
//~| ERROR evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
|
||||
test::<MaskedStorage<GenericComp2<Pos>>>(make());
|
||||
//~^ ERROR evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
//~| ERROR evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
//~^ ERROR evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
//~| ERROR evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
}
|
||||
|
||||
#[rustc_evaluate_where_clauses]
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/issue-85360-eval-obligation-ice.rs:9:5
|
||||
|
|
||||
LL | test::<MaskedStorage<GenericComp<Pos>>>(make());
|
||||
@ -7,7 +7,7 @@ LL | test::<MaskedStorage<GenericComp<Pos>>>(make());
|
||||
LL | fn test<T: Sized>(_: T) {}
|
||||
| - predicate
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/issue-85360-eval-obligation-ice.rs:9:5
|
||||
|
|
||||
LL | test::<MaskedStorage<GenericComp<Pos>>>(make());
|
||||
@ -16,7 +16,7 @@ LL | test::<MaskedStorage<GenericComp<Pos>>>(make());
|
||||
LL | fn test<T: Sized>(_: T) {}
|
||||
| ----- predicate
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
error: evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
--> $DIR/issue-85360-eval-obligation-ice.rs:13:5
|
||||
|
|
||||
LL | test::<MaskedStorage<GenericComp2<Pos>>>(make());
|
||||
@ -25,7 +25,7 @@ LL | test::<MaskedStorage<GenericComp2<Pos>>>(make());
|
||||
LL | fn test<T: Sized>(_: T) {}
|
||||
| - predicate
|
||||
|
||||
error: evaluate(Binder(TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
error: evaluate(Binder { value: TraitPredicate(<MaskedStorage<GenericComp2<Pos>> as std::marker::Sized>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
--> $DIR/issue-85360-eval-obligation-ice.rs:13:5
|
||||
|
|
||||
LL | test::<MaskedStorage<GenericComp2<Pos>>>(make());
|
||||
|
@ -48,8 +48,8 @@ fn test(val: MyStruct) where Helper: HelperTrait {
|
||||
|
||||
fn foo(val: MyStruct) {
|
||||
test(val);
|
||||
//[with_clause]~^ ERROR evaluate(Binder(TraitPredicate(<Helper as HelperTrait>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
//[without_clause]~^^ ERROR evaluate(Binder(TraitPredicate(<Helper as HelperTrait>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
//[with_clause]~^ ERROR evaluate(Binder { value: TraitPredicate(<Helper as HelperTrait>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
//[without_clause]~^^ ERROR evaluate(Binder { value: TraitPredicate(<Helper as HelperTrait>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: evaluate(Binder(TraitPredicate(<Helper as HelperTrait>, polarity:Positive), [])) = Ok(EvaluatedToOkModuloRegions)
|
||||
error: evaluate(Binder { value: TraitPredicate(<Helper as HelperTrait>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOkModuloRegions)
|
||||
--> $DIR/project-modulo-regions.rs:50:5
|
||||
|
|
||||
LL | fn test(val: MyStruct) where Helper: HelperTrait {
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: evaluate(Binder(TraitPredicate(<Helper as HelperTrait>, polarity:Positive), [])) = Ok(EvaluatedToOk)
|
||||
error: evaluate(Binder { value: TraitPredicate(<Helper as HelperTrait>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
||||
--> $DIR/project-modulo-regions.rs:50:5
|
||||
|
|
||||
LL | fn test(val: MyStruct) where Helper: HelperTrait {
|
||||
|
@ -1,7 +1,6 @@
|
||||
// run-pass
|
||||
|
||||
#![feature(generators)]
|
||||
#![feature(unboxed_closures, fn_traits)]
|
||||
|
||||
#![allow(non_camel_case_types)]
|
||||
#![allow(dead_code)]
|
||||
@ -17,6 +16,7 @@
|
||||
extern crate core;
|
||||
use std::cell::Cell;
|
||||
use std::mem::swap;
|
||||
use std::ops::Deref;
|
||||
|
||||
// Just a grab bag of stuff that you wouldn't want to actually write.
|
||||
|
||||
@ -183,10 +183,10 @@ fn 𝚌𝚘𝚗𝚝𝚒𝚗𝚞𝚎() {
|
||||
|
||||
fn function() {
|
||||
struct foo;
|
||||
impl FnOnce<()> for foo {
|
||||
type Output = foo;
|
||||
extern "rust-call" fn call_once(self, _args: ()) -> Self::Output {
|
||||
foo
|
||||
impl Deref for foo {
|
||||
type Target = fn() -> Self;
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&((|| foo) as _)
|
||||
}
|
||||
}
|
||||
let foo = foo () ()() ()()() ()()()() ()()()()();
|
||||
|
Loading…
x
Reference in New Issue
Block a user