Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e6b07849
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,发现更多精彩内容 >>
提交
e6b07849
编写于
9月 09, 2014
作者:
A
Alex Crichton
浏览文件
操作
浏览文件
下载
差异文件
rollup merge of #17085 : jakub-/issue-17074
上级
b8dd7d50
c98a80e4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
57 addition
and
35 deletion
+57
-35
src/librustc/middle/const_eval.rs
src/librustc/middle/const_eval.rs
+37
-35
src/test/run-pass/issue-17074.rs
src/test/run-pass/issue-17074.rs
+20
-0
未找到文件。
src/librustc/middle/const_eval.rs
浏览文件 @
e6b07849
...
...
@@ -500,42 +500,44 @@ fn fromb(b: bool) -> Result<const_val, String> { Ok(const_int(b as i64)) }
"target type not found for const cast"
)
});
let
base
=
eval_const_expr_partial
(
tcx
,
&**
base
);
match
base
{
Err
(
_
)
=>
base
,
Ok
(
val
)
=>
{
match
ty
::
get
(
ety
)
.sty
{
ty
::
ty_float
(
_
)
=>
{
match
val
{
const_bool
(
b
)
=>
Ok
(
const_float
(
b
as
f64
)),
const_uint
(
u
)
=>
Ok
(
const_float
(
u
as
f64
)),
const_int
(
i
)
=>
Ok
(
const_float
(
i
as
f64
)),
const_float
(
f
)
=>
Ok
(
const_float
(
f
)),
_
=>
Err
(
"can't cast this type to float"
.to_string
()),
}
macro_rules!
define_casts
(
(
$val:ident
,
{
$
(
$ty_pat:pat
=>
(
$intermediate_ty:ty
,
$const_type:ident
,
$target_ty:ty
)),
*
})
=>
(
match
ty
::
get
(
ety
)
.sty
{
$
(
$ty_pat
=>
{
match
$val
{
const_bool
(
b
)
=>
Ok
(
$const_type
(
b
as
$intermediate_ty
as
$target_ty
)),
const_uint
(
u
)
=>
Ok
(
$const_type
(
u
as
$intermediate_ty
as
$target_ty
)),
const_int
(
i
)
=>
Ok
(
$const_type
(
i
as
$intermediate_ty
as
$target_ty
)),
const_float
(
f
)
=>
Ok
(
$const_type
(
f
as
$intermediate_ty
as
$target_ty
)),
_
=>
Err
(
concat!
(
"can't cast this type to "
,
stringify!
(
$const_type
)
)
.to_string
())
}
ty
::
ty_uint
(
_
)
=>
{
match
val
{
const_bool
(
b
)
=>
Ok
(
const_uint
(
b
as
u64
)),
const_uint
(
u
)
=>
Ok
(
const_uint
(
u
)),
const_int
(
i
)
=>
Ok
(
const_uint
(
i
as
u64
)),
const_float
(
f
)
=>
Ok
(
const_uint
(
f
as
u64
)),
_
=>
Err
(
"can't cast this type to uint"
.to_string
()),
}
}
ty
::
ty_int
(
_
)
=>
{
match
val
{
const_bool
(
b
)
=>
Ok
(
const_int
(
b
as
i64
)),
const_uint
(
u
)
=>
Ok
(
const_int
(
u
as
i64
)),
const_int
(
i
)
=>
Ok
(
const_int
(
i
)),
const_float
(
f
)
=>
Ok
(
const_int
(
f
as
i64
)),
_
=>
Err
(
"can't cast this type to int"
.to_string
()),
}
}
_
=>
Err
(
"can't cast this type"
.to_string
())
}
}
}
},)
*
_
=>
Err
(
"can't cast this type"
.to_string
())
})
)
eval_const_expr_partial
(
tcx
,
&**
base
)
.and_then
(|
val
|
define_casts!
(
val
,
{
ty
::
ty_int
(
ast
::
TyI
)
=>
(
int
,
const_int
,
i64
),
ty
::
ty_int
(
ast
::
TyI8
)
=>
(
i8
,
const_int
,
i64
),
ty
::
ty_int
(
ast
::
TyI16
)
=>
(
i16
,
const_int
,
i64
),
ty
::
ty_int
(
ast
::
TyI32
)
=>
(
i32
,
const_int
,
i64
),
ty
::
ty_int
(
ast
::
TyI64
)
=>
(
i64
,
const_int
,
i64
),
ty
::
ty_uint
(
ast
::
TyU
)
=>
(
uint
,
const_uint
,
u64
),
ty
::
ty_uint
(
ast
::
TyU8
)
=>
(
u8
,
const_uint
,
u64
),
ty
::
ty_uint
(
ast
::
TyU16
)
=>
(
u16
,
const_uint
,
u64
),
ty
::
ty_uint
(
ast
::
TyU32
)
=>
(
u32
,
const_uint
,
u64
),
ty
::
ty_uint
(
ast
::
TyU64
)
=>
(
u64
,
const_uint
,
u64
),
ty
::
ty_float
(
ast
::
TyF32
)
=>
(
f32
,
const_float
,
f64
),
ty
::
ty_float
(
ast
::
TyF64
)
=>
(
f64
,
const_float
,
f64
)
}))
}
ExprPath
(
_
)
=>
{
match
lookup_const
(
tcx
,
e
)
{
...
...
src/test/run-pass/issue-17074.rs
0 → 100644
浏览文件 @
e6b07849
// Copyright 2014 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.
static
X
:
u64
=
-
1
as
u16
as
u64
;
static
Y
:
u64
=
-
1
as
u32
as
u64
;
fn
main
()
{
assert_eq!
(
match
1
{
X
=>
unreachable!
(),
Y
=>
unreachable!
(),
_
=>
1
i
},
1
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录