diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 538a3c89bef72362e42bcc33dc49e98f27c277e0..5e0a40b90dd377dca3a871edefcce948dad1ffa0 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -2287,6 +2287,12 @@ fn subtypes_require(cx: ctxt, seen: &mut ~[DefId], ::util::ppaux::ty_to_str(cx, ty)); let r = match get(ty).sty { + // fixed length vectors need special treatment compared to + // normal vectors, since they don't necessarily have the + // possibilty to have length zero. + ty_vec(_, vstore_fixed(0)) => false, // don't need no contents + ty_vec(mt, vstore_fixed(_)) => type_requires(cx, seen, r_ty, mt.ty), + ty_nil | ty_bot | ty_bool | diff --git a/src/test/compile-fail/uninstantiable-fixed-length-vec.rs b/src/test/compile-fail/uninstantiable-fixed-length-vec.rs new file mode 100644 index 0000000000000000000000000000000000000000..bb2c3247e030f1f73cb482c8111812d15ea58598 --- /dev/null +++ b/src/test/compile-fail/uninstantiable-fixed-length-vec.rs @@ -0,0 +1,26 @@ +// Copyright 2014 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. + +// issue #11659, the compiler needs to know that a fixed length vector +// always requires instantiable contents to instantiable itself +// (unlike a ~[] vector which can have length zero). + +// ~ to avoid infinite size. +struct Uninstantiable { //~ ERROR cannot be instantiated without an instance of itself + p: ~[Uninstantiable, .. 1] +} + +struct Instantiable { p: ~[Instantiable, .. 0] } + + +fn main() { + let _ = None::; + let _ = Instantiable { p: ~([]) }; +}