Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
084d9fa9
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
084d9fa9
编写于
4月 05, 2016
作者:
M
Manish Goregaokar
浏览文件
操作
浏览文件
下载
差异文件
Rollup merge of #32712 - jonas-schievink:autoderef-fields-for-fn-ty, r=nagisa
Autoderef when suggesting to call `(self.field)` Fixes #32128
上级
7d63422b
1ea98a8b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
58 addition
and
18 deletion
+58
-18
src/librustc_typeck/check/method/suggest.rs
src/librustc_typeck/check/method/suggest.rs
+33
-18
src/test/compile-fail/issue-32128.rs
src/test/compile-fail/issue-32128.rs
+25
-0
未找到文件。
src/librustc_typeck/check/method/suggest.rs
浏览文件 @
084d9fa9
...
...
@@ -14,7 +14,7 @@
use
CrateCtxt
;
use
astconv
::
AstConv
;
use
check
::{
self
,
FnCtxt
};
use
check
::{
self
,
FnCtxt
,
UnresolvedTypeAction
,
autoderef
};
use
front
::
map
as
hir_map
;
use
rustc
::
ty
::{
self
,
Ty
,
ToPolyTraitRef
,
ToPredicate
,
TypeFoldable
};
use
middle
::
cstore
::{
self
,
CrateStore
};
...
...
@@ -22,6 +22,7 @@
use
middle
::
def_id
::
DefId
;
use
middle
::
lang_items
::
FnOnceTraitLangItem
;
use
rustc
::
ty
::
subst
::
Substs
;
use
rustc
::
ty
::
LvaluePreference
;
use
rustc
::
traits
::{
Obligation
,
SelectionContext
};
use
util
::
nodemap
::{
FnvHashSet
};
...
...
@@ -50,23 +51,37 @@ fn is_fn_ty<'a, 'tcx>(ty: &Ty<'tcx>, fcx: &FnCtxt<'a, 'tcx>, span: Span) -> bool
if
let
Ok
(
fn_once_trait_did
)
=
cx
.lang_items
.require
(
FnOnceTraitLangItem
)
{
let
infcx
=
fcx
.infcx
();
infcx
.probe
(|
_
|
{
let
fn_once_substs
=
Substs
::
new_trait
(
vec!
[
infcx
.next_ty_var
()],
Vec
::
new
(),
ty
);
let
trait_ref
=
ty
::
TraitRef
::
new
(
fn_once_trait_did
,
cx
.mk_substs
(
fn_once_substs
));
let
poly_trait_ref
=
trait_ref
.to_poly_trait_ref
();
let
obligation
=
Obligation
::
misc
(
span
,
fcx
.body_id
,
poly_trait_ref
.to_predicate
());
let
mut
selcx
=
SelectionContext
::
new
(
infcx
);
return
selcx
.evaluate_obligation
(
&
obligation
)
})
let
(
_
,
_
,
opt_is_fn
)
=
autoderef
(
fcx
,
span
,
ty
,
||
None
,
UnresolvedTypeAction
::
Ignore
,
LvaluePreference
::
NoPreference
,
|
ty
,
_
|
{
infcx
.probe
(|
_
|
{
let
fn_once_substs
=
Substs
::
new_trait
(
vec!
[
infcx
.next_ty_var
()],
Vec
::
new
(),
ty
);
let
trait_ref
=
ty
::
TraitRef
::
new
(
fn_once_trait_did
,
cx
.mk_substs
(
fn_once_substs
));
let
poly_trait_ref
=
trait_ref
.to_poly_trait_ref
();
let
obligation
=
Obligation
::
misc
(
span
,
fcx
.body_id
,
poly_trait_ref
.to_predicate
());
let
mut
selcx
=
SelectionContext
::
new
(
infcx
);
if
selcx
.evaluate_obligation
(
&
obligation
)
{
Some
(())
}
else
{
None
}
})
});
opt_is_fn
.is_some
()
}
else
{
false
}
...
...
src/test/compile-fail/issue-32128.rs
0 → 100644
浏览文件 @
084d9fa9
// Copyright 2016 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
struct
Example
{
example
:
Box
<
Fn
(
i32
)
->
i32
>
}
fn
main
()
{
let
demo
=
Example
{
example
:
Box
::
new
(|
x
|
{
x
+
1
})
};
demo
.example
(
1
);
//~ ERROR no method named `example`
//~^ NOTE use `(demo.example)(...)`
// (demo.example)(1);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录