diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-10-02 13:07:22 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-10-02 13:07:22 +0530 |
| commit | 9155edf6a2c2991a94a901fc749f9067d45d68dc (patch) | |
| tree | 6c708280d88fff09af6b52c8697f7fd63ccbfbac | |
| parent | b1d2a49b87ff0041b4c6507f5be04083a0d0aa02 (diff) | |
| parent | 1763fcb36d85767fa1fee4c2de66fc2855633fcd (diff) | |
| download | rust-9155edf6a2c2991a94a901fc749f9067d45d68dc.tar.gz rust-9155edf6a2c2991a94a901fc749f9067d45d68dc.zip | |
Rollup merge of #28686 - eefriedman:unresolved-path-error, r=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 #28670, and probably a bunch of duplicates.
| -rw-r--r-- | src/librustc/middle/const_eval.rs | 19 | ||||
| -rw-r--r-- | src/test/compile-fail/invalid-path-in-const.rs | 14 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index 2d74525e4ed..d3f427e770c 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -367,6 +367,7 @@ pub enum ErrKind { ShiftRightWithOverflow, MissingStructField, NonConstPath, + UnresolvedPath, ExpectedConstTuple, ExpectedConstStruct, TupleIndexOutOfBounds, @@ -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(), @@ -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) { diff --git a/src/test/compile-fail/invalid-path-in-const.rs b/src/test/compile-fail/invalid-path-in-const.rs new file mode 100644 index 00000000000..3c4ad5a56ec --- /dev/null +++ b/src/test/compile-fail/invalid-path-in-const.rs @@ -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 +} |
