From b2a634f8c97aec3b5b956601fbcf0f44354a8a5a Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 25 Jan 2018 16:22:58 -0800 Subject: [PATCH 1/5] Call non-git beta builds simply x.y.z-beta We can't use git commands to compute a prerelease version when we're building from a source tarball, or if git is otherwise unavailable. We'll just call such builds `x.y.z-beta`, without a prerelease. --- src/bootstrap/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index a10868b84d264..ae53c054e414b 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -771,7 +771,11 @@ impl Build { fn release(&self, num: &str) -> String { match &self.config.channel[..] { "stable" => num.to_string(), - "beta" => format!("{}-beta.{}", num, self.beta_prerelease_version()), + "beta" => if self.rust_info.is_git() { + format!("{}-beta.{}", num, self.beta_prerelease_version()) + } else { + format!("{}-beta", num) + }, "nightly" => format!("{}-nightly", num), _ => format!("{}-dev", num), } From 2fefceef22a0867d8c09744b08e8174a77b7ceac Mon Sep 17 00:00:00 2001 From: Ryan Cumming Date: Sat, 27 Jan 2018 12:14:12 +1100 Subject: [PATCH 2/5] Fix ICE on const eval of union field MIR's `Const::get_field()` attempts to retrieve the value for a given field in a constant. In the case of a union constant it was falling through to a generic `const_get_elt` based on the field index. As union fields don't have an index this caused an ICE in `llvm_field_index`. Fix by simply returning the current value when accessing any field in a union. This works because all union fields start at byte offset 0. The added test uses `const_fn` it ensure the field is extracted using MIR's const evaluation. The crash is reproducible without it, however. Fixes #47788 --- src/librustc_trans/mir/constant.rs | 5 +++- .../run-pass/union/union-const-eval-field.rs | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/union/union-const-eval-field.rs diff --git a/src/librustc_trans/mir/constant.rs b/src/librustc_trans/mir/constant.rs index d836d796c4113..e6917a964f42f 100644 --- a/src/librustc_trans/mir/constant.rs +++ b/src/librustc_trans/mir/constant.rs @@ -140,7 +140,10 @@ impl<'a, 'tcx> Const<'tcx> { } } _ => { - const_get_elt(self.llval, layout.llvm_field_index(i)) + match layout.fields { + layout::FieldPlacement::Union(_) => self.llval, + _ => const_get_elt(self.llval, layout.llvm_field_index(i)), + } } } } diff --git a/src/test/run-pass/union/union-const-eval-field.rs b/src/test/run-pass/union/union-const-eval-field.rs new file mode 100644 index 0000000000000..a58b8bc34cd05 --- /dev/null +++ b/src/test/run-pass/union/union-const-eval-field.rs @@ -0,0 +1,26 @@ +// Copyright 2018 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. + +#![feature(const_fn)] + +union DummyUnion { + field1: i32, + field2: i32, +} + +const fn read_field() -> i32 { + const UNION: DummyUnion = DummyUnion { field1: 5 }; + const FIELD: i32 = unsafe { UNION.field2 }; + FIELD +} + +fn main() { + assert_eq!(read_field(), 5); +} From 90fe0493eec654f25beaf699cefc27af7d060a6e Mon Sep 17 00:00:00 2001 From: Ryan Cumming Date: Sat, 27 Jan 2018 14:18:18 +1100 Subject: [PATCH 3/5] Expand union test to include different types --- .../run-pass/union/union-const-eval-field.rs | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/test/run-pass/union/union-const-eval-field.rs b/src/test/run-pass/union/union-const-eval-field.rs index a58b8bc34cd05..f83f49f298b90 100644 --- a/src/test/run-pass/union/union-const-eval-field.rs +++ b/src/test/run-pass/union/union-const-eval-field.rs @@ -10,17 +10,36 @@ #![feature(const_fn)] +type Field1 = i32; +type Field2 = f32; +type Field3 = i64; + union DummyUnion { - field1: i32, - field2: i32, + field1: Field1, + field2: Field2, + field3: Field3, +} + +const FLOAT1_AS_I32: i32 = 1065353216; +const UNION: DummyUnion = DummyUnion { field1: FLOAT1_AS_I32 }; + +const fn read_field1() -> Field1 { + const FIELD1: Field1 = unsafe { UNION.field1 }; + FIELD1 +} + +const fn read_field2() -> Field2 { + const FIELD2: Field2 = unsafe { UNION.field2 }; + FIELD2 } -const fn read_field() -> i32 { - const UNION: DummyUnion = DummyUnion { field1: 5 }; - const FIELD: i32 = unsafe { UNION.field2 }; - FIELD +const fn read_field3() -> Field3 { + const FIELD3: Field3 = unsafe { UNION.field3 }; + FIELD3 } fn main() { - assert_eq!(read_field(), 5); + assert_eq!(read_field1(), FLOAT1_AS_I32); + assert_eq!(read_field2(), 1.0); + assert_eq!(read_field3(), unsafe { UNION.field3 }); } From 06e74a930da1a5d721e27cd0be3fdb0c2f4ec786 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Wed, 31 Jan 2018 00:23:25 +0200 Subject: [PATCH 4/5] rustc_trans: keep LLVM types for trait objects anonymous. --- src/librustc_trans/type_of.rs | 4 +++- src/test/codegen/function-arguments.rs | 4 ++-- src/test/run-pass/issue-47638.rs | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/test/run-pass/issue-47638.rs diff --git a/src/librustc_trans/type_of.rs b/src/librustc_trans/type_of.rs index 8d9bc07fe5630..e57d027dc8237 100644 --- a/src/librustc_trans/type_of.rs +++ b/src/librustc_trans/type_of.rs @@ -57,7 +57,9 @@ fn uncached_llvm_type<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ty::TyClosure(..) | ty::TyGenerator(..) | ty::TyAdt(..) | - ty::TyDynamic(..) | + // FIXME(eddyb) producing readable type names for trait objects can result + // in problematically distinct types due to HRTB and subtyping (see #47638). + // ty::TyDynamic(..) | ty::TyForeign(..) | ty::TyStr => { let mut name = String::with_capacity(32); diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index f8945a6ee8d93..0e98d3f9050a8 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -122,13 +122,13 @@ pub fn unsafe_slice(_: &[UnsafeInner]) { pub fn str(_: &[u8]) { } -// CHECK: @trait_borrow(%"core::ops::drop::Drop"* nonnull %arg0.0, {}* noalias nonnull readonly %arg0.1) +// CHECK: @trait_borrow({}* nonnull %arg0.0, {}* noalias nonnull readonly %arg0.1) // FIXME #25759 This should also have `nocapture` #[no_mangle] pub fn trait_borrow(_: &Drop) { } -// CHECK: @trait_box(%"core::ops::drop::Drop"* noalias nonnull, {}* noalias nonnull readonly) +// CHECK: @trait_box({}* noalias nonnull, {}* noalias nonnull readonly) #[no_mangle] pub fn trait_box(_: Box) { } diff --git a/src/test/run-pass/issue-47638.rs b/src/test/run-pass/issue-47638.rs new file mode 100644 index 0000000000000..6f627b2a3c137 --- /dev/null +++ b/src/test/run-pass/issue-47638.rs @@ -0,0 +1,18 @@ +// Copyright 2018 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. + +fn id<'c, 'b>(f: &'c &'b Fn(&i32)) -> &'c &'b Fn(&'static i32) { + f +} + +fn main() { + let f: &Fn(&i32) = &|x| {}; + id(&f); +} From 0a339818d7ffb794629e0df88f0591364f04bf90 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 1 Feb 2018 14:07:52 -0800 Subject: [PATCH 5/5] Update Cargo on beta --- src/tools/cargo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/cargo b/src/tools/cargo index 64326d735a0c8..8c93e08953646 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 64326d735a0c883ad6aa0a2c49fe12b5b61307e1 +Subproject commit 8c93e089536467783957fec23b0f2627bb6ce357