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.
This commit is contained in:
commit
9155edf6a2
2 changed files with 31 additions and 2 deletions
|
@ -367,6 +367,7 @@ pub enum ErrKind {
|
||||||
ShiftRightWithOverflow,
|
ShiftRightWithOverflow,
|
||||||
MissingStructField,
|
MissingStructField,
|
||||||
NonConstPath,
|
NonConstPath,
|
||||||
|
UnresolvedPath,
|
||||||
ExpectedConstTuple,
|
ExpectedConstTuple,
|
||||||
ExpectedConstStruct,
|
ExpectedConstStruct,
|
||||||
TupleIndexOutOfBounds,
|
TupleIndexOutOfBounds,
|
||||||
|
@ -403,7 +404,8 @@ impl ConstEvalErr {
|
||||||
ShiftLeftWithOverflow => "attempted left shift with overflow".into_cow(),
|
ShiftLeftWithOverflow => "attempted left shift with overflow".into_cow(),
|
||||||
ShiftRightWithOverflow => "attempted right shift with overflow".into_cow(),
|
ShiftRightWithOverflow => "attempted right shift with overflow".into_cow(),
|
||||||
MissingStructField => "nonexistent struct field".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(),
|
ExpectedConstTuple => "expected constant tuple".into_cow(),
|
||||||
ExpectedConstStruct => "expected constant struct".into_cow(),
|
ExpectedConstStruct => "expected constant struct".into_cow(),
|
||||||
TupleIndexOutOfBounds => "tuple index out of bounds".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(..) => {
|
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 {
|
let (const_expr, const_ty) = match opt_def {
|
||||||
Some(def::DefConst(def_id)) => {
|
Some(def::DefConst(def_id)) => {
|
||||||
if let Some(node_id) = tcx.map.as_local_node_id(def_id) {
|
if let Some(node_id) = tcx.map.as_local_node_id(def_id) {
|
||||||
|
|
14
src/test/compile-fail/invalid-path-in-const.rs
Normal file
14
src/test/compile-fail/invalid-path-in-const.rs
Normal file
|
@ -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
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue