Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
9cc8453a
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,发现更多精彩内容 >>
提交
9cc8453a
编写于
11月 25, 2014
作者:
N
Niko Matsakis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Adjust feature gates to allow for parenthetical notation to be used
with the fn traits
上级
698db04a
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
59 addition
and
47 deletion
+59
-47
src/librustc/diagnostics.rs
src/librustc/diagnostics.rs
+2
-1
src/librustc/middle/lang_items.rs
src/librustc/middle/lang_items.rs
+16
-0
src/librustc_typeck/astconv.rs
src/librustc_typeck/astconv.rs
+14
-1
src/librustc_typeck/check/closure.rs
src/librustc_typeck/check/closure.rs
+25
-32
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/mod.rs
+2
-0
src/libsyntax/feature_gate.rs
src/libsyntax/feature_gate.rs
+0
-13
未找到文件。
src/librustc/diagnostics.rs
浏览文件 @
9cc8453a
...
...
@@ -67,5 +67,6 @@
E0173
,
E0174
,
E0177
,
E0178
E0178
,
E0179
// parenthesized params may only be used with a trait
)
src/librustc/middle/lang_items.rs
浏览文件 @
9cc8453a
...
...
@@ -114,6 +114,22 @@ pub fn to_builtin_kind(&self, id: ast::DefId) -> Option<ty::BuiltinBound> {
}
}
pub
fn
fn_trait_kind
(
&
self
,
id
:
ast
::
DefId
)
->
Option
<
ty
::
UnboxedClosureKind
>
{
let
def_id_kinds
=
[
(
self
.fn_trait
(),
ty
::
FnUnboxedClosureKind
),
(
self
.fn_mut_trait
(),
ty
::
FnMutUnboxedClosureKind
),
(
self
.fn_once_trait
(),
ty
::
FnOnceUnboxedClosureKind
),
];
for
&
(
opt_def_id
,
kind
)
in
def_id_kinds
.iter
()
{
if
Some
(
id
)
==
opt_def_id
{
return
Some
(
kind
);
}
}
None
}
$
(
#[allow(dead_code)]
pub
fn
$method
(
&
self
)
->
Option
<
ast
::
DefId
>
{
...
...
src/librustc_typeck/astconv.rs
浏览文件 @
9cc8453a
...
...
@@ -235,7 +235,7 @@ fn ast_path_substs_for_ty<'tcx,AC,RS>(
convert_angle_bracketed_parameters
(
this
,
rscope
,
data
)
}
ast
::
ParenthesizedParameters
(
ref
data
)
=>
{
span_err!
(
tcx
.sess
,
path
.span
,
E01
69
,
span_err!
(
tcx
.sess
,
path
.span
,
E01
73
,
"parenthesized parameters may only be used with a trait"
);
(
Vec
::
new
(),
convert_parenthesized_parameters
(
this
,
data
),
Vec
::
new
())
}
...
...
@@ -581,6 +581,19 @@ fn ast_path_to_trait_ref<'tcx,AC,RS>(
convert_angle_bracketed_parameters
(
this
,
&
shifted_rscope
,
data
)
}
ast
::
ParenthesizedParameters
(
ref
data
)
=>
{
// For now, require that parenthetical notation be used
// only with `Fn()` etc.
if
!
this
.tcx
()
.sess.features
.borrow
()
.unboxed_closures
&&
this
.tcx
()
.lang_items
.fn_trait_kind
(
trait_def_id
)
.is_none
()
{
this
.tcx
()
.sess
.span_err
(
path
.span
,
"parenthetical notation is only stable when
\
used with the `Fn` family of traits"
);
span_help!
(
this
.tcx
()
.sess
,
path
.span
,
"add `#![feature(unboxed_closures)]` to
\
the crate attributes to enable"
);
}
(
Vec
::
new
(),
convert_parenthesized_parameters
(
this
,
data
),
Vec
::
new
())
}
};
...
...
src/librustc_typeck/check/closure.rs
浏览文件 @
9cc8453a
...
...
@@ -188,42 +188,35 @@ fn deduce_unboxed_closure_expectations_from_trait_ref<'a,'tcx>(
debug!
(
"deduce_unboxed_closure_expectations_from_object_type({})"
,
trait_ref
.repr
(
tcx
));
let
def_id_kinds
=
[
(
tcx
.lang_items
.fn_trait
(),
ty
::
FnUnboxedClosureKind
),
(
tcx
.lang_items
.fn_mut_trait
(),
ty
::
FnMutUnboxedClosureKind
),
(
tcx
.lang_items
.fn_once_trait
(),
ty
::
FnOnceUnboxedClosureKind
),
];
for
&
(
def_id
,
kind
)
in
def_id_kinds
.iter
()
{
if
Some
(
trait_ref
.def_id
)
==
def_id
{
debug!
(
"found object type {}"
,
kind
);
let
arg_param_ty
=
*
trait_ref
.substs.types
.get
(
subst
::
TypeSpace
,
0
);
let
arg_param_ty
=
fcx
.infcx
()
.resolve_type_vars_if_possible
(
arg_param_ty
);
debug!
(
"arg_param_ty {}"
,
arg_param_ty
.repr
(
tcx
));
let
input_tys
=
match
arg_param_ty
.sty
{
ty
::
ty_tup
(
ref
tys
)
=>
{
(
*
tys
)
.clone
()
}
_
=>
{
continue
;
}
};
debug!
(
"input_tys {}"
,
input_tys
.repr
(
tcx
));
let
kind
=
match
tcx
.lang_items
.fn_trait_kind
(
trait_ref
.def_id
)
{
Some
(
k
)
=>
k
,
None
=>
{
return
None
;
}
};
let
ret_param_ty
=
*
trait_ref
.substs.types
.get
(
subst
::
TypeSpace
,
1
);
let
ret_param_ty
=
fcx
.infcx
()
.resolve_type_vars_if_possible
(
ret_param_ty
);
debug!
(
"ret_param_ty {}"
,
ret_param_ty
.repr
(
tcx
));
debug!
(
"found object type {}"
,
kind
);
let
fn_sig
=
ty
::
FnSig
{
inputs
:
input_tys
,
output
:
ty
::
FnConverging
(
ret_param_ty
),
variadic
:
false
};
debug!
(
"fn_sig {}"
,
fn_sig
.repr
(
tcx
));
let
arg_param_ty
=
*
trait_ref
.substs.types
.get
(
subst
::
TypeSpace
,
0
);
let
arg_param_ty
=
fcx
.infcx
()
.resolve_type_vars_if_possible
(
arg_param_ty
);
debug!
(
"arg_param_ty {}"
,
arg_param_ty
.repr
(
tcx
));
return
Some
((
fn_sig
,
kind
));
}
}
let
input_tys
=
match
arg_param_ty
.sty
{
ty
::
ty_tup
(
ref
tys
)
=>
{
(
*
tys
)
.clone
()
}
_
=>
{
return
None
;
}
};
debug!
(
"input_tys {}"
,
input_tys
.repr
(
tcx
));
None
let
ret_param_ty
=
*
trait_ref
.substs.types
.get
(
subst
::
TypeSpace
,
1
);
let
ret_param_ty
=
fcx
.infcx
()
.resolve_type_vars_if_possible
(
ret_param_ty
);
debug!
(
"ret_param_ty {}"
,
ret_param_ty
.repr
(
tcx
));
let
fn_sig
=
ty
::
FnSig
{
inputs
:
input_tys
,
output
:
ty
::
FnConverging
(
ret_param_ty
),
variadic
:
false
};
debug!
(
"fn_sig {}"
,
fn_sig
.repr
(
tcx
));
return
Some
((
fn_sig
,
kind
));
}
fn
deduce_unboxed_closure_expectations_from_obligations
<
'a
,
'tcx
>
(
...
...
src/librustc_typeck/check/mod.rs
浏览文件 @
9cc8453a
...
...
@@ -5159,6 +5159,8 @@ fn push_explicit_parameters_from_segment_to_substs<'a, 'tcx>(
}
ast
::
ParenthesizedParameters
(
ref
data
)
=>
{
span_err!
(
fcx
.tcx
()
.sess
,
span
,
E0173
,
"parenthesized parameters may only be used with a trait"
);
push_explicit_parenthesized_parameters_from_segment_to_substs
(
fcx
,
space
,
span
,
type_defs
,
data
,
substs
);
}
...
...
src/libsyntax/feature_gate.rs
浏览文件 @
9cc8453a
...
...
@@ -374,19 +374,6 @@ fn visit_fn(&mut self,
}
visit
::
walk_fn
(
self
,
fn_kind
,
fn_decl
,
block
,
span
);
}
fn
visit_path_parameters
(
&
mut
self
,
path_span
:
Span
,
parameters
:
&
'v
ast
::
PathParameters
)
{
match
*
parameters
{
ast
::
ParenthesizedParameters
(
..
)
=>
{
self
.gate_feature
(
"unboxed_closures"
,
path_span
,
"parenthetical parameter notation is subject to change"
);
}
ast
::
AngleBracketedParameters
(
..
)
=>
{
}
}
visit
::
walk_path_parameters
(
self
,
path_span
,
parameters
)
}
}
pub
fn
check_crate
(
span_handler
:
&
SpanHandler
,
krate
:
&
ast
::
Crate
)
->
(
Features
,
Vec
<
Span
>
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录