From c58fff2bb76b055c8276551d54a99aea997c34ed Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Tue, 28 Feb 2017 23:46:47 +0000 Subject: [PATCH] Allow types passed to [] to coerce, like .index() Fixes #40085 --- src/librustc_typeck/check/mod.rs | 2 +- src/test/run-pass/issue-40085.rs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/issue-40085.rs diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 9d963226caf..fbea34c95a6 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -3912,7 +3912,7 @@ fn check_expr_kind(&self, let base_t = self.structurally_resolved_type(expr.span, base_t); match self.lookup_indexing(expr, base, base_t, idx_t, lvalue_pref) { Some((index_ty, element_ty)) => { - self.demand_eqtype(expr.span, index_ty, idx_t); + self.demand_coerce(idx, idx_t, index_ty); element_ty } None => { diff --git a/src/test/run-pass/issue-40085.rs b/src/test/run-pass/issue-40085.rs new file mode 100644 index 00000000000..b6d02908a0f --- /dev/null +++ b/src/test/run-pass/issue-40085.rs @@ -0,0 +1,22 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::ops::Index; +fn bar() {} +static UNIT: () = (); +struct S; +impl Index for S { + type Output = (); + fn index(&self, _: fn()) -> &() { &UNIT } +} +fn main() { + S.index(bar); + S[bar]; +} -- 2.44.0