Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
68b76a48
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,发现更多精彩内容 >>
提交
68b76a48
编写于
10月 01, 2021
作者:
N
Nadrieril
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Normalize after substituting via `field.ty()`
上级
b7e358ee
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
62 addition
and
27 deletion
+62
-27
compiler/rustc_middle/src/ty/mod.rs
compiler/rustc_middle/src/ty/mod.rs
+2
-2
compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
+3
-1
compiler/rustc_mir_build/src/thir/pattern/usefulness.rs
compiler/rustc_mir_build/src/thir/pattern/usefulness.rs
+1
-2
src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs
...ttern/usefulness/issue-72476-and-89393-associated-type.rs
+56
-0
src/test/ui/pattern/usefulness/issue-72476-associated-type.rs
...test/ui/pattern/usefulness/issue-72476-associated-type.rs
+0
-22
未找到文件。
compiler/rustc_middle/src/ty/mod.rs
浏览文件 @
68b76a48
...
...
@@ -1627,8 +1627,8 @@ pub fn inhibit_union_abi_opt(&self) -> bool {
}
impl
<
'tcx
>
FieldDef
{
/// Returns the type of this field. The
`subst` is typically obtained
/// via the second field of `TyKind::AdtDef`.
/// Returns the type of this field. The
resulting type is not normalized. The `subst` is
///
typically obtained
via the second field of `TyKind::AdtDef`.
pub
fn
ty
(
&
self
,
tcx
:
TyCtxt
<
'tcx
>
,
subst
:
SubstsRef
<
'tcx
>
)
->
Ty
<
'tcx
>
{
tcx
.type_of
(
self
.did
)
.subst
(
tcx
,
subst
)
}
...
...
compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
浏览文件 @
68b76a48
...
...
@@ -1154,6 +1154,8 @@ fn list_variant_nonhidden_fields<'a>(
variant
.fields
.iter
()
.enumerate
()
.filter_map
(
move
|(
i
,
field
)|
{
let
ty
=
field
.ty
(
cx
.tcx
,
substs
);
// `field.ty()` doesn't normalize after substituting.
let
ty
=
cx
.tcx
.normalize_erasing_regions
(
cx
.param_env
,
ty
);
let
is_visible
=
adt
.is_enum
()
||
field
.vis
.is_accessible_from
(
cx
.module
,
cx
.tcx
);
let
is_uninhabited
=
cx
.is_uninhabited
(
ty
);
...
...
@@ -1671,7 +1673,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!
(
f
,
"{}"
,
hi
)
}
IntRange
(
range
)
=>
write!
(
f
,
"{:?}"
,
range
),
// Best-effort, will render e.g. `false` as `0..=0`
Wildcard
|
Missing
{
..
}
|
NonExhaustive
=>
write!
(
f
,
"_
"
),
Wildcard
|
Missing
{
..
}
|
NonExhaustive
=>
write!
(
f
,
"_
: {:?}"
,
self
.ty
),
Or
=>
{
for
pat
in
self
.iter_fields
()
{
write!
(
f
,
"{}{:?}"
,
start_or_continue
(
" | "
),
pat
)
?
;
...
...
compiler/rustc_mir_build/src/thir/pattern/usefulness.rs
浏览文件 @
68b76a48
...
...
@@ -781,8 +781,7 @@ fn is_useful<'p, 'tcx>(
assert
!
(
rows
.iter
()
.all
(|
r
|
r
.len
()
==
v
.len
()));
// FIXME(Nadrieril): Hack to work around type normalization issues (see #72476).
let
ty
=
matrix
.heads
()
.next
()
.map_or
(
v
.head
()
.ty
(),
|
r
|
r
.ty
());
let
ty
=
v
.head
()
.ty
();
let
is_non_exhaustive
=
cx
.is_foreign_non_exhaustive_enum
(
ty
);
let
pcx
=
PatCtxt
{
cx
,
ty
,
span
:
v
.head
()
.span
(),
is_top_level
,
is_non_exhaustive
};
...
...
src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs
0 → 100644
浏览文件 @
68b76a48
// check-pass
// From https://github.com/rust-lang/rust/issues/72476
// and https://github.com/rust-lang/rust/issues/89393
trait
Trait
{
type
Projection
;
}
struct
A
;
impl
Trait
for
A
{
type
Projection
=
bool
;
}
struct
B
;
impl
Trait
for
B
{
type
Projection
=
(
u32
,
u32
);
}
struct
Next
<
T
:
Trait
>
(
T
::
Projection
);
fn
foo1
(
item
:
Next
<
A
>
)
{
match
item
{
Next
(
true
)
=>
{}
Next
(
false
)
=>
{}
}
}
fn
foo2
(
x
:
<
A
as
Trait
>
::
Projection
)
{
match
x
{
true
=>
{}
false
=>
{}
}
}
fn
foo3
(
x
:
Next
<
B
>
)
{
let
Next
((
_
,
_
))
=
x
;
match
x
{
Next
((
_
,
_
))
=>
{}
}
}
fn
foo4
(
x
:
<
B
as
Trait
>
::
Projection
)
{
let
(
_
,
_
)
=
x
;
match
x
{
(
_
,
_
)
=>
{}
}
}
fn
foo5
<
T
:
Trait
>
(
x
:
<
T
as
Trait
>
::
Projection
)
{
match
x
{
_
=>
{}
}
}
fn
main
()
{}
src/test/ui/pattern/usefulness/issue-72476-associated-type.rs
已删除
100644 → 0
浏览文件 @
b7e358ee
// check-pass
// From https://github.com/rust-lang/rust/issues/72476
trait
A
{
type
Projection
;
}
impl
A
for
()
{
type
Projection
=
bool
;
}
struct
Next
<
T
:
A
>
(
T
::
Projection
);
fn
f
(
item
:
Next
<
()
>
)
{
match
item
{
Next
(
true
)
=>
{}
Next
(
false
)
=>
{}
}
}
fn
main
()
{}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录