Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
91da1a5c
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,发现更多精彩内容 >>
提交
91da1a5c
编写于
10月 08, 2018
作者:
S
scalexm
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Write an initial version of the `program_clauses` callback
上级
74ff7dcb
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
214 addition
and
25 deletion
+214
-25
src/librustc_traits/chalk_context.rs
src/librustc_traits/chalk_context.rs
+207
-21
src/librustc_traits/lowering/environment.rs
src/librustc_traits/lowering/environment.rs
+6
-3
src/librustc_traits/lowering/mod.rs
src/librustc_traits/lowering/mod.rs
+1
-1
未找到文件。
src/librustc_traits/chalk_context.rs
浏览文件 @
91da1a5c
...
...
@@ -23,6 +23,7 @@
Goal
,
GoalKind
,
Clause
,
ProgramClauseCategory
,
QuantifierKind
,
Environment
,
InEnvironment
,
...
...
@@ -30,6 +31,7 @@
use
rustc
::
ty
::
fold
::{
TypeFoldable
,
TypeFolder
,
TypeVisitor
};
use
rustc
::
ty
::
subst
::
Kind
;
use
rustc
::
ty
::{
self
,
TyCtxt
};
use
rustc
::
hir
::
def_id
::
DefId
;
use
std
::
fmt
::{
self
,
Debug
};
use
std
::
marker
::
PhantomData
;
...
...
@@ -330,46 +332,230 @@ impl context::UnificationOps<ChalkArenas<'gcx>, ChalkArenas<'tcx>>
{
fn
program_clauses
(
&
self
,
_
environment
:
&
Environment
<
'tcx
>
,
environment
:
&
Environment
<
'tcx
>
,
goal
:
&
DomainGoal
<
'tcx
>
,
)
->
Vec
<
Clause
<
'tcx
>>
{
use
rustc
::
traits
::
WhereClause
::
*
;
match
goal
{
DomainGoal
::
Holds
(
Implemented
(
_
trait_predicate
))
=>
{
fn
assemble_clauses_from_impls
<
'tcx
>
(
tcx
:
ty
::
TyCtxt
<
'_
,
'_
,
'tcx
>
,
trait_def_id
:
DefId
,
clauses
:
&
mut
Vec
<
Clause
<
'tcx
>>
)
{
tcx
.for_each_impl
(
trait_def_id
,
|
impl_def_id
|
{
clauses
.extend
(
tcx
.program_clauses_for
(
impl_def_id
)
.into_iter
()
.cloned
()
);
});
}
fn
assemble_clauses_from_assoc_ty_values
<
'tcx
>
(
tcx
:
ty
::
TyCtxt
<
'_
,
'_
,
'tcx
>
,
trait_def_id
:
DefId
,
clauses
:
&
mut
Vec
<
Clause
<
'tcx
>>
)
{
tcx
.for_each_impl
(
trait_def_id
,
|
impl_def_id
|
{
for
def_id
in
tcx
.associated_item_def_ids
(
impl_def_id
)
.iter
()
{
clauses
.extend
(
tcx
.program_clauses_for
(
*
def_id
)
.into_iter
()
.cloned
()
);
}
});
}
let
mut
clauses
=
match
goal
{
DomainGoal
::
Holds
(
Implemented
(
trait_predicate
))
=>
{
// These come from:
// * implementations of the trait itself (rule `Implemented-From-Impl`)
// * the trait decl (rule `Implemented-From-Env`)
let
mut
clauses
=
vec!
[];
assemble_clauses_from_impls
(
self
.infcx.tcx
,
trait_predicate
.def_id
(),
&
mut
clauses
);
// FIXME: we need to add special rules for builtin impls:
// * `Copy` / `Clone`
// * `Sized`
// * `Unsize`
// * `Generator`
// * `FnOnce` / `FnMut` / `Fn`
// * trait objects
// * auto traits
// Rule `Implemented-From-Env` will be computed from the environment.
clauses
}
DomainGoal
::
Holds
(
ProjectionEq
(
projection_predicate
))
=>
{
// These come from:
// * the assoc type definition (rule `ProjectionEq-Placeholder`)
// * normalization of the assoc ty values (rule `ProjectionEq-Normalize`)
// * implied bounds from trait definitions (rule `Implied-Bound-From-Trait`)
// * implied bounds from type definitions (rule `Implied-Bound-From-Type`)
let
clauses
=
self
.infcx.tcx
.program_clauses_for
(
projection_predicate
.projection_ty.item_def_id
)
.into_iter
()
// only select `ProjectionEq-Placeholder` and `ProjectionEq-Normalize`
.filter
(|
clause
|
clause
.category
()
==
ProgramClauseCategory
::
Other
)
.cloned
()
.collect
::
<
Vec
<
_
>>
();
// Rules `Implied-Bound-From-Trait` and `Implied-Bound-From-Type` will be computed
// from the environment.
clauses
}
DomainGoal
::
Holds
(
RegionOutlives
(
..
))
=>
{
// These come from:
//
// - Trait definitions (implied bounds)
// - Implementations of the trait itself
panic!
()
// * implied bounds from trait definitions (rule `Implied-Bound-From-Trait`)
// * implied bounds from type definitions (rule `Implied-Bound-From-Type`)
// All of these rules are computed in the environment.
vec!
[]
}
DomainGoal
::
Holds
(
ProjectionEq
(
_
projection_predicate
))
=>
{
DomainGoal
::
Holds
(
TypeOutlives
(
..
))
=>
{
// These come from:
panic!
()
// * implied bounds from trait definitions (rule `Implied-Bound-From-Trait`)
// * implied bounds from type definitions (rule `Implied-Bound-From-Type`)
// All of these rules are computed in the environment.
vec!
[]
}
DomainGoal
::
Holds
(
RegionOutlives
(
_
region_outlives
))
=>
{
panic!
()
DomainGoal
::
WellFormed
(
WellFormed
::
Trait
(
trait_predicate
))
=>
{
// These come from -- the trait decl (rule `WellFormed-TraitRef`).
self
.infcx.tcx
.program_clauses_for
(
trait_predicate
.def_id
())
.into_iter
()
// only select `WellFormed-TraitRef`
.filter
(|
clause
|
clause
.category
()
==
ProgramClauseCategory
::
WellFormed
)
.cloned
()
.collect
()
}
DomainGoal
::
Holds
(
TypeOutlives
(
_
type_outlives
))
=>
{
panic!
()
DomainGoal
::
WellFormed
(
WellFormed
::
Ty
(
ty
))
=>
{
// These come from:
// * the associated type definition if `ty` refers to an unnormalized
// associated type (rule `WellFormed-AssocTy`)
// * custom rules for built-in types
// * the type definition otherwise (rule `WellFormed-Type`)
let
clauses
=
match
ty
.sty
{
ty
::
Projection
(
data
)
=>
{
self
.infcx.tcx
.program_clauses_for
(
data
.item_def_id
)
}
// These types are always WF (recall that we do not check
// for parameters to be WF)
ty
::
Bool
|
ty
::
Char
|
ty
::
Int
(
..
)
|
ty
::
Uint
(
..
)
|
ty
::
Float
(
..
)
|
ty
::
Str
|
ty
::
RawPtr
(
..
)
|
ty
::
FnPtr
(
..
)
|
ty
::
Param
(
..
)
|
ty
::
Never
=>
{
ty
::
List
::
empty
()
}
// WF if inner type is `Sized`
ty
::
Slice
(
..
)
|
ty
::
Array
(
..
)
=>
{
ty
::
List
::
empty
()
}
ty
::
Tuple
(
..
)
=>
{
ty
::
List
::
empty
()
}
// WF if `sub_ty` outlives `region`
ty
::
Ref
(
..
)
=>
{
ty
::
List
::
empty
()
}
ty
::
Dynamic
(
..
)
=>
{
// FIXME: no rules yet for trait objects
ty
::
List
::
empty
()
}
ty
::
Adt
(
def
,
..
)
=>
{
self
.infcx.tcx
.program_clauses_for
(
def
.did
)
}
ty
::
Foreign
(
def_id
)
|
ty
::
FnDef
(
def_id
,
..
)
|
ty
::
Closure
(
def_id
,
..
)
|
ty
::
Generator
(
def_id
,
..
)
|
ty
::
Opaque
(
def_id
,
..
)
=>
{
self
.infcx.tcx
.program_clauses_for
(
def_id
)
}
ty
::
GeneratorWitness
(
..
)
|
ty
::
UnnormalizedProjection
(
..
)
|
ty
::
Infer
(
..
)
|
ty
::
Error
=>
{
bug!
(
"unexpected type {:?}"
,
ty
)
}
};
clauses
.into_iter
()
.filter
(|
clause
|
clause
.category
()
==
ProgramClauseCategory
::
WellFormed
)
.cloned
()
.collect
()
}
DomainGoal
::
WellFormed
(
WellFormed
::
Trait
(
_
trait_predicate
))
=>
{
// These come from -- the trait decl.
panic!
()
DomainGoal
::
FromEnv
(
FromEnv
::
Trait
(
..
))
=>
{
// These come from:
// * implied bounds from trait definitions (rule `Implied-Bound-From-Trait`)
// * implied bounds from type definitions (rule `Implied-Bound-From-Type`)
// * implied bounds from assoc type defs (rules `Implied-Trait-From-AssocTy`,
// `Implied-Bound-From-AssocTy` and `Implied-WC-From-AssocTy`)
// All of these rules are computed in the environment.
vec!
[]
}
DomainGoal
::
WellFormed
(
WellFormed
::
Ty
(
_
ty
))
=>
panic!
(),
DomainGoal
::
FromEnv
(
FromEnv
::
Ty
(
..
))
=>
{
// There are no `FromEnv::Ty(..) :- ...` rules (this predicate only
// comes from the environment).
vec!
[]
}
DomainGoal
::
FromEnv
(
FromEnv
::
Trait
(
_
trait_predicate
))
=>
panic!
(),
DomainGoal
::
Normalize
(
projection_predicate
)
=>
{
// These come from -- assoc ty values (rule `Normalize-From-Impl`).
let
mut
clauses
=
vec!
[];
DomainGoal
::
FromEnv
(
FromEnv
::
Ty
(
_
ty
))
=>
panic!
(),
assemble_clauses_from_assoc_ty_values
(
self
.infcx.tcx
,
projection_predicate
.projection_ty
.trait_ref
(
self
.infcx.tcx
)
.def_id
,
&
mut
clauses
);
DomainGoal
::
Normalize
(
_
)
=>
panic!
(),
}
clauses
}
};
let
environment
=
self
.infcx.tcx
.lift_to_global
(
environment
)
.expect
(
"environment is not global"
);
clauses
.extend
(
self
.infcx.tcx
.program_clauses_for_env
(
environment
)
.into_iter
()
.cloned
()
);
clauses
}
fn
instantiate_binders_universally
(
...
...
src/librustc_traits/lowering/environment.rs
浏览文件 @
91da1a5c
...
...
@@ -86,13 +86,16 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) {
ty
::
Slice
(
..
)
|
ty
::
RawPtr
(
..
)
|
ty
::
FnPtr
(
..
)
|
ty
::
Never
|
ty
::
Tuple
(
..
)
|
ty
::
Never
|
ty
::
Param
(
..
)
=>
(),
ty
::
GeneratorWitness
(
..
)
|
ty
::
UnnormalizedProjection
(
..
)
|
ty
::
Param
(
..
)
|
ty
::
Infer
(
..
)
|
ty
::
Error
=>
(),
ty
::
Error
=>
{
bug!
(
"unexpected type {:?}"
,
ty
);
}
}
}
...
...
src/librustc_traits/lowering/mod.rs
浏览文件 @
91da1a5c
...
...
@@ -433,7 +433,7 @@ pub fn program_clauses_for_associated_type_def<'a, 'tcx>(
let
wf_clause
=
ProgramClause
{
goal
:
DomainGoal
::
WellFormed
(
WellFormed
::
Ty
(
placeholder_ty
)),
hypotheses
:
tcx
.mk_goals
(
iter
::
once
(
hypothesis
)),
category
:
ProgramClauseCategory
::
Other
,
category
:
ProgramClauseCategory
::
WellFormed
,
};
// Rule Implied-Trait-From-AssocTy
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录