From 3b390e5420e9fd8b142f90cc5fd74ddb85ce9ef4 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 16 Jan 2018 12:15:25 -0500 Subject: [PATCH] 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. --- .../borrow_check/nll/universal_regions.rs | 13 +++------ .../run-pass/nll/issue-47153-generic-const.rs | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 src/test/run-pass/nll/issue-47153-generic-const.rs 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 or the MIT license +// , 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 { x: T } + +impl Bar { + const B: bool = true; +} + +fn main() { }