Skip to content

Commit

Permalink
Correctly check for opaque types in assoc_ty_def
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewjasper committed Jan 5, 2020
1 parent c5840f9 commit 5e92625
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/librustc/traits/project.rs
Expand Up @@ -1461,7 +1461,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 {
Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.rs
@@ -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`.

0 comments on commit 5e92625

Please sign in to comment.