diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2018-01-16 12:15:25 -0500 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2018-01-16 12:45:39 -0500 |
| commit | 3b390e5420e9fd8b142f90cc5fd74ddb85ce9ef4 (patch) | |
| tree | cf233bf30efaa973cda174e4340e5d14a7f382c4 | |
| parent | da569fa9ddf8369a9809184d43c600dc06bd4b4d (diff) | |
| download | rust-3b390e5420e9fd8b142f90cc5fd74ddb85ce9ef4.tar.gz rust-3b390e5420e9fd8b142f90cc5fd74ddb85ce9ef4.zip | |
remove bogus assertion and comments
The code (incorrectly) assumed that constants could not have generics in scope, but it's not really a problem if they do.
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/universal_regions.rs | 13 | ||||
| -rw-r--r-- | src/test/run-pass/nll/issue-47153-generic-const.rs | 27 |
2 files changed, 31 insertions, 9 deletions
diff --git a/src/librustc_mir/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs index 45604d52958..7703235b4b7 100644 --- a/src/librustc_mir/borrow_check/nll/universal_regions.rs +++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs @@ -584,13 +584,9 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> { DefiningTy::FnDef(_, substs) => substs, - // When we encounter other sorts of constant - // expressions, such as the `22` in `[foo; 22]`, we can - // get the type `usize` here. For now, just return an - // empty vector of substs in this case, since there are no - // generics in scope in such expressions right now. + // When we encounter a constant body, just return whatever + // substitutions are in scope for that constant. DefiningTy::Const(_) => { - assert!(identity_substs.is_empty()); identity_substs } }; @@ -654,9 +650,8 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> { sig.inputs_and_output() } - // This happens on things like `[foo; 22]`. Hence, no - // inputs, one output, but it seems like we need a more - // general way to handle this category of MIR. + // For a constant body, there are no inputs, and one + // "output" (the type of the constant). DefiningTy::Const(ty) => ty::Binder::dummy(tcx.mk_type_list(iter::once(ty))), } } diff --git a/src/test/run-pass/nll/issue-47153-generic-const.rs b/src/test/run-pass/nll/issue-47153-generic-const.rs new file mode 100644 index 00000000000..9708ca1c142 --- /dev/null +++ b/src/test/run-pass/nll/issue-47153-generic-const.rs @@ -0,0 +1,27 @@ +// Copyright 2016 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. + +// Regression test for #47153: constants in a generic context (such as +// a trait) used to ICE. + +#![feature(nll)] +#![allow(warnings)] + +trait Foo { + const B: bool = true; +} + +struct Bar<T> { x: T } + +impl<T> Bar<T> { + const B: bool = true; +} + +fn main() { } |
