diff options
| author | Felix S. Klock II <pnkfelix@pnkfx.org> | 2016-09-05 12:56:29 +0200 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2016-09-16 17:49:06 +0000 |
| commit | 7611709a1f6030f716b8dd4a2bfc813f80ba3005 (patch) | |
| tree | ec49462bf8ed72378d76342cc35ccb3bbc7e42cd | |
| parent | bf91022627b45d272e3895bcecb3798b519f0983 (diff) | |
| download | rust-7611709a1f6030f716b8dd4a2bfc813f80ba3005.tar.gz rust-7611709a1f6030f716b8dd4a2bfc813f80ba3005.zip | |
Fix issue #36036.
We were treating an associated type as unsized even when the concrete instantiation was actually sized. Fix is to normalize before checking if it is sized.
| -rw-r--r-- | src/librustc/ty/layout.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/issue-36036-associated-type-layout.rs | 36 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index 195cece6bc4..7c944020e93 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -803,10 +803,10 @@ impl<'a, 'gcx, 'tcx> Layout { ty::TyRef(_, ty::TypeAndMut { ty: pointee, .. }) | ty::TyRawPtr(ty::TypeAndMut { ty: pointee, .. }) => { let non_zero = !ty.is_unsafe_ptr(); + let pointee = normalize_associated_type(infcx, pointee); if pointee.is_sized(tcx, &infcx.parameter_environment, DUMMY_SP) { Scalar { value: Pointer, non_zero: non_zero } } else { - let pointee = normalize_associated_type(infcx, pointee); let unsized_part = tcx.struct_tail(pointee); let meta = match unsized_part.sty { ty::TySlice(_) | ty::TyStr => { diff --git a/src/test/run-pass/issue-36036-associated-type-layout.rs b/src/test/run-pass/issue-36036-associated-type-layout.rs new file mode 100644 index 00000000000..4ee3be0eb7b --- /dev/null +++ b/src/test/run-pass/issue-36036-associated-type-layout.rs @@ -0,0 +1,36 @@ +// 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. + +// Issue 36036: computing the layout of a type composed from another +// trait's associated type caused compiler to ICE when the associated +// type was allowed to be unsized, even though the known instantiated +// type is itself sized. + +#![allow(dead_code)] + +trait Context { + type Container: ?Sized; +} + +impl Context for u16 { + type Container = u8; +} + +struct Wrapper<C: Context+'static> { + container: &'static C::Container +} + +fn foobar(_: Wrapper<u16>) {} + +static VALUE: u8 = 0; + +fn main() { + foobar(Wrapper { container: &VALUE }); +} |
