Make sure that args are compatible in resolve_associated_item
This commit is contained in:
parent
2ccafed862
commit
40d132f0f8
@ -191,11 +191,22 @@ fn resolve_associated_item<'tcx>(
|
|||||||
|
|
||||||
// Any final impl is required to define all associated items.
|
// Any final impl is required to define all associated items.
|
||||||
if !leaf_def.item.defaultness(tcx).has_value() {
|
if !leaf_def.item.defaultness(tcx).has_value() {
|
||||||
let guard = tcx.dcx().span_delayed_bug(
|
let guar = tcx.dcx().span_delayed_bug(
|
||||||
tcx.def_span(leaf_def.item.def_id),
|
tcx.def_span(leaf_def.item.def_id),
|
||||||
"missing value for assoc item in impl",
|
"missing value for assoc item in impl",
|
||||||
);
|
);
|
||||||
return Err(guard);
|
return Err(guar);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that we're projecting to an item that has compatible args.
|
||||||
|
// This may happen if we are resolving an instance before codegen, such
|
||||||
|
// as during inlining. This check is also done in projection.
|
||||||
|
if !tcx.check_args_compatible(leaf_def.item.def_id, args) {
|
||||||
|
let guar = tcx.dcx().span_delayed_bug(
|
||||||
|
tcx.def_span(leaf_def.item.def_id),
|
||||||
|
"missing value for assoc item in impl",
|
||||||
|
);
|
||||||
|
return Err(guar);
|
||||||
}
|
}
|
||||||
|
|
||||||
let args = tcx.erase_regions(args);
|
let args = tcx.erase_regions(args);
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
//@ known-bug: #120792
|
|
||||||
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes
|
|
||||||
|
|
||||||
impl Trait<()> for () {
|
|
||||||
fn foo<'a, K>(self, _: (), _: K) {
|
|
||||||
todo!();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trait Foo<T> {}
|
|
||||||
|
|
||||||
impl<F, T> Foo<T> for F {
|
|
||||||
fn main() {
|
|
||||||
().foo((), ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trait Trait<T> {
|
|
||||||
fn foo<'a, K>(self, _: T, _: K)
|
|
||||||
where
|
|
||||||
T: 'a,
|
|
||||||
K: 'a;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn main() {}
|
|
@ -1,22 +0,0 @@
|
|||||||
//@ known-bug: #120793
|
|
||||||
// can't use build-fail, because this also fails check-fail, but
|
|
||||||
// the ICE from #120787 only reproduces on build-fail.
|
|
||||||
//@ compile-flags: --emit=mir
|
|
||||||
|
|
||||||
#![feature(effects)]
|
|
||||||
|
|
||||||
trait Dim {
|
|
||||||
fn dim() -> usize;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Dim3 {}
|
|
||||||
|
|
||||||
impl Dim for Dim3 {
|
|
||||||
fn dim(x: impl Sized) -> usize {
|
|
||||||
3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
[0; Dim3::dim()];
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
//@ known-bug: #120793
|
|
||||||
#![feature(effects)]
|
|
||||||
|
|
||||||
trait Dim {
|
|
||||||
fn dim() -> usize;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Dim3 {}
|
|
||||||
|
|
||||||
impl Dim for Dim3 {
|
|
||||||
fn dim(mut x: impl Iterator<Item = &'_ ()>) -> usize {
|
|
||||||
3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let array: [usize; Dim3::dim()]
|
|
||||||
//~^ ERROR E0015
|
|
||||||
= [0; Dim3::dim()];
|
|
||||||
//~^ ERROR E0015
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
//@ known-bug: #121063
|
|
||||||
//@ compile-flags: -Zpolymorphize=on --edition=2021 -Zinline-mir=yes
|
|
||||||
|
|
||||||
use std::{
|
|
||||||
fmt, ops,
|
|
||||||
path::{Component, Path, PathBuf},
|
|
||||||
};
|
|
||||||
|
|
||||||
pub struct AbsPathBuf(PathBuf);
|
|
||||||
|
|
||||||
impl TryFrom<PathBuf> for AbsPathBuf {
|
|
||||||
type Error = PathBuf;
|
|
||||||
fn try_from(path: impl AsRef<Path>) -> Result<AbsPathBuf, PathBuf> {}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<&str> for AbsPathBuf {
|
|
||||||
fn try_from(path: &str) -> Result<AbsPathBuf, PathBuf> {
|
|
||||||
AbsPathBuf::try_from(PathBuf::from(path))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
//@ known-bug: #121957
|
|
||||||
#![feature(const_trait_impl, effects)]
|
|
||||||
|
|
||||||
#[const_trait]
|
|
||||||
trait Main {
|
|
||||||
fn compute<T: ~const Aux>() -> u32;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl const Main for () {
|
|
||||||
fn compute<'x, 'y, 'z: 'x>() -> u32 {}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[const_trait]
|
|
||||||
trait Aux {}
|
|
||||||
|
|
||||||
impl const Aux for () {}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
const _: u32 = <()>::compute::<()>();
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
//@ known-bug: #121957
|
|
||||||
#![feature(const_trait_impl, effects)]
|
|
||||||
|
|
||||||
#[const_trait]
|
|
||||||
trait Main {
|
|
||||||
fn compute<T: ~const Aux>() -> u32;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl const Main for () {
|
|
||||||
fn compute<'x, 'y, 'z: 'x>() -> u32 {}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[const_trait]
|
|
||||||
trait Aux {}
|
|
||||||
|
|
||||||
impl const Aux for () {}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
const _: u32 = <()>::compute::<()>();
|
|
||||||
}
|
|
27
tests/ui/polymorphization/inline-incorrect-early-bound.rs
Normal file
27
tests/ui/polymorphization/inline-incorrect-early-bound.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// This test demonstrates an ICE that may occur when we try to resolve the instance
|
||||||
|
// of a impl that has different generics than the trait it's implementing. This ensures
|
||||||
|
// we first check that the args are compatible before resolving the body, just like
|
||||||
|
// we do in projection before substituting a GAT.
|
||||||
|
//
|
||||||
|
// When polymorphization is enabled, we check the optimized MIR for unused parameters.
|
||||||
|
// This will invoke the inliner, leading to this ICE.
|
||||||
|
|
||||||
|
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes
|
||||||
|
|
||||||
|
trait Trait {
|
||||||
|
fn foo<'a, K: 'a>(self, _: K);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Trait for () {
|
||||||
|
#[inline]
|
||||||
|
fn foo<K>(self, _: K) {
|
||||||
|
//~^ ERROR lifetime parameters or bounds on method `foo` do not match the trait declaration
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn qux<T>() {
|
||||||
|
().foo(());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,15 @@
|
|||||||
|
error[E0195]: lifetime parameters or bounds on method `foo` do not match the trait declaration
|
||||||
|
--> $DIR/inline-incorrect-early-bound.rs:17:11
|
||||||
|
|
|
||||||
|
LL | fn foo<'a, K: 'a>(self, _: K);
|
||||||
|
| -----------
|
||||||
|
| | |
|
||||||
|
| | this bound might be missing in the impl
|
||||||
|
| lifetimes in impl do not match this method in trait
|
||||||
|
...
|
||||||
|
LL | fn foo<K>(self, _: K) {
|
||||||
|
| ^^^ lifetimes do not match method in trait
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0195`.
|
@ -0,0 +1,32 @@
|
|||||||
|
// This test demonstrates an ICE that may occur when we try to resolve the instance
|
||||||
|
// of a impl that has different generics than the trait it's implementing. This ensures
|
||||||
|
// we first check that the args are compatible before resolving the body, just like
|
||||||
|
// we do in projection before substituting a GAT.
|
||||||
|
//
|
||||||
|
// Const traits aren't the only way to achieve this ICE, but it's a convenient way
|
||||||
|
// to ensure the inliner is called.
|
||||||
|
|
||||||
|
//@ compile-flags: -Znext-solver -Zinline-mir=yes
|
||||||
|
|
||||||
|
#![feature(const_trait_impl, effects)]
|
||||||
|
//~^ WARN the feature `effects` is incomplete
|
||||||
|
|
||||||
|
trait Trait {
|
||||||
|
fn foo(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Trait for () {
|
||||||
|
#[inline]
|
||||||
|
fn foo<T>(self) {
|
||||||
|
//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn foo() {
|
||||||
|
().foo();
|
||||||
|
}
|
||||||
|
|
||||||
|
const UWU: () = foo();
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,21 @@
|
|||||||
|
warning: the feature `effects` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/inline-incorrect-early-bound-in-ctfe.rs:11:30
|
||||||
|
|
|
||||||
|
LL | #![feature(const_trait_impl, effects)]
|
||||||
|
| ^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #102090 <https://github.com/rust-lang/rust/issues/102090> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
--> $DIR/inline-incorrect-early-bound-in-ctfe.rs:20:12
|
||||||
|
|
|
||||||
|
LL | fn foo(self);
|
||||||
|
| - expected 0 type parameters
|
||||||
|
...
|
||||||
|
LL | fn foo<T>(self) {
|
||||||
|
| ^ found 1 type parameter
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0049`.
|
Loading…
Reference in New Issue
Block a user