Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
af90cac0
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
af90cac0
编写于
4月 16, 2021
作者:
A
Aliénore Bouttefeux
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix reporting return type in some cases
上级
f1ca558d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
60 addition
and
22 deletion
+60
-22
compiler/rustc_typeck/src/check/coercion.rs
compiler/rustc_typeck/src/check/coercion.rs
+0
-22
compiler/rustc_typeck/src/check/demand.rs
compiler/rustc_typeck/src/check/demand.rs
+29
-0
src/test/ui/closures/issue-84128.rs
src/test/ui/closures/issue-84128.rs
+16
-0
src/test/ui/closures/issue-84128.stderr
src/test/ui/closures/issue-84128.stderr
+15
-0
未找到文件。
compiler/rustc_typeck/src/check/coercion.rs
浏览文件 @
af90cac0
...
...
@@ -1492,28 +1492,6 @@ fn report_return_mismatched_types<'a>(
if
let
(
Some
(
sp
),
Some
(
fn_output
))
=
(
fcx
.ret_coercion_span
.get
(),
fn_output
)
{
self
.add_impl_trait_explanation
(
&
mut
err
,
cause
,
fcx
,
expected
,
sp
,
fn_output
);
}
if
let
Some
(
sp
)
=
fcx
.ret_coercion_span
.get
()
{
// If the closure has an explicit return type annotation,
// then a type error may occur at the first return expression we
// see in the closure (if it conflicts with the declared
// return type). Skip adding a note in this case, since it
// would be incorrect.
if
!
err
.span
.primary_spans
()
.iter
()
.any
(|
&
span
|
span
==
sp
)
{
let
hir
=
fcx
.tcx
.hir
();
let
body_owner
=
hir
.body_owned_by
(
hir
.enclosing_body_owner
(
fcx
.body_id
));
if
fcx
.tcx
.is_closure
(
hir
.body_owner_def_id
(
body_owner
)
.to_def_id
())
{
err
.span_note
(
sp
,
&
format!
(
"return type inferred to be `{}` here"
,
fcx
.resolve_vars_if_possible
(
expected
)
),
);
}
}
}
err
}
...
...
compiler/rustc_typeck/src/check/demand.rs
浏览文件 @
af90cac0
...
...
@@ -37,6 +37,7 @@ pub fn emit_coerce_suggestions(
self
.suggest_missing_parentheses
(
err
,
expr
);
self
.note_need_for_fn_pointer
(
err
,
expected
,
expr_ty
);
self
.note_internal_mutation_in_method
(
err
,
expr
,
expected
,
expr_ty
);
self
.report_closure_infered_return_type
(
err
,
expected
)
}
// Requires that the two types unify, and prints an error message if
...
...
@@ -1061,4 +1062,32 @@ pub fn check_for_cast(
_
=>
false
,
}
}
// Report the type inferred by the return statement.
fn
report_closure_infered_return_type
(
&
self
,
err
:
&
mut
DiagnosticBuilder
<
'_
>
,
expected
:
Ty
<
'tcx
>
,
)
{
if
let
Some
(
sp
)
=
self
.ret_coercion_span
.get
()
{
// If the closure has an explicit return type annotation,
// then a type error may occur at the first return expression we
// see in the closure (if it conflicts with the declared
// return type). Skip adding a note in this case, since it
// would be incorrect.
if
!
err
.span
.primary_spans
()
.iter
()
.any
(|
&
span
|
span
==
sp
)
{
let
hir
=
self
.tcx
.hir
();
let
body_owner
=
hir
.body_owned_by
(
hir
.enclosing_body_owner
(
self
.body_id
));
if
self
.tcx
.is_closure
(
hir
.body_owner_def_id
(
body_owner
)
.to_def_id
())
{
err
.span_note
(
sp
,
&
format!
(
"return type inferred to be `{}` here"
,
self
.resolve_vars_if_possible
(
expected
)
),
);
}
}
}
}
}
src/test/ui/closures/issue-84128.rs
0 → 100644
浏览文件 @
af90cac0
// test for issue 84128
// missing suggestion for similar ADT type with diffetent generic paramenter
// on closure ReturnNoExpression
struct
Foo
<
T
>
(
T
);
fn
main
()
{
||
{
if
false
{
return
Foo
(
0
);
}
Foo
(())
//~^ ERROR mismatched types [E0308]
};
}
src/test/ui/closures/issue-84128.stderr
0 → 100644
浏览文件 @
af90cac0
error[E0308]: mismatched types
--> $DIR/issue-84128.rs:13:13
|
LL | Foo(())
| ^^ expected integer, found `()`
|
note: return type inferred to be `{integer}` here
--> $DIR/issue-84128.rs:10:20
|
LL | return Foo(0);
| ^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录