From: Pietro Albini Date: Tue, 26 Jun 2018 09:35:41 +0000 (+0200) Subject: Rollup merge of #51786 - cuviper:stat64-pointers, r=Mark-Simulacrum X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=2348dc5b3f8403b28d25e6b95a534b7bb5100fb9;hp=490f49fd2ab15ae25a6ffeae2de8f667a521f19d;p=rust.git Rollup merge of #51786 - cuviper:stat64-pointers, r=Mark-Simulacrum Remove unnecessary stat64 pointer casts In effect, these just casted `&mut stat64` to `*mut stat64`, twice. That's harmless, but it masked a problem when this was copied to new code calling `fstatat`, which takes a pointer to `struct stat`. That will be fixed by #51785, but let's remove the unnecessary casts here too. --- diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index cbb42a04bdd..4fd6c81e597 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -44,7 +44,7 @@ pub fn pkgname(builder: &Builder, component: &str) -> String { } else if component == "rustfmt" { format!("{}-{}", component, builder.rustfmt_package_vers()) } else if component == "llvm-tools" { - format!("{}-{}", component, builder.llvm_tools_vers()) + format!("{}-{}", component, builder.llvm_tools_package_vers()) } else { assert!(component.starts_with("rust")); format!("{}-{}", component, builder.rust_package_vers()) @@ -1303,6 +1303,7 @@ fn run(self, builder: &Builder) { let cargo_installer = builder.ensure(Cargo { stage, target }); let rustfmt_installer = builder.ensure(Rustfmt { stage, target }); let rls_installer = builder.ensure(Rls { stage, target }); + let llvm_tools_installer = builder.ensure(LlvmTools { stage, target }); let mingw_installer = builder.ensure(Mingw { host: target }); let analysis_installer = builder.ensure(Analysis { compiler: builder.compiler(stage, self.host), @@ -1340,6 +1341,7 @@ fn run(self, builder: &Builder) { tarballs.push(cargo_installer); tarballs.extend(rls_installer.clone()); tarballs.extend(rustfmt_installer.clone()); + tarballs.extend(llvm_tools_installer.clone()); tarballs.push(analysis_installer); tarballs.push(std_installer); if builder.config.docs { @@ -1740,7 +1742,7 @@ fn run(self, builder: &Builder) { cmd.arg(builder.package_vers(&builder.release_num("cargo"))); cmd.arg(builder.package_vers(&builder.release_num("rls"))); cmd.arg(builder.package_vers(&builder.release_num("rustfmt"))); - cmd.arg(builder.llvm_tools_vers()); + cmd.arg(builder.llvm_tools_package_vers()); cmd.arg(addr); builder.create_dir(&distdir(builder)); @@ -1755,7 +1757,6 @@ fn run(self, builder: &Builder) { #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct LlvmTools { pub stage: u32, - pub compiler: Compiler, pub target: Interned, } @@ -1770,19 +1771,16 @@ fn should_run(run: ShouldRun) -> ShouldRun { fn make_run(run: RunConfig) { run.builder.ensure(LlvmTools { stage: run.builder.top_stage, - compiler: run.builder.compiler(run.builder.top_stage, run.target), target: run.target, }); } fn run(self, builder: &Builder) -> Option { - let compiler = self.compiler; - let host = compiler.host; - let stage = self.stage; + let target = self.target; assert!(builder.config.extended); - builder.info(&format!("Dist LlvmTools stage{} ({})", stage, host)); + builder.info(&format!("Dist LlvmTools stage{} ({})", stage, target)); let src = builder.src.join("src/llvm"); let name = pkgname(builder, "llvm-tools"); @@ -1794,9 +1792,9 @@ fn run(self, builder: &Builder) -> Option { // Prepare the image directory for tool in LLVM_TOOLS { let exe = builder - .llvm_out(host) + .llvm_out(target) .join("bin") - .join(exe(tool, &compiler.host)); + .join(exe(tool, &target)); builder.install(&exe, &image.join("bin"), 0o755); } @@ -1806,6 +1804,7 @@ fn run(self, builder: &Builder) -> Option { builder.create_dir(&overlay); builder.install(&src.join("README.txt"), &overlay, 0o644); builder.install(&src.join("LICENSE.TXT"), &overlay, 0o644); + builder.create(&overlay.join("version"), &builder.llvm_tools_vers()); // Generate the installer tarball let mut cmd = rust_installer(builder); @@ -1817,12 +1816,12 @@ fn run(self, builder: &Builder) -> Option { .arg("--work-dir").arg(&tmpdir(builder)) .arg("--output-dir").arg(&distdir(builder)) .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, host)) + .arg(format!("--package-name={}-{}", name, target)) .arg("--legacy-manifest-dirs=rustlib,cargo") .arg("--component-name=llvm-tools"); builder.run(&mut cmd); - Some(distdir(builder).join(format!("{}-{}.tar.gz", name, host))) + Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target))) } } diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index ae37d67e5d7..b5d450b8839 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -973,24 +973,11 @@ fn rustfmt_package_vers(&self) -> String { self.package_vers(&self.release_num("rustfmt")) } - fn llvm_tools_vers(&self) -> String { - // japaric: should we use LLVM version here? - // let stdout = build_helper::output( - // Command::new(self.llvm_out(self.config.build).join("build/bin/llvm-size")) - // .arg("--version"), - // ); - - // for line in stdout.lines() { - // if line.contains("LLVM version") { - // if let Some(vers) = line.split_whitespace().nth(2) { - // return vers.to_string(); - // } - // } - // } - - // panic!("The output of $LLVM_TOOL has changed; \ - // please fix `bootstrap::Build.llvm_tools_vers`"); + fn llvm_tools_package_vers(&self) -> String { + self.package_vers(&self.rust_version()) + } + fn llvm_tools_vers(&self) -> String { self.rust_version() } diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index 31635ffa53c..08bd9289ab4 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -1119,6 +1119,12 @@ impl<'a, T: ?Sized + Unpin> PinMut<'a, T> { pub fn new(reference: &'a mut T) -> PinMut<'a, T> { PinMut { inner: reference } } + + /// Get a mutable reference to the data inside of this `PinMut`. + #[unstable(feature = "pin", issue = "49150")] + pub fn get_mut(this: PinMut<'a, T>) -> &'a mut T { + this.inner + } } @@ -1150,21 +1156,21 @@ pub fn reborrow<'b>(&'b mut self) -> PinMut<'b, T> { /// the data out of the mutable reference you receive when you call this /// function. #[unstable(feature = "pin", issue = "49150")] - pub unsafe fn get_mut(this: PinMut<'a, T>) -> &'a mut T { + pub unsafe fn get_mut_unchecked(this: PinMut<'a, T>) -> &'a mut T { this.inner } /// Construct a new pin by mapping the interior value. /// - /// For example, if you wanted to get a `PinMut` of a field of something, you - /// could use this to get access to that field in one line of code. + /// For example, if you wanted to get a `PinMut` of a field of something, + /// you could use this to get access to that field in one line of code. /// /// This function is unsafe. You must guarantee that the data you return /// will not move so long as the argument value does not move (for example, /// because it is one of the fields of that value), and also that you do /// not move out of the argument you receive to the interior function. #[unstable(feature = "pin", issue = "49150")] - pub unsafe fn map(this: PinMut<'a, T>, f: F) -> PinMut<'a, U> where + pub unsafe fn map_unchecked(this: PinMut<'a, T>, f: F) -> PinMut<'a, U> where F: FnOnce(&mut T) -> &mut U { PinMut { inner: f(this.inner) } diff --git a/src/libcore/option.rs b/src/libcore/option.rs index e633d80a63c..20bc173f7e1 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -275,7 +275,7 @@ pub fn as_mut(&mut self) -> Option<&mut T> { #[unstable(feature = "pin", issue = "49150")] pub fn as_pin_mut<'a>(self: PinMut<'a, Self>) -> Option> { unsafe { - PinMut::get_mut(self).as_mut().map(|x| PinMut::new_unchecked(x)) + PinMut::get_mut_unchecked(self).as_mut().map(|x| PinMut::new_unchecked(x)) } } diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 02046edd218..484c41b3a79 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -3536,12 +3536,22 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr { this.expr_block(block, ThinVec::new()) }) }) - }, + } ExprKind::Closure( - capture_clause, asyncness, movability, ref decl, ref body, fn_decl_span) => - { - self.with_new_scopes(|this| { - if let IsAsync::Async(async_closure_node_id) = asyncness { + capture_clause, asyncness, movability, ref decl, ref body, fn_decl_span + ) => { + if let IsAsync::Async(async_closure_node_id) = asyncness { + let outer_decl = FnDecl { + inputs: decl.inputs.clone(), + output: FunctionRetTy::Default(fn_decl_span), + variadic: false, + }; + // We need to lower the declaration outside the new scope, because we + // have to conserve the state of being inside a loop condition for the + // closure argument types. + let fn_decl = self.lower_fn_decl(&outer_decl, None, false, false); + + self.with_new_scopes(|this| { // FIXME(cramertj) allow `async` non-`move` closures with if capture_clause == CaptureBy::Ref && !decl.inputs.is_empty() @@ -3561,11 +3571,6 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr { // Transform `async |x: u8| -> X { ... }` into // `|x: u8| future_from_generator(|| -> X { ... })` - let outer_decl = FnDecl { - inputs: decl.inputs.clone(), - output: FunctionRetTy::Default(fn_decl_span), - variadic: false, - }; let body_id = this.lower_body(Some(&outer_decl), |this| { let async_ret_ty = if let FunctionRetTy::Ty(ty) = &decl.output { Some(&**ty) @@ -3579,12 +3584,17 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr { }); hir::ExprClosure( this.lower_capture_clause(capture_clause), - this.lower_fn_decl(&outer_decl, None, false, false), + fn_decl, body_id, fn_decl_span, None, ) - } else { + }) + } else { + // Lower outside new scope to preserve `is_in_loop_condition`. + let fn_decl = self.lower_fn_decl(decl, None, false, false); + + self.with_new_scopes(|this| { let mut is_generator = false; let body_id = this.lower_body(Some(decl), |this| { let e = this.lower_expr(body); @@ -3618,13 +3628,13 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr { }; hir::ExprClosure( this.lower_capture_clause(capture_clause), - this.lower_fn_decl(decl, None, false, false), + fn_decl, body_id, fn_decl_span, generator_option, ) - } - }) + }) + } } ExprKind::Block(ref blk, opt_label) => { hir::ExprBlock(self.lower_block(blk, diff --git a/src/librustc/infer/canonical.rs b/src/librustc/infer/canonical.rs index 1164c332330..ef11cc0f493 100644 --- a/src/librustc/infer/canonical.rs +++ b/src/librustc/infer/canonical.rs @@ -29,7 +29,7 @@ //! For a more detailed look at what is happening here, check //! out the [chapter in the rustc guide][c]. //! -//! [c]: https://rust-lang-nursery.github.io/rustc-guide/traits-canonicalization.html +//! [c]: https://rust-lang-nursery.github.io/rustc-guide/traits/canonicalization.html use infer::{InferCtxt, InferOk, InferResult, RegionVariableOrigin, TypeVariableOrigin}; use rustc_data_structures::indexed_vec::Idx; @@ -274,7 +274,7 @@ pub fn fresh_inference_var_for_canonical_var( /// To get a good understanding of what is happening here, check /// out the [chapter in the rustc guide][c]. /// - /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits-canonicalization.html#processing-the-canonicalized-query-result + /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits/canonicalization.html#processing-the-canonicalized-query-result pub fn instantiate_query_result( &self, cause: &ObligationCause<'tcx>, @@ -458,7 +458,7 @@ fn unify_canonical_vars( /// To get a good understanding of what is happening here, check /// out the [chapter in the rustc guide][c]. /// - /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits-canonicalization.html#canonicalizing-the-query + /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits/canonicalization.html#canonicalizing-the-query pub fn canonicalize_query(&self, value: &V) -> (V::Canonicalized, CanonicalVarValues<'tcx>) where V: Canonicalize<'gcx, 'tcx>, @@ -497,7 +497,7 @@ pub fn canonicalize_query(&self, value: &V) -> (V::Canonicalized, CanonicalVa /// To get a good understanding of what is happening here, check /// out the [chapter in the rustc guide][c]. /// - /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits-canonicalization.html#canonicalizing-the-query-result + /// [c]: https://rust-lang-nursery.github.io/rustc-guide/traits/canonicalization.html#canonicalizing-the-query-result pub fn canonicalize_response( &self, value: &V, diff --git a/src/librustc/infer/higher_ranked/mod.rs b/src/librustc/infer/higher_ranked/mod.rs index 680d445a1bc..43ed80b474a 100644 --- a/src/librustc/infer/higher_ranked/mod.rs +++ b/src/librustc/infer/higher_ranked/mod.rs @@ -583,7 +583,7 @@ fn region_vars_confined_to_snapshot(&self, /// For more information about how skolemization for HRTBs works, see /// the [rustc guide]. /// - /// [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/trait-hrtb.html + /// [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/traits/hrtb.html pub fn skolemize_late_bound_regions(&self, binder: &ty::Binder) -> (T, SkolemizationMap<'tcx>) diff --git a/src/librustc/infer/lexical_region_resolve/README.md b/src/librustc/infer/lexical_region_resolve/README.md index 0086aed3e7c..6e1c4191173 100644 --- a/src/librustc/infer/lexical_region_resolve/README.md +++ b/src/librustc/infer/lexical_region_resolve/README.md @@ -3,7 +3,7 @@ > WARNING: This README is obsolete and will be removed soon! For > more info on how the current borrowck works, see the [rustc guide]. -[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir-borrowck.html +[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir/borrowck.html ## Terminology diff --git a/src/librustc/infer/region_constraints/README.md b/src/librustc/infer/region_constraints/README.md index 07b87e2012d..61603e6dee6 100644 --- a/src/librustc/infer/region_constraints/README.md +++ b/src/librustc/infer/region_constraints/README.md @@ -3,7 +3,7 @@ > WARNING: This README is obsolete and will be removed soon! For > more info on how the current borrowck works, see the [rustc guide]. -[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir-borrowck.html +[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir/borrowck.html ## Terminology diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 7d4a18c2a57..1f8c7f0064e 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -304,6 +304,12 @@ "warn about documentation intra links resolution failure" } +declare_lint! { + pub WHERE_CLAUSES_OBJECT_SAFETY, + Warn, + "checks the object safety of where clauses" +} + /// Does nothing as a lint pass, but registers some `Lint`s /// which are used by other parts of the compiler. #[derive(Copy, Clone)] @@ -358,6 +364,7 @@ fn get_lints(&self) -> LintArray { DUPLICATE_ASSOCIATED_TYPE_BINDINGS, DUPLICATE_MACRO_EXPORTS, INTRA_DOC_LINK_RESOLUTION_FAILURE, + WHERE_CLAUSES_OBJECT_SAFETY, ) } } diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index e478f493647..c7249c0aa20 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -14,7 +14,7 @@ //! For more information about how MIR-based region-checking works, //! see the [rustc guide]. //! -//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir-borrowck.html +//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir/borrowck.html use ich::{StableHashingContext, NodeIdHashingMode}; use util::nodemap::{FxHashMap, FxHashSet}; diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 87fb0a6b70a..ee6cb398acd 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -10,7 +10,7 @@ //! MIR datatypes and passes. See the [rustc guide] for more info. //! -//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir.html +//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir/index.html use graphviz::IntoCow; use hir::def::CtorKind; diff --git a/src/librustc/traits/coherence.rs b/src/librustc/traits/coherence.rs index 5a626e7b82c..6a6bebdbd86 100644 --- a/src/librustc/traits/coherence.rs +++ b/src/librustc/traits/coherence.rs @@ -11,8 +11,8 @@ //! See rustc guide chapters on [trait-resolution] and [trait-specialization] for more info on how //! this works. //! -//! [trait-resolution]: https://rust-lang-nursery.github.io/rustc-guide/trait-resolution.html -//! [trait-specialization]: https://rust-lang-nursery.github.io/rustc-guide/trait-specialization.html +//! [trait-resolution]: https://rust-lang-nursery.github.io/rustc-guide/traits/resolution.html +//! [trait-specialization]: https://rust-lang-nursery.github.io/rustc-guide/traits/specialization.html use hir::def_id::{DefId, LOCAL_CRATE}; use syntax_pos::DUMMY_SP; diff --git a/src/librustc/traits/mod.rs b/src/librustc/traits/mod.rs index 354debf87dc..15f0b8eebc1 100644 --- a/src/librustc/traits/mod.rs +++ b/src/librustc/traits/mod.rs @@ -10,7 +10,7 @@ //! Trait Resolution. See [rustc guide] for more info on how this works. //! -//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/trait-resolution.html +//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/traits/resolution.html pub use self::SelectionError::*; pub use self::FulfillmentErrorCode::*; diff --git a/src/librustc/traits/object_safety.rs b/src/librustc/traits/object_safety.rs index 6c67c10dc69..85bd5853d18 100644 --- a/src/librustc/traits/object_safety.rs +++ b/src/librustc/traits/object_safety.rs @@ -20,14 +20,16 @@ use super::elaborate_predicates; use hir::def_id::DefId; +use lint; use traits; use ty::{self, Ty, TyCtxt, TypeFoldable}; use ty::subst::Substs; use ty::util::ExplicitSelf; use std::borrow::Cow; use syntax::ast; +use syntax_pos::Span; -#[derive(Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum ObjectSafetyViolation { /// Self : Sized declared on the trait SizedSelf, @@ -56,6 +58,9 @@ pub fn error_msg(&self) -> Cow<'static, str> { ObjectSafetyViolation::Method(name, MethodViolationCode::ReferencesSelf) => format!("method `{}` references the `Self` type \ in its arguments or return type", name).into(), + ObjectSafetyViolation::Method(name, + MethodViolationCode::WhereClauseReferencesSelf(_)) => + format!("method `{}` references the `Self` type in where clauses", name).into(), ObjectSafetyViolation::Method(name, MethodViolationCode::Generic) => format!("method `{}` has generic type parameters", name).into(), ObjectSafetyViolation::Method(name, MethodViolationCode::NonStandardSelfType) => @@ -75,6 +80,9 @@ pub enum MethodViolationCode { /// e.g., `fn foo(&self, x: Self)` or `fn foo(&self) -> Self` ReferencesSelf, + /// e.g. `fn foo(&self) where Self: Clone` + WhereClauseReferencesSelf(Span), + /// e.g., `fn foo()` Generic, @@ -123,6 +131,22 @@ fn object_safety_violations_for_trait(self, trait_def_id: DefId) .filter_map(|item| { self.object_safety_violation_for_method(trait_def_id, &item) .map(|code| ObjectSafetyViolation::Method(item.name, code)) + }).filter(|violation| { + if let ObjectSafetyViolation::Method(_, + MethodViolationCode::WhereClauseReferencesSelf(span)) = violation { + // Using`CRATE_NODE_ID` is wrong, but it's hard to get a more precise id. + // It's also hard to get a use site span, so we use the method definition span. + self.lint_node_note( + lint::builtin::WHERE_CLAUSES_OBJECT_SAFETY, + ast::CRATE_NODE_ID, + *span, + &format!("the trait `{}` cannot be made into an object", + self.item_path_str(trait_def_id)), + &violation.error_msg()); + false + } else { + true + } }).collect(); // Check the trait itself. @@ -245,7 +269,10 @@ pub fn is_vtable_safe_method(self, return false; } - self.virtual_call_violation_for_method(trait_def_id, method).is_none() + match self.virtual_call_violation_for_method(trait_def_id, method) { + None | Some(MethodViolationCode::WhereClauseReferencesSelf(_)) => true, + Some(_) => false, + } } /// Returns `Some(_)` if this method cannot be called on a trait @@ -288,6 +315,18 @@ fn virtual_call_violation_for_method(self, return Some(MethodViolationCode::Generic); } + if self.predicates_of(method.def_id).predicates.into_iter() + // A trait object can't claim to live more than the concrete type, + // so outlives predicates will always hold. + .filter(|p| p.to_opt_type_outlives().is_none()) + .collect::>() + // Do a shallow visit so that `contains_illegal_self_type_reference` + // may apply it's custom visiting. + .visit_tys_shallow(|t| self.contains_illegal_self_type_reference(trait_def_id, t)) { + let span = self.def_span(method.def_id); + return Some(MethodViolationCode::WhereClauseReferencesSelf(span)); + } + None } diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 08af80543df..fe30b6a2f88 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -10,7 +10,7 @@ //! See [rustc guide] for more info on how this works. //! -//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/trait-resolution.html#selection +//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/traits/resolution.html#selection use self::SelectionCandidate::*; use self::EvaluationResult::*; @@ -1047,7 +1047,7 @@ fn insert_evaluation_cache(&mut self, // candidates. See [rustc guide] for more details. // // [rustc guide]: - // https://rust-lang-nursery.github.io/rustc-guide/trait-resolution.html#candidate-assembly + // https://rust-lang-nursery.github.io/rustc-guide/traits/resolution.html#candidate-assembly fn candidate_from_obligation<'o>(&mut self, stack: &TraitObligationStack<'o, 'tcx>) @@ -2415,7 +2415,7 @@ fn collect_predicates_for_types(&mut self, // type error. See [rustc guide] for more details. // // [rustc guide]: - // https://rust-lang-nursery.github.io/rustc-guide/trait-resolution.html#confirmation + // https://rust-lang-nursery.github.io/rustc-guide/traits/resolution.html#confirmation fn confirm_candidate(&mut self, obligation: &TraitObligation<'tcx>, diff --git a/src/librustc/traits/specialize/mod.rs b/src/librustc/traits/specialize/mod.rs index d3380628514..f6ae5113cb2 100644 --- a/src/librustc/traits/specialize/mod.rs +++ b/src/librustc/traits/specialize/mod.rs @@ -17,7 +17,7 @@ //! See the [rustc guide] for a bit more detail on how specialization //! fits together with the rest of the trait machinery. //! -//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/trait-specialization.html +//! [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/traits/specialization.html use super::{SelectionContext, FulfillmentContext}; use super::util::impl_trait_ref_and_oblig; diff --git a/src/librustc/ty/fold.rs b/src/librustc/ty/fold.rs index d459a6de0d6..307e1b23838 100644 --- a/src/librustc/ty/fold.rs +++ b/src/librustc/ty/fold.rs @@ -136,6 +136,20 @@ fn is_global(&self) -> bool { fn has_late_bound_regions(&self) -> bool { self.has_type_flags(TypeFlags::HAS_RE_LATE_BOUND) } + + /// A visitor that does not recurse into types, works like `fn walk_shallow` in `Ty`. + fn visit_tys_shallow(&self, visit: impl FnMut(Ty<'tcx>) -> bool) -> bool { + + pub struct Visitor(F); + + impl<'tcx, F: FnMut(Ty<'tcx>) -> bool> TypeVisitor<'tcx> for Visitor { + fn visit_ty(&mut self, ty: Ty<'tcx>) -> bool { + self.0(ty) + } + } + + self.visit_with(&mut Visitor(visit)) + } } /// The TypeFolder trait defines the actual *folding*. There is a diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 4a69fbdacc4..d8ca817ff2b 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1087,7 +1087,7 @@ pub fn is_self(&self) -> bool { /// /// [1]: http://smallcultfollowing.com/babysteps/blog/2013/10/29/intermingled-parameter-lists/ /// [2]: http://smallcultfollowing.com/babysteps/blog/2013/11/04/intermingled-parameter-lists/ -/// [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/trait-hrtb.html +/// [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/traits/hrtb.html #[derive(Clone, PartialEq, Eq, Hash, Copy, RustcEncodable, RustcDecodable, PartialOrd, Ord)] pub enum RegionKind { // Region bound in a type or fn declaration which will be diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 3252a2cd6ab..4fe9c34c140 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -1062,10 +1062,14 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { TyParam(ref param_ty) => write!(f, "{}", param_ty), TyAdt(def, substs) => cx.parameterized(f, substs, def.did, &[]), TyDynamic(data, r) => { - data.print(f, cx)?; let r = r.print_to_string(cx); if !r.is_empty() { - write!(f, " + {}", r) + write!(f, "(")?; + } + write!(f, "dyn ")?; + data.print(f, cx)?; + if !r.is_empty() { + write!(f, " + {})", r) } else { Ok(()) } diff --git a/src/librustc_borrowck/borrowck/README.md b/src/librustc_borrowck/borrowck/README.md index 6fc0ed47b80..8bc0b4969b8 100644 --- a/src/librustc_borrowck/borrowck/README.md +++ b/src/librustc_borrowck/borrowck/README.md @@ -3,7 +3,7 @@ > WARNING: This README is more or less obsolete, and will be removed > soon! The new system is described in the [rustc guide]. -[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir-borrowck.html +[rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/mir/borrowck.html This pass has the job of enforcing memory safety. This is a subtle topic. This docs aim to explain both the practice and the theory diff --git a/src/librustc_codegen_llvm/diagnostics.rs b/src/librustc_codegen_llvm/diagnostics.rs index 57cc33d09bb..94776f17c79 100644 --- a/src/librustc_codegen_llvm/diagnostics.rs +++ b/src/librustc_codegen_llvm/diagnostics.rs @@ -48,8 +48,3 @@ fn main() { "##, } - - -register_diagnostics! { - E0558 -} diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs index 990dc66c66a..df34891ff03 100644 --- a/src/librustc_data_structures/obligation_forest/mod.rs +++ b/src/librustc_data_structures/obligation_forest/mod.rs @@ -91,13 +91,14 @@ struct Node { obligation: O, state: Cell, - /// Obligations that depend on this obligation for their - /// completion. They must all be in a non-pending state. - dependents: Vec, /// The parent of a node - the original obligation of /// which it is a subobligation. Except for error reporting, - /// this is just another member of `dependents`. + /// it is just like any member of `dependents`. parent: Option, + + /// Obligations that depend on this obligation for their + /// completion. They must all be in a non-pending state. + dependents: Vec, } /// The state of one node in some tree within the forest. This @@ -193,15 +194,18 @@ fn register_obligation_at(&mut self, obligation: O, parent: Option) Entry::Occupied(o) => { debug!("register_obligation_at({:?}, {:?}) - duplicate of {:?}!", obligation, parent, o.get()); + let node = &mut self.nodes[o.get().get()]; if let Some(parent) = parent { - if self.nodes[o.get().get()].dependents.contains(&parent) { - debug!("register_obligation_at({:?}, {:?}) - duplicate subobligation", - obligation, parent); - } else { - self.nodes[o.get().get()].dependents.push(parent); + // If the node is already in `waiting_cache`, it's already + // been marked with a parent. (It's possible that parent + // has been cleared by `apply_rewrites`, though.) So just + // dump `parent` into `node.dependents`... unless it's + // already in `node.dependents` or `node.parent`. + if !node.dependents.contains(&parent) && Some(parent) != node.parent { + node.dependents.push(parent); } } - if let NodeState::Error = self.nodes[o.get().get()].state.get() { + if let NodeState::Error = node.state.get() { Err(()) } else { Ok(()) @@ -380,10 +384,7 @@ fn find_cycles_from_node

