Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
06a0e4f7
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,发现更多精彩内容 >>
提交
06a0e4f7
编写于
1月 29, 2018
作者:
E
Eduard-Mihai Burtescu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc: move `expr_is_lval` to rustc_typeck and rename to `is_place_expr`.
上级
3f4a489f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
58 addition
and
59 deletion
+58
-59
src/librustc/ty/mod.rs
src/librustc/ty/mod.rs
+0
-54
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/mod.rs
+56
-2
src/librustc_typeck/check/op.rs
src/librustc_typeck/check/op.rs
+2
-3
未找到文件。
src/librustc/ty/mod.rs
浏览文件 @
06a0e4f7
...
...
@@ -2177,60 +2177,6 @@ pub fn expr_span(self, id: NodeId) -> Span {
}
}
pub
fn
expr_is_lval
(
self
,
expr
:
&
hir
::
Expr
)
->
bool
{
match
expr
.node
{
hir
::
ExprPath
(
hir
::
QPath
::
Resolved
(
_
,
ref
path
))
=>
{
match
path
.def
{
Def
::
Local
(
..
)
|
Def
::
Upvar
(
..
)
|
Def
::
Static
(
..
)
|
Def
::
Err
=>
true
,
_
=>
false
,
}
}
hir
::
ExprType
(
ref
e
,
_
)
=>
{
self
.expr_is_lval
(
e
)
}
hir
::
ExprUnary
(
hir
::
UnDeref
,
_
)
|
hir
::
ExprField
(
..
)
|
hir
::
ExprTupField
(
..
)
|
hir
::
ExprIndex
(
..
)
=>
{
true
}
// Partially qualified paths in expressions can only legally
// refer to associated items which are always rvalues.
hir
::
ExprPath
(
hir
::
QPath
::
TypeRelative
(
..
))
|
hir
::
ExprCall
(
..
)
|
hir
::
ExprMethodCall
(
..
)
|
hir
::
ExprStruct
(
..
)
|
hir
::
ExprTup
(
..
)
|
hir
::
ExprIf
(
..
)
|
hir
::
ExprMatch
(
..
)
|
hir
::
ExprClosure
(
..
)
|
hir
::
ExprBlock
(
..
)
|
hir
::
ExprRepeat
(
..
)
|
hir
::
ExprArray
(
..
)
|
hir
::
ExprBreak
(
..
)
|
hir
::
ExprAgain
(
..
)
|
hir
::
ExprRet
(
..
)
|
hir
::
ExprWhile
(
..
)
|
hir
::
ExprLoop
(
..
)
|
hir
::
ExprAssign
(
..
)
|
hir
::
ExprInlineAsm
(
..
)
|
hir
::
ExprAssignOp
(
..
)
|
hir
::
ExprLit
(
_
)
|
hir
::
ExprUnary
(
..
)
|
hir
::
ExprBox
(
..
)
|
hir
::
ExprAddrOf
(
..
)
|
hir
::
ExprBinary
(
..
)
|
hir
::
ExprYield
(
..
)
|
hir
::
ExprCast
(
..
)
=>
{
false
}
}
}
pub
fn
provided_trait_methods
(
self
,
id
:
DefId
)
->
Vec
<
AssociatedItem
>
{
self
.associated_items
(
id
)
.filter
(|
item
|
item
.kind
==
AssociatedKind
::
Method
&&
item
.defaultness
.has_value
())
...
...
src/librustc_typeck/check/mod.rs
浏览文件 @
06a0e4f7
...
...
@@ -2221,6 +2221,60 @@ fn select_obligations_where_possible(&self) {
}
}
fn
is_place_expr
(
&
self
,
expr
:
&
hir
::
Expr
)
->
bool
{
match
expr
.node
{
hir
::
ExprPath
(
hir
::
QPath
::
Resolved
(
_
,
ref
path
))
=>
{
match
path
.def
{
Def
::
Local
(
..
)
|
Def
::
Upvar
(
..
)
|
Def
::
Static
(
..
)
|
Def
::
Err
=>
true
,
_
=>
false
,
}
}
hir
::
ExprType
(
ref
e
,
_
)
=>
{
self
.is_place_expr
(
e
)
}
hir
::
ExprUnary
(
hir
::
UnDeref
,
_
)
|
hir
::
ExprField
(
..
)
|
hir
::
ExprTupField
(
..
)
|
hir
::
ExprIndex
(
..
)
=>
{
true
}
// Partially qualified paths in expressions can only legally
// refer to associated items which are always rvalues.
hir
::
ExprPath
(
hir
::
QPath
::
TypeRelative
(
..
))
|
hir
::
ExprCall
(
..
)
|
hir
::
ExprMethodCall
(
..
)
|
hir
::
ExprStruct
(
..
)
|
hir
::
ExprTup
(
..
)
|
hir
::
ExprIf
(
..
)
|
hir
::
ExprMatch
(
..
)
|
hir
::
ExprClosure
(
..
)
|
hir
::
ExprBlock
(
..
)
|
hir
::
ExprRepeat
(
..
)
|
hir
::
ExprArray
(
..
)
|
hir
::
ExprBreak
(
..
)
|
hir
::
ExprAgain
(
..
)
|
hir
::
ExprRet
(
..
)
|
hir
::
ExprWhile
(
..
)
|
hir
::
ExprLoop
(
..
)
|
hir
::
ExprAssign
(
..
)
|
hir
::
ExprInlineAsm
(
..
)
|
hir
::
ExprAssignOp
(
..
)
|
hir
::
ExprLit
(
_
)
|
hir
::
ExprUnary
(
..
)
|
hir
::
ExprBox
(
..
)
|
hir
::
ExprAddrOf
(
..
)
|
hir
::
ExprBinary
(
..
)
|
hir
::
ExprYield
(
..
)
|
hir
::
ExprCast
(
..
)
=>
{
false
}
}
}
/// For the overloaded lvalue expressions (`*x`, `x[3]`), the trait
/// returns a type of `&T`, but the actual type we assign to the
/// *expression* is `T`. So this function just peels off the return
...
...
@@ -3627,7 +3681,7 @@ fn check_expr_kind(&self,
let
hint
=
expected
.only_has_type
(
self
)
.map_or
(
NoExpectation
,
|
ty
|
{
match
ty
.sty
{
ty
::
TyRef
(
_
,
ref
mt
)
|
ty
::
TyRawPtr
(
ref
mt
)
=>
{
if
self
.
tcx
.expr_is_lval
(
&
oprnd
)
{
if
self
.
is_place_expr
(
&
oprnd
)
{
// Lvalues may legitimately have unsized types.
// For example, dereferences of a fat pointer and
// the last field of a struct can be unsized.
...
...
@@ -3796,7 +3850,7 @@ fn check_expr_kind(&self,
_
=>
{
// Only check this if not in an `if` condition, as the
// mistyped comparison help is more appropriate.
if
!
self
.
tcx
.expr_is_lval
(
&
lhs
)
{
if
!
self
.
is_place_expr
(
&
lhs
)
{
struct_span_err!
(
self
.tcx.sess
,
expr
.span
,
E0070
,
"invalid left-hand side expression"
)
.span_label
(
expr
.span
,
"left-hand of expression not valid"
)
...
...
src/librustc_typeck/check/op.rs
浏览文件 @
06a0e4f7
...
...
@@ -40,10 +40,9 @@ pub fn check_binop_assign(&self,
return_ty
};
let
tcx
=
self
.tcx
;
if
!
tcx
.expr_is_lval
(
lhs_expr
)
{
if
!
self
.is_place_expr
(
lhs_expr
)
{
struct_span_err!
(
tcx
.sess
,
lhs_expr
.span
,
self
.
tcx.sess
,
lhs_expr
.span
,
E0067
,
"invalid left-hand side expression"
)
.span_label
(
lhs_expr
.span
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录