From 7611709a1f6030f716b8dd4a2bfc813f80ba3005 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Mon, 5 Sep 2016 12:56:29 +0200 Subject: [PATCH 1/2] 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. --- src/librustc/ty/layout.rs | 2 +- .../issue-36036-associated-type-layout.rs | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/issue-36036-associated-type-layout.rs diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index 195cece6bc4e0..7c944020e9352 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 0000000000000..4ee3be0eb7b81 --- /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 or the MIT license +// , 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 { + container: &'static C::Container +} + +fn foobar(_: Wrapper) {} + +static VALUE: u8 = 0; + +fn main() { + foobar(Wrapper { container: &VALUE }); +} From ca42e0dfd9150f445374fedea397215fa32053e9 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Fri, 26 Aug 2016 19:23:42 +0300 Subject: [PATCH 2/2] Make `private_in_public` compatibility lint warn-by-default again --- src/librustc/lint/builtin.rs | 2 +- src/librustc_privacy/diagnostics.rs | 4 ++++ src/test/compile-fail/issue-28514.rs | 2 ++ src/test/compile-fail/issue-30079.rs | 1 + src/test/compile-fail/private-in-public-warn.rs | 4 ++-- src/test/compile-fail/private-variant-and-crate-reexport.rs | 1 + 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index f0ddcdc07e120..3230a08c27630 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -114,7 +114,7 @@ declare_lint! { declare_lint! { pub PRIVATE_IN_PUBLIC, - Deny, + Warn, "detect private items in public interfaces not caught by the old implementation" } diff --git a/src/librustc_privacy/diagnostics.rs b/src/librustc_privacy/diagnostics.rs index 891b6adea7893..66afe5835bf6f 100644 --- a/src/librustc_privacy/diagnostics.rs +++ b/src/librustc_privacy/diagnostics.rs @@ -17,6 +17,8 @@ A private trait was used on a public type parameter bound. Erroneous code examples: ```compile_fail,E0445 +#![deny(private_in_public)] + trait Foo { fn dummy(&self) { } } @@ -45,6 +47,8 @@ E0446: r##" A private type was used in a public type signature. Erroneous code example: ```compile_fail,E0446 +#![deny(private_in_public)] + mod Foo { struct Bar(u32); diff --git a/src/test/compile-fail/issue-28514.rs b/src/test/compile-fail/issue-28514.rs index 6ee375503c2af..fb25166531dcb 100644 --- a/src/test/compile-fail/issue-28514.rs +++ b/src/test/compile-fail/issue-28514.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![deny(private_in_public)] + pub use inner::C; mod inner { diff --git a/src/test/compile-fail/issue-30079.rs b/src/test/compile-fail/issue-30079.rs index 55c58ed021b27..6a54e53f14638 100644 --- a/src/test/compile-fail/issue-30079.rs +++ b/src/test/compile-fail/issue-30079.rs @@ -8,6 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![deny(private_in_public)] #![allow(unused)] struct SemiPriv; diff --git a/src/test/compile-fail/private-in-public-warn.rs b/src/test/compile-fail/private-in-public-warn.rs index 6d6af77be92b0..455de37aee96f 100644 --- a/src/test/compile-fail/private-in-public-warn.rs +++ b/src/test/compile-fail/private-in-public-warn.rs @@ -13,8 +13,8 @@ #![feature(associated_consts)] #![feature(associated_type_defaults)] -#![allow(dead_code)] -#![allow(unused_variables)] +#![deny(private_in_public)] +#![allow(unused)] #![allow(improper_ctypes)] mod types { diff --git a/src/test/compile-fail/private-variant-and-crate-reexport.rs b/src/test/compile-fail/private-variant-and-crate-reexport.rs index ce029e7eff7fc..dce533e73feea 100644 --- a/src/test/compile-fail/private-variant-and-crate-reexport.rs +++ b/src/test/compile-fail/private-variant-and-crate-reexport.rs @@ -8,6 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![deny(private_in_public)] #![allow(dead_code)] extern crate core;