Rollup merge of #67867 - matthewjasper:opaque-assoc-lookup, r=oli-obk
Correctly check for opaque types in `assoc_ty_def` Closes #67856
This commit is contained in:
commit
1d9c69fb89
@ -1467,7 +1467,7 @@ fn assoc_ty_def(
|
||||
// cycle error if the specialization graph is currently being built.
|
||||
let impl_node = specialization_graph::Node::Impl(impl_def_id);
|
||||
for item in impl_node.items(tcx) {
|
||||
if item.kind == ty::AssocKind::Type
|
||||
if matches!(item.kind, ty::AssocKind::Type | ty::AssocKind::OpaqueTy)
|
||||
&& tcx.hygienic_eq(item.ident, assoc_ty_name, trait_def_id)
|
||||
{
|
||||
return specialization_graph::NodeItem {
|
||||
|
@ -0,0 +1,16 @@
|
||||
// Regression test for issue 67856
|
||||
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![feature(fn_traits)]
|
||||
|
||||
trait MyTrait {}
|
||||
impl MyTrait for () {}
|
||||
|
||||
impl<F> FnOnce<()> for &F {
|
||||
//~^ ERROR conflicting implementations
|
||||
//~| ERROR type parameter `F` must be used
|
||||
type Output = impl MyTrait;
|
||||
extern "rust-call" fn call_once(self, _: ()) -> Self::Output {}
|
||||
}
|
||||
fn main() {}
|
@ -0,0 +1,23 @@
|
||||
error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`:
|
||||
--> $DIR/incoherent-assoc-imp-trait.rs:10:1
|
||||
|
|
||||
LL | impl<F> FnOnce<()> for &F {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: conflicting implementation in crate `core`:
|
||||
- impl<A, F> std::ops::FnOnce<A> for &F
|
||||
where F: std::ops::Fn<A>, F: ?Sized;
|
||||
|
||||
error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct<F>`)
|
||||
--> $DIR/incoherent-assoc-imp-trait.rs:10:6
|
||||
|
|
||||
LL | impl<F> FnOnce<()> for &F {
|
||||
| ^ type parameter `F` must be used as the type parameter for some local type
|
||||
|
|
||||
= note: implementing a foreign trait is only possible if at least one of the types for which is it implemented is local
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0119, E0210.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
Loading…
Reference in New Issue
Block a user