mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Auto merge of #144087 - cuviper:beta-next, r=cuviper
[beta] backports - Taint body on invalid call ABI rust-lang/rust#142983 - Fix rustdoc not correctly showing attributes with re-exports rust-lang/rust#143083 - trait_sel: `MetaSized` always holds temporarily rust-lang/rust#144016 - Ensure home directory exists rust-lang/rust#144003 r? cuviper
This commit is contained in:
@@ -190,6 +190,11 @@ jobs:
|
||||
- name: install MinGW
|
||||
run: src/ci/scripts/install-mingw.sh
|
||||
|
||||
# Workaround for spurious ci failures after mingw install
|
||||
# see https://rust-lang.zulipchat.com/#narrow/channel/242791-t-infra/topic/Spurious.20bors.20CI.20failures/near/528915775
|
||||
- name: ensure home dir exists
|
||||
run: mkdir -p ~
|
||||
|
||||
- name: install ninja
|
||||
run: src/ci/scripts/install-ninja.sh
|
||||
|
||||
|
||||
@@ -36,6 +36,10 @@ pub enum ExternAbi {
|
||||
/// Stronger than just `#[cold]` because `fn` pointers might be incompatible.
|
||||
RustCold,
|
||||
|
||||
/// An always-invalid ABI that's used to test "this ABI is not supported by this platform"
|
||||
/// in a platform-agnostic way.
|
||||
RustInvalid,
|
||||
|
||||
/// Unstable impl detail that directly uses Rust types to describe the ABI to LLVM.
|
||||
/// Even normally-compatible Rust types can become ABI-incompatible with this ABI!
|
||||
Unadjusted,
|
||||
@@ -157,6 +161,7 @@ fn from_str(s: &str) -> Result<$e_name, Self::Err> {
|
||||
RiscvInterruptS =><= "riscv-interrupt-s",
|
||||
RustCall =><= "rust-call",
|
||||
RustCold =><= "rust-cold",
|
||||
RustInvalid =><= "rust-invalid",
|
||||
Stdcall { unwind: false } =><= "stdcall",
|
||||
Stdcall { unwind: true } =><= "stdcall-unwind",
|
||||
System { unwind: false } =><= "system",
|
||||
|
||||
@@ -96,6 +96,9 @@ pub fn extern_abi_stability(abi: ExternAbi) -> Result<(), UnstableAbi> {
|
||||
ExternAbi::RustCold => {
|
||||
Err(UnstableAbi { abi, feature: sym::rust_cold_cc, explain: GateReason::Experimental })
|
||||
}
|
||||
ExternAbi::RustInvalid => {
|
||||
Err(UnstableAbi { abi, feature: sym::rustc_attrs, explain: GateReason::ImplDetail })
|
||||
}
|
||||
ExternAbi::GpuKernel => Err(UnstableAbi {
|
||||
abi,
|
||||
feature: sym::abi_gpu_kernel,
|
||||
|
||||
@@ -156,7 +156,16 @@ pub(crate) fn check_expr_call(
|
||||
pub(crate) fn check_call_abi(&self, abi: ExternAbi, span: Span) {
|
||||
let canon_abi = match AbiMap::from_target(&self.sess().target).canonize_abi(abi, false) {
|
||||
AbiMapping::Direct(canon_abi) | AbiMapping::Deprecated(canon_abi) => canon_abi,
|
||||
AbiMapping::Invalid => return,
|
||||
AbiMapping::Invalid => {
|
||||
// This should be reported elsewhere, but we want to taint this body
|
||||
// so that we don't try to evaluate calls to ABIs that are invalid.
|
||||
let guar = self.dcx().span_delayed_bug(
|
||||
span,
|
||||
format!("invalid abi for platform should have reported an error: {abi}"),
|
||||
);
|
||||
self.set_tainted_by_errors(guar);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let valid = match canon_abi {
|
||||
|
||||
@@ -1253,7 +1253,8 @@ pub fn fn_can_unwind(tcx: TyCtxt<'_>, fn_def_id: Option<DefId>, abi: ExternAbi)
|
||||
| CCmseNonSecureCall
|
||||
| CCmseNonSecureEntry
|
||||
| Custom
|
||||
| Unadjusted => false,
|
||||
| Unadjusted
|
||||
| RustInvalid => false,
|
||||
Rust | RustCall | RustCold => tcx.sess.panic_strategy() == PanicStrategy::Unwind,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,6 +494,7 @@ fn internal<'tcx>(&self, _tables: &mut Tables<'_>, _tcx: TyCtxt<'tcx>) -> Self::
|
||||
Abi::RustCall => rustc_abi::ExternAbi::RustCall,
|
||||
Abi::Unadjusted => rustc_abi::ExternAbi::Unadjusted,
|
||||
Abi::RustCold => rustc_abi::ExternAbi::RustCold,
|
||||
Abi::RustInvalid => rustc_abi::ExternAbi::RustInvalid,
|
||||
Abi::RiscvInterruptM => rustc_abi::ExternAbi::RiscvInterruptM,
|
||||
Abi::RiscvInterruptS => rustc_abi::ExternAbi::RiscvInterruptS,
|
||||
Abi::Custom => rustc_abi::ExternAbi::Custom,
|
||||
|
||||
@@ -877,6 +877,7 @@ fn stable(&self, _: &mut Tables<'_>) -> Self::T {
|
||||
ExternAbi::RustCall => Abi::RustCall,
|
||||
ExternAbi::Unadjusted => Abi::Unadjusted,
|
||||
ExternAbi::RustCold => Abi::RustCold,
|
||||
ExternAbi::RustInvalid => Abi::RustInvalid,
|
||||
ExternAbi::RiscvInterruptM => Abi::RiscvInterruptM,
|
||||
ExternAbi::RiscvInterruptS => Abi::RiscvInterruptS,
|
||||
ExternAbi::Custom => Abi::Custom,
|
||||
|
||||
@@ -1126,6 +1126,7 @@ pub enum Abi {
|
||||
RustCold,
|
||||
RiscvInterruptM,
|
||||
RiscvInterruptS,
|
||||
RustInvalid,
|
||||
Custom,
|
||||
}
|
||||
|
||||
|
||||
@@ -156,7 +156,8 @@ pub fn canonize_abi(&self, extern_abi: ExternAbi, has_c_varargs: bool) -> AbiMap
|
||||
| ExternAbi::Msp430Interrupt
|
||||
| ExternAbi::RiscvInterruptM
|
||||
| ExternAbi::RiscvInterruptS
|
||||
| ExternAbi::X86Interrupt,
|
||||
| ExternAbi::X86Interrupt
|
||||
| ExternAbi::RustInvalid,
|
||||
_,
|
||||
) => return AbiMapping::Invalid,
|
||||
};
|
||||
|
||||
@@ -377,6 +377,13 @@ pub fn sizedness_fast_path<'tcx>(tcx: TyCtxt<'tcx>, predicate: ty::Predicate<'tc
|
||||
_ => return false,
|
||||
};
|
||||
|
||||
// FIXME(sized_hierarchy): this temporarily reverts the `sized_hierarchy` feature
|
||||
// while a proper fix for `tests/ui/sized-hierarchy/incomplete-inference-issue-143992.rs`
|
||||
// is pending a proper fix
|
||||
if !tcx.features().sized_hierarchy() && matches!(sizedness, SizedTraitKind::MetaSized) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if trait_ref.self_ty().has_trivial_sizedness(tcx, sizedness) {
|
||||
debug!("fast path -- trivial sizedness");
|
||||
return true;
|
||||
|
||||
@@ -2746,7 +2746,8 @@ fn add_without_unwanted_attributes<'hir>(
|
||||
attrs.push((Cow::Owned(attr), import_parent));
|
||||
}
|
||||
}
|
||||
hir::Attribute::Parsed(..) if is_inline => {
|
||||
// FIXME: make sure to exclude `#[cfg_trace]` here when it is ported to the new parsers
|
||||
hir::Attribute::Parsed(..) => {
|
||||
attrs.push((Cow::Owned(attr), import_parent));
|
||||
}
|
||||
_ => {}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// Tests that attributes are correctly copied onto a re-exported item.
|
||||
//@ edition:2021
|
||||
#![crate_name = "re_export"]
|
||||
|
||||
//@ has 're_export/fn.thingy2.html' '//pre[@class="rust item-decl"]' '#[no_mangle]'
|
||||
pub use thingymod::thingy as thingy2;
|
||||
|
||||
mod thingymod {
|
||||
#[no_mangle]
|
||||
pub fn thingy() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
// Fix for #142969 where an invalid ABI in a signature still had its call ABI computed
|
||||
// because CTFE tried to evaluate it, despite previous errors during AST-to-HIR lowering.
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
const extern "rust-invalid" fn foo() {
|
||||
//~^ ERROR `"rust-invalid"` is not a supported ABI for the current target
|
||||
panic!()
|
||||
}
|
||||
|
||||
const _: () = foo();
|
||||
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,9 @@
|
||||
error[E0570]: `"rust-invalid"` is not a supported ABI for the current target
|
||||
--> $DIR/invalid-call-abi-ctfe.rs:6:1
|
||||
|
|
||||
LL | const extern "rust-invalid" fn foo() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0570`.
|
||||
@@ -0,0 +1,12 @@
|
||||
// Tests the `"rustc-invalid"` ABI, which is never canonizable.
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
const extern "rust-invalid" fn foo() {
|
||||
//~^ ERROR `"rust-invalid"` is not a supported ABI for the current target
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
error[E0570]: `"rust-invalid"` is not a supported ABI for the current target
|
||||
--> $DIR/invalid-call-abi.rs:5:1
|
||||
|
|
||||
LL | const extern "rust-invalid" fn foo() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0570`.
|
||||
@@ -8,8 +8,8 @@
|
||||
}
|
||||
|
||||
const _SIZE: usize = unsafe { size_of_val(&4 as *const i32 as *const Opaque) };
|
||||
//~^ ERROR the size for values of type `Opaque` cannot be known
|
||||
//~^ ERROR `extern type` does not have known layout
|
||||
const _ALIGN: usize = unsafe { align_of_val(&4 as *const i32 as *const Opaque) };
|
||||
//~^ ERROR the size for values of type `Opaque` cannot be known
|
||||
//~^ ERROR `extern type` does not have known layout
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,27 +1,15 @@
|
||||
error[E0277]: the size for values of type `Opaque` cannot be known
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:10:43
|
||||
error[E0080]: `extern type` does not have known layout
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:10:31
|
||||
|
|
||||
LL | const _SIZE: usize = unsafe { size_of_val(&4 as *const i32 as *const Opaque) };
|
||||
| ----------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a known size
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Opaque`
|
||||
note: required by a bound in `std::intrinsics::size_of_val`
|
||||
--> $SRC_DIR/core/src/intrinsics/mod.rs:LL:COL
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_SIZE` failed here
|
||||
|
||||
error[E0277]: the size for values of type `Opaque` cannot be known
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:12:45
|
||||
error[E0080]: `extern type` does not have known layout
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:12:32
|
||||
|
|
||||
LL | const _ALIGN: usize = unsafe { align_of_val(&4 as *const i32 as *const Opaque) };
|
||||
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a known size
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Opaque`
|
||||
note: required by a bound in `std::intrinsics::align_of_val`
|
||||
--> $SRC_DIR/core/src/intrinsics/mod.rs:LL:COL
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_ALIGN` failed here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
||||
+1
-3
@@ -1,4 +1,4 @@
|
||||
//@ check-fail
|
||||
//@ check-pass
|
||||
#![feature(extern_types)]
|
||||
|
||||
use std::mem::{align_of_val, size_of_val};
|
||||
@@ -11,7 +11,5 @@ fn main() {
|
||||
let x: &A = unsafe { &*(1usize as *const A) };
|
||||
|
||||
size_of_val(x);
|
||||
//~^ ERROR the size for values of type `A` cannot be known
|
||||
align_of_val(x);
|
||||
//~^ ERROR the size for values of type `A` cannot be known
|
||||
}
|
||||
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-size_of_val.rs:13:17
|
||||
|
|
||||
LL | size_of_val(x);
|
||||
| ----------- ^ the trait `MetaSized` is not implemented for `A`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `A: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::mem::size_of_val`
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | size_of_val(&x);
|
||||
| +
|
||||
LL | size_of_val(&mut x);
|
||||
| ++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-size_of_val.rs:15:18
|
||||
|
|
||||
LL | align_of_val(x);
|
||||
| ------------ ^ the trait `MetaSized` is not implemented for `A`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `A: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::mem::align_of_val`
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | align_of_val(&x);
|
||||
| +
|
||||
LL | align_of_val(&mut x);
|
||||
| ++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
-2
@@ -27,9 +27,7 @@ fn main() {
|
||||
|
||||
assert_sized::<Bar<A>>();
|
||||
//~^ ERROR the size for values of type
|
||||
//~| ERROR the size for values of type
|
||||
|
||||
assert_sized::<Bar<Bar<A>>>();
|
||||
//~^ ERROR the size for values of type
|
||||
//~| ERROR the size for values of type
|
||||
}
|
||||
|
||||
+2
-28
@@ -59,21 +59,8 @@ help: consider relaxing the implicit `Sized` restriction
|
||||
LL | fn assert_sized<T: ?Sized>() {}
|
||||
| ++++++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-unsized.rs:28:20
|
||||
|
|
||||
LL | assert_sized::<Bar<A>>();
|
||||
| ^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `A`
|
||||
note: required by a bound in `Bar`
|
||||
--> $DIR/extern-types-unsized.rs:14:12
|
||||
|
|
||||
LL | struct Bar<T: ?Sized> {
|
||||
| ^ required by this bound in `Bar`
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known at compilation time
|
||||
--> $DIR/extern-types-unsized.rs:32:20
|
||||
--> $DIR/extern-types-unsized.rs:31:20
|
||||
|
|
||||
LL | assert_sized::<Bar<Bar<A>>>();
|
||||
| ^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
@@ -94,19 +81,6 @@ help: consider relaxing the implicit `Sized` restriction
|
||||
LL | fn assert_sized<T: ?Sized>() {}
|
||||
| ++++++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-unsized.rs:32:20
|
||||
|
|
||||
LL | assert_sized::<Bar<Bar<A>>>();
|
||||
| ^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `A`
|
||||
note: required by a bound in `Bar`
|
||||
--> $DIR/extern-types-unsized.rs:14:12
|
||||
|
|
||||
LL | struct Bar<T: ?Sized> {
|
||||
| ^ required by this bound in `Bar`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
||||
-4
@@ -7,14 +7,10 @@
|
||||
}
|
||||
|
||||
unsafe fn make_device() -> Box<Device> {
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
Box::from_raw(0 as *mut _)
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
//~| ERROR the size for values of type `Device` cannot be known
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let d: Device = unsafe { *make_device() };
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
//~| ERROR the size for values of type `Device` cannot be known
|
||||
}
|
||||
|
||||
+2
-50
@@ -1,43 +1,5 @@
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:9:28
|
||||
|
|
||||
LL | unsafe fn make_device() -> Box<Device> {
|
||||
| ^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:11:19
|
||||
|
|
||||
LL | Box::from_raw(0 as *mut _)
|
||||
| ------------- ^^^^^^^^^^^ the trait `MetaSized` is not implemented for `Device`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `Device: MetaSized` is not satisfied
|
||||
note: required by a bound in `Box::<T>::from_raw`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | Box::from_raw(&0 as *mut _)
|
||||
| +
|
||||
LL | Box::from_raw(&mut 0 as *mut _)
|
||||
| ++++
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:11:5
|
||||
|
|
||||
LL | Box::from_raw(0 as *mut _)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known at compilation time
|
||||
--> $DIR/unsized-extern-derefmove.rs:17:9
|
||||
--> $DIR/unsized-extern-derefmove.rs:14:9
|
||||
|
|
||||
LL | let d: Device = unsafe { *make_device() };
|
||||
| ^ doesn't have a size known at compile-time
|
||||
@@ -49,16 +11,6 @@ help: consider borrowing here
|
||||
LL | let d: &Device = unsafe { *make_device() };
|
||||
| +
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:17:31
|
||||
|
|
||||
LL | let d: Device = unsafe { *make_device() };
|
||||
| ^^^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
||||
@@ -17,4 +17,3 @@ impl<C: ?Sized> A for u8 { //~ ERROR: the type parameter `C` is not constrained
|
||||
#[rustc_layout(debug)]
|
||||
struct S([u8; <u8 as A>::B]);
|
||||
//~^ ERROR: the type has an unknown layout
|
||||
//~| ERROR: type annotations needed
|
||||
|
||||
@@ -4,19 +4,12 @@ error[E0207]: the type parameter `C` is not constrained by the impl trait, self
|
||||
LL | impl<C: ?Sized> A for u8 {
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/unconstrained-param-ice-137308.rs:18:16
|
||||
|
|
||||
LL | struct S([u8; <u8 as A>::B]);
|
||||
| ^^ cannot infer type for type parameter `C`
|
||||
|
||||
error: the type has an unknown layout
|
||||
--> $DIR/unconstrained-param-ice-137308.rs:18:1
|
||||
|
|
||||
LL | struct S([u8; <u8 as A>::B]);
|
||||
| ^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0282.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
|
||||
@@ -5,7 +5,7 @@ trait A {
|
||||
type X: ?Sized;
|
||||
}
|
||||
|
||||
fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>) //~ ERROR
|
||||
fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
where
|
||||
for<'b> &'b T: A,
|
||||
<&'static T as A>::X: Sized
|
||||
|
||||
@@ -1,18 +1,3 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-50716.rs:8:27
|
||||
|
|
||||
LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected trait `<<&'a T as A>::X as MetaSized>`
|
||||
found trait `<<&'static T as A>::X as MetaSized>`
|
||||
note: the lifetime `'a` as defined here...
|
||||
--> $DIR/issue-50716.rs:8:8
|
||||
|
|
||||
LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
| ^^
|
||||
= note: ...does not necessarily outlive the static lifetime
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-50716.rs:13:14
|
||||
|
|
||||
@@ -22,6 +7,5 @@ LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
LL | let _x = *s;
|
||||
| ^^ proving this value is `Sized` requires that `'a` must outlive `'static`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
||||
@@ -20,6 +20,7 @@ riscv-interrupt-m
|
||||
riscv-interrupt-s
|
||||
rust-call
|
||||
rust-cold
|
||||
rust-invalid
|
||||
stdcall
|
||||
stdcall-unwind
|
||||
system
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/incomplete-inference-issue-143992.rs:27:28
|
||||
|
|
||||
LL | let _x = T::Assoc::new(());
|
||||
| ------------- ^^ expected `[u32; 1]`, found `()`
|
||||
| |
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
note: associated function defined here
|
||||
--> $DIR/incomplete-inference-issue-143992.rs:18:8
|
||||
|
|
||||
LL | fn new(r: R) -> R {
|
||||
| ^^^ ----
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
@@ -0,0 +1,29 @@
|
||||
//@ compile-flags: --crate-type=lib
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[current] check-pass
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
//@[next] check-fail
|
||||
|
||||
// Test that we avoid incomplete inference when normalizing. Without this,
|
||||
// `Trait`'s implicit `MetaSized` supertrait requires proving `T::Assoc<_>: MetaSized`
|
||||
// before checking the `new` arguments, resulting in eagerly constraining the inference
|
||||
// var to `u32`. This is undesirable and would breaking code.
|
||||
|
||||
pub trait Trait {
|
||||
type Assoc<G>: OtherTrait<G>;
|
||||
}
|
||||
|
||||
pub trait OtherTrait<R> {
|
||||
fn new(r: R) -> R {
|
||||
r
|
||||
}
|
||||
}
|
||||
|
||||
pub fn function<T: Trait>()
|
||||
where
|
||||
T::Assoc<[u32; 1]>: Clone,
|
||||
{
|
||||
let _x = T::Assoc::new(());
|
||||
//[next]~^ ERROR mismatched types
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
error[E0275]: overflow evaluating the requirement `Element: MetaSized`
|
||||
--> $DIR/overflow.rs:16:16
|
||||
|
|
||||
LL | struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: required for `Box<Element>` to implement `ParseTokens`
|
||||
--> $DIR/overflow.rs:12:31
|
||||
|
|
||||
LL | impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
| - ^^^^^^^^^^^ ^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: 1 redundant requirement hidden
|
||||
= note: required for `Box<Box<Element>>` to implement `ParseTokens`
|
||||
|
||||
error[E0275]: overflow evaluating the requirement `Box<Element>: ParseTokens`
|
||||
--> $DIR/overflow.rs:18:22
|
||||
|
|
||||
LL | impl ParseTokens for Element {
|
||||
| ^^^^^^^
|
||||
|
|
||||
note: required for `Box<Box<Element>>` to implement `ParseTokens`
|
||||
--> $DIR/overflow.rs:12:31
|
||||
|
|
||||
LL | impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
| ----------- ^^^^^^^^^^^ ^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
note: required because it appears within the type `Element`
|
||||
--> $DIR/overflow.rs:16:8
|
||||
|
|
||||
LL | struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
| ^^^^^^^
|
||||
note: required by a bound in `ParseTokens`
|
||||
--> $DIR/overflow.rs:9:1
|
||||
|
|
||||
LL | / trait ParseTokens {
|
||||
LL | | type Output;
|
||||
LL | | }
|
||||
| |_^ required by this bound in `ParseTokens`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0275`.
|
||||
@@ -1,9 +1,13 @@
|
||||
//@ compile-flags: --crate-type=lib
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[current] check-pass
|
||||
//@[next] check-pass
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
// FIXME(sized_hierarchy): this is expected to fail in the old solver when there
|
||||
// isn't a temporary revert of the `sized_hierarchy` feature
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
trait ParseTokens {
|
||||
@@ -14,8 +18,6 @@ impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
}
|
||||
|
||||
struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
//[current]~^ ERROR overflow evaluating
|
||||
impl ParseTokens for Element {
|
||||
//[current]~^ ERROR overflow evaluating
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ fn call() {}
|
||||
|
||||
fn test() -> impl Sized {
|
||||
<() as Callable>::call()
|
||||
//~^ ERROR: type annotations needed
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -4,13 +4,6 @@ error[E0207]: the type parameter `V` is not constrained by the impl trait, self
|
||||
LL | impl<V: ?Sized> Callable for () {
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/resolve-impl-before-constrain-check.rs:17:6
|
||||
|
|
||||
LL | <() as Callable>::call()
|
||||
| ^^ cannot infer type for type parameter `V`
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0282.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
|
||||
Reference in New Issue
Block a user