Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
80e1ee5a
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,发现更多精彩内容 >>
未验证
提交
80e1ee5a
编写于
8月 27, 2021
作者:
D
Deadbeef
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add `ty::BoundConstness`
上级
c75aeaac
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
80 addition
and
80 deletion
+80
-80
compiler/rustc_middle/src/traits/mod.rs
compiler/rustc_middle/src/traits/mod.rs
+1
-2
compiler/rustc_middle/src/ty/error.rs
compiler/rustc_middle/src/ty/error.rs
+2
-2
compiler/rustc_middle/src/ty/mod.rs
compiler/rustc_middle/src/ty/mod.rs
+26
-9
compiler/rustc_middle/src/ty/relate.rs
compiler/rustc_middle/src/ty/relate.rs
+4
-4
compiler/rustc_middle/src/ty/structural_impls.rs
compiler/rustc_middle/src/ty/structural_impls.rs
+3
-3
compiler/rustc_middle/src/ty/sty.rs
compiler/rustc_middle/src/ty/sty.rs
+1
-1
compiler/rustc_mir/src/borrow_check/type_check/canonical.rs
compiler/rustc_mir/src/borrow_check/type_check/canonical.rs
+1
-2
compiler/rustc_mir/src/transform/check_consts/check.rs
compiler/rustc_mir/src/transform/check_consts/check.rs
+2
-2
compiler/rustc_trait_selection/src/traits/auto_trait.rs
compiler/rustc_trait_selection/src/traits/auto_trait.rs
+1
-1
compiler/rustc_trait_selection/src/traits/mod.rs
compiler/rustc_trait_selection/src/traits/mod.rs
+1
-1
compiler/rustc_trait_selection/src/traits/select/confirmation.rs
...r/rustc_trait_selection/src/traits/select/confirmation.rs
+2
-3
compiler/rustc_trait_selection/src/traits/select/mod.rs
compiler/rustc_trait_selection/src/traits/select/mod.rs
+19
-17
compiler/rustc_typeck/src/astconv/mod.rs
compiler/rustc_typeck/src/astconv/mod.rs
+7
-10
compiler/rustc_typeck/src/bounds.rs
compiler/rustc_typeck/src/bounds.rs
+1
-2
compiler/rustc_typeck/src/check/fn_ctxt/mod.rs
compiler/rustc_typeck/src/check/fn_ctxt/mod.rs
+0
-4
compiler/rustc_typeck/src/collect.rs
compiler/rustc_typeck/src/collect.rs
+6
-13
compiler/rustc_typeck/src/impl_wf_check/min_specialization.rs
...iler/rustc_typeck/src/impl_wf_check/min_specialization.rs
+2
-3
compiler/rustc_typeck/src/lib.rs
compiler/rustc_typeck/src/lib.rs
+1
-1
未找到文件。
compiler/rustc_middle/src/traits/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -17,7 +17,6 @@
use
rustc_errors
::{
Applicability
,
DiagnosticBuilder
};
use
rustc_hir
as
hir
;
use
rustc_hir
::
def_id
::{
DefId
,
LocalDefId
};
use
rustc_hir
::
Constness
;
use
rustc_span
::
symbol
::
Symbol
;
use
rustc_span
::{
Span
,
DUMMY_SP
};
use
smallvec
::
SmallVec
;
...
...
@@ -497,7 +496,7 @@ pub enum ImplSource<'tcx, N> {
/// for some type parameter. The `Vec<N>` represents the
/// obligations incurred from normalizing the where-clause (if
/// any).
Param
(
Vec
<
N
>
,
Constness
),
Param
(
Vec
<
N
>
,
ty
::
Bound
Constness
),
/// Virtual calls through an object.
Object
(
ImplSourceObjectData
<
'tcx
,
N
>
),
...
...
compiler/rustc_middle/src/ty/error.rs
浏览文件 @
80e1ee5a
...
...
@@ -33,7 +33,7 @@ pub fn new(a_is_expected: bool, a: T, b: T) -> Self {
#[derive(Clone,
Debug,
TypeFoldable)]
pub
enum
TypeError
<
'tcx
>
{
Mismatch
,
ConstnessMismatch
(
ExpectedFound
<
hir
::
Constness
>
),
ConstnessMismatch
(
ExpectedFound
<
ty
::
Bound
Constness
>
),
UnsafetyMismatch
(
ExpectedFound
<
hir
::
Unsafety
>
),
AbiMismatch
(
ExpectedFound
<
abi
::
Abi
>
),
Mutability
,
...
...
@@ -102,7 +102,7 @@ fn report_maybe_different(
CyclicConst
(
_
)
=>
write!
(
f
,
"encountered a self-referencing constant"
),
Mismatch
=>
write!
(
f
,
"types differ"
),
ConstnessMismatch
(
values
)
=>
{
write!
(
f
,
"expected {}
fn, found {} fn
"
,
values
.expected
,
values
.found
)
write!
(
f
,
"expected {}
bound, found {} bound
"
,
values
.expected
,
values
.found
)
}
UnsafetyMismatch
(
values
)
=>
{
write!
(
f
,
"expected {} fn, found {} fn"
,
values
.expected
,
values
.found
)
...
...
compiler/rustc_middle/src/ty/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -37,7 +37,7 @@
use
rustc_hir
as
hir
;
use
rustc_hir
::
def
::{
CtorKind
,
CtorOf
,
DefKind
,
Res
};
use
rustc_hir
::
def_id
::{
CrateNum
,
DefId
,
LocalDefId
,
LocalDefIdMap
,
CRATE_DEF_INDEX
};
use
rustc_hir
::
{
Constness
,
Node
}
;
use
rustc_hir
::
Node
;
use
rustc_macros
::
HashStable
;
use
rustc_span
::
symbol
::{
kw
,
Ident
,
Symbol
};
use
rustc_span
::
Span
;
...
...
@@ -181,6 +181,25 @@ pub enum Visibility {
Invisible
,
}
#[derive(Copy,
Clone,
Debug,
PartialEq,
Eq,
Hash,
HashStable,
TyEncodable,
TyDecodable)]
pub
enum
BoundConstness
{
/// `T: Trait`
NotConst
,
/// `T: ~const Trait`
///
/// Requires resolving to const only when we are in a const context.
ConstIfConst
,
}
impl
fmt
::
Display
for
BoundConstness
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
<
'_
>
)
->
fmt
::
Result
{
match
self
{
Self
::
NotConst
=>
f
.write_str
(
"normal"
),
Self
::
ConstIfConst
=>
f
.write_str
(
"`~const`"
),
}
}
}
#[derive(
Clone,
Debug,
...
...
@@ -628,9 +647,7 @@ pub fn subst_supertrait(
pub
struct
TraitPredicate
<
'tcx
>
{
pub
trait_ref
:
TraitRef
<
'tcx
>
,
/// A trait predicate will have `Constness::Const` if it originates
/// from a bound marked with `~const`.
pub
constness
:
hir
::
Constness
,
pub
constness
:
BoundConstness
,
}
pub
type
PolyTraitPredicate
<
'tcx
>
=
ty
::
Binder
<
'tcx
,
TraitPredicate
<
'tcx
>>
;
...
...
@@ -1299,7 +1316,7 @@ pub fn and<T: TypeFoldable<'tcx>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
#[derive(Copy,
Clone,
Debug,
PartialEq,
Eq,
Hash,
TypeFoldable)]
pub
struct
ConstnessAnd
<
T
>
{
pub
constness
:
Constness
,
pub
constness
:
Bound
Constness
,
pub
value
:
T
,
}
...
...
@@ -1307,18 +1324,18 @@ pub struct ConstnessAnd<T> {
// the constness of trait bounds is being propagated correctly.
pub
trait
WithConstness
:
Sized
{
#[inline]
fn
with_constness
(
self
,
constness
:
Constness
)
->
ConstnessAnd
<
Self
>
{
fn
with_constness
(
self
,
constness
:
Bound
Constness
)
->
ConstnessAnd
<
Self
>
{
ConstnessAnd
{
constness
,
value
:
self
}
}
#[inline]
fn
with_const
(
self
)
->
ConstnessAnd
<
Self
>
{
self
.with_constness
(
Constness
::
Const
)
fn
with_const
_if_const
(
self
)
->
ConstnessAnd
<
Self
>
{
self
.with_constness
(
BoundConstness
::
ConstIf
Const
)
}
#[inline]
fn
without_const
(
self
)
->
ConstnessAnd
<
Self
>
{
self
.with_constness
(
Constness
::
NotConst
)
self
.with_constness
(
Bound
Constness
::
NotConst
)
}
}
...
...
compiler/rustc_middle/src/ty/relate.rs
浏览文件 @
80e1ee5a
...
...
@@ -200,12 +200,12 @@ fn relate<R: TypeRelation<'tcx>>(
}
}
impl
<
'tcx
>
Relate
<
'tcx
>
for
ast
::
Constness
{
impl
<
'tcx
>
Relate
<
'tcx
>
for
ty
::
Bound
Constness
{
fn
relate
<
R
:
TypeRelation
<
'tcx
>>
(
relation
:
&
mut
R
,
a
:
ast
::
Constness
,
b
:
ast
::
Constness
,
)
->
RelateResult
<
'tcx
,
ast
::
Constness
>
{
a
:
ty
::
Bound
Constness
,
b
:
ty
::
Bound
Constness
,
)
->
RelateResult
<
'tcx
,
ty
::
Bound
Constness
>
{
if
a
!=
b
{
Err
(
TypeError
::
ConstnessMismatch
(
expected_found
(
relation
,
a
,
b
)))
}
else
{
...
...
compiler/rustc_middle/src/ty/structural_impls.rs
浏览文件 @
80e1ee5a
...
...
@@ -8,7 +8,6 @@
use
crate
::
ty
::
print
::{
with_no_trimmed_paths
,
FmtPrinter
,
Printer
};
use
crate
::
ty
::{
self
,
InferConst
,
Lift
,
Ty
,
TyCtxt
};
use
rustc_data_structures
::
functor
::
IdFunctor
;
use
rustc_hir
as
hir
;
use
rustc_hir
::
def
::
Namespace
;
use
rustc_hir
::
def_id
::
CRATE_DEF_INDEX
;
use
rustc_index
::
vec
::{
Idx
,
IndexVec
};
...
...
@@ -155,8 +154,8 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
impl
fmt
::
Debug
for
ty
::
TraitPredicate
<
'tcx
>
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
<
'_
>
)
->
fmt
::
Result
{
if
let
hir
::
Constness
::
Const
=
self
.constness
{
write!
(
f
,
"const "
)
?
;
if
let
ty
::
BoundConstness
::
ConstIf
Const
=
self
.constness
{
write!
(
f
,
"
~
const "
)
?
;
}
write!
(
f
,
"TraitPredicate({:?})"
,
self
.trait_ref
)
}
...
...
@@ -241,6 +240,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
crate
::
traits
::
Reveal
,
crate
::
ty
::
adjustment
::
AutoBorrowMutability
,
crate
::
ty
::
AdtKind
,
crate
::
ty
::
BoundConstness
,
// Including `BoundRegionKind` is a *bit* dubious, but direct
// references to bound region appear in `ty::Error`, and aren't
// really meant to be folded. In general, we can only fold a fully
...
...
compiler/rustc_middle/src/ty/sty.rs
浏览文件 @
80e1ee5a
...
...
@@ -878,7 +878,7 @@ pub fn def_id(&self) -> DefId {
pub
fn
to_poly_trait_predicate
(
&
self
)
->
ty
::
PolyTraitPredicate
<
'tcx
>
{
self
.map_bound
(|
trait_ref
|
ty
::
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
NotConst
,
constness
:
ty
::
Bound
Constness
::
NotConst
,
})
}
}
...
...
compiler/rustc_mir/src/borrow_check/type_check/canonical.rs
浏览文件 @
80e1ee5a
use
std
::
fmt
;
use
rustc_hir
as
hir
;
use
rustc_infer
::
infer
::
canonical
::
Canonical
;
use
rustc_infer
::
traits
::
query
::
NoSolution
;
use
rustc_middle
::
mir
::
ConstraintCategory
;
...
...
@@ -88,7 +87,7 @@ pub(super) fn prove_trait_ref(
self
.prove_predicates
(
Some
(
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
NotConst
,
constness
:
ty
::
Bound
Constness
::
NotConst
,
})),
locations
,
category
,
...
...
compiler/rustc_mir/src/transform/check_consts/check.rs
浏览文件 @
80e1ee5a
...
...
@@ -821,7 +821,7 @@ fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location
param_env
,
Binder
::
dummy
(
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
Const
,
constness
:
ty
::
BoundConstness
::
ConstIf
Const
,
}),
);
...
...
@@ -831,7 +831,7 @@ fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location
});
match
implsrc
{
Ok
(
Some
(
ImplSource
::
Param
(
_
,
hir
::
Constness
::
Const
)))
=>
{
Ok
(
Some
(
ImplSource
::
Param
(
_
,
ty
::
BoundConstness
::
ConstIf
Const
)))
=>
{
debug!
(
"const_trait_impl: provided {:?} via where-clause in {:?}"
,
trait_ref
,
param_env
...
...
compiler/rustc_trait_selection/src/traits/auto_trait.rs
浏览文件 @
80e1ee5a
...
...
@@ -285,7 +285,7 @@ fn evaluate_predicates(
def_id
:
trait_did
,
substs
:
infcx
.tcx
.mk_substs_trait
(
ty
,
&
[]),
},
constness
:
hir
::
Constness
::
NotConst
,
constness
:
ty
::
Bound
Constness
::
NotConst
,
}));
let
computed_preds
=
param_env
.caller_bounds
()
.iter
();
...
...
compiler/rustc_trait_selection/src/traits/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -778,7 +778,7 @@ pub fn vtable_trait_upcasting_coercion_new_vptr_slot(
let
obligation
=
Obligation
::
new
(
ObligationCause
::
dummy
(),
ty
::
ParamEnv
::
reveal_all
(),
ty
::
Binder
::
dummy
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
NotConst
}),
ty
::
Binder
::
dummy
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
ty
::
Bound
Constness
::
NotConst
}),
);
let
implsrc
=
tcx
.infer_ctxt
()
.enter
(|
infcx
|
{
...
...
compiler/rustc_trait_selection/src/traits/select/confirmation.rs
浏览文件 @
80e1ee5a
...
...
@@ -8,7 +8,6 @@
//! https://rustc-dev-guide.rust-lang.org/traits/resolution.html#confirmation
use
rustc_data_structures
::
stack
::
ensure_sufficient_stack
;
use
rustc_hir
::
lang_items
::
LangItem
;
use
rustc_hir
::
Constness
;
use
rustc_index
::
bit_set
::
GrowableBitSet
;
use
rustc_infer
::
infer
::
InferOk
;
use
rustc_infer
::
infer
::
LateBoundRegionConversionTime
::
HigherRankedType
;
...
...
@@ -75,7 +74,7 @@ pub(super) fn confirm_candidate(
ProjectionCandidate
(
idx
)
=>
{
let
obligations
=
self
.confirm_projection_candidate
(
obligation
,
idx
)
?
;
// FIXME(jschievink): constness
Ok
(
ImplSource
::
Param
(
obligations
,
Constness
::
NotConst
))
Ok
(
ImplSource
::
Param
(
obligations
,
ty
::
Bound
Constness
::
NotConst
))
}
ObjectCandidate
(
idx
)
=>
{
...
...
@@ -113,7 +112,7 @@ pub(super) fn confirm_candidate(
// This indicates something like `Trait + Send: Send`. In this case, we know that
// this holds because that's what the object type is telling us, and there's really
// no additional obligations to prove and no types in particular to unify, etc.
Ok
(
ImplSource
::
Param
(
Vec
::
new
(),
Constness
::
NotConst
))
Ok
(
ImplSource
::
Param
(
Vec
::
new
(),
ty
::
Bound
Constness
::
NotConst
))
}
BuiltinUnsizeCandidate
=>
{
...
...
compiler/rustc_trait_selection/src/traits/select/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -32,7 +32,6 @@
use
rustc_errors
::
ErrorReported
;
use
rustc_hir
as
hir
;
use
rustc_hir
::
def_id
::
DefId
;
use
rustc_hir
::
Constness
;
use
rustc_infer
::
infer
::
LateBoundRegionConversionTime
;
use
rustc_middle
::
dep_graph
::{
DepKind
,
DepNodeIndex
};
use
rustc_middle
::
mir
::
abstract_const
::
NotConstEvaluatable
;
...
...
@@ -130,8 +129,8 @@ pub struct SelectionContext<'cx, 'tcx> {
/// and a negative impl
allow_negative_impls
:
bool
,
///
Do we only want const impls when we have a const trait predicate
?
const_impls_required
:
bool
,
///
Are we in a const context that needs `~const` bounds to be const
?
is_in_const_context
:
bool
,
/// The mode that trait queries run in, which informs our error handling
/// policy. In essence, canonicalized queries need their errors propagated
...
...
@@ -224,7 +223,7 @@ pub fn new(infcx: &'cx InferCtxt<'cx, 'tcx>) -> SelectionContext<'cx, 'tcx> {
intercrate
:
false
,
intercrate_ambiguity_causes
:
None
,
allow_negative_impls
:
false
,
const_impls_required
:
false
,
is_in_const_context
:
false
,
query_mode
:
TraitQueryMode
::
Standard
,
}
}
...
...
@@ -236,7 +235,7 @@ pub fn intercrate(infcx: &'cx InferCtxt<'cx, 'tcx>) -> SelectionContext<'cx, 'tc
intercrate
:
true
,
intercrate_ambiguity_causes
:
None
,
allow_negative_impls
:
false
,
const_impls_required
:
false
,
is_in_const_context
:
false
,
query_mode
:
TraitQueryMode
::
Standard
,
}
}
...
...
@@ -252,7 +251,7 @@ pub fn with_negative(
intercrate
:
false
,
intercrate_ambiguity_causes
:
None
,
allow_negative_impls
,
const_impls_required
:
false
,
is_in_const_context
:
false
,
query_mode
:
TraitQueryMode
::
Standard
,
}
}
...
...
@@ -268,7 +267,7 @@ pub fn with_query_mode(
intercrate
:
false
,
intercrate_ambiguity_causes
:
None
,
allow_negative_impls
:
false
,
const_impls_required
:
false
,
is_in_const_context
:
false
,
query_mode
,
}
}
...
...
@@ -283,7 +282,7 @@ pub fn with_constness(
intercrate
:
false
,
intercrate_ambiguity_causes
:
None
,
allow_negative_impls
:
false
,
const_impls_required
:
matches!
(
constness
,
hir
::
Constness
::
Const
),
is_in_const_context
:
matches!
(
constness
,
hir
::
Constness
::
Const
),
query_mode
:
TraitQueryMode
::
Standard
,
}
}
...
...
@@ -316,14 +315,19 @@ pub fn tcx(&self) -> TyCtxt<'tcx> {
self
.infcx.tcx
}
/// Returns `true` if the trait predicate is considerd `const` to this selection context.
pub
fn
is_trait_predicate_const
(
&
self
,
pred
:
ty
::
TraitPredicate
<
'_
>
)
->
bool
{
match
pred
.constness
{
ty
::
BoundConstness
::
ConstIfConst
if
self
.is_in_const_context
=>
true
,
_
=>
false
}
}
/// Returns `true` if the predicate is considered `const` to
/// this selection context.
pub
fn
is_predicate_const
(
&
self
,
pred
:
ty
::
Predicate
<
'_
>
)
->
bool
{
match
pred
.kind
()
.skip_binder
()
{
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
constness
:
hir
::
Constness
::
Const
,
..
})
if
self
.const_impls_required
=>
true
,
ty
::
PredicateKind
::
Trait
(
pred
)
=>
self
.is_trait_predicate_const
(
pred
),
_
=>
false
,
}
}
...
...
@@ -1074,8 +1078,7 @@ fn filter_impls(
)
->
SelectionResult
<
'tcx
,
SelectionCandidate
<
'tcx
>>
{
let
tcx
=
self
.tcx
();
// Respect const trait obligations
if
self
.const_impls_required
{
if
let
hir
::
Constness
::
Const
=
obligation
.predicate
.skip_binder
()
.constness
{
if
self
.is_trait_predicate_const
(
obligation
.predicate
.skip_binder
())
{
if
Some
(
obligation
.predicate
.skip_binder
()
.trait_ref.def_id
)
!=
tcx
.lang_items
()
.sized_trait
()
// const Sized bounds are skipped
...
...
@@ -1086,7 +1089,7 @@ fn filter_impls(
if
tcx
.impl_constness
(
def_id
)
==
hir
::
Constness
::
Const
=>
{}
// const param
ParamCandidate
(
ty
::
ConstnessAnd
{
constness
:
hir
::
Constness
::
Const
,
constness
:
ty
::
BoundConstness
::
ConstIf
Const
,
..
})
=>
{}
// auto trait impl
...
...
@@ -1100,7 +1103,6 @@ fn filter_impls(
}
}
}
}
}
// Treat negative impls as unimplemented, and reservation impls as ambiguity.
if
let
ImplCandidate
(
def_id
)
=
candidate
{
...
...
@@ -1495,7 +1497,7 @@ fn candidate_should_be_dropped_in_favor_of(
// probably best characterized as a "hack", since we might prefer to just do our
// best to *not* create essentially duplicate candidates in the first place.
other
.value
.bound_vars
()
.len
()
<=
victim
.value
.bound_vars
()
.len
()
}
else
if
other
.value
==
victim
.value
&&
victim
.constness
==
Constness
::
NotConst
{
}
else
if
other
.value
==
victim
.value
&&
victim
.constness
==
ty
::
Bound
Constness
::
NotConst
{
// Drop otherwise equivalent non-const candidates in favor of const candidates.
true
}
else
{
...
...
compiler/rustc_typeck/src/astconv/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -20,7 +20,7 @@
use
rustc_hir
::
def_id
::{
DefId
,
LocalDefId
};
use
rustc_hir
::
intravisit
::{
walk_generics
,
Visitor
as
_
};
use
rustc_hir
::
lang_items
::
LangItem
;
use
rustc_hir
::{
Constness
,
GenericArg
,
GenericArgs
};
use
rustc_hir
::{
GenericArg
,
GenericArgs
};
use
rustc_middle
::
ty
::
subst
::{
self
,
GenericArgKind
,
InternalSubsts
,
Subst
,
SubstsRef
};
use
rustc_middle
::
ty
::
GenericParamDefKind
;
use
rustc_middle
::
ty
::{
self
,
Const
,
DefIdTree
,
Ty
,
TyCtxt
,
TypeFoldable
};
...
...
@@ -47,8 +47,6 @@ pub trait AstConv<'tcx> {
fn
item_def_id
(
&
self
)
->
Option
<
DefId
>
;
fn
default_constness_for_trait_bounds
(
&
self
)
->
Constness
;
/// Returns predicates in scope of the form `X: Foo<T>`, where `X`
/// is a type parameter `X` with the given id `def_id` and T
/// matches `assoc_name`. This is a subset of the full set of
...
...
@@ -724,7 +722,7 @@ pub fn instantiate_poly_trait_ref(
&
self
,
trait_ref
:
&
hir
::
TraitRef
<
'_
>
,
span
:
Span
,
constness
:
Constness
,
constness
:
ty
::
Bound
Constness
,
self_ty
:
Ty
<
'tcx
>
,
bounds
:
&
mut
Bounds
<
'tcx
>
,
speculative
:
bool
,
...
...
@@ -795,7 +793,7 @@ pub fn instantiate_lang_item_trait_ref(
let
bound_vars
=
tcx
.late_bound_vars
(
hir_id
);
let
poly_trait_ref
=
ty
::
Binder
::
bind_with_vars
(
ty
::
TraitRef
::
new
(
trait_def_id
,
substs
),
bound_vars
);
bounds
.trait_bounds
.push
((
poly_trait_ref
,
span
,
Constness
::
NotConst
));
bounds
.trait_bounds
.push
((
poly_trait_ref
,
span
,
ty
::
Bound
Constness
::
NotConst
));
let
mut
dup_bindings
=
FxHashMap
::
default
();
for
binding
in
assoc_bindings
{
...
...
@@ -920,14 +918,13 @@ fn add_bounds(
bounds
:
&
mut
Bounds
<
'tcx
>
,
bound_vars
:
&
'tcx
ty
::
List
<
ty
::
BoundVariableKind
>
,
)
{
let
constness
=
self
.default_constness_for_trait_bounds
();
for
ast_bound
in
ast_bounds
{
match
*
ast_bound
{
hir
::
GenericBound
::
Trait
(
ref
b
,
hir
::
TraitBoundModifier
::
None
)
=>
{
self
.instantiate_poly_trait_ref
(
&
b
.trait_ref
,
b
.span
,
Constness
::
NotConst
,
ty
::
Bound
Constness
::
NotConst
,
param_ty
,
bounds
,
false
,
...
...
@@ -937,7 +934,7 @@ fn add_bounds(
self
.instantiate_poly_trait_ref
(
&
b
.trait_ref
,
b
.span
,
constness
,
ty
::
BoundConstness
::
ConstIfConst
,
param_ty
,
bounds
,
false
,
...
...
@@ -1251,7 +1248,7 @@ fn conv_object_ty_poly_trait_ref(
}
=
self
.instantiate_poly_trait_ref
(
&
trait_bound
.trait_ref
,
trait_bound
.span
,
Constness
::
NotConst
,
ty
::
Bound
Constness
::
NotConst
,
dummy_self
,
&
mut
bounds
,
false
,
...
...
@@ -1330,7 +1327,7 @@ trait here instead: `trait NewTrait: {} {{}}`",
.filter
(|(
trait_ref
,
_
,
_
)|
!
tcx
.trait_is_auto
(
trait_ref
.def_id
()));
for
(
base_trait_ref
,
span
,
constness
)
in
regular_traits_refs_spans
{
assert_eq!
(
constness
,
Constness
::
NotConst
);
assert_eq!
(
constness
,
ty
::
Bound
Constness
::
NotConst
);
for
obligation
in
traits
::
elaborate_trait_ref
(
tcx
,
base_trait_ref
)
{
debug!
(
...
...
compiler/rustc_typeck/src/bounds.rs
浏览文件 @
80e1ee5a
//! Bounds are restrictions applied to some types after they've been converted into the
//! `ty` form from the HIR.
use
rustc_hir
::
Constness
;
use
rustc_middle
::
ty
::{
self
,
ToPredicate
,
Ty
,
TyCtxt
,
WithConstness
};
use
rustc_span
::
Span
;
...
...
@@ -30,7 +29,7 @@ pub struct Bounds<'tcx> {
/// A list of trait bounds. So if you had `T: Debug` this would be
/// `T: Debug`. Note that the self-type is explicit here.
pub
trait_bounds
:
Vec
<
(
ty
::
PolyTraitRef
<
'tcx
>
,
Span
,
Constness
)
>
,
pub
trait_bounds
:
Vec
<
(
ty
::
PolyTraitRef
<
'tcx
>
,
Span
,
ty
::
Bound
Constness
)
>
,
/// A list of projection equality bounds. So if you had `T:
/// Iterator<Item = u32>` this would include `<T as
...
...
compiler/rustc_typeck/src/check/fn_ctxt/mod.rs
浏览文件 @
80e1ee5a
...
...
@@ -180,10 +180,6 @@ fn item_def_id(&self) -> Option<DefId> {
None
}
fn
default_constness_for_trait_bounds
(
&
self
)
->
hir
::
Constness
{
self
.tcx
.hir
()
.get
(
self
.body_id
)
.constness_for_typeck
()
}
fn
get_type_parameter_bounds
(
&
self
,
_
:
Span
,
...
...
compiler/rustc_typeck/src/collect.rs
浏览文件 @
80e1ee5a
...
...
@@ -365,10 +365,6 @@ fn item_def_id(&self) -> Option<DefId> {
Some
(
self
.item_def_id
)
}
fn
default_constness_for_trait_bounds
(
&
self
)
->
hir
::
Constness
{
self
.node
()
.constness_for_typeck
()
}
fn
get_type_parameter_bounds
(
&
self
,
span
:
Span
,
...
...
@@ -664,7 +660,6 @@ fn type_parameter_bounds_in_generics(
only_self_bounds
:
OnlySelfBounds
,
assoc_name
:
Option
<
Ident
>
,
)
->
Vec
<
(
ty
::
Predicate
<
'tcx
>
,
Span
)
>
{
let
constness
=
self
.default_constness_for_trait_bounds
();
let
from_ty_params
=
ast_generics
.params
.iter
()
...
...
@@ -677,7 +672,7 @@ fn type_parameter_bounds_in_generics(
Some
(
assoc_name
)
=>
self
.bound_defines_assoc_item
(
b
,
assoc_name
),
None
=>
true
,
})
.flat_map
(|
b
|
predicates_from_bound
(
self
,
ty
,
b
,
constness
));
.flat_map
(|
b
|
predicates_from_bound
(
self
,
ty
,
b
));
let
from_where_clauses
=
ast_generics
.where_clause
...
...
@@ -703,7 +698,7 @@ fn type_parameter_bounds_in_generics(
})
.filter_map
(
move
|
b
|
bt
.map
(|
bt
|
(
bt
,
b
)))
})
.flat_map
(|(
bt
,
b
)|
predicates_from_bound
(
self
,
bt
,
b
,
constness
));
.flat_map
(|(
bt
,
b
)|
predicates_from_bound
(
self
,
bt
,
b
));
from_ty_params
.chain
(
from_where_clauses
)
.collect
()
}
...
...
@@ -2031,7 +2026,6 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
let
mut
is_default_impl_trait
=
None
;
let
icx
=
ItemCtxt
::
new
(
tcx
,
def_id
);
let
constness
=
icx
.default_constness_for_trait_bounds
();
const
NO_GENERICS
:
&
hir
::
Generics
<
'_
>
=
&
hir
::
Generics
::
empty
();
...
...
@@ -2227,8 +2221,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
match
bound
{
hir
::
GenericBound
::
Trait
(
poly_trait_ref
,
modifier
)
=>
{
let
constness
=
match
modifier
{
hir
::
TraitBoundModifier
::
None
=>
hir
::
Constness
::
NotConst
,
hir
::
TraitBoundModifier
::
MaybeConst
=>
constness
,
hir
::
TraitBoundModifier
::
None
=>
ty
::
Bound
Constness
::
NotConst
,
hir
::
TraitBoundModifier
::
MaybeConst
=>
ty
::
BoundConstness
::
ConstIfConst
,
// We ignore `where T: ?Sized`, it is already part of
// type parameter `T`.
hir
::
TraitBoundModifier
::
Maybe
=>
continue
,
...
...
@@ -2491,14 +2485,13 @@ fn predicates_from_bound<'tcx>(
astconv
:
&
dyn
AstConv
<
'tcx
>
,
param_ty
:
Ty
<
'tcx
>
,
bound
:
&
'tcx
hir
::
GenericBound
<
'tcx
>
,
constness
:
hir
::
Constness
,
)
->
Vec
<
(
ty
::
Predicate
<
'tcx
>
,
Span
)
>
{
match
*
bound
{
hir
::
GenericBound
::
Trait
(
ref
tr
,
modifier
)
=>
{
let
constness
=
match
modifier
{
hir
::
TraitBoundModifier
::
Maybe
=>
return
vec!
[],
hir
::
TraitBoundModifier
::
MaybeConst
=>
constness
,
hir
::
TraitBoundModifier
::
None
=>
hir
::
Constness
::
NotConst
,
hir
::
TraitBoundModifier
::
MaybeConst
=>
ty
::
BoundConstness
::
ConstIfConst
,
hir
::
TraitBoundModifier
::
None
=>
ty
::
Bound
Constness
::
NotConst
,
};
let
mut
bounds
=
Bounds
::
default
();
...
...
compiler/rustc_typeck/src/impl_wf_check/min_specialization.rs
浏览文件 @
80e1ee5a
...
...
@@ -68,7 +68,6 @@
use
crate
::
constrained_generic_params
as
cgp
;
use
rustc_data_structures
::
fx
::
FxHashSet
;
use
rustc_hir
as
hir
;
use
rustc_hir
::
def_id
::{
DefId
,
LocalDefId
};
use
rustc_infer
::
infer
::
outlives
::
env
::
OutlivesEnvironment
;
use
rustc_infer
::
infer
::{
InferCtxt
,
RegionckMode
,
TyCtxtInferExt
};
...
...
@@ -368,7 +367,7 @@ fn check_specialization_on<'tcx>(tcx: TyCtxt<'tcx>, predicate: ty::Predicate<'tc
// items.
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
NotConst
,
constness
:
ty
::
Bound
Constness
::
NotConst
,
})
=>
{
if
!
matches!
(
trait_predicate_kind
(
tcx
,
predicate
),
...
...
@@ -399,7 +398,7 @@ fn trait_predicate_kind<'tcx>(
match
predicate
.kind
()
.skip_binder
()
{
ty
::
PredicateKind
::
Trait
(
ty
::
TraitPredicate
{
trait_ref
,
constness
:
hir
::
Constness
::
NotConst
,
constness
:
ty
::
Bound
Constness
::
NotConst
,
})
=>
Some
(
tcx
.trait_def
(
trait_ref
.def_id
)
.specialization_kind
),
ty
::
PredicateKind
::
Trait
(
_
)
|
ty
::
PredicateKind
::
RegionOutlives
(
_
)
...
...
compiler/rustc_typeck/src/lib.rs
浏览文件 @
80e1ee5a
...
...
@@ -548,7 +548,7 @@ pub fn hir_trait_to_predicates<'tcx>(
&
item_cx
,
hir_trait
,
DUMMY_SP
,
hir
::
Constness
::
NotConst
,
ty
::
Bound
Constness
::
NotConst
,
self_ty
,
&
mut
bounds
,
true
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录