diff --git a/compiler/rustc_data_structures/src/obligation_forest/mod.rs b/compiler/rustc_data_structures/src/obligation_forest/mod.rs index a47908648ba16..0352c085063e2 100644 --- a/compiler/rustc_data_structures/src/obligation_forest/mod.rs +++ b/compiler/rustc_data_structures/src/obligation_forest/mod.rs @@ -359,7 +359,10 @@ impl ObligationForest { Entry::Vacant(v) => { let obligation_tree_id = match parent { Some(parent_index) => self.nodes[parent_index].obligation_tree_id, - None => self.obligation_tree_id_generator.next().unwrap(), + // FIXME(type_alias_impl_trait): with `#[defines]` attributes required to define hidden + // types we can convert this back to a `next` method call, as this function shouldn't be + // defining a hidden type anyway. + None => Iterator::next(&mut self.obligation_tree_id_generator).unwrap(), }; let already_failed = parent.is_some() diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs index 2580179ce5bf3..db161a6e9ccca 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs @@ -1448,7 +1448,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let impl_ty = self.normalize(span, tcx.type_of(impl_def_id).instantiate(tcx, args)); let self_ty = self.normalize(span, self_ty); match self.at(&self.misc(span), self.param_env).eq( - DefineOpaqueTypes::No, + DefineOpaqueTypes::Yes, impl_ty, self_ty, ) { diff --git a/compiler/rustc_hir_typeck/src/method/confirm.rs b/compiler/rustc_hir_typeck/src/method/confirm.rs index 36860e446fc2b..8965597e9f28d 100644 --- a/compiler/rustc_hir_typeck/src/method/confirm.rs +++ b/compiler/rustc_hir_typeck/src/method/confirm.rs @@ -499,7 +499,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> { args, })), ); - match self.at(&cause, self.param_env).sup(DefineOpaqueTypes::No, method_self_ty, self_ty) { + match self.at(&cause, self.param_env).sup(DefineOpaqueTypes::Yes, method_self_ty, self_ty) { Ok(InferOk { obligations, value: () }) => { self.register_predicates(obligations); } diff --git a/compiler/rustc_hir_typeck/src/method/probe.rs b/compiler/rustc_hir_typeck/src/method/probe.rs index 28e17e1de36c3..265bd55436a4f 100644 --- a/compiler/rustc_hir_typeck/src/method/probe.rs +++ b/compiler/rustc_hir_typeck/src/method/probe.rs @@ -1488,7 +1488,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { self.probe(|_| { // First check that the self type can be related. let sub_obligations = match self.at(&ObligationCause::dummy(), self.param_env).sup( - DefineOpaqueTypes::No, + DefineOpaqueTypes::Yes, probe.xform_self_ty, self_ty, ) { diff --git a/tests/ui/impl-trait/issues/issue-70877.rs b/tests/ui/impl-trait/issues/issue-70877.rs index df7722986744d..76cd7291a7c40 100644 --- a/tests/ui/impl-trait/issues/issue-70877.rs +++ b/tests/ui/impl-trait/issues/issue-70877.rs @@ -27,7 +27,9 @@ fn ham() -> Foo { fn oof(_: Foo) -> impl std::fmt::Debug { let mut bar = ham(); - let func = bar.next().unwrap(); + // Need to UFC invoke `Iterator::next`, + // as otherwise the hidden type gets constrained to `&mut _` + let func = Iterator::next(&mut bar).unwrap(); return func(&"oof"); //~ ERROR opaque type's hidden type cannot be another opaque type } diff --git a/tests/ui/impl-trait/issues/issue-70877.stderr b/tests/ui/impl-trait/issues/issue-70877.stderr index 274139f01d087..804718c0fae61 100644 --- a/tests/ui/impl-trait/issues/issue-70877.stderr +++ b/tests/ui/impl-trait/issues/issue-70877.stderr @@ -1,5 +1,5 @@ error: opaque type's hidden type cannot be another opaque type from the same scope - --> $DIR/issue-70877.rs:31:12 + --> $DIR/issue-70877.rs:33:12 | LL | return func(&"oof"); | ^^^^^^^^^^^^ one of the two opaque types used here has to be outside its defining scope diff --git a/tests/ui/impl-trait/method-resolution.current.stderr b/tests/ui/impl-trait/method-resolution.current.stderr index 6d10693c8933b..049353fe347b3 100644 --- a/tests/ui/impl-trait/method-resolution.current.stderr +++ b/tests/ui/impl-trait/method-resolution.current.stderr @@ -1,30 +1,27 @@ -error[E0599]: no method named `bar` found for struct `Bar` in the current scope - --> $DIR/method-resolution.rs:23:11 +error[E0599]: no method named `foo` found for struct `Bar` in the current scope + --> $DIR/method-resolution.rs:22:11 | LL | struct Bar(T); - | ------------- method `bar` not found for this struct + | ------------- method `foo` not found for this struct ... -LL | x.bar(); +LL | x.foo(); | ^^^ method not found in `Bar` - | - = note: the method was found for - - `Bar` error[E0391]: cycle detected when computing type of opaque `foo::{opaque#0}` - --> $DIR/method-resolution.rs:19:24 + --> $DIR/method-resolution.rs:18:24 | LL | fn foo(x: bool) -> Bar { | ^^^^^^^^^^ | note: ...which requires type-checking `foo`... - --> $DIR/method-resolution.rs:23:9 + --> $DIR/method-resolution.rs:22:9 | -LL | x.bar(); +LL | x.foo(); | ^ = note: ...which requires evaluating trait selection obligation `Bar: core::marker::Unpin`... = note: ...which again requires computing type of opaque `foo::{opaque#0}`, completing the cycle note: cycle used when computing type of `foo::{opaque#0}` - --> $DIR/method-resolution.rs:19:24 + --> $DIR/method-resolution.rs:18:24 | LL | fn foo(x: bool) -> Bar { | ^^^^^^^^^^ diff --git a/tests/ui/impl-trait/method-resolution.next.stderr b/tests/ui/impl-trait/method-resolution.next.stderr new file mode 100644 index 0000000000000..6c2a37ebde2d4 --- /dev/null +++ b/tests/ui/impl-trait/method-resolution.next.stderr @@ -0,0 +1,12 @@ +error[E0599]: no method named `foo` found for struct `Bar` in the current scope + --> $DIR/method-resolution.rs:22:11 + | +LL | struct Bar(T); + | ------------- method `foo` not found for this struct +... +LL | x.foo(); + | ^^^ method not found in `Bar<_>` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0599`. diff --git a/tests/ui/impl-trait/method-resolution.rs b/tests/ui/impl-trait/method-resolution.rs index 07618aa64085d..14c8b2400bfd0 100644 --- a/tests/ui/impl-trait/method-resolution.rs +++ b/tests/ui/impl-trait/method-resolution.rs @@ -4,7 +4,6 @@ //@ revisions: current next //@[next] compile-flags: -Znext-solver -//@[next] check-pass trait Trait {} @@ -17,11 +16,11 @@ impl Bar { } fn foo(x: bool) -> Bar { - //[current]~^ ERROR: cycle detected + //[current]~^ ERROR: cycle if x { let x = foo(false); - x.bar(); - //[current]~^ ERROR: no method named `bar` found + x.foo(); + //~^ ERROR: no method named `foo` found } todo!() } diff --git a/tests/ui/impl-trait/method-resolution3.current.stderr b/tests/ui/impl-trait/method-resolution3.current.stderr index 7407b489e324f..a05055b92e7a3 100644 --- a/tests/ui/impl-trait/method-resolution3.current.stderr +++ b/tests/ui/impl-trait/method-resolution3.current.stderr @@ -1,15 +1,11 @@ -error[E0599]: no method named `bar` found for struct `Bar` in the current scope +error[E0599]: no method named `foo` found for struct `Bar` in the current scope --> $DIR/method-resolution3.rs:22:11 | LL | struct Bar(T); - | ------------- method `bar` not found for this struct + | ------------- method `foo` not found for this struct ... -LL | x.bar(); +LL | x.foo(); | ^^^ method not found in `Bar` - | - = note: the method was found for - - `Bar` - - `Bar` error[E0391]: cycle detected when computing type of opaque `foo::{opaque#0}` --> $DIR/method-resolution3.rs:18:24 @@ -20,7 +16,7 @@ LL | fn foo(x: bool) -> Bar { note: ...which requires type-checking `foo`... --> $DIR/method-resolution3.rs:22:9 | -LL | x.bar(); +LL | x.foo(); | ^ = note: ...which requires evaluating trait selection obligation `Bar: core::marker::Unpin`... = note: ...which again requires computing type of opaque `foo::{opaque#0}`, completing the cycle diff --git a/tests/ui/impl-trait/method-resolution3.next.stderr b/tests/ui/impl-trait/method-resolution3.next.stderr index 53b77c620ba0e..f650a03bda2ba 100644 --- a/tests/ui/impl-trait/method-resolution3.next.stderr +++ b/tests/ui/impl-trait/method-resolution3.next.stderr @@ -1,20 +1,12 @@ -error[E0034]: multiple applicable items in scope +error[E0599]: no method named `foo` found for struct `Bar` in the current scope --> $DIR/method-resolution3.rs:22:11 | -LL | x.bar(); - | ^^^ multiple `bar` found - | -note: candidate #1 is defined in an impl for the type `Bar` - --> $DIR/method-resolution3.rs:15:5 - | -LL | fn bar(self) {} - | ^^^^^^^^^^^^ -note: candidate #2 is defined in an impl for the type `Bar` - --> $DIR/method-resolution3.rs:11:5 - | -LL | fn bar(self) {} - | ^^^^^^^^^^^^ +LL | struct Bar(T); + | ------------- method `foo` not found for this struct +... +LL | x.foo(); + | ^^^ method not found in `Bar<_>` error: aborting due to 1 previous error -For more information about this error, try `rustc --explain E0034`. +For more information about this error, try `rustc --explain E0599`. diff --git a/tests/ui/impl-trait/method-resolution3.rs b/tests/ui/impl-trait/method-resolution3.rs index 8474e2da7dbb9..b1bb350056bd2 100644 --- a/tests/ui/impl-trait/method-resolution3.rs +++ b/tests/ui/impl-trait/method-resolution3.rs @@ -19,9 +19,8 @@ fn foo(x: bool) -> Bar { //[current]~^ ERROR: cycle if x { let x = foo(false); - x.bar(); - //[current]~^ ERROR: no method named `bar` - //[next]~^^ ERROR: multiple applicable items in scope + x.foo(); + //~^ ERROR: no method named `foo` found } todo!() } diff --git a/tests/ui/impl-trait/method-resolution4.current.stderr b/tests/ui/impl-trait/method-resolution4.current.stderr new file mode 100644 index 0000000000000..d87fda55d7204 --- /dev/null +++ b/tests/ui/impl-trait/method-resolution4.current.stderr @@ -0,0 +1,16 @@ +error[E0308]: mismatched types + --> $DIR/method-resolution4.rs:15:5 + | +LL | std::iter::empty() + | ^^^^^^^^^^^^^^^^^^ expected `&mut _`, found `Empty<_>` + | + = note: expected mutable reference `&mut _` + found struct `std::iter::Empty<_>` +help: consider mutably borrowing here + | +LL | &mut std::iter::empty() + | ++++ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/impl-trait/method-resolution4.next.stderr b/tests/ui/impl-trait/method-resolution4.next.stderr index b48de0af3579d..41e914c62f37d 100644 --- a/tests/ui/impl-trait/method-resolution4.next.stderr +++ b/tests/ui/impl-trait/method-resolution4.next.stderr @@ -1,11 +1,11 @@ error[E0282]: type annotations needed - --> $DIR/method-resolution4.rs:13:9 + --> $DIR/method-resolution4.rs:12:9 | LL | foo(false).next().unwrap(); | ^^^^^^^^^^ cannot infer type error[E0308]: mismatched types - --> $DIR/method-resolution4.rs:16:5 + --> $DIR/method-resolution4.rs:15:5 | LL | fn foo(b: bool) -> impl Iterator { | ------------------------ the expected opaque type diff --git a/tests/ui/impl-trait/method-resolution4.rs b/tests/ui/impl-trait/method-resolution4.rs index 3578db7cb55f3..8c6ff6ee9c894 100644 --- a/tests/ui/impl-trait/method-resolution4.rs +++ b/tests/ui/impl-trait/method-resolution4.rs @@ -4,7 +4,6 @@ //! variable, but get a type mismatch when comparing `&mut _` with //! `std::iter::Empty`. -//@[current] check-pass //@ revisions: current next //@[next] compile-flags: -Znext-solver @@ -14,7 +13,7 @@ fn foo(b: bool) -> impl Iterator { //[next]~^ type annotations needed } std::iter::empty() - //[next]~^ mismatched types + //~^ mismatched types } fn main() {} diff --git a/tests/ui/methods/opaque_param_in_ufc.rs b/tests/ui/methods/opaque_param_in_ufc.rs index a4b27a0131fd0..b170e6805f646 100644 --- a/tests/ui/methods/opaque_param_in_ufc.rs +++ b/tests/ui/methods/opaque_param_in_ufc.rs @@ -1,4 +1,7 @@ #![feature(type_alias_impl_trait)] + +//@ check-pass + struct Foo(T); impl Foo { @@ -15,14 +18,11 @@ fn bar() -> Bar { impl Foo { fn foo() -> Bar { Self::method(); - //~^ ERROR: no function or associated item named `method` found for struct `Foo` Foo::::method(); - //~^ ERROR: no function or associated item named `method` found for struct `Foo` let x = Foo(bar()); Foo::method2(x); let x = Self(bar()); Self::method2(x); - //~^ ERROR: no function or associated item named `method2` found for struct `Foo` todo!() } } diff --git a/tests/ui/methods/opaque_param_in_ufc.stderr b/tests/ui/methods/opaque_param_in_ufc.stderr deleted file mode 100644 index 7e5bbbac8a9ab..0000000000000 --- a/tests/ui/methods/opaque_param_in_ufc.stderr +++ /dev/null @@ -1,36 +0,0 @@ -error[E0599]: no function or associated item named `method` found for struct `Foo` in the current scope - --> $DIR/opaque_param_in_ufc.rs:17:15 - | -LL | struct Foo(T); - | ------------- function or associated item `method` not found for this struct -... -LL | Self::method(); - | ^^^^^^ function or associated item not found in `Foo` - | - = note: the function or associated item was found for - - `Foo` - -error[E0599]: no function or associated item named `method` found for struct `Foo` in the current scope - --> $DIR/opaque_param_in_ufc.rs:19:21 - | -LL | struct Foo(T); - | ------------- function or associated item `method` not found for this struct -... -LL | Foo::::method(); - | ^^^^^^ function or associated item not found in `Foo` - | - = note: the function or associated item was found for - - `Foo` - -error[E0599]: no function or associated item named `method2` found for struct `Foo` in the current scope - --> $DIR/opaque_param_in_ufc.rs:24:15 - | -LL | struct Foo(T); - | ------------- function or associated item `method2` not found for this struct -... -LL | Self::method2(x); - | ^^^^^^^ function or associated item not found in `Foo` - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0599`. diff --git a/tests/ui/type-alias-impl-trait/method_resolution2.current.stderr b/tests/ui/type-alias-impl-trait/method_resolution2.current.stderr deleted file mode 100644 index e68ea70a8ef48..0000000000000 --- a/tests/ui/type-alias-impl-trait/method_resolution2.current.stderr +++ /dev/null @@ -1,36 +0,0 @@ -error[E0599]: no method named `foo` found for struct `Bar` in the current scope - --> $DIR/method_resolution2.rs:17:14 - | -LL | struct Bar(T); - | ------------- method `foo` not found for this struct -... -LL | self.foo() - | ^^^ method not found in `Bar` - | - = note: the method was found for - - `Bar` - -error[E0391]: cycle detected when computing type of opaque `Foo::{opaque#0}` - --> $DIR/method_resolution2.rs:10:12 - | -LL | type Foo = impl Sized; - | ^^^^^^^^^^ - | -note: ...which requires type-checking `::bar`... - --> $DIR/method_resolution2.rs:17:9 - | -LL | self.foo() - | ^^^^ - = note: ...which requires evaluating trait selection obligation `Bar: core::marker::Unpin`... - = note: ...which again requires computing type of opaque `Foo::{opaque#0}`, completing the cycle -note: cycle used when computing type of `Foo::{opaque#0}` - --> $DIR/method_resolution2.rs:10:12 - | -LL | type Foo = impl Sized; - | ^^^^^^^^^^ - = 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: aborting due to 2 previous errors - -Some errors have detailed explanations: E0391, E0599. -For more information about an error, try `rustc --explain E0391`. diff --git a/tests/ui/type-alias-impl-trait/method_resolution2.rs b/tests/ui/type-alias-impl-trait/method_resolution2.rs index bb747246bf672..88ac1580c08ab 100644 --- a/tests/ui/type-alias-impl-trait/method_resolution2.rs +++ b/tests/ui/type-alias-impl-trait/method_resolution2.rs @@ -3,19 +3,17 @@ //@ revisions: current next //@[next] compile-flags: -Znext-solver -//@[next] check-pass +//@ check-pass #![feature(type_alias_impl_trait)] type Foo = impl Sized; -//[current]~^ ERROR: cycle struct Bar(T); impl Bar { fn bar(self) { self.foo() - //[current]~^ ERROR: no method named `foo` } } diff --git a/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.current.stderr b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.current.stderr new file mode 100644 index 0000000000000..3b8f0bc5a5858 --- /dev/null +++ b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.current.stderr @@ -0,0 +1,15 @@ +error[E0284]: type annotations needed + --> $DIR/method_resolution_trait_method_from_opaque.rs:25:18 + | +LL | self.bar.next().unwrap(); + | ^^^^ + | + = note: cannot satisfy `<_ as Iterator>::Item == _` +help: try using a fully qualified path to specify the expected types + | +LL | <_ as Iterator>::next(self.bar).unwrap(); + | ++++++++++++++++++++++ ~ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0284`. diff --git a/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.next.stderr b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.next.stderr index 2617ce124c105..8e6cb8b4d41a8 100644 --- a/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.next.stderr +++ b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.next.stderr @@ -1,5 +1,5 @@ error[E0282]: type annotations needed - --> $DIR/method_resolution_trait_method_from_opaque.rs:26:9 + --> $DIR/method_resolution_trait_method_from_opaque.rs:25:9 | LL | self.bar.next().unwrap(); | ^^^^^^^^ cannot infer type diff --git a/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.rs b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.rs index 9e44cb716b717..9a3ddf629f2c8 100644 --- a/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.rs +++ b/tests/ui/type-alias-impl-trait/method_resolution_trait_method_from_opaque.rs @@ -5,7 +5,6 @@ //! type, this won't be as much of a problem, as most functions that do method calls on opaque types //! won't also be the ones defining the hidden type. -//@[current] check-pass //@ revisions: current next //@[next] compile-flags: -Znext-solver @@ -24,7 +23,7 @@ impl Foo { fn foo(&mut self) { self.bar.next().unwrap(); - //[next]~^ ERROR: type annotations needed + //~^ ERROR: type annotations needed } }