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