Skip to content

Commit

Permalink
Rollup merge of rust-lang#29777 - Manishearth:const_irrefutable_diag,…
Browse files Browse the repository at this point in the history
… r=eddyb

None
  • Loading branch information
Manishearth committed Nov 11, 2015
2 parents 3ef3fd9 + 9be0ba5 commit 98b5285
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
22 changes: 15 additions & 7 deletions src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -632,7 +640,7 @@ enum NameSearchType {
#[derive(Copy, Clone)]
enum BareIdentifierPatternResolution {
FoundStructOrEnumVariant(Def, LastPrivate),
FoundConst(Def, LastPrivate),
FoundConst(Def, LastPrivate, Name),
BareIdentifierPatternUnresolved
}

Expand Down Expand Up @@ -2685,7 +2693,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
renamed)
);
}
FoundConst(def, lp) if const_ok => {
FoundConst(def, lp, _) if const_ok => {
debug!("(resolving pattern) resolving `{}` to \
constant",
renamed);
Expand All @@ -2700,11 +2708,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
depth: 0
});
}
FoundConst(..) => {
FoundConst(def, _, name) => {
resolve_error(
self,
pattern.span,
ResolutionError::OnlyIrrefutablePatternsAllowedHere
ResolutionError::OnlyIrrefutablePatternsAllowedHere(def.def_id(), name)
);
}
BareIdentifierPatternUnresolved => {
Expand Down Expand Up @@ -2929,7 +2937,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
return FoundStructOrEnumVariant(def, LastMod(AllPublic));
}
def @ DefConst(..) | def @ DefAssociatedConst(..) => {
return FoundConst(def, LastMod(AllPublic));
return FoundConst(def, LastMod(AllPublic), name);
}
DefStatic(..) => {
resolve_error(self,
Expand Down
28 changes: 28 additions & 0 deletions src/test/compile-fail/const-pattern-irrefutable.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

mod foo {
const b: u8 = 2; //~ NOTE constant defined here
const d: u8 = 2; //~ NOTE constant defined here
}

use foo::b as c; //~ NOTE constant imported here
use foo::d; //~ NOTE constant imported here

const a: u8 = 2; //~ NOTE constant defined here

fn main() {
let a = 4; //~ ERROR only irrefutable
//~^ NOTE there already is a constant in scope
let c = 4; //~ ERROR only irrefutable
//~^ NOTE there already is a constant in scope
let d = 4; //~ ERROR only irrefutable
//~^ NOTE there already is a constant in scope
}

0 comments on commit 98b5285

Please sign in to comment.