Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
0be80f29
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,发现更多精彩内容 >>
提交
0be80f29
编写于
11月 28, 2019
作者:
W
Wesley Wiser
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[const-prop] Fix ICE calculating enum discriminant
Fixes #66787
上级
4007d4ef
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
10 deletion
+52
-10
src/librustc_mir/interpret/place.rs
src/librustc_mir/interpret/place.rs
+13
-10
src/test/ui/consts/issue-66787.rs
src/test/ui/consts/issue-66787.rs
+39
-0
未找到文件。
src/librustc_mir/interpret/place.rs
浏览文件 @
0be80f29
...
...
@@ -1038,13 +1038,16 @@ pub fn write_discriminant_index(
variant_index
:
VariantIdx
,
dest
:
PlaceTy
<
'tcx
,
M
::
PointerTag
>
,
)
->
InterpResult
<
'tcx
>
{
let
variant_scalar
=
Scalar
::
from_u32
(
variant_index
.as_u32
())
.into
();
// Layout computation excludes uninhabited variants from consideration
// therefore there's no way to represent those variants in the given layout.
if
dest
.layout
.for_variant
(
self
,
variant_index
)
.abi
.is_uninhabited
()
{
throw_ub!
(
Unreachable
);
}
match
dest
.layout.variants
{
layout
::
Variants
::
Single
{
index
}
=>
{
if
index
!=
variant_index
{
throw_ub!
(
InvalidDiscriminant
(
variant_scalar
));
}
assert_eq!
(
index
,
variant_index
);
}
layout
::
Variants
::
Multiple
{
discr_kind
:
layout
::
DiscriminantKind
::
Tag
,
...
...
@@ -1052,9 +1055,9 @@ pub fn write_discriminant_index(
discr_index
,
..
}
=>
{
if
!
dest
.layout.ty
.variant_range
(
*
self
.tcx
)
.unwrap
()
.contains
(
&
variant_index
)
{
throw_ub!
(
InvalidDiscriminant
(
variant_scalar
));
}
// No need to validate that the discriminant here because the
// `TyLayout::for_variant()` call earlier already checks the variant is valid.
let
discr_val
=
dest
.layout.ty
.discriminant_for_variant
(
*
self
.tcx
,
variant_index
)
.unwrap
()
.val
;
...
...
@@ -1077,9 +1080,9 @@ pub fn write_discriminant_index(
discr_index
,
..
}
=>
{
if
!
variant_index
.as_usize
()
<
dest
.layout.ty
.ty_adt_def
()
.unwrap
()
.variants
.len
()
{
throw_ub!
(
InvalidDiscriminant
(
variant_scalar
));
}
// No need to validate that the discriminant here because the
// `TyLayout::for_variant()` call earlier already checks the variant is valid.
if
variant_index
!=
dataful_variant
{
let
variants_start
=
niche_variants
.start
()
.as_u32
();
let
variant_index_relative
=
variant_index
.as_u32
()
...
...
src/test/ui/consts/issue-66787.rs
0 → 100644
浏览文件 @
0be80f29
// build-pass
// compile-flags: --crate-type lib
// Regression test for ICE which occurred when const propagating an enum with three variants
// one of which is uninhabited.
pub
enum
ApiError
{}
#[allow(dead_code)]
pub
struct
TokioError
{
b
:
bool
,
}
pub
enum
Error
{
Api
{
source
:
ApiError
,
},
Ethereum
,
Tokio
{
source
:
TokioError
,
},
}
struct
Api
;
impl
IntoError
<
Error
>
for
Api
{
type
Source
=
ApiError
;
fn
into_error
(
self
,
error
:
Self
::
Source
)
->
Error
{
Error
::
Api
{
source
:
(|
v
|
v
)(
error
),
}
}
}
pub
trait
IntoError
<
E
>
{
/// The underlying error
type
Source
;
/// Combine the information to produce the error
fn
into_error
(
self
,
source
:
Self
::
Source
)
->
E
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录