Skip to content

Commit

Permalink
Rollup merge of rust-lang#28686 - eefriedman:unresolved-path-error, r…
Browse files Browse the repository at this point in the history
…=nikomatsakis

The behavior here isn't really ideal, but we can't really do much better
given the current state of constant evaluation.

The changes to ExprUseVisitor are to avoid a compile error; apparently
that bit of code is extremely sensitive to changes in other areas of the
compiler.

Fixes rust-lang#28670, and probably a bunch of duplicates.
  • Loading branch information
Manishearth committed Oct 2, 2015
2 parents b1d2a49 + 1763fcb commit 9155edf
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/librustc/middle/const_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ pub enum ErrKind {
ShiftRightWithOverflow,
MissingStructField,
NonConstPath,
UnresolvedPath,
ExpectedConstTuple,
ExpectedConstStruct,
TupleIndexOutOfBounds,
Expand Down Expand Up @@ -403,7 +404,8 @@ impl ConstEvalErr {
ShiftLeftWithOverflow => "attempted left shift with overflow".into_cow(),
ShiftRightWithOverflow => "attempted right shift with overflow".into_cow(),
MissingStructField => "nonexistent struct field".into_cow(),
NonConstPath => "non-constant path in constant expr".into_cow(),
NonConstPath => "non-constant path in constant expression".into_cow(),
UnresolvedPath => "unresolved path in constant expression".into_cow(),
ExpectedConstTuple => "expected constant tuple".into_cow(),
ExpectedConstStruct => "expected constant struct".into_cow(),
TupleIndexOutOfBounds => "tuple index out of bounds".into_cow(),
Expand Down Expand Up @@ -895,7 +897,20 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &ty::ctxt<'tcx>,
}
}
hir::ExprPath(..) => {
let opt_def = tcx.def_map.borrow().get(&e.id).map(|d| d.full_def());
let opt_def = if let Some(def) = tcx.def_map.borrow().get(&e.id) {
// After type-checking, def_map contains definition of the
// item referred to by the path. During type-checking, it
// can contain the raw output of path resolution, which
// might be a partially resolved path.
// FIXME: There's probably a better way to make sure we don't
// panic here.
if def.depth != 0 {
signal!(e, UnresolvedPath);
}
Some(def.full_def())
} else {
None
};
let (const_expr, const_ty) = match opt_def {
Some(def::DefConst(def_id)) => {
if let Some(node_id) = tcx.map.as_local_node_id(def_id) {
Expand Down
14 changes: 14 additions & 0 deletions src/test/compile-fail/invalid-path-in-const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// 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.

fn main() {
fn f(a: [u8; u32::DOESNOTEXIST]) {}
//~^ ERROR unresolved path in constant expression
}

0 comments on commit 9155edf

Please sign in to comment.