Skip to content

Commit 12b1242

Browse files
author
Yuki Okushi
authored
Rollup merge of rust-lang#106521 - oskgo:remove-E0280, r=jackh726
remove E0280 After looking at rust-lang#61137 I tried my hand at E0280. I'm unable to find a reasonable example that emits the error. There are a couple of old examples that compile with the current compiler ([rust-lang#26217](rust-lang#26217), [rust-lang#42114](rust-lang#42114), [rust-lang#27113](rust-lang#27113)) and there is a [bug with chalk](https://github.com/rust-lang/rust/blob/b7cdb635c4b973572307ad288466fba64533369c/src/test/ui/chalkify/bugs/async.rs) that makes it emit the error, with a couple more chalk bugs on zulip. It seems like the error is supposed to be emitted from unfulfilled where bounds, of which two are related to borrow checking (error in where T: 'a or where 'a: 'b) and thus tend to emit errors like "lifetime may not live long enough" from borrow checking instead. The final case is with type equality constraints (where <T as Iterator>::Item == u32), which is unimplemented ([rust-lang#20041](rust-lang#20041)). That such different problems are supposed to have the same error code also seems strange to me. Since the error seems to only be emitted when using chalk I propose to remove it and replace it with an ICE instead. A crater run might be warranted. Pinging `@jackh726` due to removal of chalk test that now ICEs.
2 parents 8d7a06a + f75eb24 commit 12b1242

File tree

4 files changed

+55
-52
lines changed

4 files changed

+55
-52
lines changed

compiler/rustc_error_codes/src/error_codes.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ E0791: include_str!("./error_codes/E0791.md"),
574574
// E0274, // on_unimplemented #2
575575
// E0278, // requirement is not satisfied
576576
// E0279,
577-
E0280, // requirement is not satisfied
577+
// E0280, // changed to ICE
578578
// E0285, // overflow evaluation builtin bounds
579579
// E0296, // replaced with a generic attribute input check
580580
// E0298, // cannot compare constants

compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -1102,15 +1102,19 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
11021102
}
11031103

11041104
ty::PredicateKind::Clause(ty::Clause::RegionOutlives(..))
1105-
| ty::PredicateKind::Clause(ty::Clause::Projection(..))
11061105
| ty::PredicateKind::Clause(ty::Clause::TypeOutlives(..)) => {
1107-
let predicate = self.resolve_vars_if_possible(obligation.predicate);
1108-
struct_span_err!(
1109-
self.tcx.sess,
1106+
span_bug!(
11101107
span,
1111-
E0280,
1112-
"the requirement `{}` is not satisfied",
1113-
predicate
1108+
"outlives clauses should not error outside borrowck. obligation: `{:?}`",
1109+
obligation
1110+
)
1111+
}
1112+
1113+
ty::PredicateKind::Clause(ty::Clause::Projection(..)) => {
1114+
span_bug!(
1115+
span,
1116+
"projection clauses should be implied from elsewhere. obligation: `{:?}`",
1117+
obligation
11141118
)
11151119
}
11161120

src/test/ui/chalkify/bugs/async.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
// check-fail
2-
// known-bug: unknown
3-
// compile-flags: -Z trait-solver=chalk --edition=2021
2+
// known-bug
3+
// unset-rustc-env:RUST_BACKTRACE
4+
// compile-flags:-Z trait-solver=chalk --edition=2021
5+
// error-pattern:stack backtrace:
6+
// failure-status:101
7+
// normalize-stderr-test "note: .*" -> ""
8+
// normalize-stderr-test "thread 'rustc' .*" -> ""
9+
// normalize-stderr-test " .*\n" -> ""
10+
// normalize-stderr-test "DefId([^)]*)" -> "..."
411

512
fn main() -> () {}
613

+34-42
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,40 @@
1-
error[E0277]: `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
2-
--> $DIR/async.rs:7:29
3-
|
4-
LL | async fn foo(x: u32) -> u32 {
5-
| _____________________________-
6-
LL | | x
7-
LL | | }
8-
| | ^
9-
| | |
10-
| |_`[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
11-
| required by a bound introduced by this call
12-
|
13-
= help: the trait `Future` is not implemented for `[async fn body@$DIR/async.rs:7:29: 9:2]`
14-
= note: [async fn body@$DIR/async.rs:7:29: 9:2] must be a future or must implement `IntoFuture` to be awaited
15-
note: required by a bound in `identity_future`
16-
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
17-
18-
error[E0277]: the size for values of type `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output` cannot be known at compilation time
19-
--> $DIR/async.rs:7:29
20-
|
21-
LL | async fn foo(x: u32) -> u32 {
22-
| _____________________________^
23-
LL | | x
24-
LL | | }
25-
| |_^ doesn't have a size known at compile-time
26-
|
27-
= help: the trait `Sized` is not implemented for `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output`
28-
note: required by a bound in `identity_future`
29-
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
30-
31-
error[E0277]: `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
32-
--> $DIR/async.rs:7:25
33-
|
1+
error[E0277]: `[async fn body@$DIR/async.rs:14:29: 16:2]` is not a future
2+
LL |LL | |LL | | }
3+
4+
5+
error[E0277]: the size for values of type `<[async fn body@$DIR/async.rs:14:29: 16:2] as Future>::Output` cannot be known at compilation time
6+
LL |LL | |LL | | }
7+
8+
9+
error[E0277]: `[async fn body@$DIR/async.rs:14:29: 16:2]` is not a future
3410
LL | async fn foo(x: u32) -> u32 {
35-
| ^^^ `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
36-
|
37-
= help: the trait `Future` is not implemented for `[async fn body@$DIR/async.rs:7:29: 9:2]`
38-
= note: [async fn body@$DIR/async.rs:7:29: 9:2] must be a future or must implement `IntoFuture` to be awaited
39-
40-
error[E0280]: the requirement `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output == u32` is not satisfied
41-
--> $DIR/async.rs:7:25
42-
|
11+
12+
error: internal compiler error: compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs:1114:25: projection clauses should be implied from elsewhere. obligation: `Obligation(predicate=Binder(ProjectionPredicate(AliasTy { substs: [[async fn body@$DIR/async.rs:14:29: 16:2]], def_id: ...), _use_mk_alias_ty_instead: () }, Term::Ty(u32)), []), depth=0)`
4313
LL | async fn foo(x: u32) -> u32 {
44-
| ^^^
4514

15+
16+
stack backtrace:
17+
18+
19+
20+
21+
22+
23+
24+
25+
26+
query stack during panic:
27+
#0 [typeck] type-checking `foo`
28+
#1 [thir_body] building THIR for `foo`
29+
#2 [mir_built] building MIR for `foo`
30+
#3 [unsafety_check_result] unsafety-checking `foo`
31+
#4 [mir_const] preparing `foo` for borrow checking
32+
#5 [mir_promoted] processing MIR for `foo`
33+
#6 [mir_borrowck] borrow-checking `foo`
34+
#7 [type_of] computing type of `foo::{opaque#0}`
35+
#8 [check_mod_item_types] checking item types in top-level module
36+
#9 [analysis] running analysis passes on this crate
37+
end of query stack
4638
error: aborting due to 4 previous errors
4739

4840
For more information about this error, try `rustc --explain E0277`.

0 commit comments

Comments
 (0)