Merge from rustc
This commit is contained in:
commit
8cabbc9bd0
18 changed files with 201 additions and 261 deletions
|
@ -998,6 +998,9 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
self.lower_const_arg(ct, FeedConstTy::No).into()
|
||||
}
|
||||
};
|
||||
if term.references_error() {
|
||||
continue;
|
||||
}
|
||||
// FIXME(#97583): This isn't syntactically well-formed!
|
||||
where_bounds.push(format!(
|
||||
" T: {trait}::{assoc_name} = {term}",
|
||||
|
|
|
@ -2,7 +2,7 @@ use rustc_ast as ast;
|
|||
use rustc_hir::LangItem;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput};
|
||||
use rustc_middle::ty::{self, ScalarInt, TyCtxt};
|
||||
use rustc_middle::ty::{self, ScalarInt, TyCtxt, TypeVisitableExt as _};
|
||||
use tracing::trace;
|
||||
|
||||
use crate::build::parse_float_into_scalar;
|
||||
|
@ -13,6 +13,10 @@ pub(crate) fn lit_to_const<'tcx>(
|
|||
) -> Result<ty::Const<'tcx>, LitToConstError> {
|
||||
let LitToConstInput { lit, ty, neg } = lit_input;
|
||||
|
||||
if let Err(guar) = ty.error_reported() {
|
||||
return Ok(ty::Const::new_error(tcx, guar));
|
||||
}
|
||||
|
||||
let trunc = |n| {
|
||||
let width = match tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) {
|
||||
Ok(layout) => layout.size,
|
||||
|
|
|
@ -626,32 +626,8 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||
) -> PatKind<'tcx> {
|
||||
let tcx = self.tcx;
|
||||
let def_id = block.def_id;
|
||||
let body_id = block.body;
|
||||
let expr = &tcx.hir().body(body_id).value;
|
||||
let ty = tcx.typeck(def_id).node_type(block.hir_id);
|
||||
|
||||
// Special case inline consts that are just literals. This is solely
|
||||
// a performance optimization, as we could also just go through the regular
|
||||
// const eval path below.
|
||||
// FIXME: investigate the performance impact of removing this.
|
||||
let lit_input = match expr.kind {
|
||||
hir::ExprKind::Lit(lit) => Some(LitToConstInput { lit: &lit.node, ty, neg: false }),
|
||||
hir::ExprKind::Unary(hir::UnOp::Neg, expr) => match expr.kind {
|
||||
hir::ExprKind::Lit(lit) => Some(LitToConstInput { lit: &lit.node, ty, neg: true }),
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
};
|
||||
if let Some(lit_input) = lit_input {
|
||||
match tcx.at(expr.span).lit_to_const(lit_input) {
|
||||
Ok(c) => return self.const_to_pat(c, ty, id, span).kind,
|
||||
// If an error occurred, ignore that it's a literal
|
||||
// and leave reporting the error up to const eval of
|
||||
// the unevaluated constant below.
|
||||
Err(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
let typeck_root_def_id = tcx.typeck_root_def_id(def_id.to_def_id());
|
||||
let parent_args =
|
||||
tcx.erase_regions(ty::GenericArgs::identity_for_item(tcx, typeck_root_def_id));
|
||||
|
|
|
@ -492,131 +492,150 @@ impl Extend<()> for () {
|
|||
fn extend_one(&mut self, _item: ()) {}
|
||||
}
|
||||
|
||||
#[stable(feature = "extend_for_tuple", since = "1.56.0")]
|
||||
impl<A, B, ExtendA, ExtendB> Extend<(A, B)> for (ExtendA, ExtendB)
|
||||
where
|
||||
ExtendA: Extend<A>,
|
||||
ExtendB: Extend<B>,
|
||||
{
|
||||
/// Allows to `extend` a tuple of collections that also implement `Extend`.
|
||||
///
|
||||
/// See also: [`Iterator::unzip`]
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// let mut tuple = (vec![0], vec![1]);
|
||||
/// tuple.extend([(2, 3), (4, 5), (6, 7)]);
|
||||
/// assert_eq!(tuple.0, [0, 2, 4, 6]);
|
||||
/// assert_eq!(tuple.1, [1, 3, 5, 7]);
|
||||
///
|
||||
/// // also allows for arbitrarily nested tuples as elements
|
||||
/// let mut nested_tuple = (vec![1], (vec![2], vec![3]));
|
||||
/// nested_tuple.extend([(4, (5, 6)), (7, (8, 9))]);
|
||||
///
|
||||
/// let (a, (b, c)) = nested_tuple;
|
||||
/// assert_eq!(a, [1, 4, 7]);
|
||||
/// assert_eq!(b, [2, 5, 8]);
|
||||
/// assert_eq!(c, [3, 6, 9]);
|
||||
/// ```
|
||||
fn extend<T: IntoIterator<Item = (A, B)>>(&mut self, into_iter: T) {
|
||||
let (a, b) = self;
|
||||
let iter = into_iter.into_iter();
|
||||
SpecTupleExtend::extend(iter, a, b);
|
||||
}
|
||||
macro_rules! spec_tuple_impl {
|
||||
( ($ty_name:ident, $var_name:ident, $extend_ty_name: ident, $trait_name:ident, $default_fn_name:ident, $cnt:tt), ) => {
|
||||
spec_tuple_impl!($trait_name, $default_fn_name, #[doc(fake_variadic)] #[doc = "This trait is implemented for tuples up to twelve items long. The `impl`s for 1- and 3- through 12-ary tuples were stabilized after 2-tuples, in RUSTC_CURRENT_VERSION."] => ($ty_name, $var_name, $extend_ty_name, $cnt),);
|
||||
};
|
||||
( ($ty_name:ident, $var_name:ident, $extend_ty_name: ident, $trait_name:ident, $default_fn_name:ident, $cnt:tt), $(($ty_names:ident, $var_names:ident, $extend_ty_names:ident, $trait_names:ident, $default_fn_names:ident, $cnts:tt),)*) => {
|
||||
|
||||
fn extend_one(&mut self, item: (A, B)) {
|
||||
self.0.extend_one(item.0);
|
||||
self.1.extend_one(item.1);
|
||||
}
|
||||
spec_tuple_impl!($(($ty_names, $var_names, $extend_ty_names, $trait_names, $default_fn_names, $cnts),)*);
|
||||
spec_tuple_impl!($trait_name, $default_fn_name, #[doc(hidden)] => ($ty_name, $var_name, $extend_ty_name, $cnt), $(($ty_names, $var_names, $extend_ty_names, $cnts),)*);
|
||||
};
|
||||
($trait_name:ident, $default_fn_name:ident, #[$meta:meta] $(#[$doctext:meta])? => $(($ty_names:ident, $var_names:ident, $extend_ty_names:ident, $cnts:tt),)*) => {
|
||||
#[$meta]
|
||||
$(#[$doctext])?
|
||||
#[stable(feature = "extend_for_tuple", since = "1.56.0")]
|
||||
impl<$($ty_names,)* $($extend_ty_names,)*> Extend<($($ty_names,)*)> for ($($extend_ty_names,)*)
|
||||
where
|
||||
$($extend_ty_names: Extend<$ty_names>,)*
|
||||
{
|
||||
/// Allows to `extend` a tuple of collections that also implement `Extend`.
|
||||
///
|
||||
/// See also: [`Iterator::unzip`]
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// // Example given for a 2-tuple, but 1- through 12-tuples are supported
|
||||
/// let mut tuple = (vec![0], vec![1]);
|
||||
/// tuple.extend([(2, 3), (4, 5), (6, 7)]);
|
||||
/// assert_eq!(tuple.0, [0, 2, 4, 6]);
|
||||
/// assert_eq!(tuple.1, [1, 3, 5, 7]);
|
||||
///
|
||||
/// // also allows for arbitrarily nested tuples as elements
|
||||
/// let mut nested_tuple = (vec![1], (vec![2], vec![3]));
|
||||
/// nested_tuple.extend([(4, (5, 6)), (7, (8, 9))]);
|
||||
///
|
||||
/// let (a, (b, c)) = nested_tuple;
|
||||
/// assert_eq!(a, [1, 4, 7]);
|
||||
/// assert_eq!(b, [2, 5, 8]);
|
||||
/// assert_eq!(c, [3, 6, 9]);
|
||||
/// ```
|
||||
fn extend<T: IntoIterator<Item = ($($ty_names,)*)>>(&mut self, into_iter: T) {
|
||||
let ($($var_names,)*) = self;
|
||||
let iter = into_iter.into_iter();
|
||||
$trait_name::extend(iter, $($var_names,)*);
|
||||
}
|
||||
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
self.0.extend_reserve(additional);
|
||||
self.1.extend_reserve(additional);
|
||||
}
|
||||
fn extend_one(&mut self, item: ($($ty_names,)*)) {
|
||||
$(self.$cnts.extend_one(item.$cnts);)*
|
||||
}
|
||||
|
||||
unsafe fn extend_one_unchecked(&mut self, item: (A, B)) {
|
||||
// SAFETY: Those are our safety preconditions, and we correctly forward `extend_reserve`.
|
||||
unsafe {
|
||||
self.0.extend_one_unchecked(item.0);
|
||||
self.1.extend_one_unchecked(item.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
$(self.$cnts.extend_reserve(additional);)*
|
||||
}
|
||||
|
||||
fn default_extend_tuple<A, B, ExtendA, ExtendB>(
|
||||
iter: impl Iterator<Item = (A, B)>,
|
||||
a: &mut ExtendA,
|
||||
b: &mut ExtendB,
|
||||
) where
|
||||
ExtendA: Extend<A>,
|
||||
ExtendB: Extend<B>,
|
||||
{
|
||||
fn extend<'a, A, B>(
|
||||
a: &'a mut impl Extend<A>,
|
||||
b: &'a mut impl Extend<B>,
|
||||
) -> impl FnMut((), (A, B)) + 'a {
|
||||
move |(), (t, u)| {
|
||||
a.extend_one(t);
|
||||
b.extend_one(u);
|
||||
}
|
||||
}
|
||||
|
||||
let (lower_bound, _) = iter.size_hint();
|
||||
if lower_bound > 0 {
|
||||
a.extend_reserve(lower_bound);
|
||||
b.extend_reserve(lower_bound);
|
||||
}
|
||||
|
||||
iter.fold((), extend(a, b));
|
||||
}
|
||||
|
||||
trait SpecTupleExtend<A, B> {
|
||||
fn extend(self, a: &mut A, b: &mut B);
|
||||
}
|
||||
|
||||
impl<A, B, ExtendA, ExtendB, Iter> SpecTupleExtend<ExtendA, ExtendB> for Iter
|
||||
where
|
||||
ExtendA: Extend<A>,
|
||||
ExtendB: Extend<B>,
|
||||
Iter: Iterator<Item = (A, B)>,
|
||||
{
|
||||
default fn extend(self, a: &mut ExtendA, b: &mut ExtendB) {
|
||||
default_extend_tuple(self, a, b);
|
||||
}
|
||||
}
|
||||
|
||||
impl<A, B, ExtendA, ExtendB, Iter> SpecTupleExtend<ExtendA, ExtendB> for Iter
|
||||
where
|
||||
ExtendA: Extend<A>,
|
||||
ExtendB: Extend<B>,
|
||||
Iter: TrustedLen<Item = (A, B)>,
|
||||
{
|
||||
fn extend(self, a: &mut ExtendA, b: &mut ExtendB) {
|
||||
fn extend<'a, A, B>(
|
||||
a: &'a mut impl Extend<A>,
|
||||
b: &'a mut impl Extend<B>,
|
||||
) -> impl FnMut((), (A, B)) + 'a {
|
||||
// SAFETY: We reserve enough space for the `size_hint`, and the iterator is `TrustedLen`
|
||||
// so its `size_hint` is exact.
|
||||
move |(), (t, u)| unsafe {
|
||||
a.extend_one_unchecked(t);
|
||||
b.extend_one_unchecked(u);
|
||||
unsafe fn extend_one_unchecked(&mut self, item: ($($ty_names,)*)) {
|
||||
// SAFETY: Those are our safety preconditions, and we correctly forward `extend_reserve`.
|
||||
unsafe {
|
||||
$(self.$cnts.extend_one_unchecked(item.$cnts);)*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let (lower_bound, upper_bound) = self.size_hint();
|
||||
|
||||
if upper_bound.is_none() {
|
||||
// We cannot reserve more than `usize::MAX` items, and this is likely to go out of memory anyway.
|
||||
default_extend_tuple(self, a, b);
|
||||
return;
|
||||
trait $trait_name<$($ty_names),*> {
|
||||
fn extend(self, $($var_names: &mut $ty_names,)*);
|
||||
}
|
||||
|
||||
if lower_bound > 0 {
|
||||
a.extend_reserve(lower_bound);
|
||||
b.extend_reserve(lower_bound);
|
||||
fn $default_fn_name<$($ty_names,)* $($extend_ty_names,)*>(
|
||||
iter: impl Iterator<Item = ($($ty_names,)*)>,
|
||||
$($var_names: &mut $extend_ty_names,)*
|
||||
) where
|
||||
$($extend_ty_names: Extend<$ty_names>,)*
|
||||
{
|
||||
fn extend<'a, $($ty_names,)*>(
|
||||
$($var_names: &'a mut impl Extend<$ty_names>,)*
|
||||
) -> impl FnMut((), ($($ty_names,)*)) + 'a {
|
||||
#[allow(non_snake_case)]
|
||||
move |(), ($($extend_ty_names,)*)| {
|
||||
$($var_names.extend_one($extend_ty_names);)*
|
||||
}
|
||||
}
|
||||
|
||||
let (lower_bound, _) = iter.size_hint();
|
||||
if lower_bound > 0 {
|
||||
$($var_names.extend_reserve(lower_bound);)*
|
||||
}
|
||||
|
||||
iter.fold((), extend($($var_names,)*));
|
||||
}
|
||||
|
||||
self.fold((), extend(a, b));
|
||||
impl<$($ty_names,)* $($extend_ty_names,)* Iter> $trait_name<$($extend_ty_names),*> for Iter
|
||||
where
|
||||
$($extend_ty_names: Extend<$ty_names>,)*
|
||||
Iter: Iterator<Item = ($($ty_names,)*)>,
|
||||
{
|
||||
default fn extend(self, $($var_names: &mut $extend_ty_names),*) {
|
||||
$default_fn_name(self, $($var_names),*);
|
||||
}
|
||||
}
|
||||
|
||||
impl<$($ty_names,)* $($extend_ty_names,)* Iter> $trait_name<$($extend_ty_names),*> for Iter
|
||||
where
|
||||
$($extend_ty_names: Extend<$ty_names>,)*
|
||||
Iter: TrustedLen<Item = ($($ty_names,)*)>,
|
||||
{
|
||||
fn extend(self, $($var_names: &mut $extend_ty_names,)*) {
|
||||
fn extend<'a, $($ty_names,)*>(
|
||||
$($var_names: &'a mut impl Extend<$ty_names>,)*
|
||||
) -> impl FnMut((), ($($ty_names,)*)) + 'a {
|
||||
#[allow(non_snake_case)]
|
||||
// SAFETY: We reserve enough space for the `size_hint`, and the iterator is `TrustedLen`
|
||||
// so its `size_hint` is exact.
|
||||
move |(), ($($extend_ty_names,)*)| unsafe {
|
||||
$($var_names.extend_one_unchecked($extend_ty_names);)*
|
||||
}
|
||||
}
|
||||
|
||||
let (lower_bound, upper_bound) = self.size_hint();
|
||||
|
||||
if upper_bound.is_none() {
|
||||
// We cannot reserve more than `usize::MAX` items, and this is likely to go out of memory anyway.
|
||||
$default_fn_name(self, $($var_names,)*);
|
||||
return;
|
||||
}
|
||||
|
||||
if lower_bound > 0 {
|
||||
$($var_names.extend_reserve(lower_bound);)*
|
||||
}
|
||||
|
||||
self.fold((), extend($($var_names,)*));
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
spec_tuple_impl!(
|
||||
(L, l, EL, TraitL, default_extend_tuple_l, 11),
|
||||
(K, k, EK, TraitK, default_extend_tuple_k, 10),
|
||||
(J, j, EJ, TraitJ, default_extend_tuple_j, 9),
|
||||
(I, i, EI, TraitI, default_extend_tuple_i, 8),
|
||||
(H, h, EH, TraitH, default_extend_tuple_h, 7),
|
||||
(G, g, EG, TraitG, default_extend_tuple_g, 6),
|
||||
(F, f, EF, TraitF, default_extend_tuple_f, 5),
|
||||
(E, e, EE, TraitE, default_extend_tuple_e, 4),
|
||||
(D, d, ED, TraitD, default_extend_tuple_d, 3),
|
||||
(C, c, EC, TraitC, default_extend_tuple_c, 2),
|
||||
(B, b, EB, TraitB, default_extend_tuple_b, 1),
|
||||
(A, a, EA, TraitA, default_extend_tuple_a, 0),
|
||||
);
|
||||
|
|
|
@ -617,6 +617,19 @@ fn test_next_chunk() {
|
|||
assert_eq!(it.next_chunk::<0>().unwrap(), []);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_collect_into_tuples() {
|
||||
let a = vec![(1, 2, 3), (4, 5, 6), (7, 8, 9)];
|
||||
let b = vec![1, 4, 7];
|
||||
let c = vec![2, 5, 8];
|
||||
let d = vec![3, 6, 9];
|
||||
let mut e = (Vec::new(), Vec::new(), Vec::new());
|
||||
a.iter().cloned().collect_into(&mut e);
|
||||
assert!(e.0 == b);
|
||||
assert!(e.1 == c);
|
||||
assert!(e.2 == d);
|
||||
}
|
||||
|
||||
// just tests by whether or not this compiles
|
||||
fn _empty_impl_all_auto_traits<T>() {
|
||||
use std::panic::{RefUnwindSafe, UnwindSafe};
|
||||
|
|
|
@ -338,9 +338,9 @@ pub enum ErrorKind {
|
|||
/// example, on Unix, a named pipe opened with `File::open`.
|
||||
#[stable(feature = "io_error_a_bit_more", since = "1.83.0")]
|
||||
NotSeekable,
|
||||
/// Filesystem quota was exceeded.
|
||||
#[unstable(feature = "io_error_more", issue = "86442")]
|
||||
FilesystemQuotaExceeded,
|
||||
/// Filesystem quota or some other kind of quota was exceeded.
|
||||
#[stable(feature = "io_error_quota_exceeded", since = "CURRENT_RUSTC_VERSION")]
|
||||
QuotaExceeded,
|
||||
/// File larger than allowed or supported.
|
||||
///
|
||||
/// This might arise from a hard limit of the underlying filesystem or file access API, or from
|
||||
|
@ -364,7 +364,7 @@ pub enum ErrorKind {
|
|||
#[stable(feature = "io_error_a_bit_more", since = "1.83.0")]
|
||||
Deadlock,
|
||||
/// Cross-device or cross-filesystem (hard) link or rename.
|
||||
#[unstable(feature = "io_error_more", issue = "86442")]
|
||||
#[stable(feature = "io_error_crosses_devices", since = "CURRENT_RUSTC_VERSION")]
|
||||
CrossesDevices,
|
||||
/// Too many (hard) links to the same filesystem object.
|
||||
///
|
||||
|
@ -446,8 +446,8 @@ pub enum ErrorKind {
|
|||
impl ErrorKind {
|
||||
pub(crate) fn as_str(&self) -> &'static str {
|
||||
use ErrorKind::*;
|
||||
// tidy-alphabetical-start
|
||||
match *self {
|
||||
// tidy-alphabetical-start
|
||||
AddrInUse => "address in use",
|
||||
AddrNotAvailable => "address not available",
|
||||
AlreadyExists => "entity already exists",
|
||||
|
@ -460,12 +460,11 @@ impl ErrorKind {
|
|||
Deadlock => "deadlock",
|
||||
DirectoryNotEmpty => "directory not empty",
|
||||
ExecutableFileBusy => "executable file busy",
|
||||
FileTooLarge => "file too large",
|
||||
FilesystemLoop => "filesystem loop or indirection limit (e.g. symlink loop)",
|
||||
FilesystemQuotaExceeded => "filesystem quota exceeded",
|
||||
FileTooLarge => "file too large",
|
||||
HostUnreachable => "host unreachable",
|
||||
Interrupted => "operation interrupted",
|
||||
InProgress => "in progress",
|
||||
Interrupted => "operation interrupted",
|
||||
InvalidData => "invalid data",
|
||||
InvalidFilename => "invalid filename",
|
||||
InvalidInput => "invalid input parameter",
|
||||
|
@ -479,6 +478,7 @@ impl ErrorKind {
|
|||
Other => "other error",
|
||||
OutOfMemory => "out of memory",
|
||||
PermissionDenied => "permission denied",
|
||||
QuotaExceeded => "quota exceeded",
|
||||
ReadOnlyFilesystem => "read-only filesystem or storage medium",
|
||||
ResourceBusy => "resource busy",
|
||||
StaleNetworkFileHandle => "stale network file handle",
|
||||
|
@ -490,8 +490,8 @@ impl ErrorKind {
|
|||
Unsupported => "unsupported",
|
||||
WouldBlock => "operation would block",
|
||||
WriteZero => "write zero",
|
||||
// tidy-alphabetical-end
|
||||
}
|
||||
// tidy-alphabetical-end
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@ fn kind_from_prim(ek: u32) -> Option<ErrorKind> {
|
|||
WriteZero,
|
||||
StorageFull,
|
||||
NotSeekable,
|
||||
FilesystemQuotaExceeded,
|
||||
QuotaExceeded,
|
||||
FileTooLarge,
|
||||
ResourceBusy,
|
||||
ExecutableFileBusy,
|
||||
|
|
|
@ -71,7 +71,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
|
|||
libc::ECONNREFUSED => ConnectionRefused,
|
||||
libc::ECONNRESET => ConnectionReset,
|
||||
libc::EDEADLK => Deadlock,
|
||||
libc::EDQUOT => FilesystemQuotaExceeded,
|
||||
libc::EDQUOT => QuotaExceeded,
|
||||
libc::EEXIST => AlreadyExists,
|
||||
libc::EFBIG => FileTooLarge,
|
||||
libc::EHOSTUNREACH => HostUnreachable,
|
||||
|
|
|
@ -254,7 +254,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
|
|||
libc::ECONNREFUSED => ConnectionRefused,
|
||||
libc::ECONNRESET => ConnectionReset,
|
||||
libc::EDEADLK => Deadlock,
|
||||
libc::EDQUOT => FilesystemQuotaExceeded,
|
||||
libc::EDQUOT => QuotaExceeded,
|
||||
libc::EEXIST => AlreadyExists,
|
||||
libc::EFBIG => FileTooLarge,
|
||||
libc::EHOSTUNREACH => HostUnreachable,
|
||||
|
|
|
@ -113,7 +113,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
|
|||
c::ERROR_WRITE_PROTECT => return ReadOnlyFilesystem,
|
||||
c::ERROR_DISK_FULL | c::ERROR_HANDLE_DISK_FULL => return StorageFull,
|
||||
c::ERROR_SEEK_ON_DEVICE => return NotSeekable,
|
||||
c::ERROR_DISK_QUOTA_EXCEEDED => return FilesystemQuotaExceeded,
|
||||
c::ERROR_DISK_QUOTA_EXCEEDED => return QuotaExceeded,
|
||||
c::ERROR_FILE_TOO_LARGE => return FileTooLarge,
|
||||
c::ERROR_BUSY => return ResourceBusy,
|
||||
c::ERROR_POSSIBLE_DEADLOCK => return Deadlock,
|
||||
|
@ -138,7 +138,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
|
|||
c::WSAEHOSTUNREACH => HostUnreachable,
|
||||
c::WSAENETDOWN => NetworkDown,
|
||||
c::WSAENETUNREACH => NetworkUnreachable,
|
||||
c::WSAEDQUOT => FilesystemQuotaExceeded,
|
||||
c::WSAEDQUOT => QuotaExceeded,
|
||||
|
||||
_ => Uncategorized,
|
||||
}
|
||||
|
|
|
@ -1070,23 +1070,33 @@ impl Step for Tidy {
|
|||
}
|
||||
|
||||
if builder.config.channel == "dev" || builder.config.channel == "nightly" {
|
||||
builder.info("fmt check");
|
||||
if builder.initial_rustfmt().is_none() {
|
||||
let inferred_rustfmt_dir = builder.initial_sysroot.join("bin");
|
||||
eprintln!(
|
||||
"\
|
||||
if !builder.config.json_output {
|
||||
builder.info("fmt check");
|
||||
if builder.initial_rustfmt().is_none() {
|
||||
let inferred_rustfmt_dir = builder.initial_sysroot.join("bin");
|
||||
eprintln!(
|
||||
"\
|
||||
ERROR: no `rustfmt` binary found in {PATH}
|
||||
INFO: `rust.channel` is currently set to \"{CHAN}\"
|
||||
HELP: if you are testing a beta branch, set `rust.channel` to \"beta\" in the `config.toml` file
|
||||
HELP: to skip test's attempt to check tidiness, pass `--skip src/tools/tidy` to `x.py test`",
|
||||
PATH = inferred_rustfmt_dir.display(),
|
||||
CHAN = builder.config.channel,
|
||||
PATH = inferred_rustfmt_dir.display(),
|
||||
CHAN = builder.config.channel,
|
||||
);
|
||||
crate::exit!(1);
|
||||
}
|
||||
let all = false;
|
||||
crate::core::build_steps::format::format(
|
||||
builder,
|
||||
!builder.config.cmd.bless(),
|
||||
all,
|
||||
&[],
|
||||
);
|
||||
} else {
|
||||
eprintln!(
|
||||
"WARNING: `--json-output` is not supported on rustfmt, formatting will be skipped"
|
||||
);
|
||||
crate::exit!(1);
|
||||
}
|
||||
let all = false;
|
||||
crate::core::build_steps::format::format(builder, !builder.config.cmd.bless(), all, &[
|
||||
]);
|
||||
}
|
||||
|
||||
builder.info("tidy check");
|
||||
|
@ -2624,6 +2634,11 @@ fn prepare_cargo_test(
|
|||
if builder.kind == Kind::Test && !builder.fail_fast {
|
||||
cargo.arg("--no-fail-fast");
|
||||
}
|
||||
|
||||
if builder.config.json_output {
|
||||
cargo.arg("--message-format=json");
|
||||
}
|
||||
|
||||
match builder.doc_tests {
|
||||
DocTests::Only => {
|
||||
cargo.arg("--doc");
|
||||
|
|
|
@ -1241,19 +1241,6 @@ impl Attributes {
|
|||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Attributes {
|
||||
fn eq(&self, rhs: &Self) -> bool {
|
||||
self.doc_strings == rhs.doc_strings
|
||||
&& self
|
||||
.other_attrs
|
||||
.iter()
|
||||
.map(|attr| attr.id)
|
||||
.eq(rhs.other_attrs.iter().map(|attr| attr.id))
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for Attributes {}
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
||||
pub(crate) enum GenericBound {
|
||||
TraitBound(PolyTrait, hir::TraitBoundModifiers),
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 05f54fdc34310f458033af8a63ce1d699fae8bf6
|
||||
Subproject commit 20a443231846b81c7b909691ec3f15eb173f2b18
|
|
@ -44,7 +44,7 @@ const UNIX_IO_ERROR_TABLE: &[(&str, std::io::ErrorKind)] = {
|
|||
("ECONNREFUSED", ConnectionRefused),
|
||||
("ECONNRESET", ConnectionReset),
|
||||
("EDEADLK", Deadlock),
|
||||
("EDQUOT", FilesystemQuotaExceeded),
|
||||
("EDQUOT", QuotaExceeded),
|
||||
("EEXIST", AlreadyExists),
|
||||
("EFBIG", FileTooLarge),
|
||||
("EHOSTUNREACH", HostUnreachable),
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
//@ known-bug: #123809
|
||||
type Positive = std::pat::pattern_type!(std::pat is 0..);
|
||||
|
||||
pub fn main() {}
|
|
@ -26,12 +26,6 @@ LL | trait Parent2 { const C: &'static str; }
|
|||
LL |
|
||||
LL | fn take1(_: impl Trait1<C = "?">) {}
|
||||
| ^^^^^^^ ambiguous associated constant `C`
|
||||
|
|
||||
= help: consider introducing a new type parameter `T` and adding `where` constraints:
|
||||
where
|
||||
T: Trait1,
|
||||
T: Parent2::C = "?",
|
||||
T: Parent1::C = "?"
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
@ -3,15 +3,11 @@ trait Foo<const N: Bar<2>> {
|
|||
//~^ WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| ERROR cycle detected when computing type of `Foo::N`
|
||||
//~| ERROR the trait `Foo` cannot be made into an object
|
||||
//~| ERROR `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter
|
||||
fn func() {}
|
||||
}
|
||||
|
||||
trait Bar<const M: Foo<2>> {}
|
||||
//~^ WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
//~| ERROR the trait `Foo` cannot be made into an object
|
||||
//~| ERROR `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -13,7 +13,7 @@ LL | trait Foo<const N: dyn Bar<2>> {
|
|||
| +++
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:20
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:9:20
|
||||
|
|
||||
LL | trait Bar<const M: Foo<2>> {}
|
||||
| ^^^^^^
|
||||
|
@ -32,7 +32,7 @@ LL | trait Foo<const N: Bar<2>> {
|
|||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires computing type of `Bar::M`...
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:11
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:9:11
|
||||
|
|
||||
LL | trait Bar<const M: Foo<2>> {}
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
@ -44,69 +44,6 @@ LL | trait Foo<const N: Bar<2>> {
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||
|
||||
error[E0038]: the trait `Foo` cannot be made into an object
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:24
|
||||
|
|
||||
LL | trait Foo<const N: Bar<2>> {
|
||||
| ^ `Foo` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "dyn-compatible" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:8:8
|
||||
|
|
||||
LL | trait Foo<const N: Bar<2>> {
|
||||
| --- this trait cannot be made into an object...
|
||||
...
|
||||
LL | fn func() {}
|
||||
| ^^^^ ...because associated function `func` has no `self` parameter
|
||||
help: consider turning `func` into a method by giving it a `&self` argument
|
||||
|
|
||||
LL | fn func(&self) {}
|
||||
| +++++
|
||||
help: alternatively, consider constraining `func` so it does not apply to trait objects
|
||||
|
|
||||
LL | fn func() where Self: Sized {}
|
||||
| +++++++++++++++++
|
||||
error: aborting due to 1 previous error; 2 warnings emitted
|
||||
|
||||
error: `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:20
|
||||
|
|
||||
LL | trait Foo<const N: Bar<2>> {
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error[E0038]: the trait `Foo` cannot be made into an object
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:11
|
||||
|
|
||||
LL | trait Bar<const M: Foo<2>> {}
|
||||
| ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "dyn-compatible" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:8:8
|
||||
|
|
||||
LL | trait Foo<const N: Bar<2>> {
|
||||
| --- this trait cannot be made into an object...
|
||||
...
|
||||
LL | fn func() {}
|
||||
| ^^^^ ...because associated function `func` has no `self` parameter
|
||||
help: consider turning `func` into a method by giving it a `&self` argument
|
||||
|
|
||||
LL | fn func(&self) {}
|
||||
| +++++
|
||||
help: alternatively, consider constraining `func` so it does not apply to trait objects
|
||||
|
|
||||
LL | fn func() where Self: Sized {}
|
||||
| +++++++++++++++++
|
||||
|
||||
error: `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:20
|
||||
|
|
||||
LL | trait Bar<const M: Foo<2>> {}
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error: aborting due to 5 previous errors; 2 warnings emitted
|
||||
|
||||
Some errors have detailed explanations: E0038, E0391.
|
||||
For more information about an error, try `rustc --explain E0038`.
|
||||
For more information about this error, try `rustc --explain E0391`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue