提交 d8062a93 编写于 作者: M Manish Goregaokar

Add more comprehensive diagnostics for irrefutable pattern error with constants

Fixes #7526
上级 8c743a95
......@@ -153,7 +153,7 @@ pub enum ResolutionError<'a> {
/// error E0413: declaration shadows an enum variant or unit-like struct in scope
DeclarationShadowsEnumVariantOrUnitLikeStruct(Name),
/// error E0414: only irrefutable patterns allowed here
OnlyIrrefutablePatternsAllowedHere,
OnlyIrrefutablePatternsAllowedHere(DefId, Name),
/// error E0415: identifier is bound more than once in this parameter list
IdentifierBoundMoreThanOnceInParameterList(&'a str),
/// error E0416: identifier is bound more than once in the same pattern
......@@ -283,8 +283,16 @@ fn resolve_error<'b, 'a:'b, 'tcx:'a>(resolver: &'b Resolver<'a, 'tcx>, span: syn
scope",
name);
},
ResolutionError::OnlyIrrefutablePatternsAllowedHere => {
ResolutionError::OnlyIrrefutablePatternsAllowedHere(did, name) => {
span_err!(resolver.session, span, E0414, "only irrefutable patterns allowed here");
resolver.session.span_note(span, "there already is a constant in scope sharing the same name as this pattern");
if let Some(sp) = resolver.ast_map.span_if_local(did) {
resolver.session.span_note(sp, "constant defined here");
}
if let Some(directive) = resolver.current_module.import_resolutions.borrow().get(&name) {
let item = resolver.ast_map.expect_item(directive.value_id);
resolver.session.span_note(item.span, "constant imported here");
}
},
ResolutionError::IdentifierBoundMoreThanOnceInParameterList(identifier) => {
span_err!(resolver.session, span, E0415,
......@@ -632,7 +640,7 @@ enum NameSearchType {
#[derive(Copy, Clone)]
enum BareIdentifierPatternResolution {
FoundStructOrEnumVariant(Def, LastPrivate),
FoundConst(Def, LastPrivate),
FoundConst(Def, LastPrivate, Name),
BareIdentifierPatternUnresolved
}
......@@ -2685,7 +2693,7 @@ struct or enum variant",
renamed)
);
}
FoundConst(def, lp) if const_ok => {
FoundConst(def, lp, _) if const_ok => {
debug!("(resolving pattern) resolving `{}` to \
constant",
renamed);
......@@ -2700,11 +2708,11 @@ struct or enum variant",
depth: 0
});
}
FoundConst(..) => {
FoundConst(def, _, name) => {
resolve_error(
self,
pattern.span,
ResolutionError::OnlyIrrefutablePatternsAllowedHere
ResolutionError::OnlyIrrefutablePatternsAllowedHere(def.def_id(), name)
);
}
BareIdentifierPatternUnresolved => {
......@@ -2929,7 +2937,7 @@ fn resolve_bare_identifier_pattern(&mut self, name: Name, span: Span)
return FoundStructOrEnumVariant(def, LastMod(AllPublic));
}
def @ DefConst(..) | def @ DefAssociatedConst(..) => {
return FoundConst(def, LastMod(AllPublic));
return FoundConst(def, LastMod(AllPublic), name);
}
DefStatic(..) => {
resolve_error(self,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册