-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #128171 - compiler-errors:arg-compat, r=oli-obk
Make sure that args are compatible in `resolve_associated_item` Implements a similar check to the one that we have in projection for GATs (#102488, #123240), where we check that the args of an impl item are compatible before returning it. This is done in `resolve_assoc_item`, which is backing `Instance::resolve`, so this is conceptually generalizing the check from GATs to methods/assoc consts. This is important to make sure that the inliner will only visit and substitute MIR bodies that are compatible w/ their trait definitions. This shouldn't happen in codegen, but there are a few ways to get the inliner to be invoked (via calls to `optimized_mir`) before codegen, namely polymorphization and CTFE. Fixes #121957 Fixes #120792 Fixes #120793 Fixes #121063
- Loading branch information
Showing
11 changed files
with
108 additions
and
130 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() {} |
15 changes: 15 additions & 0 deletions
15
tests/ui/polymorphization/inline-incorrect-early-bound.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |
32 changes: 32 additions & 0 deletions
32
tests/ui/rfcs/rfc-2632-const-trait-impl/inline-incorrect-early-bound-in-ctfe.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() {} |
21 changes: 21 additions & 0 deletions
21
tests/ui/rfcs/rfc-2632-const-trait-impl/inline-incorrect-early-bound-in-ctfe.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |