Skip to content

Commit 5e92625

Browse files
committed
Correctly check for opaque types in assoc_ty_def
1 parent c5840f9 commit 5e92625

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

src/librustc/traits/project.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1461,7 +1461,7 @@ fn assoc_ty_def(
14611461
// cycle error if the specialization graph is currently being built.
14621462
let impl_node = specialization_graph::Node::Impl(impl_def_id);
14631463
for item in impl_node.items(tcx) {
1464-
if item.kind == ty::AssocKind::Type
1464+
if matches!(item.kind, ty::AssocKind::Type | ty::AssocKind::OpaqueTy)
14651465
&& tcx.hygienic_eq(item.ident, assoc_ty_name, trait_def_id)
14661466
{
14671467
return specialization_graph::NodeItem {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Regression test for issue 67856
2+
3+
#![feature(unboxed_closures)]
4+
#![feature(type_alias_impl_trait)]
5+
#![feature(fn_traits)]
6+
7+
trait MyTrait {}
8+
impl MyTrait for () {}
9+
10+
impl<F> FnOnce<()> for &F {
11+
//~^ ERROR conflicting implementations
12+
//~| ERROR type parameter `F` must be used
13+
type Output = impl MyTrait;
14+
extern "rust-call" fn call_once(self, _: ()) -> Self::Output {}
15+
}
16+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`:
2+
--> $DIR/incoherent-assoc-imp-trait.rs:10:1
3+
|
4+
LL | impl<F> FnOnce<()> for &F {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= note: conflicting implementation in crate `core`:
8+
- impl<A, F> std::ops::FnOnce<A> for &F
9+
where F: std::ops::Fn<A>, F: ?Sized;
10+
11+
error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct<F>`)
12+
--> $DIR/incoherent-assoc-imp-trait.rs:10:6
13+
|
14+
LL | impl<F> FnOnce<()> for &F {
15+
| ^ type parameter `F` must be used as the type parameter for some local type
16+
|
17+
= note: implementing a foreign trait is only possible if at least one of the types for which is it implemented is local
18+
= note: only traits defined in the current crate can be implemented for a type parameter
19+
20+
error: aborting due to 2 previous errors
21+
22+
Some errors have detailed explanations: E0119, E0210.
23+
For more information about an error, try `rustc --explain E0119`.

0 commit comments

Comments
 (0)