From 68b38c3bd902deccd31d59f45d5b49e58aa76a9d Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Fri, 10 Apr 2020 18:14:55 +0800 Subject: [PATCH 1/2] Normalize function signature in function casting check --- src/librustc_typeck/check/cast.rs | 5 ++++- src/test/ui/issues/issue-54094.rs | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issues/issue-54094.rs diff --git a/src/librustc_typeck/check/cast.rs b/src/librustc_typeck/check/cast.rs index 5de0184f2bba9..38d0c42e1588b 100644 --- a/src/librustc_typeck/check/cast.rs +++ b/src/librustc_typeck/check/cast.rs @@ -536,7 +536,10 @@ impl<'a, 'tcx> CastCheck<'tcx> { match self.expr_ty.kind { ty::FnDef(..) => { // Attempt a coercion to a fn pointer type. - let f = self.expr_ty.fn_sig(fcx.tcx); + let f = fcx.normalize_associated_types_in( + self.expr.span, + &self.expr_ty.fn_sig(fcx.tcx), + ); let res = fcx.try_coerce( self.expr, self.expr_ty, diff --git a/src/test/ui/issues/issue-54094.rs b/src/test/ui/issues/issue-54094.rs new file mode 100644 index 0000000000000..57384825a35fe --- /dev/null +++ b/src/test/ui/issues/issue-54094.rs @@ -0,0 +1,14 @@ +// check-pass +trait Zoo { + type X; +} + +impl Zoo for u16 { + type X = usize; +} + +fn foo(abc: ::X) {} + +fn main() { + let x: *const u8 = foo as _; +} \ No newline at end of file From 75cc40335c5ca83ffa636ea6ff249d1934223b8b Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Fri, 10 Apr 2020 18:51:27 +0800 Subject: [PATCH 2/2] Tidy fix --- src/test/ui/issues/issue-54094.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/issues/issue-54094.rs b/src/test/ui/issues/issue-54094.rs index 57384825a35fe..ec38dc40e610a 100644 --- a/src/test/ui/issues/issue-54094.rs +++ b/src/test/ui/issues/issue-54094.rs @@ -11,4 +11,4 @@ fn foo(abc: ::X) {} fn main() { let x: *const u8 = foo as _; -} \ No newline at end of file +}