(&self, stack: &mut Vec, NodeState::Success => { node.state.set(NodeState::OnDfsStack); stack.push(index); - if let Some(parent) = node.parent { - self.find_cycles_from_node(stack, processor, parent.get()); - } - for dependent in &node.dependents { + for dependent in node.parent.iter().chain(node.dependents.iter()) { self.find_cycles_from_node(stack, processor, dependent.get()); } stack.pop(); @@ -427,7 +428,7 @@ fn error_at(&mut self, p: usize) -> Vec { } error_stack.extend( - node.dependents.iter().cloned().chain(node.parent).map(|x| x.get()) + node.parent.iter().chain(node.dependents.iter()).map(|x| x.get()) ); } @@ -437,11 +438,7 @@ fn error_at(&mut self, p: usize) -> Vec { #[inline] fn mark_neighbors_as_waiting_from(&self, node: &Node) { - if let Some(parent) = node.parent { - self.mark_as_waiting_from(&self.nodes[parent.get()]); - } - - for dependent in &node.dependents { + for dependent in node.parent.iter().chain(node.dependents.iter()) { self.mark_as_waiting_from(&self.nodes[dependent.get()]); } } @@ -588,8 +585,8 @@ impl Node { fn new(parent: Option, obligation: O) -> Node { Node { obligation, - parent, state: Cell::new(NodeState::Pending), + parent, dependents: vec![], } } diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 9ac22f8dceb..1d443258dc6 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -292,6 +292,11 @@ macro_rules! add_lint_group { reference: "issue TBD", edition: Some(Edition::Edition2018), }, + FutureIncompatibleInfo { + id: LintId::of(WHERE_CLAUSES_OBJECT_SAFETY), + reference: "issue #51443 ", + edition: None, + }, FutureIncompatibleInfo { id: LintId::of(DUPLICATE_ASSOCIATED_TYPE_BINDINGS), reference: "issue #50589 ", diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir/build/scope.rs index ee0a087a1dd..b9d6486d917 100644 --- a/src/librustc_mir/build/scope.rs +++ b/src/librustc_mir/build/scope.rs @@ -540,12 +540,12 @@ pub fn new_source_scope(&mut self, // ============== /// Finds the breakable scope for a given label. This is used for /// resolving `break` and `continue`. - pub fn find_breakable_scope(&mut self, + pub fn find_breakable_scope(&self, span: Span, label: region::Scope) - -> &mut BreakableScope<'tcx> { + -> &BreakableScope<'tcx> { // find the loop-scope with the correct id - self.breakable_scopes.iter_mut() + self.breakable_scopes.iter() .rev() .filter(|breakable_scope| breakable_scope.region_scope == label) .next() diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index e84586520b1..889073f6b4c 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -3846,7 +3846,14 @@ fn check_expr_kind(&self, } } - hir::ExprContinue(_) => { tcx.types.never } + hir::ExprContinue(destination) => { + if let Ok(_) = destination.target_id { + tcx.types.never + } else { + // There was an error, make typecheck fail + tcx.types.err + } + } hir::ExprRet(ref expr_opt) => { if self.ret_coercion.is_none() { struct_span_err!(self.tcx.sess, expr.span, E0572, diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 824346dab94..c24e20c5699 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1898,11 +1898,18 @@ fn codegen_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> Codegen } }); } else if attr.check_name("export_name") { - if let s @ Some(_) = attr.value_str() { - codegen_fn_attrs.export_name = s; + if let Some(s) = attr.value_str() { + if s.as_str().contains("\0") { + // `#[export_name = ...]` will be converted to a null-terminated string, + // so it may not contain any null characters. + struct_span_err!(tcx.sess, attr.span, E0648, + "`export_name` may not contain null characters") + .emit(); + } + codegen_fn_attrs.export_name = Some(s); } else { struct_span_err!(tcx.sess, attr.span, E0558, - "export_name attribute has invalid format") + "`export_name` attribute has invalid format") .span_label(attr.span, "did you mean #[export_name=\"*\"]?") .emit(); } diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs index 3f7e3529e96..b0b72256edc 100644 --- a/src/librustc_typeck/diagnostics.rs +++ b/src/librustc_typeck/diagnostics.rs @@ -3709,7 +3709,7 @@ fn main() {} Erroneous code example: ```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail) -#[export_name] // error: export_name attribute has invalid format +#[export_name] // error: `export_name` attribute has invalid format pub fn something() {} fn main() {} @@ -4545,6 +4545,15 @@ fn start(_: isize, _: *const *const u8) -> isize where (): Copy { ``` "##, +E0648: r##" +`export_name` attributes may not contain null characters (`\0`). + +```compile_fail,E0648 +#[export_name="\0foo"] // error: `export_name` may not contain null characters +pub fn bar() {} +``` +"##, + E0689: r##" This error indicates that the numeric value for the method being passed exists but the type of the numeric value or binding could not be identified. diff --git a/src/libstd/future.rs b/src/libstd/future.rs index 2da775fdc94..c1cc36f3b41 100644 --- a/src/libstd/future.rs +++ b/src/libstd/future.rs @@ -43,7 +43,7 @@ impl> !Unpin for GenFuture {} impl> Future for GenFuture { type Output = T::Return; fn poll(self: PinMut, cx: &mut task::Context) -> Poll { - set_task_cx(cx, || match unsafe { PinMut::get_mut(self).0.resume() } { + set_task_cx(cx, || match unsafe { PinMut::get_mut_unchecked(self).0.resume() } { GeneratorState::Yielded(()) => Poll::Pending, GeneratorState::Complete(x) => Poll::Ready(x), }) diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index a856e7736fb..75f038407c1 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -38,10 +38,13 @@ /// The multi-argument form of this macro panics with a string and has the /// [`format!`] syntax for building a string. /// +/// See also the macro [`compile_error!`], for raising errors during compilation. +/// /// [runwrap]: ../std/result/enum.Result.html#method.unwrap /// [`Option`]: ../std/option/enum.Option.html#method.unwrap /// [`Result`]: ../std/result/enum.Result.html /// [`format!`]: ../std/macro.format.html +/// [`compile_error!`]: ../std/macro.compile_error.html /// [book]: ../book/second-edition/ch09-01-unrecoverable-errors-with-panic.html /// /// # Current implementation @@ -305,13 +308,16 @@ pub mod builtin { /// Unconditionally causes compilation to fail with the given error message when encountered. /// /// This macro should be used when a crate uses a conditional compilation strategy to provide - /// better error messages for erroneous conditions. + /// better error messages for erroneous conditions. It's the compiler-level form of [`panic!`], + /// which emits an error at *runtime*, rather than during compilation. /// /// # Examples /// /// Two such examples are macros and `#[cfg]` environments. /// - /// Emit better compiler error if a macro is passed invalid values. + /// Emit better compiler error if a macro is passed invalid values. Without the final branch, + /// the compiler would still emit an error, but the error's message would not mention the two + /// valid values. /// /// ```compile_fail /// macro_rules! give_me_foo_or_bar { @@ -332,6 +338,8 @@ pub mod builtin { /// #[cfg(not(any(feature = "foo", feature = "bar")))] /// compile_error!("Either feature \"foo\" or \"bar\" must be enabled for this crate.") /// ``` + /// + /// [`panic!`]: ../std/macro.panic.html #[stable(feature = "compile_error_macro", since = "1.20.0")] #[macro_export] macro_rules! compile_error { diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs index 2c11c262488..451420ae88a 100644 --- a/src/libstd/panic.rs +++ b/src/libstd/panic.rs @@ -327,14 +327,9 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { impl<'a, F: Future> Future for AssertUnwindSafe { type Output = F::Output; - fn poll(mut self: PinMut, cx: &mut task::Context) -> Poll { - unsafe { - let pinned_field = PinMut::new_unchecked( - &mut PinMut::get_mut(self.reborrow()).0 - ); - - pinned_field.poll(cx) - } + fn poll(self: PinMut, cx: &mut task::Context) -> Poll { + let pinned_field = unsafe { PinMut::map_unchecked(self, |x| &mut x.0) }; + pinned_field.poll(cx) } } diff --git a/src/libstd/sys/mod.rs b/src/libstd/sys/mod.rs index 1231898ed7e..c44db3b1072 100644 --- a/src/libstd/sys/mod.rs +++ b/src/libstd/sys/mod.rs @@ -67,6 +67,7 @@ // (missing things in `libc` which is empty) so just omit everything // with an empty module #[unstable(issue = "0", feature = "std_internals")] + #[allow(missing_docs)] pub mod unix_ext {} } else { // On other platforms like Windows document the bare bones of unix @@ -80,11 +81,13 @@ pub mod unix_ext {} cfg_if! { if #[cfg(windows)] { // On windows we'll just be documenting what's already available + #[allow(missing_docs)] pub use self::ext as windows_ext; } else if #[cfg(any(target_os = "cloudabi", target_arch = "wasm32"))] { // On CloudABI and wasm right now the shim below doesn't compile, so // just omit it #[unstable(issue = "0", feature = "std_internals")] + #[allow(missing_docs)] pub mod windows_ext {} } else { // On all other platforms (aka linux/osx/etc) then pull in a "minimal" diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 93e2f4425b6..662a76d6725 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -25,10 +25,12 @@ #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "l4re"))] use libc::{stat64, fstat64, lstat64, off64_t, ftruncate64, lseek64, dirent64, readdir64_r, open64}; +#[cfg(any(target_os = "linux", target_os = "emscripten"))] +use libc::fstatat64; #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "android"))] -use libc::{fstatat, dirfd}; +use libc::dirfd; #[cfg(target_os = "android")] -use libc::{stat as stat64, fstat as fstat64, lstat as lstat64, lseek64, +use libc::{stat as stat64, fstat as fstat64, fstatat as fstatat64, lstat as lstat64, lseek64, dirent as dirent64, open as open64}; #[cfg(not(any(target_os = "linux", target_os = "emscripten", @@ -57,7 +59,10 @@ struct InnerReadDir { } #[derive(Clone)] -pub struct ReadDir(Arc); +pub struct ReadDir { + inner: Arc, + end_of_stream: bool, +} struct Dir(*mut libc::DIR); @@ -213,7 +218,7 @@ impl fmt::Debug for ReadDir { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // This will only be called from std::fs::ReadDir, which will add a "ReadDir()" frame. // Thus the result will be e g 'ReadDir("/home")' - fmt::Debug::fmt(&*self.0.root, f) + fmt::Debug::fmt(&*self.inner.root, f) } } @@ -229,7 +234,7 @@ fn next(&mut self) -> Option> { // is safe to use in threaded applications and it is generally preferred // over the readdir_r(3C) function. super::os::set_errno(0); - let entry_ptr = libc::readdir(self.0.dirp.0); + let entry_ptr = libc::readdir(self.inner.dirp.0); if entry_ptr.is_null() { // NULL can mean either the end is reached or an error occurred. // So we had to clear errno beforehand to check for an error now. @@ -257,6 +262,10 @@ fn next(&mut self) -> Option> { #[cfg(not(any(target_os = "solaris", target_os = "fuchsia")))] fn next(&mut self) -> Option> { + if self.end_of_stream { + return None; + } + unsafe { let mut ret = DirEntry { entry: mem::zeroed(), @@ -264,7 +273,14 @@ fn next(&mut self) -> Option> { }; let mut entry_ptr = ptr::null_mut(); loop { - if readdir64_r(self.0.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 { + if readdir64_r(self.inner.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 { + if entry_ptr.is_null() { + // We encountered an error (which will be returned in this iteration), but + // we also reached the end of the directory stream. The `end_of_stream` + // flag is enabled to make sure that we return `None` in the next iteration + // (instead of looping forever) + self.end_of_stream = true; + } return Some(Err(Error::last_os_error())) } if entry_ptr.is_null() { @@ -287,7 +303,7 @@ fn drop(&mut self) { impl DirEntry { pub fn path(&self) -> PathBuf { - self.dir.0.root.join(OsStr::from_bytes(self.name_bytes())) + self.dir.inner.root.join(OsStr::from_bytes(self.name_bytes())) } pub fn file_name(&self) -> OsString { @@ -296,13 +312,10 @@ pub fn file_name(&self) -> OsString { #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "android"))] pub fn metadata(&self) -> io::Result { - let fd = cvt(unsafe {dirfd(self.dir.0.dirp.0)})?; + let fd = cvt(unsafe {dirfd(self.dir.inner.dirp.0)})?; let mut stat: stat64 = unsafe { mem::zeroed() }; cvt(unsafe { - fstatat(fd, - self.entry.d_name.as_ptr(), - &mut stat as *mut _ as *mut _, - libc::AT_SYMLINK_NOFOLLOW) + fstatat64(fd, self.entry.d_name.as_ptr(), &mut stat, libc::AT_SYMLINK_NOFOLLOW) })?; Ok(FileAttr { stat: stat }) } @@ -692,7 +705,10 @@ pub fn readdir(p: &Path) -> io::Result { Err(Error::last_os_error()) } else { let inner = InnerReadDir { dirp: Dir(ptr), root }; - Ok(ReadDir(Arc::new(inner))) + Ok(ReadDir{ + inner: Arc::new(inner), + end_of_stream: false, + }) } } } diff --git a/src/test/compile-fail/cross-borrow-trait.rs b/src/test/compile-fail/cross-borrow-trait.rs index 847a82c0826..7c76cf475d2 100644 --- a/src/test/compile-fail/cross-borrow-trait.rs +++ b/src/test/compile-fail/cross-borrow-trait.rs @@ -18,6 +18,6 @@ impl Trait for Foo {} pub fn main() { let x: Box = Box::new(Foo); let _y: &Trait = x; //~ ERROR E0308 - //~| expected type `&Trait` - //~| found type `std::boxed::Box` + //~| expected type `&dyn Trait` + //~| found type `std::boxed::Box` } diff --git a/src/test/compile-fail/destructure-trait-ref.rs b/src/test/compile-fail/destructure-trait-ref.rs index 09bd3a2fc57..b5acdc12ca0 100644 --- a/src/test/compile-fail/destructure-trait-ref.rs +++ b/src/test/compile-fail/destructure-trait-ref.rs @@ -33,23 +33,23 @@ fn main() { let &&x = &&(&1isize as &T); // n == m - let &x = &1isize as &T; //~ ERROR type `&T` cannot be dereferenced - let &&x = &(&1isize as &T); //~ ERROR type `&T` cannot be dereferenced - let box x = box 1isize as Box; //~ ERROR type `std::boxed::Box` cannot be dereferenced + let &x = &1isize as &T; //~ ERROR type `&dyn T` cannot be dereferenced + let &&x = &(&1isize as &T); //~ ERROR type `&dyn T` cannot be dereferenced + let box x = box 1isize as Box; //~ ERROR type `std::boxed::Box` cannot be dereferenced // n > m let &&x = &1isize as &T; //~^ ERROR mismatched types - //~| expected type `T` + //~| expected type `dyn T` //~| found type `&_` //~| expected trait T, found reference let &&&x = &(&1isize as &T); //~^ ERROR mismatched types - //~| expected type `T` + //~| expected type `dyn T` //~| found type `&_` //~| expected trait T, found reference let box box x = box 1isize as Box; //~^ ERROR mismatched types - //~| expected type `T` + //~| expected type `dyn T` //~| found type `std::boxed::Box<_>` } diff --git a/src/test/compile-fail/dst-bad-assign-3.rs b/src/test/compile-fail/dst-bad-assign-3.rs index 5bc6c6cda26..2a209a2959b 100644 --- a/src/test/compile-fail/dst-bad-assign-3.rs +++ b/src/test/compile-fail/dst-bad-assign-3.rs @@ -42,7 +42,7 @@ pub fn main() { let z: Box = Box::new(Bar1 {f: 36}); f5.2 = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected type `ToBar` + //~| expected type `dyn ToBar` //~| found type `Bar1` //~| expected trait ToBar, found struct `Bar1` //~| ERROR the size for value values of type diff --git a/src/test/compile-fail/dst-bad-assign.rs b/src/test/compile-fail/dst-bad-assign.rs index 37b6056d1a7..e28586c4755 100644 --- a/src/test/compile-fail/dst-bad-assign.rs +++ b/src/test/compile-fail/dst-bad-assign.rs @@ -44,7 +44,7 @@ pub fn main() { let z: Box = Box::new(Bar1 {f: 36}); f5.ptr = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected type `ToBar` + //~| expected type `dyn ToBar` //~| found type `Bar1` //~| expected trait ToBar, found struct `Bar1` //~| ERROR the size for value values of type diff --git a/src/test/compile-fail/fn-trait-formatting.rs b/src/test/compile-fail/fn-trait-formatting.rs index 6d70f54edb4..56d64d77ee2 100644 --- a/src/test/compile-fail/fn-trait-formatting.rs +++ b/src/test/compile-fail/fn-trait-formatting.rs @@ -16,15 +16,15 @@ fn main() { let _: () = (box |_: isize| {}) as Box; //~^ ERROR mismatched types //~| expected type `()` - //~| found type `std::boxed::Box` + //~| found type `std::boxed::Box` let _: () = (box |_: isize, isize| {}) as Box; //~^ ERROR mismatched types //~| expected type `()` - //~| found type `std::boxed::Box` + //~| found type `std::boxed::Box` let _: () = (box || -> isize { unimplemented!() }) as Box isize>; //~^ ERROR mismatched types //~| expected type `()` - //~| found type `std::boxed::Box isize>` + //~| found type `std::boxed::Box isize>` needs_fn(1); //~^ ERROR : std::ops::Fn<(isize,)>` diff --git a/src/test/compile-fail/issue-13033.rs b/src/test/compile-fail/issue-13033.rs index 3d9d81471cb..f1fd617717a 100644 --- a/src/test/compile-fail/issue-13033.rs +++ b/src/test/compile-fail/issue-13033.rs @@ -17,8 +17,8 @@ trait Foo { impl Foo for Baz { fn bar(&mut self, other: &Foo) {} //~^ ERROR method `bar` has an incompatible type for trait - //~| expected type `fn(&mut Baz, &mut Foo)` - //~| found type `fn(&mut Baz, &Foo)` + //~| expected type `fn(&mut Baz, &mut dyn Foo)` + //~| found type `fn(&mut Baz, &dyn Foo)` } fn main() {} diff --git a/src/test/compile-fail/issue-20939.rs b/src/test/compile-fail/issue-20939.rs index 88197166ee0..5282ce4bb88 100644 --- a/src/test/compile-fail/issue-20939.rs +++ b/src/test/compile-fail/issue-20939.rs @@ -11,6 +11,6 @@ trait Foo {} impl<'a> Foo for Foo+'a {} -//~^ ERROR the object type `Foo + 'a` automatically implements the trait `Foo` +//~^ ERROR the object type `(dyn Foo + 'a)` automatically implements the trait `Foo` fn main() {} diff --git a/src/test/compile-fail/issue-32963.rs b/src/test/compile-fail/issue-32963.rs index e97e5a86a9d..24db822f89c 100644 --- a/src/test/compile-fail/issue-32963.rs +++ b/src/test/compile-fail/issue-32963.rs @@ -17,5 +17,5 @@ fn size_of_copy() -> usize { mem::size_of::() } fn main() { size_of_copy::(); //~^ ERROR only auto traits can be used as additional traits in a trait object - //~| ERROR the trait bound `Misc: std::marker::Copy` is not satisfied + //~| ERROR the trait bound `dyn Misc: std::marker::Copy` is not satisfied } diff --git a/src/test/compile-fail/issue-41139.rs b/src/test/compile-fail/issue-41139.rs index 15ca151c49a..0509a4387ba 100644 --- a/src/test/compile-fail/issue-41139.rs +++ b/src/test/compile-fail/issue-41139.rs @@ -14,5 +14,5 @@ fn get_function<'a>() -> &'a Fn() -> Trait { panic!("") } fn main() { let t : &Trait = &get_function()(); - //~^ ERROR cannot move a value of type Trait + 'static + //~^ ERROR cannot move a value of type (dyn Trait + 'static) } diff --git a/src/test/compile-fail/issue-43431.rs b/src/test/compile-fail/issue-43431.rs index e9f62152888..1e6366e068a 100644 --- a/src/test/compile-fail/issue-43431.rs +++ b/src/test/compile-fail/issue-43431.rs @@ -11,7 +11,7 @@ #![feature(fn_traits)] trait CallSingle { - fn call(&self, a: A) -> B where Self: Fn(A) -> B; + fn call(&self, a: A) -> B where Self: Sized, Self: Fn(A) -> B; } impl B> CallSingle for F { diff --git a/src/test/compile-fail/issue-5153.rs b/src/test/compile-fail/issue-5153.rs index b1d96f9b527..9b49886961d 100644 --- a/src/test/compile-fail/issue-5153.rs +++ b/src/test/compile-fail/issue-5153.rs @@ -18,5 +18,5 @@ fn foo(self: Box) { } fn main() { (&5isize as &Foo).foo(); - //~^ ERROR: no method named `foo` found for type `&Foo` in the current scope + //~^ ERROR: no method named `foo` found for type `&dyn Foo` in the current scope } diff --git a/src/test/compile-fail/kindck-send-object.rs b/src/test/compile-fail/kindck-send-object.rs index a3eb47be3ee..82b97878549 100644 --- a/src/test/compile-fail/kindck-send-object.rs +++ b/src/test/compile-fail/kindck-send-object.rs @@ -20,12 +20,12 @@ trait Message : Send { } fn object_ref_with_static_bound_not_ok() { assert_send::<&'static (Dummy+'static)>(); - //~^ ERROR `Dummy + 'static` cannot be shared between threads safely [E0277] + //~^ ERROR `(dyn Dummy + 'static)` cannot be shared between threads safely [E0277] } fn box_object_with_no_bound_not_ok<'a>() { assert_send::>(); - //~^ ERROR `Dummy` cannot be sent between threads safely + //~^ ERROR `dyn Dummy` cannot be sent between threads safely } fn object_with_send_bound_ok() { diff --git a/src/test/compile-fail/kindck-send-object1.rs b/src/test/compile-fail/kindck-send-object1.rs index 673a6abc5f0..853630aa416 100644 --- a/src/test/compile-fail/kindck-send-object1.rs +++ b/src/test/compile-fail/kindck-send-object1.rs @@ -18,7 +18,7 @@ trait Dummy { } // careful with object types, who knows what they close over... fn test51<'a>() { assert_send::<&'a Dummy>(); - //~^ ERROR `Dummy + 'a` cannot be shared between threads safely [E0277] + //~^ ERROR `(dyn Dummy + 'a)` cannot be shared between threads safely [E0277] } fn test52<'a>() { assert_send::<&'a (Dummy+Sync)>(); @@ -37,7 +37,7 @@ fn test61() { // them not ok fn test_71<'a>() { assert_send::>(); - //~^ ERROR `Dummy + 'a` cannot be sent between threads safely + //~^ ERROR `(dyn Dummy + 'a)` cannot be sent between threads safely } fn main() { } diff --git a/src/test/compile-fail/kindck-send-object2.rs b/src/test/compile-fail/kindck-send-object2.rs index 3a935af2000..0265f888e7c 100644 --- a/src/test/compile-fail/kindck-send-object2.rs +++ b/src/test/compile-fail/kindck-send-object2.rs @@ -15,12 +15,12 @@ trait Dummy { } fn test50() { assert_send::<&'static Dummy>(); - //~^ ERROR `Dummy + 'static` cannot be shared between threads safely [E0277] + //~^ ERROR `(dyn Dummy + 'static)` cannot be shared between threads safely [E0277] } fn test53() { assert_send::>(); - //~^ ERROR `Dummy` cannot be sent between threads safely + //~^ ERROR `dyn Dummy` cannot be sent between threads safely } // ...unless they are properly bounded diff --git a/src/test/compile-fail/map-types.rs b/src/test/compile-fail/map-types.rs index 9dcf902a69f..e8ff9e817af 100644 --- a/src/test/compile-fail/map-types.rs +++ b/src/test/compile-fail/map-types.rs @@ -25,5 +25,5 @@ fn main() { let x: Box> = box HashMap::new(); let x: Box> = x; let y: Box> = Box::new(x); - //~^ ERROR `std::boxed::Box>: Map` is not satisfied + //~^ ERROR `std::boxed::Box>: Map` is not satisfied } diff --git a/src/test/compile-fail/non-interger-atomic.rs b/src/test/compile-fail/non-interger-atomic.rs index a51a9e518ce..2a6e148ca79 100644 --- a/src/test/compile-fail/non-interger-atomic.rs +++ b/src/test/compile-fail/non-interger-atomic.rs @@ -61,22 +61,22 @@ pub unsafe fn test_Foo_cxchg(p: &mut Foo, v: Foo) { pub unsafe fn test_Bar_load(p: &mut Bar, v: Bar) { intrinsics::atomic_load(p); - //~^ ERROR expected basic integer type, found `&std::ops::Fn()` + //~^ ERROR expected basic integer type, found `&dyn std::ops::Fn()` } pub unsafe fn test_Bar_store(p: &mut Bar, v: Bar) { intrinsics::atomic_store(p, v); - //~^ ERROR expected basic integer type, found `&std::ops::Fn()` + //~^ ERROR expected basic integer type, found `&dyn std::ops::Fn()` } pub unsafe fn test_Bar_xchg(p: &mut Bar, v: Bar) { intrinsics::atomic_xchg(p, v); - //~^ ERROR expected basic integer type, found `&std::ops::Fn()` + //~^ ERROR expected basic integer type, found `&dyn std::ops::Fn()` } pub unsafe fn test_Bar_cxchg(p: &mut Bar, v: Bar) { intrinsics::atomic_cxchg(p, v, v); - //~^ ERROR expected basic integer type, found `&std::ops::Fn()` + //~^ ERROR expected basic integer type, found `&dyn std::ops::Fn()` } pub unsafe fn test_Quux_load(p: &mut Quux, v: Quux) { diff --git a/src/test/compile-fail/object-does-not-impl-trait.rs b/src/test/compile-fail/object-does-not-impl-trait.rs index 8babc734c84..30f8d5e2f45 100644 --- a/src/test/compile-fail/object-does-not-impl-trait.rs +++ b/src/test/compile-fail/object-does-not-impl-trait.rs @@ -14,5 +14,5 @@ trait Foo {} fn take_foo(f: F) {} fn take_object(f: Box) { take_foo(f); } -//~^ ERROR `std::boxed::Box: Foo` is not satisfied +//~^ ERROR `std::boxed::Box: Foo` is not satisfied fn main() {} diff --git a/src/test/compile-fail/object-safety-by-value-self-use.rs b/src/test/compile-fail/object-safety-by-value-self-use.rs index 36356cb7d52..e575bbb6cea 100644 --- a/src/test/compile-fail/object-safety-by-value-self-use.rs +++ b/src/test/compile-fail/object-safety-by-value-self-use.rs @@ -22,7 +22,7 @@ trait Baz { } fn use_bar(t: Box) { - t.bar() //~ ERROR cannot move a value of type Bar + t.bar() //~ ERROR cannot move a value of type (dyn Bar + 'static) } fn main() { } diff --git a/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs b/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs index c25616c5435..6019369aa2e 100644 --- a/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs +++ b/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs @@ -19,19 +19,19 @@ pub trait PubTr: PrivTr {} pub macro mac1() { let _: Box>; - //~^ ERROR type `priv_trait::PubTr + '` is private - //~| ERROR type `priv_trait::PubTr + '` is private + //~^ ERROR type `(dyn priv_trait::PubTr + ')` is private + //~| ERROR type `(dyn priv_trait::PubTr + ')` is private type InSignatureTy2 = Box>; - //~^ ERROR type `priv_trait::PubTr + 'static` is private + //~^ ERROR type `(dyn priv_trait::PubTr + 'static)` is private trait InSignatureTr2: PubTr {} //~^ ERROR trait `priv_trait::PrivTr` is private } pub macro mac2() { let _: Box>; - //~^ ERROR type `priv_trait::PrivTr + '` is private - //~| ERROR type `priv_trait::PrivTr + '` is private + //~^ ERROR type `(dyn priv_trait::PrivTr + ')` is private + //~| ERROR type `(dyn priv_trait::PrivTr + ')` is private type InSignatureTy1 = Box>; - //~^ ERROR type `priv_trait::PrivTr + 'static` is private + //~^ ERROR type `(dyn priv_trait::PrivTr + 'static)` is private trait InSignatureTr1: PrivTr {} //~^ ERROR trait `priv_trait::PrivTr` is private } diff --git a/src/test/compile-fail/private-inferred-type.rs b/src/test/compile-fail/private-inferred-type.rs index 5af8b063c16..3ca8b1eb2ed 100644 --- a/src/test/compile-fail/private-inferred-type.rs +++ b/src/test/compile-fail/private-inferred-type.rs @@ -129,7 +129,7 @@ fn main() { m::leak_anon2(); //~ ERROR type `m::Priv` is private m::leak_anon3(); //~ ERROR type `m::Priv` is private - m::leak_dyn1(); //~ ERROR type `m::Trait + 'static` is private + m::leak_dyn1(); //~ ERROR type `(dyn m::Trait + 'static)` is private m::leak_dyn2(); //~ ERROR type `m::Priv` is private m::leak_dyn3(); //~ ERROR type `m::Priv` is private diff --git a/src/test/compile-fail/trait-item-privacy.rs b/src/test/compile-fail/trait-item-privacy.rs index be0f7dd4e1c..f8e4f0d596e 100644 --- a/src/test/compile-fail/trait-item-privacy.rs +++ b/src/test/compile-fail/trait-item-privacy.rs @@ -110,9 +110,9 @@ fn check_assoc_const() { // A, B, C are resolved as inherent items, their traits don't need to be in scope C::A; //~ ERROR associated constant `A` is private //~^ ERROR the trait `assoc_const::C` cannot be made into an object - //~| ERROR the trait bound `assoc_const::C: assoc_const::A` is not satisfied + //~| ERROR the trait bound `dyn assoc_const::C: assoc_const::A` is not satisfied C::B; // ERROR the trait `assoc_const::C` cannot be made into an object - //~^ ERROR the trait bound `assoc_const::C: assoc_const::B` is not satisfied + //~^ ERROR the trait bound `dyn assoc_const::C: assoc_const::B` is not satisfied C::C; // OK } diff --git a/src/test/compile-fail/traits-repeated-supertrait-ambig.rs b/src/test/compile-fail/traits-repeated-supertrait-ambig.rs index 3fc0d638dd6..559871af72e 100644 --- a/src/test/compile-fail/traits-repeated-supertrait-ambig.rs +++ b/src/test/compile-fail/traits-repeated-supertrait-ambig.rs @@ -33,7 +33,7 @@ fn same_as(&self, t: u64) -> bool { *self == (t as i64) } impl CompareToInts for i64 { } fn with_obj(c: &CompareToInts) -> bool { - c.same_as(22) //~ ERROR `CompareToInts: CompareTo` is not satisfied + c.same_as(22) //~ ERROR `dyn CompareToInts: CompareTo` is not satisfied } fn with_trait(c: &C) -> bool { @@ -41,7 +41,7 @@ fn with_trait(c: &C) -> bool { } fn with_ufcs1(c: &C) -> bool { - CompareToInts::same_as(c, 22) //~ ERROR `CompareToInts: CompareTo` is not satisfied + CompareToInts::same_as(c, 22) //~ ERROR `dyn CompareToInts: CompareTo` is not satisfied } fn with_ufcs2(c: &C) -> bool { diff --git a/src/test/compile-fail/trivial_casts.rs b/src/test/compile-fail/trivial_casts.rs index aabf0d26d5b..3f2bd2ffabf 100644 --- a/src/test/compile-fail/trivial_casts.rs +++ b/src/test/compile-fail/trivial_casts.rs @@ -59,25 +59,25 @@ pub fn main() { // unsize trait let x: &Bar = &Bar; - let _ = x as &Foo; //~ERROR trivial cast: `&Bar` as `&Foo` - let _ = x as *const Foo; //~ERROR trivial cast: `&Bar` as `*const Foo` + let _ = x as &Foo; //~ERROR trivial cast: `&Bar` as `&dyn Foo` + let _ = x as *const Foo; //~ERROR trivial cast: `&Bar` as `*const dyn Foo` let _: &Foo = x; let _: *const Foo = x; let x: &mut Bar = &mut Bar; - let _ = x as &mut Foo; //~ERROR trivial cast: `&mut Bar` as `&mut Foo` - let _ = x as *mut Foo; //~ERROR trivial cast: `&mut Bar` as `*mut Foo` + let _ = x as &mut Foo; //~ERROR trivial cast: `&mut Bar` as `&mut dyn Foo` + let _ = x as *mut Foo; //~ERROR trivial cast: `&mut Bar` as `*mut dyn Foo` let _: &mut Foo = x; let _: *mut Foo = x; let x: Box = Box::new(Bar); - let _ = x as Box; //~ERROR trivial cast: `std::boxed::Box` as `std::boxed::Box` + let _ = x as Box; //~ERROR `std::boxed::Box` as `std::boxed::Box` let x: Box = Box::new(Bar); let _: Box = x; // functions fn baz(_x: i32) {} - let _ = &baz as &Fn(i32); //~ERROR trivial cast: `&fn(i32) {main::baz}` as `&std::ops::Fn(i32)` + let _ = &baz as &Fn(i32); //~ERROR `&fn(i32) {main::baz}` as `&dyn std::ops::Fn(i32)` let _: &Fn(i32) = &baz; let x = |_x: i32| {}; let _ = &x as &Fn(i32); //~ERROR trivial cast diff --git a/src/test/compile-fail/type-mismatch-same-crate-name.rs b/src/test/compile-fail/type-mismatch-same-crate-name.rs index 4295d08a470..7e93f626cfc 100644 --- a/src/test/compile-fail/type-mismatch-same-crate-name.rs +++ b/src/test/compile-fail/type-mismatch-same-crate-name.rs @@ -33,7 +33,7 @@ fn main() { //~^ ERROR mismatched types //~| Perhaps two different versions of crate `crate_a1` //~| expected trait `main::a::Bar` - //~| expected type `std::boxed::Box` - //~| found type `std::boxed::Box` + //~| expected type `std::boxed::Box<(dyn main::a::Bar + 'static)>` + //~| found type `std::boxed::Box` } } diff --git a/src/test/compile-fail/type-parameter-defaults-referencing-Self-ppaux.rs b/src/test/compile-fail/type-parameter-defaults-referencing-Self-ppaux.rs index 09687724656..08988353886 100644 --- a/src/test/compile-fail/type-parameter-defaults-referencing-Self-ppaux.rs +++ b/src/test/compile-fail/type-parameter-defaults-referencing-Self-ppaux.rs @@ -23,5 +23,5 @@ fn main() { let x: i32 = 5; let y = x as MyAdd; //~^ ERROR E0038 - //~| ERROR cast to unsized type: `i32` as `MyAdd` + //~| ERROR cast to unsized type: `i32` as `dyn MyAdd` } diff --git a/src/test/compile-fail/wf-trait-fn-where-clause.rs b/src/test/compile-fail/wf-trait-fn-where-clause.rs index f59dca93bb9..f46a54504a0 100644 --- a/src/test/compile-fail/wf-trait-fn-where-clause.rs +++ b/src/test/compile-fail/wf-trait-fn-where-clause.rs @@ -17,7 +17,7 @@ struct Bar { value: Box } trait Foo { - fn bar(&self) where Bar: Copy; + fn bar(&self) where Self: Sized, Bar: Copy; //~^ ERROR E0277 // // Here, Eq ought to be implemented. diff --git a/src/test/mir-opt/end_region_6.rs b/src/test/mir-opt/end_region_6.rs index dadc755eb8c..30ba14c1bab 100644 --- a/src/test/mir-opt/end_region_6.rs +++ b/src/test/mir-opt/end_region_6.rs @@ -68,17 +68,17 @@ fn foo(f: F) where F: FnOnce() -> i32 { // fn main::{{closure}}(_1: [closure@NodeId(22) d:&'19s D]) -> i32 { // let mut _0: i32; // ... -// let _2: &'15_0rs D; +// let _2: &'16_0rs D; // ... // let mut _3: i32; // bb0: { // StorageLive(_2); -// _2 = &'15_0rs (*(_1.0: &'19s D)); +// _2 = &'16_0rs (*(_1.0: &'19s D)); // StorageLive(_3); // _3 = ((*_2).0: i32); // _0 = move _3; // StorageDead(_3); -// EndRegion('15_0rs); +// EndRegion('16_0rs); // StorageDead(_2); // return; // } diff --git a/src/test/mir-opt/end_region_7.rs b/src/test/mir-opt/end_region_7.rs index 1426174b482..6d6afa25ae3 100644 --- a/src/test/mir-opt/end_region_7.rs +++ b/src/test/mir-opt/end_region_7.rs @@ -76,17 +76,17 @@ fn foo(f: F) where F: FnOnce() -> i32 { // fn main::{{closure}}(_1: [closure@NodeId(22) d:D]) -> i32 { // let mut _0: i32; // ... -// let _2: &'15_0rs D; +// let _2: &'16_0rs D; // ... // let mut _3: i32; // bb0: { // StorageLive(_2); -// _2 = &'15_0rs (_1.0: D); +// _2 = &'16_0rs (_1.0: D); // StorageLive(_3); // _3 = ((*_2).0: i32); // _0 = move _3; // StorageDead(_3); -// EndRegion('15_0rs); +// EndRegion('16_0rs); // StorageDead(_2); // drop(_1) -> [return: bb2, unwind: bb1]; // } diff --git a/src/test/mir-opt/validate_1.rs b/src/test/mir-opt/validate_1.rs index e6cd5355000..c331276aade 100644 --- a/src/test/mir-opt/validate_1.rs +++ b/src/test/mir-opt/validate_1.rs @@ -64,14 +64,14 @@ fn main() { // bb0: { // Validate(Acquire, [_1: &ReFree(DefId(0/1:11 ~ validate_1[317d]::main[0]::{{closure}}[0]), BrEnv) [closure@NodeId(50)], _2: &ReFree(DefId(0/1:11 ~ validate_1[317d]::main[0]::{{closure}}[0]), BrAnon(0)) mut i32]); // StorageLive(_3); -// Validate(Suspend(ReScope(Remainder(BlockRemainder { block: ItemLocalId(22), first_statement_index: 0 }))), [(*_2): i32]); +// Validate(Suspend(ReScope(Remainder(BlockRemainder { block: ItemLocalId(25), first_statement_index: 0 }))), [(*_2): i32]); // _3 = &ReErased (*_2); -// Validate(Acquire, [(*_3): i32/ReScope(Remainder(BlockRemainder { block: ItemLocalId(22), first_statement_index: 0 })) (imm)]); +// Validate(Acquire, [(*_3): i32/ReScope(Remainder(BlockRemainder { block: ItemLocalId(25), first_statement_index: 0 })) (imm)]); // StorageLive(_4); // _4 = (*_3); // _0 = move _4; // StorageDead(_4); -// EndRegion(ReScope(Remainder(BlockRemainder { block: ItemLocalId(22), first_statement_index: 0 }))); +// EndRegion(ReScope(Remainder(BlockRemainder { block: ItemLocalId(25), first_statement_index: 0 }))); // StorageDead(_3); // return; // } diff --git a/src/test/mir-opt/validate_5.rs b/src/test/mir-opt/validate_5.rs index d8d83fb5b45..b4d4479bab9 100644 --- a/src/test/mir-opt/validate_5.rs +++ b/src/test/mir-opt/validate_5.rs @@ -53,12 +53,12 @@ fn main() { // StorageLive(_3); // StorageLive(_4); // StorageLive(_5); -// Validate(Suspend(ReScope(Node(ItemLocalId(9)))), [(*_2): i32]); +// Validate(Suspend(ReScope(Node(ItemLocalId(12)))), [(*_2): i32]); // _5 = &ReErased mut (*_2); -// Validate(Acquire, [(*_5): i32/ReScope(Node(ItemLocalId(9)))]); +// Validate(Acquire, [(*_5): i32/ReScope(Node(ItemLocalId(12)))]); // _4 = move _5 as *mut i32 (Misc); // _3 = move _4; -// EndRegion(ReScope(Node(ItemLocalId(9)))); +// EndRegion(ReScope(Node(ItemLocalId(12)))); // StorageDead(_4); // StorageDead(_5); // Validate(Release, [_0: bool, _3: *mut i32]); diff --git a/src/test/run-pass/issue-21058.rs b/src/test/run-pass/issue-21058.rs index 19cd1cf3df7..862439e21f4 100644 --- a/src/test/run-pass/issue-21058.rs +++ b/src/test/run-pass/issue-21058.rs @@ -26,5 +26,5 @@ fn main() { std::intrinsics::type_name::(), // DST std::intrinsics::type_name::() - )}, ("[u8]", "str", "std::marker::Send", "NT", "DST")); + )}, ("[u8]", "str", "dyn std::marker::Send", "NT", "DST")); } diff --git a/src/test/run-pass/issue-23435.rs b/src/test/run-pass/issue-23435.rs deleted file mode 100644 index 9b727826e6d..00000000000 --- a/src/test/run-pass/issue-23435.rs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 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. - -// Test that we do not ICE when a default method implementation has -// requirements (in this case, `Self : Baz`) that do not hold for some -// specific impl (in this case, `Foo : Bar`). This causes problems -// only when building a vtable, because that goes along and -// instantiates all the methods, even those that could not otherwise -// be called. - -// pretty-expanded FIXME #23616 - -struct Foo { - x: i32 -} - -trait Bar { - fn bar(&self) where Self : Baz { self.baz(); } -} - -trait Baz { - fn baz(&self); -} - -impl Bar for Foo { -} - -fn main() { - let x: &Bar = &Foo { x: 22 }; -} diff --git a/src/test/ui/anonymous-higher-ranked-lifetime.stderr b/src/test/ui/anonymous-higher-ranked-lifetime.stderr index 82f527f8cca..809d111d74e 100644 --- a/src/test/ui/anonymous-higher-ranked-lifetime.stderr +++ b/src/test/ui/anonymous-higher-ranked-lifetime.stderr @@ -74,7 +74,7 @@ error[E0631]: type mismatch in closure arguments LL | g1(|_: (), _: ()| {}); //~ ERROR type mismatch | ^^ -------------- found signature of `fn((), ()) -> _` | | - | expected signature of `for<'r> fn(&'r (), std::boxed::Box std::ops::Fn(&'s ()) + 'static>) -> _` + | expected signature of `for<'r> fn(&'r (), std::boxed::Box<(dyn for<'s> std::ops::Fn(&'s ()) + 'static)>) -> _` | note: required by `g1` --> $DIR/anonymous-higher-ranked-lifetime.rs:33:1 @@ -102,7 +102,7 @@ error[E0631]: type mismatch in closure arguments LL | g3(|_: (), _: ()| {}); //~ ERROR type mismatch | ^^ -------------- found signature of `fn((), ()) -> _` | | - | expected signature of `for<'s> fn(&'s (), std::boxed::Box std::ops::Fn(&'r ()) + 'static>) -> _` + | expected signature of `for<'s> fn(&'s (), std::boxed::Box<(dyn for<'r> std::ops::Fn(&'r ()) + 'static)>) -> _` | note: required by `g3` --> $DIR/anonymous-higher-ranked-lifetime.rs:35:1 @@ -130,7 +130,7 @@ error[E0631]: type mismatch in closure arguments LL | h1(|_: (), _: (), _: (), _: ()| {}); //~ ERROR type mismatch | ^^ ---------------------------- found signature of `fn((), (), (), ()) -> _` | | - | expected signature of `for<'r, 's> fn(&'r (), std::boxed::Box std::ops::Fn(&'t0 ()) + 'static>, &'s (), for<'t0, 't1> fn(&'t0 (), &'t1 ())) -> _` + | expected signature of `for<'r, 's> fn(&'r (), std::boxed::Box<(dyn for<'t0> std::ops::Fn(&'t0 ()) + 'static)>, &'s (), for<'t0, 't1> fn(&'t0 (), &'t1 ())) -> _` | note: required by `h1` --> $DIR/anonymous-higher-ranked-lifetime.rs:39:1 @@ -144,7 +144,7 @@ error[E0631]: type mismatch in closure arguments LL | h2(|_: (), _: (), _: (), _: ()| {}); //~ ERROR type mismatch | ^^ ---------------------------- found signature of `fn((), (), (), ()) -> _` | | - | expected signature of `for<'r, 't0> fn(&'r (), std::boxed::Box std::ops::Fn(&'s ()) + 'static>, &'t0 (), for<'s, 't1> fn(&'s (), &'t1 ())) -> _` + | expected signature of `for<'r, 't0> fn(&'r (), std::boxed::Box<(dyn for<'s> std::ops::Fn(&'s ()) + 'static)>, &'t0 (), for<'s, 't1> fn(&'s (), &'t1 ())) -> _` | note: required by `h2` --> $DIR/anonymous-higher-ranked-lifetime.rs:40:1 diff --git a/src/test/ui/arbitrary-self-types-not-object-safe.stderr b/src/test/ui/arbitrary-self-types-not-object-safe.stderr index b3f9cbc587b..ec9e65fc4c6 100644 --- a/src/test/ui/arbitrary-self-types-not-object-safe.stderr +++ b/src/test/ui/arbitrary-self-types-not-object-safe.stderr @@ -13,7 +13,7 @@ LL | let x = Box::new(5usize) as Box; | ^^^^^^^^^^^^^^^^ the trait `Foo` cannot be made into an object | = note: method `foo` has a non-standard `self` type - = note: required because of the requirements on the impl of `std::ops::CoerceUnsized>` for `std::boxed::Box` + = note: required because of the requirements on the impl of `std::ops::CoerceUnsized>` for `std::boxed::Box` error: aborting due to 2 previous errors diff --git a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr index 67c33740f19..1e871d47284 100644 --- a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr @@ -1,4 +1,4 @@ -error[E0620]: cast to unsized type: `&{integer}` as `std::marker::Send` +error[E0620]: cast to unsized type: `&{integer}` as `dyn std::marker::Send` --> $DIR/cast-to-unsized-trait-object-suggestion.rs:12:5 | LL | &1 as Send; //~ ERROR cast to unsized @@ -6,7 +6,7 @@ LL | &1 as Send; //~ ERROR cast to unsized | | | help: try casting to a reference instead: `&Send` -error[E0620]: cast to unsized type: `std::boxed::Box<{integer}>` as `std::marker::Send` +error[E0620]: cast to unsized type: `std::boxed::Box<{integer}>` as `dyn std::marker::Send` --> $DIR/cast-to-unsized-trait-object-suggestion.rs:13:5 | LL | Box::new(1) as Send; //~ ERROR cast to unsized diff --git a/src/test/ui/closure-array-break-length.rs b/src/test/ui/closure-array-break-length.rs new file mode 100644 index 00000000000..2e99921956a --- /dev/null +++ b/src/test/ui/closure-array-break-length.rs @@ -0,0 +1,17 @@ +// 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 main() { + |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop + + while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label + + while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label +} diff --git a/src/test/ui/closure-array-break-length.stderr b/src/test/ui/closure-array-break-length.stderr new file mode 100644 index 00000000000..139153992e2 --- /dev/null +++ b/src/test/ui/closure-array-break-length.stderr @@ -0,0 +1,22 @@ +error[E0268]: `continue` outside of loop + --> $DIR/closure-array-break-length.rs:12:13 + | +LL | |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop + | ^^^^^^^^ cannot break outside of a loop + +error[E0590]: `break` or `continue` with no label in the condition of a `while` loop + --> $DIR/closure-array-break-length.rs:14:19 + | +LL | while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label + | ^^^^^^^^ unlabeled `continue` in the condition of a `while` loop + +error[E0590]: `break` or `continue` with no label in the condition of a `while` loop + --> $DIR/closure-array-break-length.rs:16:19 + | +LL | while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label + | ^^^^^ unlabeled `break` in the condition of a `while` loop + +error: aborting due to 3 previous errors + +Some errors occurred: E0268, E0590. +For more information about an error, try `rustc --explain E0268`. diff --git a/src/test/ui/const-unsized.stderr b/src/test/ui/const-unsized.stderr index 2cde4aec2b5..d6fc5391ba8 100644 --- a/src/test/ui/const-unsized.stderr +++ b/src/test/ui/const-unsized.stderr @@ -1,10 +1,10 @@ -error[E0277]: the size for value values of type `std::fmt::Debug + std::marker::Sync + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn std::fmt::Debug + std::marker::Sync + 'static)` cannot be known at compilation time --> $DIR/const-unsized.rs:13:29 | LL | const CONST_0: Debug+Sync = *(&0 as &(Debug+Sync)); | ^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `std::fmt::Debug + std::marker::Sync + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn std::fmt::Debug + std::marker::Sync + 'static)` = note: to learn more, visit = note: constant expressions must have a statically known size @@ -18,13 +18,13 @@ LL | const CONST_FOO: str = *"foo"; = note: to learn more, visit = note: constant expressions must have a statically known size -error[E0277]: the size for value values of type `std::fmt::Debug + std::marker::Sync + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn std::fmt::Debug + std::marker::Sync + 'static)` cannot be known at compilation time --> $DIR/const-unsized.rs:19:31 | LL | static STATIC_1: Debug+Sync = *(&1 as &(Debug+Sync)); | ^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `std::fmt::Debug + std::marker::Sync + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn std::fmt::Debug + std::marker::Sync + 'static)` = note: to learn more, visit = note: constant expressions must have a statically known size diff --git a/src/test/ui/did_you_mean/bad-assoc-ty.stderr b/src/test/ui/did_you_mean/bad-assoc-ty.stderr index 169a12ef92e..33792d4f5b3 100644 --- a/src/test/ui/did_you_mean/bad-assoc-ty.stderr +++ b/src/test/ui/did_you_mean/bad-assoc-ty.stderr @@ -92,7 +92,7 @@ error[E0223]: ambiguous associated type LL | type G = 'static + (Send)::AssocTy; | ^^^^^^^^^^^^^^^^^^^^^^^^^ ambiguous associated type | - = note: specify the type using the syntax `::AssocTy` + = note: specify the type using the syntax `<(dyn std::marker::Send + 'static) as Trait>::AssocTy` error[E0223]: ambiguous associated type --> $DIR/bad-assoc-ty.rs:43:10 @@ -100,7 +100,7 @@ error[E0223]: ambiguous associated type LL | type H = Fn(u8) -> (u8)::Output; | ^^^^^^^^^^^^^^^^^^^^^^ ambiguous associated type | - = note: specify the type using the syntax ` u8 + 'static as Trait>::Output` + = note: specify the type using the syntax `<(dyn std::ops::Fn(u8) -> u8 + 'static) as Trait>::Output` error: aborting due to 15 previous errors diff --git a/src/test/ui/error-codes/E0033-teach.stderr b/src/test/ui/error-codes/E0033-teach.stderr index c74485781c1..2fac6080f49 100644 --- a/src/test/ui/error-codes/E0033-teach.stderr +++ b/src/test/ui/error-codes/E0033-teach.stderr @@ -12,11 +12,11 @@ LL | let trait_obj: &SomeTrait = SomeTrait; | = note: method `foo` has no receiver -error[E0033]: type `&SomeTrait` cannot be dereferenced +error[E0033]: type `&dyn SomeTrait` cannot be dereferenced --> $DIR/E0033-teach.rs:23:9 | LL | let &invalid = trait_obj; - | ^^^^^^^^ type `&SomeTrait` cannot be dereferenced + | ^^^^^^^^ type `&dyn SomeTrait` cannot be dereferenced | = note: This error indicates that a pointer to a trait type cannot be implicitly dereferenced by a pattern. Every trait defines a type, but because the size of trait implementors isn't fixed, this type has no compile-time size. Therefore, all accesses to trait types must be through pointers. If you encounter this error you should try to avoid dereferencing the pointer. diff --git a/src/test/ui/error-codes/E0033.stderr b/src/test/ui/error-codes/E0033.stderr index a1e72d6f669..5d789566beb 100644 --- a/src/test/ui/error-codes/E0033.stderr +++ b/src/test/ui/error-codes/E0033.stderr @@ -12,11 +12,11 @@ LL | let trait_obj: &SomeTrait = SomeTrait; | = note: method `foo` has no receiver -error[E0033]: type `&SomeTrait` cannot be dereferenced +error[E0033]: type `&dyn SomeTrait` cannot be dereferenced --> $DIR/E0033.rs:21:9 | LL | let &invalid = trait_obj; - | ^^^^^^^^ type `&SomeTrait` cannot be dereferenced + | ^^^^^^^^ type `&dyn SomeTrait` cannot be dereferenced error: aborting due to 3 previous errors diff --git a/src/test/ui/error-codes/E0558.stderr b/src/test/ui/error-codes/E0558.stderr index 0cb8af99294..0777c44058f 100644 --- a/src/test/ui/error-codes/E0558.stderr +++ b/src/test/ui/error-codes/E0558.stderr @@ -1,4 +1,4 @@ -error[E0558]: export_name attribute has invalid format +error[E0558]: `export_name` attribute has invalid format --> $DIR/E0558.rs:11:1 | LL | #[export_name] diff --git a/src/test/ui/error-codes/E0648.rs b/src/test/ui/error-codes/E0648.rs new file mode 100644 index 00000000000..d3eac60de99 --- /dev/null +++ b/src/test/ui/error-codes/E0648.rs @@ -0,0 +1,14 @@ +// 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. + +#[export_name="\0foo"] //~ ERROR E0648 +pub fn bar() {} + +fn main() {} diff --git a/src/test/ui/error-codes/E0648.stderr b/src/test/ui/error-codes/E0648.stderr new file mode 100644 index 00000000000..1e11705e9b9 --- /dev/null +++ b/src/test/ui/error-codes/E0648.stderr @@ -0,0 +1,9 @@ +error[E0648]: `export_name` may not contain null characters + --> $DIR/E0648.rs:11:1 + | +LL | #[export_name="/0foo"] //~ ERROR E0648 + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0648`. diff --git a/src/test/ui/error-codes/E0657.stderr b/src/test/ui/error-codes/E0657.stderr index 23b9666de3c..fb7f88d5ca9 100644 --- a/src/test/ui/error-codes/E0657.stderr +++ b/src/test/ui/error-codes/E0657.stderr @@ -16,7 +16,7 @@ error[E0308]: mismatched types LL | () //~ ERROR mismatched types | ^^ expected struct `std::boxed::Box`, found () | - = note: expected type `std::boxed::Box + 'static>` + = note: expected type `std::boxed::Box<(dyn Id<_> + 'static)>` found type `()` error[E0308]: mismatched types @@ -25,7 +25,7 @@ error[E0308]: mismatched types LL | () //~ ERROR mismatched types | ^^ expected struct `std::boxed::Box`, found () | - = note: expected type `std::boxed::Box + 'static>` + = note: expected type `std::boxed::Box<(dyn Id<_> + 'static)>` found type `()` error: aborting due to 4 previous errors diff --git a/src/test/ui/fat-ptr-cast.stderr b/src/test/ui/fat-ptr-cast.stderr index cf1dcfcb8ad..778a4cf1fa0 100644 --- a/src/test/ui/fat-ptr-cast.stderr +++ b/src/test/ui/fat-ptr-cast.stderr @@ -52,7 +52,7 @@ error[E0607]: cannot cast thin pointer `*const i32` to fat pointer `*const [i32] LL | q as *const [i32]; //~ ERROR cannot cast | ^^^^^^^^^^^^^^^^^ -error[E0606]: casting `usize` as `*mut Trait + 'static` is invalid +error[E0606]: casting `usize` as `*mut (dyn Trait + 'static)` is invalid --> $DIR/fat-ptr-cast.rs:32:37 | LL | let t: *mut (Trait + 'static) = 0 as *mut _; //~ ERROR casting diff --git a/src/test/ui/feature-gate-trivial_bounds.stderr b/src/test/ui/feature-gate-trivial_bounds.stderr index db280f2d1f7..19a6a863795 100644 --- a/src/test/ui/feature-gate-trivial_bounds.stderr +++ b/src/test/ui/feature-gate-trivial_bounds.stderr @@ -98,7 +98,7 @@ LL | struct TwoStrs(str, str) where str: Sized; //~ ERROR = help: see issue #48214 = help: add #![feature(trivial_bounds)] to the crate attributes to enable -error[E0277]: the size for value values of type `A + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn A + 'static)` cannot be known at compilation time --> $DIR/feature-gate-trivial_bounds.rs:65:1 | LL | / fn unsized_local() where Dst: Sized { //~ ERROR @@ -106,9 +106,9 @@ LL | | let x: Dst = *(Box::new(Dst { x: 1 }) as Box>); LL | | } | |_^ doesn't have a size known at compile-time | - = help: within `Dst`, the trait `std::marker::Sized` is not implemented for `A + 'static` + = help: within `Dst<(dyn A + 'static)>`, the trait `std::marker::Sized` is not implemented for `(dyn A + 'static)` = note: to learn more, visit - = note: required because it appears within the type `Dst` + = note: required because it appears within the type `Dst<(dyn A + 'static)>` = help: see issue #48214 = help: add #![feature(trivial_bounds)] to the crate attributes to enable diff --git a/src/test/ui/fmt/send-sync.stderr b/src/test/ui/fmt/send-sync.stderr index 807b499155b..0d9239d7227 100644 --- a/src/test/ui/fmt/send-sync.stderr +++ b/src/test/ui/fmt/send-sync.stderr @@ -1,11 +1,11 @@ -error[E0277]: `*mut std::ops::Fn() + 'static` cannot be shared between threads safely +error[E0277]: `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely --> $DIR/send-sync.rs:18:5 | LL | send(format_args!("{:?}", c)); //~ ERROR E0277 - | ^^^^ `*mut std::ops::Fn() + 'static` cannot be shared between threads safely + | ^^^^ `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely | - = help: within `[std::fmt::ArgumentV1<'_>]`, the trait `std::marker::Sync` is not implemented for `*mut std::ops::Fn() + 'static` - = note: required because it appears within the type `std::marker::PhantomData<*mut std::ops::Fn() + 'static>` + = help: within `[std::fmt::ArgumentV1<'_>]`, the trait `std::marker::Sync` is not implemented for `*mut (dyn std::ops::Fn() + 'static)` + = note: required because it appears within the type `std::marker::PhantomData<*mut (dyn std::ops::Fn() + 'static)>` = note: required because it appears within the type `core::fmt::Void` = note: required because it appears within the type `&core::fmt::Void` = note: required because it appears within the type `std::fmt::ArgumentV1<'_>` @@ -18,14 +18,14 @@ note: required by `send` LL | fn send(_: T) {} | ^^^^^^^^^^^^^^^^^^^^^^ -error[E0277]: `*mut std::ops::Fn() + 'static` cannot be shared between threads safely +error[E0277]: `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely --> $DIR/send-sync.rs:19:5 | LL | sync(format_args!("{:?}", c)); //~ ERROR E0277 - | ^^^^ `*mut std::ops::Fn() + 'static` cannot be shared between threads safely + | ^^^^ `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely | - = help: within `std::fmt::Arguments<'_>`, the trait `std::marker::Sync` is not implemented for `*mut std::ops::Fn() + 'static` - = note: required because it appears within the type `std::marker::PhantomData<*mut std::ops::Fn() + 'static>` + = help: within `std::fmt::Arguments<'_>`, the trait `std::marker::Sync` is not implemented for `*mut (dyn std::ops::Fn() + 'static)` + = note: required because it appears within the type `std::marker::PhantomData<*mut (dyn std::ops::Fn() + 'static)>` = note: required because it appears within the type `core::fmt::Void` = note: required because it appears within the type `&core::fmt::Void` = note: required because it appears within the type `std::fmt::ArgumentV1<'_>` diff --git a/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr b/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr index 201470abe67..07b86228f61 100644 --- a/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr +++ b/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr @@ -10,8 +10,8 @@ note: first, the lifetime cannot outlive the lifetime 'a as defined on the funct LL | fn with_dyn_debug_static<'a>(x: Box) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: ...so that the expression is assignable: - expected std::boxed::Box - found std::boxed::Box + expected std::boxed::Box + found std::boxed::Box<(dyn std::fmt::Debug + 'a)> = note: but, the lifetime must be valid for the static lifetime... = note: ...so that the types are compatible: expected StaticTrait diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr index 37b586e1e3b..169369c304e 100644 --- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr +++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr @@ -13,8 +13,8 @@ LL | | } | |_____^ = note: ...but the lifetime must also be valid for the static lifetime... = note: ...so that the method type is compatible with trait: - expected fn(&Struct) -> &Trait + 'static - found fn(&Struct) -> &Trait + expected fn(&Struct) -> &(dyn Trait + 'static) + found fn(&Struct) -> &dyn Trait error: aborting due to previous error diff --git a/src/test/ui/issue-17441.rs b/src/test/ui/issue-17441.rs index c7b07701461..5432d5f5ed9 100644 --- a/src/test/ui/issue-17441.rs +++ b/src/test/ui/issue-17441.rs @@ -13,10 +13,10 @@ fn main() { //~^ ERROR cast to unsized type: `&[usize; 2]` as `[usize]` let _bar = Box::new(1_usize) as std::fmt::Debug; - //~^ ERROR cast to unsized type: `std::boxed::Box` as `std::fmt::Debug` + //~^ ERROR cast to unsized type: `std::boxed::Box` as `dyn std::fmt::Debug` let _baz = 1_usize as std::fmt::Debug; - //~^ ERROR cast to unsized type: `usize` as `std::fmt::Debug` + //~^ ERROR cast to unsized type: `usize` as `dyn std::fmt::Debug` let _quux = [1_usize, 2] as [usize]; //~^ ERROR cast to unsized type: `[usize; 2]` as `[usize]` diff --git a/src/test/ui/issue-17441.stderr b/src/test/ui/issue-17441.stderr index 80ba49cce1a..6c7e883f9f9 100644 --- a/src/test/ui/issue-17441.stderr +++ b/src/test/ui/issue-17441.stderr @@ -10,7 +10,7 @@ help: consider using an implicit coercion to `&[usize]` instead LL | let _foo = &[1_usize, 2] as [usize]; | ^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0620]: cast to unsized type: `std::boxed::Box` as `std::fmt::Debug` +error[E0620]: cast to unsized type: `std::boxed::Box` as `dyn std::fmt::Debug` --> $DIR/issue-17441.rs:15:16 | LL | let _bar = Box::new(1_usize) as std::fmt::Debug; @@ -18,7 +18,7 @@ LL | let _bar = Box::new(1_usize) as std::fmt::Debug; | | | help: try casting to a `Box` instead: `Box` -error[E0620]: cast to unsized type: `usize` as `std::fmt::Debug` +error[E0620]: cast to unsized type: `usize` as `dyn std::fmt::Debug` --> $DIR/issue-17441.rs:18:16 | LL | let _baz = 1_usize as std::fmt::Debug; diff --git a/src/test/ui/issue-20692.stderr b/src/test/ui/issue-20692.stderr index 1316773f6b7..156ebd920f0 100644 --- a/src/test/ui/issue-20692.stderr +++ b/src/test/ui/issue-20692.stderr @@ -13,7 +13,7 @@ LL | let _ = x | ^ the trait `Array` cannot be made into an object | = note: the trait cannot require that `Self : Sized` - = note: required because of the requirements on the impl of `std::ops::CoerceUnsized<&Array>` for `&T` + = note: required because of the requirements on the impl of `std::ops::CoerceUnsized<&dyn Array>` for `&T` error: aborting due to 2 previous errors diff --git a/src/test/ui/issue-50781.rs b/src/test/ui/issue-50781.rs new file mode 100644 index 00000000000..43830869da7 --- /dev/null +++ b/src/test/ui/issue-50781.rs @@ -0,0 +1,29 @@ +// 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. + +#![deny(where_clauses_object_safety)] + +trait Trait {} + +trait X { + fn foo(&self) where Self: Trait; //~ ERROR the trait `X` cannot be made into an object + //~^ WARN this was previously accepted by the compiler but is being phased out +} + +impl X for () { + fn foo(&self) {} +} + +impl Trait for dyn X {} + +pub fn main() { + // Check that this does not segfault. + ::foo(&()); +} diff --git a/src/test/ui/issue-50781.stderr b/src/test/ui/issue-50781.stderr new file mode 100644 index 00000000000..047b847e67e --- /dev/null +++ b/src/test/ui/issue-50781.stderr @@ -0,0 +1,17 @@ +error: the trait `X` cannot be made into an object + --> $DIR/issue-50781.rs:16:5 + | +LL | fn foo(&self) where Self: Trait; //~ ERROR the trait `X` cannot be made into an object + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/issue-50781.rs:11:9 + | +LL | #![deny(where_clauses_object_safety)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #51443 + = note: method `foo` references the `Self` type in where clauses + +error: aborting due to previous error + diff --git a/src/test/ui/lint-ctypes.rs b/src/test/ui/lint-ctypes.rs index 4b20001457f..7f22dc8739e 100644 --- a/src/test/ui/lint-ctypes.rs +++ b/src/test/ui/lint-ctypes.rs @@ -59,7 +59,7 @@ pub struct StructWithProjectionAndLifetime<'a>( pub fn char_type(p: char); //~ ERROR uses type `char` pub fn i128_type(p: i128); //~ ERROR uses type `i128` pub fn u128_type(p: u128); //~ ERROR uses type `u128` - pub fn trait_type(p: &Clone); //~ ERROR uses type `std::clone::Clone` + pub fn trait_type(p: &Clone); //~ ERROR uses type `dyn std::clone::Clone` pub fn tuple_type(p: (i32, i32)); //~ ERROR uses type `(i32, i32)` pub fn tuple_type2(p: I32Pair); //~ ERROR uses type `(i32, i32)` pub fn zero_size(p: ZeroSize); //~ ERROR struct has no fields diff --git a/src/test/ui/lint-ctypes.stderr b/src/test/ui/lint-ctypes.stderr index 76b500e7d23..d1ef3a7a19c 100644 --- a/src/test/ui/lint-ctypes.stderr +++ b/src/test/ui/lint-ctypes.stderr @@ -73,10 +73,10 @@ error: `extern` block uses type `u128` which is not FFI-safe: 128-bit integers d LL | pub fn u128_type(p: u128); //~ ERROR uses type `u128` | ^^^^ -error: `extern` block uses type `std::clone::Clone` which is not FFI-safe: trait objects have no C equivalent +error: `extern` block uses type `dyn std::clone::Clone` which is not FFI-safe: trait objects have no C equivalent --> $DIR/lint-ctypes.rs:62:26 | -LL | pub fn trait_type(p: &Clone); //~ ERROR uses type `std::clone::Clone` +LL | pub fn trait_type(p: &Clone); //~ ERROR uses type `dyn std::clone::Clone` | ^^^^^^ error: `extern` block uses type `(i32, i32)` which is not FFI-safe: tuples have unspecified layout diff --git a/src/test/ui/lub-glb/old-lub-glb-object.stderr b/src/test/ui/lub-glb/old-lub-glb-object.stderr index 6a69e7cc717..79442bd108a 100644 --- a/src/test/ui/lub-glb/old-lub-glb-object.stderr +++ b/src/test/ui/lub-glb/old-lub-glb-object.stderr @@ -9,8 +9,8 @@ LL | | _ => y, LL | | }; | |_____^ expected bound lifetime parameter 'a, found concrete lifetime | - = note: expected type `&for<'a, 'b> Foo<&'a u8, &'b u8>` - found type `&for<'a> Foo<&'a u8, &'a u8>` + = note: expected type `&dyn for<'a, 'b> Foo<&'a u8, &'b u8>` + found type `&dyn for<'a> Foo<&'a u8, &'a u8>` = note: this was previously accepted by the compiler but has been phased out = note: for more information, see https://github.com/rust-lang/rust/issues/45852 diff --git a/src/test/ui/mismatched_types/cast-rfc0401.stderr b/src/test/ui/mismatched_types/cast-rfc0401.stderr index feaf492837f..9335795f6b8 100644 --- a/src/test/ui/mismatched_types/cast-rfc0401.stderr +++ b/src/test/ui/mismatched_types/cast-rfc0401.stderr @@ -162,13 +162,13 @@ error[E0607]: cannot cast thin pointer `*const u8` to fat pointer `*const [u8]` LL | let _ = v as *const [u8]; //~ ERROR cannot cast | ^^^^^^^^^^^^^^^^ -error[E0606]: casting `&Foo` as `*const str` is invalid +error[E0606]: casting `&dyn Foo` as `*const str` is invalid --> $DIR/cast-rfc0401.rs:64:13 | LL | let _ = foo as *const str; //~ ERROR is invalid | ^^^^^^^^^^^^^^^^^ -error[E0606]: casting `&Foo` as `*mut str` is invalid +error[E0606]: casting `&dyn Foo` as `*mut str` is invalid --> $DIR/cast-rfc0401.rs:65:13 | LL | let _ = foo as *mut str; //~ ERROR is invalid @@ -200,7 +200,7 @@ LL | let _ = fat_sv as usize; //~ ERROR is invalid | = help: cast through a thin pointer first -error[E0606]: casting `*const Foo` as `*const [u16]` is invalid +error[E0606]: casting `*const dyn Foo` as `*const [u16]` is invalid --> $DIR/cast-rfc0401.rs:78:13 | LL | let _ = cf as *const [u16]; //~ ERROR is invalid @@ -208,7 +208,7 @@ LL | let _ = cf as *const [u16]; //~ ERROR is invalid | = note: vtable kinds may not match -error[E0606]: casting `*const Foo` as `*const Bar` is invalid +error[E0606]: casting `*const dyn Foo` as `*const dyn Bar` is invalid --> $DIR/cast-rfc0401.rs:79:13 | LL | let _ = cf as *const Bar; //~ ERROR is invalid @@ -224,7 +224,7 @@ LL | let _ = fat_v as *const Foo; //~ ERROR the size for value values of typ | = help: the trait `std::marker::Sized` is not implemented for `[u8]` = note: to learn more, visit - = note: required for the cast to the object type `Foo` + = note: required for the cast to the object type `dyn Foo` error[E0277]: the size for value values of type `str` cannot be known at compilation time --> $DIR/cast-rfc0401.rs:72:13 @@ -234,7 +234,7 @@ LL | let _ = a as *const Foo; //~ ERROR the size for value values of type | = help: the trait `std::marker::Sized` is not implemented for `str` = note: to learn more, visit - = note: required for the cast to the object type `Foo` + = note: required for the cast to the object type `dyn Foo` error[E0606]: casting `&{float}` as `f32` is invalid --> $DIR/cast-rfc0401.rs:81:30 diff --git a/src/test/ui/mismatched_types/issue-19109.stderr b/src/test/ui/mismatched_types/issue-19109.stderr index c838c617ae4..018ea941d12 100644 --- a/src/test/ui/mismatched_types/issue-19109.stderr +++ b/src/test/ui/mismatched_types/issue-19109.stderr @@ -2,12 +2,12 @@ error[E0308]: mismatched types --> $DIR/issue-19109.rs:14:5 | LL | fn function(t: &mut Trait) { - | - help: try adding a return type: `-> *mut Trait` + | - help: try adding a return type: `-> *mut dyn Trait` LL | t as *mut Trait | ^^^^^^^^^^^^^^^ expected (), found *-ptr | = note: expected type `()` - found type `*mut Trait` + found type `*mut dyn Trait` error: aborting due to previous error diff --git a/src/test/ui/mismatched_types/trait-bounds-cant-coerce.stderr b/src/test/ui/mismatched_types/trait-bounds-cant-coerce.stderr index bbe9053430a..15c9fd6bf8f 100644 --- a/src/test/ui/mismatched_types/trait-bounds-cant-coerce.stderr +++ b/src/test/ui/mismatched_types/trait-bounds-cant-coerce.stderr @@ -4,8 +4,8 @@ error[E0308]: mismatched types LL | a(x); //~ ERROR mismatched types [E0308] | ^ expected trait `Foo + std::marker::Send`, found trait `Foo` | - = note: expected type `std::boxed::Box` - found type `std::boxed::Box` + = note: expected type `std::boxed::Box<(dyn Foo + std::marker::Send + 'static)>` + found type `std::boxed::Box<(dyn Foo + 'static)>` error: aborting due to previous error diff --git a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr index 3689ca74adb..e0705113577 100644 --- a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr @@ -20,7 +20,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) '_#1r, T, i32, - extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box + extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#2r)> ] = note: number of external vids: 3 = note: where ::Item: '_#2r @@ -60,7 +60,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) '_#1r, T, i32, - extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box + extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#2r)> ] = note: number of external vids: 3 = note: where ::Item: '_#2r @@ -92,7 +92,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) '_#2r, T, i32, - extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box + extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#3r)> ] = note: number of external vids: 4 = note: where ::Item: '_#3r @@ -134,7 +134,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) '_#2r, T, i32, - extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box + extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#3r)> ] = note: number of external vids: 4 = note: where ::Item: '_#3r diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr index 59a8a39a7b0..39ad96cc6cd 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr @@ -20,7 +20,7 @@ LL | with_signature(x, |y| y) '_#1r, T, i32, - extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box + extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r)> ] = note: number of external vids: 3 = note: where T: '_#2r diff --git a/src/test/ui/resolve/issue-5035-2.stderr b/src/test/ui/resolve/issue-5035-2.stderr index efcd0b36248..72bd270165f 100644 --- a/src/test/ui/resolve/issue-5035-2.stderr +++ b/src/test/ui/resolve/issue-5035-2.stderr @@ -1,10 +1,10 @@ -error[E0277]: the size for value values of type `I + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn I + 'static)` cannot be known at compilation time --> $DIR/issue-5035-2.rs:14:8 | LL | fn foo(_x: K) {} | ^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `I + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn I + 'static)` = note: to learn more, visit = note: all local variables must have a statically known size diff --git a/src/test/ui/span/borrowck-object-mutability.nll.stderr b/src/test/ui/span/borrowck-object-mutability.nll.stderr index cf615eed556..b318e778f87 100644 --- a/src/test/ui/span/borrowck-object-mutability.nll.stderr +++ b/src/test/ui/span/borrowck-object-mutability.nll.stderr @@ -2,7 +2,7 @@ error[E0596]: cannot borrow immutable item `*x` as mutable --> $DIR/borrowck-object-mutability.rs:19:5 | LL | fn borrowed_receiver(x: &Foo) { - | ---- help: consider changing this to be a mutable reference: `&mut Foo` + | ---- help: consider changing this to be a mutable reference: `&mut dyn Foo` LL | x.borrowed(); LL | x.borrowed_mut(); //~ ERROR cannot borrow | ^ `x` is a `&` reference, so the data it refers to cannot be borrowed as mutable diff --git a/src/test/ui/suggestions/confuse-field-and-method/issue-2392.stderr b/src/test/ui/suggestions/confuse-field-and-method/issue-2392.stderr index bd5efcd9fee..9049ffd4090 100644 --- a/src/test/ui/suggestions/confuse-field-and-method/issue-2392.stderr +++ b/src/test/ui/suggestions/confuse-field-and-method/issue-2392.stderr @@ -75,7 +75,7 @@ LL | w.wrap.not_closure(); | = help: did you mean to write `w.wrap.not_closure` instead of `w.wrap.not_closure(...)`? -error[E0599]: no method named `closure` found for type `Obj + 'static>>` in the current scope +error[E0599]: no method named `closure` found for type `Obj + 'static)>>` in the current scope --> $DIR/issue-2392.rs:72:24 | LL | struct Obj where F: FnOnce() -> u32 { diff --git a/src/test/ui/trivial-bounds-inconsistent-sized.stderr b/src/test/ui/trivial-bounds-inconsistent-sized.stderr index ee2ff7d7861..e18018c6f0c 100644 --- a/src/test/ui/trivial-bounds-inconsistent-sized.stderr +++ b/src/test/ui/trivial-bounds-inconsistent-sized.stderr @@ -6,7 +6,7 @@ LL | struct S(str, str) where str: Sized; | = note: #[warn(trivial_bounds)] on by default -warning: Trait bound for<'a> T: std::marker::Sized does not depend on any type or lifetime parameters +warning: Trait bound for<'a> T<(dyn A + 'a)>: std::marker::Sized does not depend on any type or lifetime parameters --> $DIR/trivial-bounds-inconsistent-sized.rs:26:1 | LL | / fn unsized_local() where for<'a> T: Sized { diff --git a/src/test/ui/trivial-bounds-inconsistent.stderr b/src/test/ui/trivial-bounds-inconsistent.stderr index ee3c7518294..85b16b17042 100644 --- a/src/test/ui/trivial-bounds-inconsistent.stderr +++ b/src/test/ui/trivial-bounds-inconsistent.stderr @@ -78,7 +78,7 @@ warning: Trait bound str: std::marker::Sized does not depend on any type or life LL | struct TwoStrs(str, str) where str: Sized; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -warning: Trait bound for<'a> Dst: std::marker::Sized does not depend on any type or lifetime parameters +warning: Trait bound for<'a> Dst<(dyn A + 'a)>: std::marker::Sized does not depend on any type or lifetime parameters --> $DIR/trivial-bounds-inconsistent.rs:65:1 | LL | / fn unsized_local() where for<'a> Dst: Sized { diff --git a/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr b/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr index 98249d3f2b5..cb545ca008d 100644 --- a/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr +++ b/src/test/ui/underscore-lifetime/dyn-trait-underscore.stderr @@ -19,8 +19,8 @@ LL | Box::new(items.iter()) //~ ERROR cannot infer an appropriate lifetime | ^^^^^ = note: but, the lifetime must be valid for the static lifetime... = note: ...so that the expression is assignable: - expected std::boxed::Box + 'static> - found std::boxed::Box> + expected std::boxed::Box<(dyn std::iter::Iterator + 'static)> + found std::boxed::Box> error: aborting due to previous error diff --git a/src/test/ui/unsized-enum2.stderr b/src/test/ui/unsized-enum2.stderr index ff2aa1d1ef9..1f30c815d30 100644 --- a/src/test/ui/unsized-enum2.stderr +++ b/src/test/ui/unsized-enum2.stderr @@ -82,43 +82,43 @@ LL | VH{u: isize, x: [u32]}, = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `Foo + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn Foo + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:63:8 | LL | VM(Foo), | ^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `Foo + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn Foo + 'static)` = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `Bar + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn Bar + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:65:8 | LL | VN{x: Bar}, | ^^^^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `Bar + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn Bar + 'static)` = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `FooBar + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn FooBar + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:67:15 | LL | VO(isize, FooBar), | ^^^^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `FooBar + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn FooBar + 'static)` = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `BarFoo + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn BarFoo + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:69:18 | LL | VP{u: isize, x: BarFoo}, | ^^^^^^^^^ doesn't have a size known at compile-time | - = help: the trait `std::marker::Sized` is not implemented for `BarFoo + 'static` + = help: the trait `std::marker::Sized` is not implemented for `(dyn BarFoo + 'static)` = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type @@ -162,46 +162,46 @@ LL | VT{u: isize, x: <&'static [i32] as Deref>::Target}, = note: to learn more, visit = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `PathHelper1 + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn PathHelper1 + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:53:8 | LL | VI(Path1), | ^^^^^ doesn't have a size known at compile-time | - = help: within `Path1`, the trait `std::marker::Sized` is not implemented for `PathHelper1 + 'static` + = help: within `Path1`, the trait `std::marker::Sized` is not implemented for `(dyn PathHelper1 + 'static)` = note: to learn more, visit = note: required because it appears within the type `Path1` = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `PathHelper2 + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn PathHelper2 + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:55:8 | LL | VJ{x: Path2}, | ^^^^^^^^ doesn't have a size known at compile-time | - = help: within `Path2`, the trait `std::marker::Sized` is not implemented for `PathHelper2 + 'static` + = help: within `Path2`, the trait `std::marker::Sized` is not implemented for `(dyn PathHelper2 + 'static)` = note: to learn more, visit = note: required because it appears within the type `Path2` = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `PathHelper3 + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn PathHelper3 + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:57:15 | LL | VK(isize, Path3), | ^^^^^ doesn't have a size known at compile-time | - = help: within `Path3`, the trait `std::marker::Sized` is not implemented for `PathHelper3 + 'static` + = help: within `Path3`, the trait `std::marker::Sized` is not implemented for `(dyn PathHelper3 + 'static)` = note: to learn more, visit = note: required because it appears within the type `Path3` = note: no field of an enum variant may have a dynamically sized type -error[E0277]: the size for value values of type `PathHelper4 + 'static` cannot be known at compilation time +error[E0277]: the size for value values of type `(dyn PathHelper4 + 'static)` cannot be known at compilation time --> $DIR/unsized-enum2.rs:59:18 | LL | VL{u: isize, x: Path4}, | ^^^^^^^^ doesn't have a size known at compile-time | - = help: within `Path4`, the trait `std::marker::Sized` is not implemented for `PathHelper4 + 'static` + = help: within `Path4`, the trait `std::marker::Sized` is not implemented for `(dyn PathHelper4 + 'static)` = note: to learn more, visit = note: required because it appears within the type `Path4` = note: no field of an enum variant may have a dynamically sized type diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index db30e649a7e..35fc2182313 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -184,6 +184,7 @@ struct Builder { cargo_release: String, rls_release: String, rustfmt_release: String, + llvm_tools_release: String, input: PathBuf, output: PathBuf, @@ -196,11 +197,13 @@ struct Builder { cargo_version: Option, rls_version: Option, rustfmt_version: Option, + llvm_tools_version: Option, rust_git_commit_hash: Option, cargo_git_commit_hash: Option, rls_git_commit_hash: Option, rustfmt_git_commit_hash: Option, + llvm_tools_git_commit_hash: Option, } fn main() { @@ -212,7 +215,7 @@ fn main() { let cargo_release = args.next().unwrap(); let rls_release = args.next().unwrap(); let rustfmt_release = args.next().unwrap(); - let _llvm_tools_vers = args.next().unwrap(); // FIXME do something with it? + let llvm_tools_release = args.next().unwrap(); let s3_address = args.next().unwrap(); let mut passphrase = String::new(); t!(io::stdin().read_to_string(&mut passphrase)); @@ -222,6 +225,7 @@ fn main() { cargo_release, rls_release, rustfmt_release, + llvm_tools_release, input, output, @@ -234,11 +238,13 @@ fn main() { cargo_version: None, rls_version: None, rustfmt_version: None, + llvm_tools_version: None, rust_git_commit_hash: None, cargo_git_commit_hash: None, rls_git_commit_hash: None, rustfmt_git_commit_hash: None, + llvm_tools_git_commit_hash: None, }.build(); } @@ -248,11 +254,14 @@ fn build(&mut self) { self.cargo_version = self.version("cargo", "x86_64-unknown-linux-gnu"); self.rls_version = self.version("rls", "x86_64-unknown-linux-gnu"); self.rustfmt_version = self.version("rustfmt", "x86_64-unknown-linux-gnu"); + self.llvm_tools_version = self.version("llvm-tools", "x86_64-unknown-linux-gnu"); self.rust_git_commit_hash = self.git_commit_hash("rust", "x86_64-unknown-linux-gnu"); self.cargo_git_commit_hash = self.git_commit_hash("cargo", "x86_64-unknown-linux-gnu"); self.rls_git_commit_hash = self.git_commit_hash("rls", "x86_64-unknown-linux-gnu"); self.rustfmt_git_commit_hash = self.git_commit_hash("rustfmt", "x86_64-unknown-linux-gnu"); + self.llvm_tools_git_commit_hash = self.git_commit_hash("llvm-tools", + "x86_64-unknown-linux-gnu"); self.digest_and_sign(); let manifest = self.build_manifest(); @@ -289,9 +298,11 @@ fn build_manifest(&mut self) -> Manifest { self.package("rls-preview", &mut manifest.pkg, HOSTS); self.package("rustfmt-preview", &mut manifest.pkg, HOSTS); self.package("rust-analysis", &mut manifest.pkg, TARGETS); + self.package("llvm-tools", &mut manifest.pkg, TARGETS); let rls_present = manifest.pkg.contains_key("rls-preview"); let rustfmt_present = manifest.pkg.contains_key("rustfmt-preview"); + let llvm_tools_present = manifest.pkg.contains_key("llvm-tools"); if rls_present { manifest.renames.insert("rls".to_owned(), Rename { to: "rls-preview".to_owned() }); @@ -346,6 +357,12 @@ fn build_manifest(&mut self) -> Manifest { target: host.to_string(), }); } + if llvm_tools_present { + extensions.push(Component { + pkg: "llvm-tools".to_string(), + target: host.to_string(), + }); + } extensions.push(Component { pkg: "rust-analysis".to_string(), target: host.to_string(), @@ -455,6 +472,8 @@ fn filename(&self, component: &str, target: &str) -> String { format!("rls-{}-{}.tar.gz", self.rls_release, target) } else if component == "rustfmt" || component == "rustfmt-preview" { format!("rustfmt-{}-{}.tar.gz", self.rustfmt_release, target) + } else if component == "llvm_tools" { + format!("llvm-tools-{}-{}.tar.gz", self.llvm_tools_release, target) } else { format!("{}-{}-{}.tar.gz", component, self.rust_release, target) } @@ -467,6 +486,8 @@ fn cached_version(&self, component: &str) -> &Option { &self.rls_version } else if component == "rustfmt" || component == "rustfmt-preview" { &self.rustfmt_version + } else if component == "llvm-tools" { + &self.llvm_tools_version } else { &self.rust_version } @@ -479,6 +500,8 @@ fn cached_git_commit_hash(&self, component: &str) -> &Option { &self.rls_git_commit_hash } else if component == "rustfmt" || component == "rustfmt-preview" { &self.rustfmt_git_commit_hash + } else if component == "llvm-tools" { + &self.llvm_tools_git_commit_hash } else { &self.rust_git_commit_hash }