Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
0c5225c5
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,发现更多精彩内容 >>
提交
0c5225c5
编写于
1月 17, 2015
作者:
B
Brian Anderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add error codes to rustc_typeck
上级
953d6dfd
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
179 addition
and
157 deletion
+179
-157
src/librustc_typeck/astconv.rs
src/librustc_typeck/astconv.rs
+36
-48
src/librustc_typeck/check/closure.rs
src/librustc_typeck/check/closure.rs
+2
-3
src/librustc_typeck/check/compare_method.rs
src/librustc_typeck/check/compare_method.rs
+9
-12
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/mod.rs
+19
-25
src/librustc_typeck/check/vtable.rs
src/librustc_typeck/check/vtable.rs
+10
-13
src/librustc_typeck/check/wf.rs
src/librustc_typeck/check/wf.rs
+9
-12
src/librustc_typeck/check/writeback.rs
src/librustc_typeck/check/writeback.rs
+1
-1
src/librustc_typeck/coherence/impls.rs
src/librustc_typeck/coherence/impls.rs
+3
-4
src/librustc_typeck/coherence/mod.rs
src/librustc_typeck/coherence/mod.rs
+7
-10
src/librustc_typeck/coherence/orphan.rs
src/librustc_typeck/coherence/orphan.rs
+2
-4
src/librustc_typeck/coherence/unsafety.rs
src/librustc_typeck/coherence/unsafety.rs
+9
-13
src/librustc_typeck/collect.rs
src/librustc_typeck/collect.rs
+7
-7
src/librustc_typeck/diagnostics.rs
src/librustc_typeck/diagnostics.rs
+61
-1
src/librustc_typeck/lib.rs
src/librustc_typeck/lib.rs
+3
-3
src/librustc_typeck/variance.rs
src/librustc_typeck/variance.rs
+1
-1
未找到文件。
src/librustc_typeck/astconv.rs
浏览文件 @
0c5225c5
...
...
@@ -100,8 +100,7 @@ fn projected_ty_from_poly_trait_ref(&self,
->
Ty
<
'tcx
>
{
if
ty
::
binds_late_bound_regions
(
self
.tcx
(),
&
poly_trait_ref
)
{
self
.tcx
()
.sess
.span_err
(
span
,
span_err!
(
self
.tcx
()
.sess
,
span
,
E0212
,
"cannot extract an associated type from a higher-ranked trait bound
\
in this context"
);
self
.tcx
()
.types.err
...
...
@@ -119,8 +118,7 @@ fn projected_ty(&self,
_
item_name
:
ast
::
Name
)
->
Ty
<
'tcx
>
{
self
.tcx
()
.sess
.span_err
(
span
,
span_err!
(
self
.tcx
()
.sess
,
span
,
E0213
,
"associated types are not accepted in this context"
);
self
.tcx
()
.types.err
...
...
@@ -268,8 +266,7 @@ pub fn ast_path_substs_for_ty<'tcx>(
convert_angle_bracketed_parameters
(
this
,
rscope
,
data
)
}
ast
::
ParenthesizedParameters
(
ref
data
)
=>
{
tcx
.sess
.span_err
(
path
.span
,
span_err!
(
tcx
.sess
,
path
.span
,
E0214
,
"parenthesized parameters may only be used with a trait"
);
(
Vec
::
new
(),
convert_parenthesized_parameters
(
this
,
data
),
Vec
::
new
())
}
...
...
@@ -610,7 +607,7 @@ fn ast_path_to_trait_ref<'a,'tcx>(
if
!
this
.tcx
()
.sess.features
.borrow
()
.unboxed_closures
&&
this
.tcx
()
.lang_items
.fn_trait_kind
(
trait_def_id
)
.is_some
()
{
this
.tcx
()
.sess
.span_err
(
path
.span
,
span_err!
(
this
.tcx
()
.sess
,
path
.span
,
E0215
,
"angle-bracket notation is not stable when
\
used with the `Fn` family of traits, use parentheses"
);
span_help!
(
this
.tcx
()
.sess
,
path
.span
,
...
...
@@ -626,7 +623,7 @@ fn ast_path_to_trait_ref<'a,'tcx>(
if
!
this
.tcx
()
.sess.features
.borrow
()
.unboxed_closures
&&
this
.tcx
()
.lang_items
.fn_trait_kind
(
trait_def_id
)
.is_none
()
{
this
.tcx
()
.sess
.span_err
(
path
.span
,
span_err!
(
this
.tcx
()
.sess
,
path
.span
,
E0216
,
"parenthetical notation is only stable when
\
used with the `Fn` family of traits"
);
span_help!
(
this
.tcx
()
.sess
,
path
.span
,
...
...
@@ -738,32 +735,29 @@ fn ast_type_binding_to_projection_predicate<'tcx>(
}
if
candidates
.len
()
>
1
{
tcx
.sess
.span_err
(
binding
.span
,
format!
(
"ambiguous associated type: `{}` defined in multiple supertraits `{}`"
,
span_err!
(
tcx
.sess
,
binding
.span
,
E0217
,
"ambiguous associated type: `{}` defined in multiple supertraits `{}`"
,
token
::
get_name
(
binding
.item_name
),
candidates
.user_string
(
tcx
))
.as_slice
())
;
candidates
.user_string
(
tcx
));
return
Err
(
ErrorReported
);
}
let
candidate
=
match
candidates
.pop
()
{
Some
(
c
)
=>
c
,
None
=>
{
tcx
.sess
.span_err
(
binding
.span
,
format!
(
"no associated type `{}` defined in `{}`"
,
span_err!
(
tcx
.sess
,
binding
.span
,
E0218
,
"no associated type `{}` defined in `{}`"
,
token
::
get_name
(
binding
.item_name
),
trait_ref
.user_string
(
tcx
))
.as_slice
())
;
trait_ref
.user_string
(
tcx
));
return
Err
(
ErrorReported
);
}
};
if
ty
::
binds_late_bound_regions
(
tcx
,
&
candidate
)
{
tcx
.sess
.span_err
(
binding
.span
,
format!
(
"associated type `{}` defined in higher-ranked supertrait `{}`"
,
span_err!
(
tcx
.sess
,
binding
.span
,
E0219
,
"associated type `{}` defined in higher-ranked supertrait `{}`"
,
token
::
get_name
(
binding
.item_name
),
candidate
.user_string
(
tcx
))
.as_slice
())
;
candidate
.user_string
(
tcx
));
return
Err
(
ErrorReported
);
}
...
...
@@ -964,18 +958,18 @@ fn associated_path_def_to_ty<'tcx>(this: &AstConv<'tcx>,
}
if
suitable_bounds
.len
()
==
0
{
tcx
.sess
.span_err
(
ast_ty
.span
,
format!
(
"associated type `{}` not found for type parameter `{}`"
,
span_err!
(
tcx
.sess
,
ast_ty
.span
,
E0220
,
"associated type `{}` not found for type parameter `{}`"
,
token
::
get_name
(
assoc_name
),
token
::
get_name
(
ty_param_name
))
.as_slice
())
;
token
::
get_name
(
ty_param_name
));
return
this
.tcx
()
.types.err
;
}
if
suitable_bounds
.len
()
>
1
{
tcx
.sess
.span_err
(
ast_ty
.span
,
format!
(
"ambiguous associated type `{}` in bounds of `{}`"
,
span_err!
(
tcx
.sess
,
ast_ty
.span
,
E0221
,
"ambiguous associated type `{}` in bounds of `{}`"
,
token
::
get_name
(
assoc_name
),
token
::
get_name
(
ty_param_name
))
.as_slice
())
;
token
::
get_name
(
ty_param_name
));
for
suitable_bound
in
suitable_bounds
.iter
()
{
span_note!
(
this
.tcx
()
.sess
,
ast_ty
.span
,
...
...
@@ -1093,7 +1087,7 @@ pub fn ast_ty_to_ty<'tcx>(
ast
::
TyParen
(
ref
typ
)
=>
ast_ty_to_ty
(
this
,
rscope
,
&**
typ
),
ast
::
TyBareFn
(
ref
bf
)
=>
{
if
bf
.decl.variadic
&&
bf
.abi
!=
abi
::
C
{
tcx
.sess
.span_err
(
ast_ty
.span
,
span_err!
(
tcx
.sess
,
ast_ty
.span
,
E0222
,
"variadic function must have C calling convention"
);
}
let
bare_fn
=
ty_of_bare_fn
(
this
,
bf
.unsafety
,
bf
.abi
,
&*
bf
.decl
);
...
...
@@ -1152,8 +1146,8 @@ pub fn ast_ty_to_ty<'tcx>(
def
::
DefAssociatedTy
(
trait_type_id
)
=>
{
let
path_str
=
tcx
.map
.path_to_string
(
tcx
.map
.get_parent
(
trait_type_id
.node
));
tcx
.sess
.span_err
(
ast_ty
.span
,
&
format!
(
"ambiguous associated
\
span_err!
(
tcx
.sess
,
ast_ty
.span
,
E0223
,
"ambiguous associated
\
type; specify the type
\
using the syntax `<Type
\
as {}>::{}`"
,
...
...
@@ -1163,7 +1157,7 @@ pub fn ast_ty_to_ty<'tcx>(
.last
()
.unwrap
()
.identifier
)
.get
())
[])
;
.get
());
this
.tcx
()
.types.err
}
def
::
DefAssociatedPath
(
provenance
,
assoc_ident
)
=>
{
...
...
@@ -1557,8 +1551,7 @@ fn conv_ty_poly_trait_ref<'tcx>(
None
,
&
mut
projection_bounds
))
}
else
{
this
.tcx
()
.sess
.span_err
(
span
,
span_err!
(
this
.tcx
()
.sess
,
span
,
E0224
,
"at least one non-builtin trait is required for an object type"
);
None
};
...
...
@@ -1593,10 +1586,9 @@ pub fn conv_existential_bounds_from_partitioned_bounds<'tcx>(
if
!
trait_bounds
.is_empty
()
{
let
b
=
&
trait_bounds
[
0
];
this
.tcx
()
.sess
.span_err
(
b
.trait_ref.path.span
,
&
format!
(
"only the builtin traits can be used
\
as closure or object bounds"
)[]);
span_err!
(
this
.tcx
()
.sess
,
b
.trait_ref.path.span
,
E0225
,
"only the builtin traits can be used
\
as closure or object bounds"
);
}
let
region_bound
=
compute_region_bound
(
this
,
...
...
@@ -1633,9 +1625,8 @@ fn compute_opt_region_bound<'tcx>(tcx: &ty::ctxt<'tcx>,
builtin_bounds
.repr
(
tcx
));
if
explicit_region_bounds
.len
()
>
1
{
tcx
.sess
.span_err
(
explicit_region_bounds
[
1
]
.span
,
format!
(
"only a single explicit lifetime bound is permitted"
)
.as_slice
());
span_err!
(
tcx
.sess
,
explicit_region_bounds
[
1
]
.span
,
E0226
,
"only a single explicit lifetime bound is permitted"
);
}
if
explicit_region_bounds
.len
()
!=
0
{
...
...
@@ -1666,10 +1657,9 @@ fn compute_opt_region_bound<'tcx>(tcx: &ty::ctxt<'tcx>,
// error.
let
r
=
derived_region_bounds
[
0
];
if
derived_region_bounds
.slice_from
(
1
)
.iter
()
.any
(|
r1
|
r
!=
*
r1
)
{
tcx
.sess
.span_err
(
span
,
&
format!
(
"ambiguous lifetime bound,
\
explicit lifetime bound required"
)[]);
span_err!
(
tcx
.sess
,
span
,
E0227
,
"ambiguous lifetime bound,
\
explicit lifetime bound required"
);
}
return
Some
(
r
);
}
...
...
@@ -1693,9 +1683,8 @@ fn compute_region_bound<'tcx>(
match
rscope
.default_region_bound
(
span
)
{
Some
(
r
)
=>
{
r
}
None
=>
{
this
.tcx
()
.sess
.span_err
(
span
,
&
format!
(
"explicit lifetime bound required"
)[]);
span_err!
(
this
.tcx
()
.sess
,
span
,
E0228
,
"explicit lifetime bound required"
);
ty
::
ReStatic
}
}
...
...
@@ -1779,8 +1768,7 @@ fn prohibit_projections<'tcx>(tcx: &ty::ctxt<'tcx>,
bindings
:
&
[
ConvertedBinding
<
'tcx
>
])
{
for
binding
in
bindings
.iter
()
.take
(
1
)
{
tcx
.sess
.span_err
(
binding
.span
,
span_err!
(
tcx
.sess
,
binding
.span
,
E0229
,
"associated type bindings are not allowed here"
);
}
}
src/librustc_typeck/check/closure.rs
浏览文件 @
0c5225c5
...
...
@@ -50,10 +50,9 @@ pub fn check_expr_closure<'a,'tcx>(fcx: &FnCtxt<'a,'tcx>,
check_unboxed_closure
(
fcx
,
expr
,
kind
,
decl
,
body
,
None
);
fcx
.ccx.tcx.sess
.span_err
(
expr
.span
,
span_err!
(
fcx
.ccx.tcx.sess
,
expr
.span
,
E0187
,
"can't infer the
\"
kind
\"
of the closure, explicitly annotate it. e.g.
\
`|&:| {}`"
);
`|&:| {
{}
}`"
);
},
Some
((
sig
,
kind
))
=>
{
check_unboxed_closure
(
fcx
,
expr
,
kind
,
decl
,
body
,
Some
(
sig
));
...
...
src/librustc_typeck/check/compare_method.rs
浏览文件 @
0c5225c5
...
...
@@ -59,23 +59,21 @@ pub fn compare_impl_method<'tcx>(tcx: &ty::ctxt<'tcx>,
(
&
ty
::
StaticExplicitSelfCategory
,
&
ty
::
StaticExplicitSelfCategory
)
=>
{}
(
&
ty
::
StaticExplicitSelfCategory
,
_
)
=>
{
tcx
.sess
.span_err
(
impl_m_span
,
format!
(
"method `{}` has a `{}` declaration in the impl,
\
span_err!
(
tcx
.sess
,
impl_m_span
,
E0185
,
"method `{}` has a `{}` declaration in the impl,
\
but not in the trait"
,
token
::
get_name
(
trait_m
.name
),
ppaux
::
explicit_self_category_to_str
(
&
impl_m
.explicit_self
))
.as_slice
())
;
&
impl_m
.explicit_self
));
return
;
}
(
_
,
&
ty
::
StaticExplicitSelfCategory
)
=>
{
tcx
.sess
.span_err
(
impl_m_span
,
format!
(
"method `{}` has a `{}` declaration in the trait,
\
span_err!
(
tcx
.sess
,
impl_m_span
,
E0186
,
"method `{}` has a `{}` declaration in the trait,
\
but not in the impl"
,
token
::
get_name
(
trait_m
.name
),
ppaux
::
explicit_self_category_to_str
(
&
trait_m
.explicit_self
))
.as_slice
())
;
&
trait_m
.explicit_self
));
return
;
}
_
=>
{
...
...
@@ -400,11 +398,10 @@ fn check_region_bounds_on_impl_method<'tcx>(tcx: &ty::ctxt<'tcx>,
// are zero. Since I don't quite know how to phrase things at
// the moment, give a kind of vague error message.
if
trait_params
.len
()
!=
impl_params
.len
()
{
tcx
.sess
.span_err
(
span
,
&
format!
(
"lifetime parameters or bounds on method `{}` do
\
span_err!
(
tcx
.sess
,
span
,
E0195
,
"lifetime parameters or bounds on method `{}` do
\
not match the trait declaration"
,
token
::
get_name
(
impl_m
.name
))
[])
;
token
::
get_name
(
impl_m
.name
));
return
false
;
}
...
...
src/librustc_typeck/check/mod.rs
浏览文件 @
0c5225c5
...
...
@@ -801,16 +801,15 @@ fn check_trait_on_unimplemented<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
})
{
Some
(
_
)
=>
(),
None
=>
{
ccx
.tcx.sess
.span_err
(
attr
.span
,
format!
(
"there is no type parameter
\
span_err!
(
ccx
.tcx.sess
,
attr
.span
,
E0230
,
"there is no type parameter
\
{} on trait {}"
,
s
,
item
.ident
.as_str
())
.as_slice
());
s
,
item
.ident
.as_str
());
}
},
// `{:1}` and `{}` are not to be used
Position
::
ArgumentIs
(
_
)
|
Position
::
ArgumentNext
=>
{
ccx
.tcx.sess
.span_err
(
attr
.span
,
span_err!
(
ccx
.tcx.sess
,
attr
.span
,
E0231
,
"only named substitution
\
parameters are allowed"
);
}
...
...
@@ -818,7 +817,7 @@ fn check_trait_on_unimplemented<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
}
}
}
else
{
ccx
.tcx.sess
.span_err
(
attr
.span
,
span_err!
(
ccx
.tcx.sess
,
attr
.span
,
E0232
,
"this attribute must have a value,
\
eg `#[rustc_on_unimplemented =
\"
foo
\"
]`"
)
}
...
...
@@ -2099,8 +2098,8 @@ fn lookup_method_for_for_loop<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
let
trait_did
=
match
fcx
.tcx
()
.lang_items
.require
(
IteratorItem
)
{
Ok
(
trait_did
)
=>
trait_did
,
Err
(
ref
err_string
)
=>
{
fcx
.tcx
()
.sess
.span_err
(
iterator_expr
.span
,
&
err_string
[]);
span_err!
(
fcx
.tcx
()
.sess
,
iterator_expr
.span
,
E0233
,
"{}"
,
&
err_string
[]);
return
fcx
.tcx
()
.types.err
}
};
...
...
@@ -2123,11 +2122,10 @@ fn lookup_method_for_for_loop<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
if
!
ty
::
type_is_error
(
true_expr_type
)
{
let
ty_string
=
fcx
.infcx
()
.ty_to_string
(
true_expr_type
);
fcx
.tcx
()
.sess
.span_err
(
iterator_expr
.span
,
&
format!
(
"`for` loop expression has type `{}` which does
\
span_err!
(
fcx
.tcx
()
.sess
,
iterator_expr
.span
,
E0234
,
"`for` loop expression has type `{}` which does
\
not implement the `Iterator` trait;
\
maybe try .iter()"
,
ty_string
)[]);
maybe try .iter()"
,
ty_string
);
}
fcx
.tcx
()
.types.err
}
...
...
@@ -2162,11 +2160,10 @@ fn lookup_method_for_for_loop<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
fcx
.tcx
()
.types.err
}
_
=>
{
fcx
.tcx
()
.sess
.span_err
(
iterator_expr
.span
,
&
format!
(
"`next` method of the `Iterator`
\
span_err!
(
fcx
.tcx
()
.sess
,
iterator_expr
.span
,
E0239
,
"`next` method of the `Iterator`
\
trait has an unexpected type `{}`"
,
fcx
.infcx
()
.ty_to_string
(
return_type
))
[]);
fcx
.infcx
()
.ty_to_string
(
return_type
));
fcx
.tcx
()
.types.err
}
}
...
...
@@ -3880,10 +3877,8 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
Err
(
type_error
)
=>
{
let
type_error_description
=
ty
::
type_err_to_str
(
tcx
,
&
type_error
);
fcx
.tcx
()
.sess
.span_err
(
path
.span
,
&
format!
(
"structure constructor specifies a
\
span_err!
(
fcx
.tcx
()
.sess
,
path
.span
,
E0235
,
"structure constructor specifies a
\
structure of type `{}`, but this
\
structure has type `{}`: {}"
,
fcx
.infcx
()
...
...
@@ -3891,7 +3886,7 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
fcx
.infcx
()
.ty_to_string
(
actual_structure_type
),
type_error_description
)
[])
;
type_error_description
);
ty
::
note_and_explain_type_err
(
tcx
,
&
type_error
);
}
}
...
...
@@ -4012,7 +4007,7 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
ty
::
mk_struct
(
tcx
,
did
,
tcx
.mk_substs
(
substs
))
}
else
{
tcx
.sess
.span_err
(
expr
.span
,
"N
o lang item for range syntax"
);
span_err!
(
tcx
.sess
,
expr
.span
,
E0236
,
"n
o lang item for range syntax"
);
fcx
.tcx
()
.types.err
}
}
...
...
@@ -4022,7 +4017,7 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
let
substs
=
Substs
::
new_type
(
vec!
[],
vec!
[]);
ty
::
mk_struct
(
tcx
,
did
,
tcx
.mk_substs
(
substs
))
}
else
{
tcx
.sess
.span_err
(
expr
.span
,
"N
o lang item for range syntax"
);
span_err!
(
tcx
.sess
,
expr
.span
,
E0237
,
"n
o lang item for range syntax"
);
fcx
.tcx
()
.types.err
}
}
...
...
@@ -4872,8 +4867,7 @@ fn push_explicit_parameters_from_segment_to_substs<'a, 'tcx>(
}
ast
::
ParenthesizedParameters
(
ref
data
)
=>
{
fcx
.tcx
()
.sess
.span_err
(
span
,
span_err!
(
fcx
.tcx
()
.sess
,
span
,
E0238
,
"parenthesized parameters may only be used with a trait"
);
push_explicit_parenthesized_parameters_from_segment_to_substs
(
fcx
,
space
,
span
,
type_defs
,
data
,
substs
);
...
...
src/librustc_typeck/check/vtable.rs
浏览文件 @
0c5225c5
...
...
@@ -51,7 +51,7 @@ pub fn check_object_cast<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
{
let
object_trait
=
object_trait
(
&
object_trait_ty
);
if
!
mutability_allowed
(
referent_mutbl
,
target_mutbl
)
{
fcx
.tcx
()
.sess
.span_err
(
source_expr
.span
,
span_err!
(
fcx
.tcx
()
.sess
,
source_expr
.span
,
E0188
,
"types differ in mutability"
);
}
else
{
// Ensure that if &'a T is cast to &'b Trait, then T : Trait
...
...
@@ -70,19 +70,17 @@ pub fn check_object_cast<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
}
(
_
,
&
ty
::
ty_uniq
(
..
))
=>
{
fcx
.ccx.tcx.sess
.span_err
(
source_expr
.span
,
&
format!
(
"can only cast an boxed pointer
\
span_err!
(
fcx
.ccx.tcx.sess
,
source_expr
.span
,
E0189
,
"can only cast a boxed pointer
\
to a boxed object, not a {}"
,
ty
::
ty_sort_string
(
fcx
.tcx
(),
source_ty
))[]
);
ty
::
ty_sort_string
(
fcx
.tcx
(),
source_ty
)
);
}
(
_
,
&
ty
::
ty_rptr
(
..
))
=>
{
fcx
.ccx.tcx.sess
.span_err
(
source_expr
.span
,
&
format!
(
"can only cast a &-pointer
\
span_err!
(
fcx
.ccx.tcx.sess
,
source_expr
.span
,
E0190
,
"can only cast a &-pointer
\
to an &-object, not a {}"
,
ty
::
ty_sort_string
(
fcx
.tcx
(),
source_ty
))
[])
;
ty
::
ty_sort_string
(
fcx
.tcx
(),
source_ty
));
}
_
=>
{
...
...
@@ -272,11 +270,10 @@ fn check_object_type_binds_all_associated_types<'tcx>(tcx: &ty::ctxt<'tcx>,
}
for
(
trait_def_id
,
name
)
in
associated_types
.into_iter
()
{
tcx
.sess
.span_err
(
span
,
format!
(
"the value of the associated type `{}` (from the trait `{}`) must be specified"
,
span_err!
(
tcx
.sess
,
span
,
E0191
,
"the value of the associated type `{}` (from the trait `{}`) must be specified"
,
name
.user_string
(
tcx
),
ty
::
item_path_str
(
tcx
,
trait_def_id
))
.as_slice
())
;
ty
::
item_path_str
(
tcx
,
trait_def_id
));
}
}
...
...
src/librustc_typeck/check/wf.rs
浏览文件 @
0c5225c5
...
...
@@ -81,10 +81,9 @@ fn check_item_well_formed(&mut self, item: &ast::Item) {
match
ccx
.tcx.lang_items
.to_builtin_kind
(
trait_ref
.def_id
)
{
Some
(
ty
::
BoundSend
)
|
Some
(
ty
::
BoundSync
)
=>
{}
Some
(
_
)
|
None
=>
{
ccx
.tcx.sess
.span_err
(
item
.span
,
format!
(
"negative impls are currently
\
allowed just for `Send` and `Sync`"
)
.as_slice
())
span_err!
(
ccx
.tcx.sess
,
item
.span
,
E0192
,
"negative impls are currently
\
allowed just for `Send` and `Sync`"
)
}
}
}
...
...
@@ -302,12 +301,11 @@ fn reject_non_type_param_bounds<'tcx>(tcx: &ty::ctxt<'tcx>,
fn
report_bound_error
<
't
>
(
tcx
:
&
ty
::
ctxt
<
't
>
,
span
:
Span
,
bounded_ty
:
ty
::
Ty
<
't
>
)
{
tcx
.sess
.span_err
(
span
,
format!
(
"cannot bound type `{}`, where clause
\
span_err!
(
tcx
.sess
,
span
,
E0193
,
"cannot bound type `{}`, where clause
\
bounds may only be attached to types involving
\
type parameters"
,
bounded_ty
.repr
(
tcx
))
.as_slice
())
bounded_ty
.repr
(
tcx
))
}
fn
is_ty_param
(
ty
:
ty
::
Ty
)
->
bool
{
...
...
@@ -326,10 +324,9 @@ fn reject_shadowing_type_parameters<'tcx>(tcx: &ty::ctxt<'tcx>,
for
method_param
in
generics
.types
.get_slice
(
subst
::
FnSpace
)
.iter
()
{
if
impl_params
.contains
(
&
method_param
.name
)
{
tcx
.sess
.span_err
(
span
,
&*
format!
(
"type parameter `{}` shadows another type parameter of the same name"
,
token
::
get_name
(
method_param
.name
)));
span_err!
(
tcx
.sess
,
span
,
E0194
,
"type parameter `{}` shadows another type parameter of the same name"
,
token
::
get_name
(
method_param
.name
));
}
}
}
...
...
src/librustc_typeck/check/writeback.rs
浏览文件 @
0c5225c5
...
...
@@ -416,7 +416,7 @@ fn report_error(&self, e: infer::fixup_err) {
ResolvingUnboxedClosure
(
_
)
=>
{
let
span
=
self
.reason
.span
(
self
.tcx
);
s
elf
.tcx.sess
.span_err
(
span
,
s
pan_err!
(
self
.tcx.sess
,
span
,
E0196
,
"cannot determine a type for this
\
unboxed closure"
)
}
...
...
src/librustc_typeck/coherence/impls.rs
浏览文件 @
0c5225c5
...
...
@@ -34,10 +34,9 @@ fn visit_item(&mut self, item: &'v ast::Item) {
match
trait_ref
.self_ty
()
.sty
{
ty
::
ty_struct
(
..
)
|
ty
::
ty_enum
(
..
)
=>
{}
_
=>
{
self
.tcx.sess
.span_err
(
item
.span
,
&
format!
(
"builtin traits can only be
\
implemented on structs or enums"
)[]);
span_err!
(
self
.tcx.sess
,
item
.span
,
E0209
,
"builtin traits can only be
\
implemented on structs or enums"
);
}
}
}
...
...
src/librustc_typeck/coherence/mod.rs
浏览文件 @
0c5225c5
...
...
@@ -490,24 +490,21 @@ fn check_implementations_of_copy(&self) {
match
ty
::
can_type_implement_copy
(
&
param_env
,
span
,
self_type
)
{
Ok
(())
=>
{}
Err
(
ty
::
FieldDoesNotImplementCopy
(
name
))
=>
{
tcx
.sess
.span_err
(
span
,
&
format!
(
"the trait `Copy` may not be
\
span_err!
(
tcx
.sess
,
span
,
E0204
,
"the trait `Copy` may not be
\
implemented for this type; field
\
`{}` does not implement `Copy`"
,
token
::
get_name
(
name
))
[])
token
::
get_name
(
name
))
}
Err
(
ty
::
VariantDoesNotImplementCopy
(
name
))
=>
{
tcx
.sess
.span_err
(
span
,
&
format!
(
"the trait `Copy` may not be
\
span_err!
(
tcx
.sess
,
span
,
E0205
,
"the trait `Copy` may not be
\
implemented for this type; variant
\
`{}` does not implement `Copy`"
,
token
::
get_name
(
name
))
[])
token
::
get_name
(
name
))
}
Err
(
ty
::
TypeIsStructural
)
=>
{
tcx
.sess
.span_err
(
span
,
span_err!
(
tcx
.sess
,
span
,
E0206
,
"the trait `Copy` may not be implemented
\
for this type; type is not a structure or
\
enumeration"
)
...
...
src/librustc_typeck/coherence/orphan.rs
浏览文件 @
0c5225c5
...
...
@@ -89,13 +89,11 @@ fn visit_item(&mut self, item: &'v ast::Item) {
}
Err
(
traits
::
OrphanCheckErr
::
UncoveredTy
(
param_ty
))
=>
{
if
!
ty
::
has_attr
(
self
.tcx
,
trait_def_id
,
"old_orphan_check"
)
{
self
.tcx.sess
.span_err
(
item
.span
,
format!
(
span_err!
(
self
.tcx.sess
,
item
.span
,
E0210
,
"type parameter `{}` is not constrained by any local type;
\
only traits defined in the current crate can be implemented
\
for a type parameter"
,
param_ty
.user_string
(
self
.tcx
))
.as_slice
())
;
param_ty
.user_string
(
self
.tcx
));
self
.tcx.sess
.span_note
(
item
.span
,
format!
(
"for a limited time, you can add
\
...
...
src/librustc_typeck/coherence/unsafety.rs
浏览文件 @
0c5225c5
...
...
@@ -37,8 +37,7 @@ fn visit_item(&mut self, item: &'v ast::Item) {
match
unsafety
{
ast
::
Unsafety
::
Normal
=>
{
/* OK */
}
ast
::
Unsafety
::
Unsafe
=>
{
self
.tcx.sess
.span_err
(
item
.span
,
span_err!
(
self
.tcx.sess
,
item
.span
,
E0197
,
"inherent impls cannot be declared as unsafe"
);
}
}
...
...
@@ -49,24 +48,21 @@ fn visit_item(&mut self, item: &'v ast::Item) {
match
(
trait_def
.unsafety
,
unsafety
,
polarity
)
{
(
ast
::
Unsafety
::
Unsafe
,
ast
::
Unsafety
::
Unsafe
,
ast
::
ImplPolarity
::
Negative
)
=>
{
self
.tcx.sess
.span_err
(
item
.span
,
format!
(
"negative implementations are not unsafe"
)
.as_slice
());
span_err!
(
self
.tcx.sess
,
item
.span
,
E0198
,
"negative implementations are not unsafe"
);
}
(
ast
::
Unsafety
::
Normal
,
ast
::
Unsafety
::
Unsafe
,
_
)
=>
{
self
.tcx.sess
.span_err
(
item
.span
,
format!
(
"implementing the trait `{}` is not unsafe"
,
trait_ref
.user_string
(
self
.tcx
))
.as_slice
());
span_err!
(
self
.tcx.sess
,
item
.span
,
E0199
,
"implementing the trait `{}` is not unsafe"
,
trait_ref
.user_string
(
self
.tcx
));
}
(
ast
::
Unsafety
::
Unsafe
,
ast
::
Unsafety
::
Normal
,
ast
::
ImplPolarity
::
Positive
)
=>
{
self
.tcx.sess
.span_err
(
item
.span
,
format!
(
"the trait `{}` requires an `unsafe impl` declaration"
,
trait_ref
.user_string
(
self
.tcx
))
.as_slice
());
span_err!
(
self
.tcx.sess
,
item
.span
,
E0200
,
"the trait `{}` requires an `unsafe impl` declaration"
,
trait_ref
.user_string
(
self
.tcx
));
}
(
ast
::
Unsafety
::
Unsafe
,
...
...
src/librustc_typeck/collect.rs
浏览文件 @
0c5225c5
...
...
@@ -452,7 +452,7 @@ fn convert_methods<'a,'tcx,'i,I>(ccx: &CollectCtxt<'a, 'tcx>,
let
mut
seen_methods
=
FnvHashSet
();
for
m
in
ms
{
if
!
seen_methods
.insert
(
m
.pe_ident
()
.repr
(
tcx
))
{
tcx
.sess
.span_err
(
m
.span
,
"duplicate method in trait impl"
);
span_err!
(
tcx
.sess
,
m
.span
,
E0201
,
"duplicate method in trait impl"
);
}
let
m_def_id
=
local_def
(
m
.id
);
...
...
@@ -608,7 +608,7 @@ fn convert(ccx: &CollectCtxt, it: &ast::Item) {
}
ast
::
TypeImplItem
(
ref
typedef
)
=>
{
if
opt_trait_ref
.is_none
()
{
tcx
.sess
.span_err
(
typedef
.span
,
span_err!
(
tcx
.sess
,
typedef
.span
,
E0202
,
"associated items are not allowed in inherent impls"
);
}
...
...
@@ -1160,7 +1160,8 @@ fn add_unsized_bound<'a,'tcx>(ccx: &CollectCtxt<'a,'tcx>,
assert
!
(
ptr
.bound_lifetimes
.is_empty
());
unbound
=
Some
(
ptr
.trait_ref
.clone
());
}
else
{
ccx
.tcx.sess
.span_err
(
span
,
"type parameter has more than one relaxed default
\
span_err!
(
ccx
.tcx.sess
,
span
,
E0203
,
"type parameter has more than one relaxed default
\
bound, only one is supported"
);
}
}
...
...
@@ -1690,11 +1691,10 @@ fn enforce_impl_ty_params_are_constrained<'tcx>(tcx: &ty::ctxt<'tcx>,
impl trait, self type, or predicates"
,
param_ty
.user_string
(
tcx
))
.as_slice
());
}
else
{
tcx
.sess
.span_err
(
ty_param
.span
,
format!
(
"the type parameter `{}` is not constrained by the
\
span_err!
(
tcx
.sess
,
ty_param
.span
,
E0207
,
"the type parameter `{}` is not constrained by the
\
impl trait, self type, or predicates"
,
param_ty
.user_string
(
tcx
))
.as_slice
())
;
param_ty
.user_string
(
tcx
));
tcx
.sess
.span_help
(
ty_param
.span
,
format!
(
"you can temporarily opt out of this rule by placing
\
...
...
src/librustc_typeck/diagnostics.rs
浏览文件 @
0c5225c5
...
...
@@ -100,7 +100,67 @@
E0178
,
E0182
,
E0183
,
E0184
E0184
,
E0185
,
E0186
,
E0187
,
// can't infer the kind of the closure
E0188
,
// types differ in mutability
E0189
,
// can only cast a boxed pointer to a boxed object
E0190
,
// can only cast a &-pointer to an &-object
E0191
,
// value of the associated type must be specified
E0192
,
// negative imples are allowed just fo `Send` and `Sync`
E0193
,
// cannot bound type where clause bounds may only be attached to types
// involving type parameters
E0194
,
E0195
,
// lifetime parameters or bounds on method do not match the trait declaration
E0196
,
// cannot determine a type for this unboxed closure
E0197
,
// inherent impls cannot be declared as unsafe
E0198
,
// negative implementations are not unsafe
E0199
,
// implementing trait is not unsafe
E0200
,
// trait requires an `unsafe impl` declaration
E0201
,
// duplicate method in trait impl
E0202
,
// associated items are not allowed in inherint impls
E0203
,
// type parameter has more than one relaxed default bound,
// and only one is supported
E0204
,
// trait `Copy` may not be implemented for this type; field
// does not implement `Copy`
E0205
,
// trait `Copy` may not be implemented for this type; variant
// does not implement `copy`
E0206
,
// trait `Copy` may not be implemented for this type; type is
// not a structure or enumeration
E0207
,
// type parameter is not constrained by the impl trait, self type, or predicate
E0208
,
E0209
,
// builtin traits can only be implemented on structs or enums
E0210
,
// type parameter is not constrained by any local type
E0211
,
E0212
,
// cannot extract an associated type from a higher-ranked trait bound
E0213
,
// associated types are not accepted in this context
E0214
,
// parenthesized parameters may only be used with a trait
E0215
,
// angle-bracket notation is not stable with `Fn`
E0216
,
// parenthetical notation is only stable with `Fn`
E0217
,
// ambiguous associated type, defined in multiple supertraits
E0218
,
// no associated type defined
E0219
,
// associated type defined in higher-ranked supertrait
E0220
,
// associated type not found for type parameter
E0221
,
// ambiguous associated type in bounds
E0222
,
// variadic function must have C calling convention
E0223
,
// ambiguous associated type
E0224
,
// at least one non-builtin train is required for an object type
E0225
,
// only the builtin traits can be used as closure or object bounds
E0226
,
// only a single explicit lifetime bound is permitted
E0227
,
// ambiguous lifetime bound, explicit lifetime bound required
E0228
,
// explicit lifetime bound required
E0229
,
// associated type bindings are not allowed here
E0230
,
// there is no type parameter on trait
E0231
,
// only named substitution parameters are allowed
E0232
,
// this attribute must have a value
E0233
,
E0234
,
// `for` loop expression has type which does not implement the `Iterator` trait
E0235
,
// structure constructor specifies a structure of type but
E0236
,
// no lang item for range syntax
E0237
,
// no lang item for range syntax
E0238
,
// parenthesized parameters may only be used with a trait
E0239
// `next` method of `Iterator` trait has unexpected type
}
__
build_diagnostic_array!
{
DIAGNOSTICS
}
...
...
src/librustc_typeck/lib.rs
浏览文件 @
0c5225c5
...
...
@@ -206,11 +206,11 @@ fn require_same_types<'a, 'tcx, M>(tcx: &ty::ctxt<'tcx>,
match
result
{
Ok
(
_
)
=>
true
,
Err
(
ref
terr
)
=>
{
tcx
.sess
.span_err
(
span
,
&
format!
(
"{}: {}"
,
span_err!
(
tcx
.sess
,
span
,
E0211
,
"{}: {}"
,
msg
(),
ty
::
type_err_to_str
(
tcx
,
terr
))
[])
;
terr
));
ty
::
note_and_explain_type_err
(
tcx
,
terr
);
false
}
...
...
src/librustc_typeck/variance.rs
浏览文件 @
0c5225c5
...
...
@@ -1055,7 +1055,7 @@ fn write(&self) {
// attribute and report an error with various results if found.
if
ty
::
has_attr
(
tcx
,
item_def_id
,
"rustc_variance"
)
{
let
found
=
item_variances
.repr
(
tcx
);
tcx
.sess
.span_err
(
tcx
.map
.span
(
item_id
)
,
&
found
[]);
span_err!
(
tcx
.sess
,
tcx
.map
.span
(
item_id
),
E0208
,
"{}"
,
&
found
[]);
}
let
newly_added
=
tcx
.item_variance_map
.borrow_mut
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录