Auto merge of #68517 - oli-obk:spaces2, r=nagisa
Don't use spaces before type ascription like colons
Split out of #67133 to make that PR simpler
r? @eddyb
diff --git a/.gitmodules b/.gitmodules
index 62cbbdd..003e50d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -15,13 +15,13 @@
url = https://github.com/rust-lang/book.git
[submodule "src/tools/rls"]
path = src/tools/rls
- url = https://github.com/rust-lang-nursery/rls.git
+ url = https://github.com/rust-lang/rls.git
[submodule "src/tools/clippy"]
path = src/tools/clippy
- url = https://github.com/rust-lang-nursery/rust-clippy.git
+ url = https://github.com/rust-lang/rust-clippy.git
[submodule "src/tools/rustfmt"]
path = src/tools/rustfmt
- url = https://github.com/rust-lang-nursery/rustfmt.git
+ url = https://github.com/rust-lang/rustfmt.git
[submodule "src/tools/miri"]
path = src/tools/miri
url = https://github.com/rust-lang/miri.git
diff --git a/src/libcore/fmt/builders.rs b/src/libcore/fmt/builders.rs
index dd0f3cc..8ba0e42 100644
--- a/src/libcore/fmt/builders.rs
+++ b/src/libcore/fmt/builders.rs
@@ -133,7 +133,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn field(&mut self, name: &str, value: &dyn fmt::Debug) -> &mut DebugStruct<'a, 'b> {
+ pub fn field(&mut self, name: &str, value: &dyn fmt::Debug) -> &mut Self {
self.result = self.result.and_then(|_| {
if self.is_pretty() {
if !self.has_fields {
@@ -330,7 +330,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn field(&mut self, value: &dyn fmt::Debug) -> &mut DebugTuple<'a, 'b> {
+ pub fn field(&mut self, value: &dyn fmt::Debug) -> &mut Self {
self.result = self.result.and_then(|_| {
if self.is_pretty() {
if self.fields == 0 {
@@ -492,7 +492,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut DebugSet<'a, 'b> {
+ pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut Self {
self.inner.entry(entry);
self
}
@@ -521,7 +521,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugSet<'a, 'b>
+ pub fn entries<D, I>(&mut self, entries: I) -> &mut Self
where
D: fmt::Debug,
I: IntoIterator<Item = D>,
@@ -624,7 +624,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut DebugList<'a, 'b> {
+ pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut Self {
self.inner.entry(entry);
self
}
@@ -653,7 +653,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugList<'a, 'b>
+ pub fn entries<D, I>(&mut self, entries: I) -> &mut Self
where
D: fmt::Debug,
I: IntoIterator<Item = D>,
@@ -760,7 +760,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entry(&mut self, key: &dyn fmt::Debug, value: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> {
+ pub fn entry(&mut self, key: &dyn fmt::Debug, value: &dyn fmt::Debug) -> &mut Self {
self.key(key).value(value)
}
@@ -797,7 +797,7 @@
/// );
/// ```
#[unstable(feature = "debug_map_key_value", reason = "recently added", issue = "62482")]
- pub fn key(&mut self, key: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> {
+ pub fn key(&mut self, key: &dyn fmt::Debug) -> &mut Self {
self.result = self.result.and_then(|_| {
assert!(
!self.has_key,
@@ -862,7 +862,7 @@
/// );
/// ```
#[unstable(feature = "debug_map_key_value", reason = "recently added", issue = "62482")]
- pub fn value(&mut self, value: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> {
+ pub fn value(&mut self, value: &dyn fmt::Debug) -> &mut Self {
self.result = self.result.and_then(|_| {
assert!(self.has_key, "attempted to format a map value before its key");
@@ -908,7 +908,7 @@
/// );
/// ```
#[stable(feature = "debug_builders", since = "1.2.0")]
- pub fn entries<K, V, I>(&mut self, entries: I) -> &mut DebugMap<'a, 'b>
+ pub fn entries<K, V, I>(&mut self, entries: I) -> &mut Self
where
K: fmt::Debug,
V: fmt::Debug,
diff --git a/src/librustc/mir/interpret/mod.rs b/src/librustc/mir/interpret/mod.rs
index e554b28..54e196f 100644
--- a/src/librustc/mir/interpret/mod.rs
+++ b/src/librustc/mir/interpret/mod.rs
@@ -166,9 +166,15 @@
Reported,
}
-#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd, Debug)]
+#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct AllocId(pub u64);
+impl fmt::Debug for AllocId {
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(fmt, "alloc{}", self.0)
+ }
+}
+
impl rustc_serialize::UseSpecializedEncodable for AllocId {}
impl rustc_serialize::UseSpecializedDecodable for AllocId {}
diff --git a/src/librustc/mir/interpret/pointer.rs b/src/librustc/mir/interpret/pointer.rs
index 9b0399e..a4974fb 100644
--- a/src/librustc/mir/interpret/pointer.rs
+++ b/src/librustc/mir/interpret/pointer.rs
@@ -133,13 +133,13 @@
impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for Pointer<Tag, Id> {
default fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{:?}.{:#x}[{:?}]", self.alloc_id, self.offset.bytes(), self.tag)
+ write!(f, "{:?}+{:x}[{:?}]", self.alloc_id, self.offset.bytes(), self.tag)
}
}
// Specialization for no tag
impl<Id: fmt::Debug> fmt::Debug for Pointer<(), Id> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{:?}.{:#x}", self.alloc_id, self.offset.bytes())
+ write!(f, "{:?}+{:x}", self.alloc_id, self.offset.bytes())
}
}
diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs
index 25f9dc5..c1ae4d9 100644
--- a/src/librustc/ty/structural_impls.rs
+++ b/src/librustc/ty/structural_impls.rs
@@ -805,8 +805,7 @@
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::ExistentialPredicate<'tcx>> {
fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
- let v = self.iter().map(|p| p.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
- folder.tcx().intern_existential_predicates(&v)
+ fold_list(*self, folder, |tcx, v| tcx.intern_existential_predicates(v))
}
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
@@ -816,8 +815,7 @@
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
- let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
- folder.tcx().intern_type_list(&v)
+ fold_list(*self, folder, |tcx, v| tcx.intern_type_list(v))
}
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
@@ -827,8 +825,7 @@
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
- let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
- folder.tcx().intern_projs(&v)
+ fold_list(*self, folder, |tcx, v| tcx.intern_projs(v))
}
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
@@ -992,17 +989,7 @@
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Predicate<'tcx>> {
fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
- // This code is hot enough that it's worth specializing for a list of
- // length 0. (No other length is common enough to be worth singling
- // out).
- if self.len() == 0 {
- self
- } else {
- // Don't bother interning if nothing changed, which is the common
- // case.
- let v = self.iter().map(|p| p.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
- if v[..] == self[..] { self } else { folder.tcx().intern_predicates(&v) }
- }
+ fold_list(*self, folder, |tcx, v| tcx.intern_predicates(v))
}
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
@@ -1075,3 +1062,34 @@
false
}
}
+
+// Does the equivalent of
+// ```
+// let v = self.iter().map(|p| p.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
+// folder.tcx().intern_*(&v)
+// ```
+fn fold_list<'tcx, F, T>(
+ list: &'tcx ty::List<T>,
+ folder: &mut F,
+ intern: impl FnOnce(TyCtxt<'tcx>, &[T]) -> &'tcx ty::List<T>,
+) -> &'tcx ty::List<T>
+where
+ F: TypeFolder<'tcx>,
+ T: TypeFoldable<'tcx> + PartialEq + Copy,
+{
+ let mut iter = list.iter();
+ // Look for the first element that changed
+ if let Some((i, new_t)) = iter.by_ref().enumerate().find_map(|(i, t)| {
+ let new_t = t.fold_with(folder);
+ if new_t == *t { None } else { Some((i, new_t)) }
+ }) {
+ // An element changed, prepare to intern the resulting list
+ let mut new_list = SmallVec::<[_; 8]>::with_capacity(list.len());
+ new_list.extend_from_slice(&list[..i]);
+ new_list.push(new_t);
+ new_list.extend(iter.map(|t| t.fold_with(folder)));
+ intern(folder.tcx(), &new_list)
+ } else {
+ list
+ }
+}
diff --git a/src/librustc_error_codes/error_codes/E0229.md b/src/librustc_error_codes/error_codes/E0229.md
index a8bd341..a8fab05 100644
--- a/src/librustc_error_codes/error_codes/E0229.md
+++ b/src/librustc_error_codes/error_codes/E0229.md
@@ -1,5 +1,7 @@
An associated type binding was done outside of the type parameter declaration
-and `where` clause. Erroneous code example:
+and `where` clause.
+
+Erroneous code example:
```compile_fail,E0229
pub trait Foo {
diff --git a/src/librustc_error_codes/error_codes/E0261.md b/src/librustc_error_codes/error_codes/E0261.md
index 21cf8e7..e326843 100644
--- a/src/librustc_error_codes/error_codes/E0261.md
+++ b/src/librustc_error_codes/error_codes/E0261.md
@@ -1,7 +1,6 @@
-When using a lifetime like `'a` in a type, it must be declared before being
-used.
+An undeclared lifetime was used.
-These two examples illustrate the problem:
+Erroneous code example:
```compile_fail,E0261
// error, use of undeclared lifetime name `'a`
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index 827e9b8..17b2934 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -185,16 +185,17 @@
!invalid
})
.cloned()
- .map(|mut substitution| {
+ .filter_map(|mut substitution| {
// Assumption: all spans are in the same file, and all spans
// are disjoint. Sort in ascending order.
substitution.parts.sort_by_key(|part| part.span.lo());
// Find the bounding span.
- let lo = substitution.parts.iter().map(|part| part.span.lo()).min().unwrap();
- let hi = substitution.parts.iter().map(|part| part.span.hi()).max().unwrap();
+ let lo = substitution.parts.iter().map(|part| part.span.lo()).min()?;
+ let hi = substitution.parts.iter().map(|part| part.span.hi()).max()?;
let bounding_span = Span::with_root_ctxt(lo, hi);
- let lines = cm.span_to_lines(bounding_span).unwrap();
+ // The different spans might belong to different contexts, if so ignore suggestion.
+ let lines = cm.span_to_lines(bounding_span).ok()?;
assert!(!lines.lines.is_empty());
// To build up the result, we do this for each span:
@@ -244,7 +245,7 @@
while buf.ends_with('\n') {
buf.pop();
}
- (buf, substitution.parts, only_capitalization)
+ Some((buf, substitution.parts, only_capitalization))
})
.collect()
}
diff --git a/src/llvm-project b/src/llvm-project
index a6f4c1b..a56b846 160000
--- a/src/llvm-project
+++ b/src/llvm-project
@@ -1 +1 @@
-Subproject commit a6f4c1bb07d58df5956d2c49be68547143f77b18
+Subproject commit a56b846ec7c96d8dc86418819baee40d70c92974
diff --git a/src/test/mir-opt/const-promotion-extern-static.rs b/src/test/mir-opt/const-promotion-extern-static.rs
index 3abc90e..f6f7d09 100644
--- a/src/test/mir-opt/const-promotion-extern-static.rs
+++ b/src/test/mir-opt/const-promotion-extern-static.rs
@@ -14,7 +14,7 @@
// START rustc.FOO.PromoteTemps.before.mir
// bb0: {
// ...
-// _5 = const Scalar(AllocId(1).0x0) : &i32;
+// _5 = const Scalar(alloc1+0) : &i32;
// _4 = &(*_5);
// _3 = [move _4];
// _2 = &_3;
@@ -31,7 +31,7 @@
// START rustc.BAR.PromoteTemps.before.mir
// bb0: {
// ...
-// _5 = const Scalar(AllocId(0).0x0) : &i32;
+// _5 = const Scalar(alloc0+0) : &i32;
// _4 = &(*_5);
// _3 = [move _4];
// _2 = &_3;
diff --git a/src/test/mir-opt/const_prop/read_immutable_static.rs b/src/test/mir-opt/const_prop/read_immutable_static.rs
index d9e0eb6..693ef78 100644
--- a/src/test/mir-opt/const_prop/read_immutable_static.rs
+++ b/src/test/mir-opt/const_prop/read_immutable_static.rs
@@ -10,10 +10,10 @@
// START rustc.main.ConstProp.before.mir
// bb0: {
// ...
-// _3 = const Scalar(AllocId(0).0x0) : &u8;
+// _3 = const Scalar(alloc0+0) : &u8;
// _2 = (*_3);
// ...
-// _5 = const Scalar(AllocId(0).0x0) : &u8;
+// _5 = const Scalar(alloc0+0) : &u8;
// _4 = (*_5);
// _1 = Add(move _2, move _4);
// ...
diff --git a/src/test/ui/consts/miri_unleashed/mutable_const2.stderr b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
index 0d7fb84..a316d8f 100644
--- a/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
+++ b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
@@ -10,7 +10,7 @@
LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:356:17
+thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:357:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: internal compiler error: unexpected panic
diff --git a/src/test/ui/issues/issue-66308.rs b/src/test/ui/issues/issue-66308.rs
new file mode 100644
index 0000000..8460b35
--- /dev/null
+++ b/src/test/ui/issues/issue-66308.rs
@@ -0,0 +1,8 @@
+// build-pass
+// compile-flags: --crate-type lib -C opt-level=0
+
+// Regression test for LLVM crash affecting Emscripten targets
+
+pub fn foo() {
+ (0..0).rev().next();
+}
diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs
new file mode 100644
index 0000000..1c2051e
--- /dev/null
+++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs
@@ -0,0 +1,27 @@
+// Regression test for issue #57611
+// Ensures that we don't ICE
+// FIXME: This should compile, but it currently doesn't
+
+#![feature(trait_alias)]
+#![feature(type_alias_impl_trait)]
+
+trait Foo {
+ type Bar: Baz<Self, Self>;
+
+ fn bar(&self) -> Self::Bar;
+}
+
+struct X;
+
+impl Foo for X {
+ type Bar = impl Baz<Self, Self>; //~ ERROR type mismatch in closure arguments
+ //~^ ERROR type mismatch resolving
+
+ fn bar(&self) -> Self::Bar {
+ |x| x
+ }
+}
+
+trait Baz<A, B> = Fn(&A) -> &B;
+
+fn main() {}
diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr
new file mode 100644
index 0000000..f648b7b
--- /dev/null
+++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr
@@ -0,0 +1,23 @@
+error[E0631]: type mismatch in closure arguments
+ --> $DIR/issue-57611-trait-alias.rs:17:5
+ |
+LL | type Bar = impl Baz<Self, Self>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected signature of `for<'r> fn(&'r X) -> _`
+...
+LL | |x| x
+ | ----- found signature of `fn(_) -> _`
+ |
+ = note: the return type of a function must have a statically known size
+
+error[E0271]: type mismatch resolving `for<'r> <[closure@$DIR/issue-57611-trait-alias.rs:21:9: 21:14] as std::ops::FnOnce<(&'r X,)>>::Output == &'r X`
+ --> $DIR/issue-57611-trait-alias.rs:17:5
+ |
+LL | type Bar = impl Baz<Self, Self>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime
+ |
+ = note: the return type of a function must have a statically known size
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0271, E0631.
+For more information about an error, try `rustc --explain E0271`.
diff --git a/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs
new file mode 100644
index 0000000..fcab2c7
--- /dev/null
+++ b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs
@@ -0,0 +1,31 @@
+// Regression test for issue #57807 - ensure
+// that we properly unify associated types within
+// a type alias impl trait
+// check-pass
+#![feature(type_alias_impl_trait)]
+
+trait Bar {
+ type A;
+}
+
+impl Bar for () {
+ type A = ();
+}
+
+trait Foo {
+ type A;
+ type B: Bar<A = Self::A>;
+
+ fn foo() -> Self::B;
+}
+
+impl Foo for () {
+ type A = ();
+ type B = impl Bar<A = Self::A>;
+
+ fn foo() -> Self::B {
+ ()
+ }
+}
+
+fn main() {}
diff --git a/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs b/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs
new file mode 100644
index 0000000..3c7756e
--- /dev/null
+++ b/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs
@@ -0,0 +1,3 @@
+// compile-flags: --edition=2018
+
+pub use u32;
diff --git a/src/test/ui/use/issue-60976-extern-use-primitive-type.rs b/src/test/ui/use/issue-60976-extern-use-primitive-type.rs
new file mode 100644
index 0000000..4cd4583
--- /dev/null
+++ b/src/test/ui/use/issue-60976-extern-use-primitive-type.rs
@@ -0,0 +1,7 @@
+// Regression test for #60976: ICE (with <=1.36.0) when another file had `use <primitive_type>;`.
+// check-pass
+// aux-build:extern-use-primitive-type-lib.rs
+
+extern crate extern_use_primitive_type_lib;
+
+fn main() {}