1
Fork 0

Auto merge of #69612 - Dylan-DPC:rollup-f180gcc, r=Dylan-DPC

Rollup of 7 pull requests

Successful merges:

 - #69504 (Use assert_ne in hash tests)
 - #69554 (Cleanup e0374)
 - #69568 (Clarify explanation of Vec<T> 'fn resize')
 - #69569 (simplify boolean expressions)
 - #69577 (Clean up E0375 explanation)
 - #69598 (rustdoc: HTML escape crate version)
 - #69607 (Clean up E0376 explanation)

Failed merges:

r? @ghost
This commit is contained in:
bors 2020-03-01 17:39:05 +00:00
commit beac68a887
15 changed files with 55 additions and 42 deletions

View file

@ -536,7 +536,7 @@ impl<T: Ord> BinaryHeap<T> {
while child < end { while child < end {
let right = child + 1; let right = child + 1;
// compare with the greater of the two children // compare with the greater of the two children
if right < end && !(hole.get(child) > hole.get(right)) { if right < end && hole.get(child) <= hole.get(right) {
child = right; child = right;
} }
// if we are already in order, stop. // if we are already in order, stop.
@ -568,7 +568,7 @@ impl<T: Ord> BinaryHeap<T> {
while child < end { while child < end {
let right = child + 1; let right = child + 1;
// compare with the greater of the two children // compare with the greater of the two children
if right < end && !(hole.get(child) > hole.get(right)) { if right < end && hole.get(child) <= hole.get(right) {
child = right; child = right;
} }
hole.move_to(child); hole.move_to(child);

View file

@ -1476,8 +1476,9 @@ impl<T: Clone> Vec<T> {
/// difference, with each additional slot filled with `value`. /// difference, with each additional slot filled with `value`.
/// If `new_len` is less than `len`, the `Vec` is simply truncated. /// If `new_len` is less than `len`, the `Vec` is simply truncated.
/// ///
/// This method requires [`Clone`] to be able clone the passed value. If /// This method requires `T` to implement [`Clone`],
/// you need more flexibility (or want to rely on [`Default`] instead of /// in order to be able to clone the passed value.
/// If you need more flexibility (or want to rely on [`Default`] instead of
/// [`Clone`]), use [`resize_with`]. /// [`Clone`]), use [`resize_with`].
/// ///
/// # Examples /// # Examples

View file

@ -298,7 +298,6 @@ fn test_hash_no_concat_alias() {
let t = ("aabb", ""); let t = ("aabb", "");
let u = ("a", "abb"); let u = ("a", "abb");
assert!(s != t && t != u);
assert_ne!(s, t); assert_ne!(s, t);
assert_ne!(t, u); assert_ne!(t, u);
assert_ne!(hash(&s), hash(&t)); assert_ne!(hash(&s), hash(&t));

View file

@ -2135,7 +2135,7 @@ fn set_members_of_composite_type(
/// Computes the type parameters for a type, if any, for the given metadata. /// Computes the type parameters for a type, if any, for the given metadata.
fn compute_type_parameters(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>) -> Option<&'ll DIArray> { fn compute_type_parameters(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>) -> Option<&'ll DIArray> {
if let ty::Adt(def, substs) = ty.kind { if let ty::Adt(def, substs) = ty.kind {
if !substs.types().next().is_none() { if substs.types().next().is_some() {
let generics = cx.tcx.generics_of(def.did); let generics = cx.tcx.generics_of(def.did);
let names = get_parameter_names(cx, generics); let names = get_parameter_names(cx, generics);
let template_params: Vec<_> = substs let template_params: Vec<_> = substs

View file

@ -48,7 +48,7 @@ pub struct DebugScope<D> {
impl<D> DebugScope<D> { impl<D> DebugScope<D> {
pub fn is_valid(&self) -> bool { pub fn is_valid(&self) -> bool {
!self.scope_metadata.is_none() self.scope_metadata.is_some()
} }
} }
@ -304,7 +304,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
) -> Option<IndexVec<mir::Local, Vec<PerLocalVarDebugInfo<'tcx, Bx::DIVariable>>>> { ) -> Option<IndexVec<mir::Local, Vec<PerLocalVarDebugInfo<'tcx, Bx::DIVariable>>>> {
let full_debug_info = self.cx.sess().opts.debuginfo == DebugInfo::Full; let full_debug_info = self.cx.sess().opts.debuginfo == DebugInfo::Full;
if !(full_debug_info || !self.cx.sess().fewer_names()) { if !full_debug_info && self.cx.sess().fewer_names() {
return None; return None;
} }

View file

@ -1,9 +1,5 @@
A struct without a field containing an unsized type cannot implement `CoerceUnsized` was implemented on a struct which does not contain a field with
`CoerceUnsized`. An [unsized type][1] is any type that the compiler an unsized type.
doesn't know the length or alignment of at compile time. Any struct
containing an unsized type is also unsized.
[1]: https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait
Example of erroneous code: Example of erroneous code:
@ -20,6 +16,12 @@ impl<T, U> CoerceUnsized<Foo<U>> for Foo<T>
where T: CoerceUnsized<U> {} where T: CoerceUnsized<U> {}
``` ```
An [unsized type][1] is any type where the compiler does not know the length or
alignment of at compile time. Any struct containing an unsized type is also
unsized.
[1]: https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait
`CoerceUnsized` is used to coerce one struct containing an unsized type `CoerceUnsized` is used to coerce one struct containing an unsized type
into another struct containing a different unsized type. If the struct into another struct containing a different unsized type. If the struct
doesn't have any fields of unsized types then you don't need explicit doesn't have any fields of unsized types then you don't need explicit

View file

@ -1,12 +1,7 @@
A struct with more than one field containing an unsized type cannot implement `CoerceUnsized` was implemented on a struct which contains more than one field
`CoerceUnsized`. This only occurs when you are trying to coerce one of the with an unsized type.
types in your struct to another type in the struct. In this case we try to
impl `CoerceUnsized` from `T` to `U` which are both types that the struct
takes. An [unsized type][1] is any type that the compiler doesn't know the
length or alignment of at compile time. Any struct containing an unsized type
is also unsized.
Example of erroneous code: Erroneous code example:
```compile_fail,E0375 ```compile_fail,E0375
#![feature(coerce_unsized)] #![feature(coerce_unsized)]
@ -22,6 +17,14 @@ struct Foo<T: ?Sized, U: ?Sized> {
impl<T, U> CoerceUnsized<Foo<U, T>> for Foo<T, U> {} impl<T, U> CoerceUnsized<Foo<U, T>> for Foo<T, U> {}
``` ```
A struct with more than one field containing an unsized type cannot implement
`CoerceUnsized`. This only occurs when you are trying to coerce one of the
types in your struct to another type in the struct. In this case we try to
impl `CoerceUnsized` from `T` to `U` which are both types that the struct
takes. An [unsized type][1] is any type that the compiler doesn't know the
length or alignment of at compile time. Any struct containing an unsized type
is also unsized.
`CoerceUnsized` only allows for coercion from a structure with a single `CoerceUnsized` only allows for coercion from a structure with a single
unsized type field to another struct with a single unsized type field. unsized type field to another struct with a single unsized type field.
In fact Rust only allows for a struct to have one unsized type in a struct In fact Rust only allows for a struct to have one unsized type in a struct

View file

@ -1,14 +1,6 @@
The type you are trying to impl `CoerceUnsized` for is not a struct. `CoerceUnsized` was implemented on something that isn't a struct.
`CoerceUnsized` can only be implemented for a struct. Unsized types are
already able to be coerced without an implementation of `CoerceUnsized`
whereas a struct containing an unsized type needs to know the unsized type
field it's containing is able to be coerced. An [unsized type][1]
is any type that the compiler doesn't know the length or alignment of at
compile time. Any struct containing an unsized type is also unsized.
[1]: https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait Erroneous code example:
Example of erroneous code:
```compile_fail,E0376 ```compile_fail,E0376
#![feature(coerce_unsized)] #![feature(coerce_unsized)]
@ -22,6 +14,15 @@ struct Foo<T: ?Sized> {
impl<T, U> CoerceUnsized<U> for Foo<T> {} impl<T, U> CoerceUnsized<U> for Foo<T> {}
``` ```
`CoerceUnsized` can only be implemented for a struct. Unsized types are
already able to be coerced without an implementation of `CoerceUnsized`
whereas a struct containing an unsized type needs to know the unsized type
field it's containing is able to be coerced. An [unsized type][1]
is any type that the compiler doesn't know the length or alignment of at
compile time. Any struct containing an unsized type is also unsized.
[1]: https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait
The `CoerceUnsized` trait takes a struct type. Make sure the type you are The `CoerceUnsized` trait takes a struct type. Make sure the type you are
providing to `CoerceUnsized` is a struct with only the last field containing an providing to `CoerceUnsized` is a struct with only the last field containing an
unsized type. unsized type.

View file

@ -143,9 +143,9 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> {
} }
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
if !t.needs_infer() if !(t.needs_infer()
&& !t.has_erasable_regions() || t.has_erasable_regions()
&& !(t.has_closure_types() && self.infcx.in_progress_tables.is_some()) || (t.has_closure_types() && self.infcx.in_progress_tables.is_some()))
{ {
return t; return t;
} }

View file

@ -1484,7 +1484,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
// Even if the type may have no inference variables, during // Even if the type may have no inference variables, during
// type-checking closure types are in local tables only. // type-checking closure types are in local tables only.
if !self.in_progress_tables.is_some() || !ty.has_closure_types() { if self.in_progress_tables.is_none() || !ty.has_closure_types() {
if !(param_env, ty).has_local_value() { if !(param_env, ty).has_local_value() {
return ty.is_copy_modulo_regions(self.tcx, param_env, span); return ty.is_copy_modulo_regions(self.tcx, param_env, span);
} }

View file

@ -551,7 +551,7 @@ impl Visitor<'tcx> for Checker<'tcx> {
.emit(); .emit();
} else { } else {
let param_env = self.tcx.param_env(def_id); let param_env = self.tcx.param_env(def_id);
if !can_type_implement_copy(self.tcx, param_env, ty).is_ok() { if can_type_implement_copy(self.tcx, param_env, ty).is_err() {
feature_err( feature_err(
&self.tcx.sess.parse_sess, &self.tcx.sess.parse_sess,
sym::untagged_unions, sym::untagged_unions,

View file

@ -313,9 +313,9 @@ impl<'a> Resolver<'a> {
} }
} }
if !self.is_accessible_from(binding.vis, parent_scope.module) && if !(self.is_accessible_from(binding.vis, parent_scope.module) ||
// Remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE` // Remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`
!(self.last_import_segment && binding.is_extern_crate()) (self.last_import_segment && binding.is_extern_crate()))
{ {
self.privacy_errors.push(PrivacyError { self.privacy_errors.push(PrivacyError {
ident, ident,

View file

@ -1313,7 +1313,8 @@ impl Context {
<p>Version {}</p>\ <p>Version {}</p>\
</div>\ </div>\
<a id='all-types' href='index.html'><p>Back to index</p></a>", <a id='all-types' href='index.html'><p>Back to index</p></a>",
crate_name, version crate_name,
Escape(version),
) )
} else { } else {
String::new() String::new()
@ -3974,7 +3975,7 @@ fn print_sidebar(cx: &Context, it: &clean::Item, buffer: &mut Buffer) {
"<div class='block version'>\ "<div class='block version'>\
<p>Version {}</p>\ <p>Version {}</p>\
</div>", </div>",
version Escape(version)
); );
} }
} }

View file

@ -206,7 +206,7 @@ impl<'a> Parser<'a> {
} }
// read `::` if previous code parsed less than 8 groups // read `::` if previous code parsed less than 8 groups
if !self.read_given_char(':').is_some() || !self.read_given_char(':').is_some() { if self.read_given_char(':').is_none() || self.read_given_char(':').is_none() {
return None; return None;
} }

View file

@ -0,0 +1,6 @@
// compile-flags: --crate-version=<script>alert("hi")</script> -Z unstable-options
#![crate_name = "foo"]
// @has 'foo/index.html' '//div[@class="block version"]/p' 'Version <script>alert("hi")</script>'
// @has 'foo/all.html' '//div[@class="block version"]/p' 'Version <script>alert("hi")</script>'