Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
3bb2ff05
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
3bb2ff05
编写于
12月 03, 2017
作者:
L
leonardo.yvens
提交者:
Vadim Petrochenkov
1月 13, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move coherence/overlap.rs into coherence/mod.rs
`fn check_impl` was feeling lonely with a file all for itself.
上级
edd52b19
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
45 addition
and
60 deletion
+45
-60
src/librustc_typeck/coherence/mod.rs
src/librustc_typeck/coherence/mod.rs
+45
-2
src/librustc_typeck/coherence/overlap.rs
src/librustc_typeck/coherence/overlap.rs
+0
-58
未找到文件。
src/librustc_typeck/coherence/mod.rs
浏览文件 @
3bb2ff05
...
...
@@ -16,6 +16,7 @@
// mappings. That mapping code resides here.
use
hir
::
def_id
::{
DefId
,
LOCAL_CRATE
};
use
rustc
::
traits
;
use
rustc
::
ty
::{
self
,
TyCtxt
,
TypeFoldable
};
use
rustc
::
ty
::
maps
::
Providers
;
...
...
@@ -25,7 +26,6 @@
mod
inherent_impls
;
mod
inherent_impls_overlap
;
mod
orphan
;
mod
overlap
;
mod
unsafety
;
fn
check_impl
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
node_id
:
ast
::
NodeId
)
{
...
...
@@ -119,7 +119,7 @@ fn coherent_trait<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) {
check_impl
(
tcx
,
impl_id
);
}
for
&
impl_id
in
impls
{
overlap
::
check_impl
(
tcx
,
impl_id
);
check_impl_overlap
(
tcx
,
impl_id
);
}
builtin
::
check_trait
(
tcx
,
def_id
);
}
...
...
@@ -136,3 +136,46 @@ pub fn check_coherence<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
ty
::
maps
::
queries
::
crate_inherent_impls
::
ensure
(
tcx
,
LOCAL_CRATE
);
ty
::
maps
::
queries
::
crate_inherent_impls_overlap_check
::
ensure
(
tcx
,
LOCAL_CRATE
);
}
/// Overlap: No two impls for the same trait are implemented for the
/// same type. Likewise, no two inherent impls for a given type
/// constructor provide a method with the same name.
fn
check_impl_overlap
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
node_id
:
ast
::
NodeId
)
{
let
impl_def_id
=
tcx
.hir
.local_def_id
(
node_id
);
let
trait_ref
=
tcx
.impl_trait_ref
(
impl_def_id
)
.unwrap
();
let
trait_def_id
=
trait_ref
.def_id
;
if
trait_ref
.references_error
()
{
debug!
(
"coherence: skipping impl {:?} with error {:?}"
,
impl_def_id
,
trait_ref
);
return
}
// Trigger building the specialization graph for the trait of this impl.
// This will detect any overlap errors.
tcx
.specialization_graph_of
(
trait_def_id
);
// check for overlap with the automatic `impl Trait for Trait`
if
let
ty
::
TyDynamic
(
ref
data
,
..
)
=
trait_ref
.self_ty
()
.sty
{
// This is something like impl Trait1 for Trait2. Illegal
// if Trait1 is a supertrait of Trait2 or Trait2 is not object safe.
if
data
.principal
()
.map_or
(
true
,
|
p
|
!
tcx
.is_object_safe
(
p
.def_id
()))
{
// This is an error, but it will be reported by wfcheck. Ignore it here.
// This is tested by `coherence-impl-trait-for-trait-object-safe.rs`.
}
else
{
let
mut
supertrait_def_ids
=
traits
::
supertrait_def_ids
(
tcx
,
data
.principal
()
.unwrap
()
.def_id
());
if
supertrait_def_ids
.any
(|
d
|
d
==
trait_def_id
)
{
span_err!
(
tcx
.sess
,
tcx
.span_of_impl
(
impl_def_id
)
.unwrap
(),
E0371
,
"the object type `{}` automatically
\
implements the trait `{}`"
,
trait_ref
.self_ty
(),
tcx
.item_path_str
(
trait_def_id
));
}
}
}
}
src/librustc_typeck/coherence/overlap.rs
已删除
100644 → 0
浏览文件 @
edd52b19
// 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.
//! Overlap: No two impls for the same trait are implemented for the
//! same type. Likewise, no two inherent impls for a given type
//! constructor provide a method with the same name.
use
rustc
::
traits
;
use
rustc
::
ty
::{
self
,
TyCtxt
,
TypeFoldable
};
use
syntax
::
ast
;
pub
fn
check_impl
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
node_id
:
ast
::
NodeId
)
{
let
impl_def_id
=
tcx
.hir
.local_def_id
(
node_id
);
let
trait_ref
=
tcx
.impl_trait_ref
(
impl_def_id
)
.unwrap
();
let
trait_def_id
=
trait_ref
.def_id
;
if
trait_ref
.references_error
()
{
debug!
(
"coherence: skipping impl {:?} with error {:?}"
,
impl_def_id
,
trait_ref
);
return
}
// Trigger building the specialization graph for the trait of this impl.
// This will detect any overlap errors.
tcx
.specialization_graph_of
(
trait_def_id
);
// check for overlap with the automatic `impl Trait for Trait`
if
let
ty
::
TyDynamic
(
ref
data
,
..
)
=
trait_ref
.self_ty
()
.sty
{
// This is something like impl Trait1 for Trait2. Illegal
// if Trait1 is a supertrait of Trait2 or Trait2 is not object safe.
if
data
.principal
()
.map_or
(
true
,
|
p
|
!
tcx
.is_object_safe
(
p
.def_id
()))
{
// This is an error, but it will be reported by wfcheck. Ignore it here.
// This is tested by `coherence-impl-trait-for-trait-object-safe.rs`.
}
else
{
let
mut
supertrait_def_ids
=
traits
::
supertrait_def_ids
(
tcx
,
data
.principal
()
.unwrap
()
.def_id
());
if
supertrait_def_ids
.any
(|
d
|
d
==
trait_def_id
)
{
span_err!
(
tcx
.sess
,
tcx
.span_of_impl
(
impl_def_id
)
.unwrap
(),
E0371
,
"the object type `{}` automatically
\
implements the trait `{}`"
,
trait_ref
.self_ty
(),
tcx
.item_path_str
(
trait_def_id
));
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录