Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
f8827f52
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,发现更多精彩内容 >>
提交
f8827f52
编写于
11月 20, 2015
作者:
B
bors
浏览文件
操作
浏览文件
下载
差异文件
Auto merge of #29534 - oli-obk:fix/const_fn_eval, r=dotdash
上级
2228bacd
b9eaceeb
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
38 addition
and
15 deletion
+38
-15
src/librustc/middle/const_eval.rs
src/librustc/middle/const_eval.rs
+14
-15
src/test/compile-fail/const-call.rs
src/test/compile-fail/const-call.rs
+24
-0
未找到文件。
src/librustc/middle/const_eval.rs
浏览文件 @
f8827f52
...
...
@@ -1055,8 +1055,6 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>,
};
let
(
decl
,
unsafety
,
abi
,
block
,
constness
,
)
=
match
try!
(
eval_const_expr_partial
(
tcx
,
callee
,
sub_ty_hint
,
fn_args
))
{
...
...
@@ -1065,12 +1063,12 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>,
Some
(
ast_map
::
NodeItem
(
it
))
=>
match
it
.node
{
hir
::
ItemFn
(
ref
decl
,
unsafety
,
hir
::
Unsafety
::
Normal
,
constness
,
abi
,
abi
::
Abi
::
Rust
,
_
,
// ducktype generics? types are funky in const_eval
ref
block
,
)
=>
(
decl
,
unsafety
,
abi
,
block
,
constness
),
)
=>
(
decl
,
block
,
constness
),
_
=>
signal!
(
e
,
NonConstPath
),
},
_
=>
signal!
(
e
,
NonConstPath
),
...
...
@@ -1080,18 +1078,19 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>,
},
_
=>
signal!
(
e
,
NonConstPath
),
};
if
let
ExprTypeChecked
=
ty_hint
{
match
(
ty_hint
,
constness
)
{
(
ExprTypeChecked
,
_
)
=>
{
// no need to check for constness... either check_const
// already forbids this or we const eval over whatever
// we want
}
else
{
},
(
_
,
hir
::
Constness
::
Const
)
=>
{
// we don't know much about the function, so we force it to be a const fn
// so compilation will fail later in case the const fn's body is not const
assert_eq!
(
constness
,
hir
::
Constness
::
Const
)
},
_
=>
signal!
(
e
,
NonConstPath
),
}
assert_eq!
(
decl
.inputs
.len
(),
args
.len
());
assert_eq!
(
unsafety
,
hir
::
Unsafety
::
Normal
);
assert_eq!
(
abi
,
abi
::
Abi
::
Rust
);
let
mut
call_args
=
NodeMap
();
for
(
arg
,
arg_expr
)
in
decl
.inputs
.iter
()
.zip
(
args
.iter
())
{
...
...
src/test/compile-fail/const-call.rs
0 → 100644
浏览文件 @
f8827f52
// 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 <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.
#![feature(const_fn)]
const
unsafe
fn
g
(
x
:
usize
)
->
usize
{
x
}
fn
f
(
x
:
usize
)
->
usize
{
x
}
fn
main
()
{
let
_
=
[
0
;
f
(
2
)];
//~ ERROR: non-constant path in constant expression [E0307]
let
_
=
[
0
;
g
(
2
)];
//~ ERROR: non-constant path in constant expression [E0307]
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录