Skip to content

Commit baba500

Browse files
committed
Auto merge of #52655 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests Successful merges: - #52538 (Remove obsolete flags in the i586_musl Dockerfile) - #52548 (Cursor: update docs to clarify Cursor only works with in-memory buffers) - #52605 (Do not suggest using `to_owned()` on `&str += &str`) - #52621 (Fix color detection for Windows msys terminals.) - #52622 (Use MultiSpan in E0707 and E709) - #52627 (Compile rustc before building tests for rustdoc) - #52637 (Don't use NonNull::dangling as sentinel value in Rc, Arc) - #52640 (Forget Waker when cloning LocalWaker) - #52641 (Simplify 2 functions in rustc_mir/dataflow) - #52642 (Replace a few expect+format combos with unwrap_or_else+panic) Failed merges: r? @ghost
2 parents e842dea + 3efc612 commit baba500

File tree

19 files changed

+95
-99
lines changed

19 files changed

+95
-99
lines changed

src/Cargo.lock

+7-7
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ dependencies = [
8787

8888
[[package]]
8989
name = "atty"
90-
version = "0.2.10"
90+
version = "0.2.11"
9191
source = "registry+https://github.com/rust-lang/crates.io-index"
9292
dependencies = [
9393
"libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -187,7 +187,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
187187
name = "cargo"
188188
version = "0.30.0"
189189
dependencies = [
190-
"atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
190+
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
191191
"bufstream 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
192192
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
193193
"core-foundation 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -303,7 +303,7 @@ version = "2.32.0"
303303
source = "registry+https://github.com/rust-lang/crates.io-index"
304304
dependencies = [
305305
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
306-
"atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
306+
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
307307
"bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
308308
"strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
309309
"textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -622,7 +622,7 @@ name = "env_logger"
622622
version = "0.5.10"
623623
source = "registry+https://github.com/rust-lang/crates.io-index"
624624
dependencies = [
625-
"atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
625+
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
626626
"humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
627627
"log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
628628
"regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1844,7 +1844,7 @@ name = "rustc-ap-rustc_errors"
18441844
version = "182.0.0"
18451845
source = "registry+https://github.com/rust-lang/crates.io-index"
18461846
dependencies = [
1847-
"atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
1847+
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
18481848
"rustc-ap-rustc_data_structures 182.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
18491849
"rustc-ap-serialize 182.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
18501850
"rustc-ap-syntax_pos 182.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2097,7 +2097,7 @@ dependencies = [
20972097
name = "rustc_errors"
20982098
version = "0.0.0"
20992099
dependencies = [
2100-
"atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
2100+
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
21012101
"rustc_data_structures 0.0.0",
21022102
"serialize 0.0.0",
21032103
"syntax_pos 0.0.0",
@@ -3056,7 +3056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
30563056
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
30573057
"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef"
30583058
"checksum assert_cli 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98589b0e465a6c510d95fceebd365bb79bedece7f6e18a480897f2015f85ec51"
3059-
"checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1"
3059+
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
30603060
"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
30613061
"checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e"
30623062
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"

src/bootstrap/bin/rustc.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ fn main() {
326326
let start = Instant::now();
327327
let status = cmd
328328
.status()
329-
.expect(&format!("\n\n failed to run {:?}", cmd));
329+
.unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd));
330330
let dur = start.elapsed();
331331

332332
let is_test = args.iter().any(|a| a == "--test");
@@ -346,7 +346,7 @@ fn main() {
346346
}
347347
}
348348

349-
let code = exec_cmd(&mut cmd).expect(&format!("\n\n failed to run {:?}", cmd));
349+
let code = exec_cmd(&mut cmd).unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd));
350350
std::process::exit(code);
351351
}
352352

src/bootstrap/install.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ fn install_sh(
7575
let libdir_default = PathBuf::from("lib");
7676
let mandir_default = datadir_default.join("man");
7777
let prefix = builder.config.prefix.as_ref().map_or(prefix_default, |p| {
78-
fs::canonicalize(p).expect(&format!("could not canonicalize {}", p.display()))
78+
fs::canonicalize(p).unwrap_or_else(|_| panic!("could not canonicalize {}", p.display()))
7979
});
8080
let sysconfdir = builder.config.sysconfdir.as_ref().unwrap_or(&sysconfdir_default);
8181
let datadir = builder.config.datadir.as_ref().unwrap_or(&datadir_default);

src/bootstrap/test.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,7 @@ impl Step for CrateRustdoc {
17321732

17331733
let compiler = builder.compiler(builder.top_stage, self.host);
17341734
let target = compiler.host;
1735+
builder.ensure(compile::Rustc { compiler, target });
17351736

17361737
let mut cargo = tool::prepare_tool_cargo(builder,
17371738
compiler,

src/ci/docker/dist-i586-gnu-i586-i686-musl/Dockerfile

+1-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ ENV RUST_CONFIGURE_ARGS \
4242
# See: https://github.com/rust-lang/rust/issues/34978
4343
ENV CFLAGS_i686_unknown_linux_musl=-Wa,-mrelax-relocations=no
4444
ENV CFLAGS_i586_unknown_linux_gnu=-Wa,-mrelax-relocations=no
45-
# FIXME remove -Wl,-melf_i386 after cc is updated to include
46-
# https://github.com/alexcrichton/cc-rs/pull/281
47-
ENV CFLAGS_i586_unknown_linux_musl="-Wa,-mrelax-relocations=no -Wl,-melf_i386"
45+
ENV CFLAGS_i586_unknown_linux_musl=-Wa,-mrelax-relocations=no
4846

4947
ENV TARGETS=i586-unknown-linux-gnu,i686-unknown-linux-musl
5048

src/liballoc/rc.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ use core::ops::Deref;
258258
use core::ops::CoerceUnsized;
259259
use core::ptr::{self, NonNull};
260260
use core::convert::From;
261+
use core::usize;
261262

262263
use alloc::{Global, Alloc, Layout, box_free, handle_alloc_error};
263264
use string::String;
@@ -449,6 +450,8 @@ impl<T: ?Sized> Rc<T> {
449450
#[stable(feature = "rc_weak", since = "1.4.0")]
450451
pub fn downgrade(this: &Self) -> Weak<T> {
451452
this.inc_weak();
453+
// Make sure we do not create a dangling Weak
454+
debug_assert!(!is_dangling(this.ptr));
452455
Weak { ptr: this.ptr }
453456
}
454457

@@ -1154,8 +1157,9 @@ impl<T> From<Vec<T>> for Rc<[T]> {
11541157
pub struct Weak<T: ?Sized> {
11551158
// This is a `NonNull` to allow optimizing the size of this type in enums,
11561159
// but it is not necessarily a valid pointer.
1157-
// `Weak::new` sets this to a dangling pointer so that it doesn’t need
1158-
// to allocate space on the heap.
1160+
// `Weak::new` sets this to `usize::MAX` so that it doesn’t need
1161+
// to allocate space on the heap. That's not a value a real pointer
1162+
// will ever have because RcBox has alignment at least 2.
11591163
ptr: NonNull<RcBox<T>>,
11601164
}
11611165

@@ -1185,15 +1189,14 @@ impl<T> Weak<T> {
11851189
#[stable(feature = "downgraded_weak", since = "1.10.0")]
11861190
pub fn new() -> Weak<T> {
11871191
Weak {
1188-
ptr: NonNull::dangling(),
1192+
ptr: NonNull::new(usize::MAX as *mut RcBox<T>).expect("MAX is not 0"),
11891193
}
11901194
}
11911195
}
11921196

11931197
pub(crate) fn is_dangling<T: ?Sized>(ptr: NonNull<T>) -> bool {
11941198
let address = ptr.as_ptr() as *mut () as usize;
1195-
let align = align_of_val(unsafe { ptr.as_ref() });
1196-
address == align
1199+
address == usize::MAX
11971200
}
11981201

11991202
impl<T: ?Sized> Weak<T> {

src/liballoc/sync.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,9 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T> {}
238238
pub struct Weak<T: ?Sized> {
239239
// This is a `NonNull` to allow optimizing the size of this type in enums,
240240
// but it is not necessarily a valid pointer.
241-
// `Weak::new` sets this to a dangling pointer so that it doesn’t need
242-
// to allocate space on the heap.
241+
// `Weak::new` sets this to `usize::MAX` so that it doesn’t need
242+
// to allocate space on the heap. That's not a value a real pointer
243+
// will ever have because RcBox has alignment at least 2.
243244
ptr: NonNull<ArcInner<T>>,
244245
}
245246

@@ -442,7 +443,11 @@ impl<T: ?Sized> Arc<T> {
442443
// synchronize with the write coming from `is_unique`, so that the
443444
// events prior to that write happen before this read.
444445
match this.inner().weak.compare_exchange_weak(cur, cur + 1, Acquire, Relaxed) {
445-
Ok(_) => return Weak { ptr: this.ptr },
446+
Ok(_) => {
447+
// Make sure we do not create a dangling Weak
448+
debug_assert!(!is_dangling(this.ptr));
449+
return Weak { ptr: this.ptr };
450+
}
446451
Err(old) => cur = old,
447452
}
448453
}
@@ -1033,7 +1038,7 @@ impl<T> Weak<T> {
10331038
#[stable(feature = "downgraded_weak", since = "1.10.0")]
10341039
pub fn new() -> Weak<T> {
10351040
Weak {
1036-
ptr: NonNull::dangling(),
1041+
ptr: NonNull::new(usize::MAX as *mut ArcInner<T>).expect("MAX is not 0"),
10371042
}
10381043
}
10391044
}

src/libcore/task/wake.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
reason = "futures in libcore are unstable",
1313
issue = "50547")]
1414

15-
use fmt;
15+
use {fmt, mem};
1616
use marker::Unpin;
1717
use ptr::NonNull;
1818

@@ -166,9 +166,10 @@ impl From<LocalWaker> for Waker {
166166
impl Clone for LocalWaker {
167167
#[inline]
168168
fn clone(&self) -> Self {
169-
unsafe {
170-
LocalWaker { inner: self.inner.as_ref().clone_raw().inner }
171-
}
169+
let waker = unsafe { self.inner.as_ref().clone_raw() };
170+
let inner = waker.inner;
171+
mem::forget(waker);
172+
LocalWaker { inner }
172173
}
173174
}
174175

src/librustc/hir/lowering.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ use syntax::tokenstream::{Delimited, TokenStream, TokenTree};
7373
use syntax::parse::token::Token;
7474
use syntax::util::small_vector::SmallVector;
7575
use syntax::visit::{self, Visitor};
76-
use syntax_pos::Span;
76+
use syntax_pos::{Span, MultiSpan};
7777

7878
const HIR_ID_COUNTER_LOCKED: u32 = 0xFFFFFFFF;
7979

@@ -2071,7 +2071,7 @@ impl<'a> LoweringContext<'a> {
20712071
if current_lt_name != name {
20722072
struct_span_err!(
20732073
self.context.sess,
2074-
current_lt_span.between(lifetime.span),
2074+
MultiSpan::from_spans(vec![current_lt_span, lifetime.span]),
20752075
E0709,
20762076
"multiple different lifetimes used in arguments of `async fn`",
20772077
)
@@ -2083,7 +2083,7 @@ impl<'a> LoweringContext<'a> {
20832083
} else if current_lt_name.is_elided() && name.is_elided() {
20842084
struct_span_err!(
20852085
self.context.sess,
2086-
current_lt_span.between(lifetime.span),
2086+
MultiSpan::from_spans(vec![current_lt_span, lifetime.span]),
20872087
E0707,
20882088
"multiple elided lifetimes used in arguments of `async fn`",
20892089
)

src/librustc_codegen_llvm/back/rpath.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ fn get_rpath_relative_to_output(config: &mut RPathConfig, lib: &Path) -> String
114114
let mut output = cwd.join(&config.out_filename);
115115
output.pop();
116116
let output = fs::canonicalize(&output).unwrap_or(output);
117-
let relative = path_relative_from(&lib, &output)
118-
.expect(&format!("couldn't create relative path from {:?} to {:?}", output, lib));
117+
let relative = path_relative_from(&lib, &output).unwrap_or_else(||
118+
panic!("couldn't create relative path from {:?} to {:?}", output, lib));
119119
// FIXME (#9639): This needs to handle non-utf8 paths
120120
format!("{}/{}", prefix,
121121
relative.to_str().expect("non-utf8 component in path"))

src/librustc_codegen_llvm/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,7 @@ pub fn provide(providers: &mut Providers) {
12771277
all.iter()
12781278
.find(|cgu| *cgu.name() == name)
12791279
.cloned()
1280-
.expect(&format!("failed to find cgu with name {:?}", name))
1280+
.unwrap_or_else(|| panic!("failed to find cgu with name {:?}", name))
12811281
};
12821282
providers.compile_codegen_unit = compile_codegen_unit;
12831283

src/librustc_mir/dataflow/graphviz.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ pub type Node = BasicBlock;
7373
pub struct Edge { source: BasicBlock, index: usize }
7474

7575
fn outgoing(mir: &Mir, bb: BasicBlock) -> Vec<Edge> {
76-
mir[bb].terminator().successors().enumerate()
77-
.map(|(index, _)| Edge { source: bb, index: index}).collect()
76+
(0..mir[bb].terminator().successors().count())
77+
.map(|index| Edge { source: bb, index: index}).collect()
7878
}
7979

8080
impl<'a, 'tcx, MWF, P> dot::Labeller<'a> for Graph<'a, 'tcx, MWF, P>

src/librustc_mir/dataflow/mod.rs

+1-10
Original file line numberDiff line numberDiff line change
@@ -441,23 +441,14 @@ pub struct DataflowState<O: BitDenotation>
441441
}
442442

443443
impl<O: BitDenotation> DataflowState<O> {
444-
pub fn each_bit<F>(&self, words: &IdxSet<O::Idx>, f: F) where F: FnMut(O::Idx)
445-
{
446-
words.iter().for_each(f)
447-
}
448-
449444
pub(crate) fn interpret_set<'c, P>(&self,
450445
o: &'c O,
451446
words: &IdxSet<O::Idx>,
452447
render_idx: &P)
453448
-> Vec<DebugFormatted>
454449
where P: Fn(&O, O::Idx) -> DebugFormatted
455450
{
456-
let mut v = Vec::new();
457-
self.each_bit(words, |i| {
458-
v.push(render_idx(o, i));
459-
});
460-
v
451+
words.iter().map(|i| render_idx(o, i)).collect()
461452
}
462453
}
463454

src/librustc_typeck/check/op.rs

+36-31
Original file line numberDiff line numberDiff line change
@@ -307,9 +307,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
307307
if let Some(missing_trait) = missing_trait {
308308
if op.node == hir::BinOpKind::Add &&
309309
self.check_str_addition(expr, lhs_expr, rhs_expr, lhs_ty,
310-
rhs_ty, &mut err) {
310+
rhs_ty, &mut err, true) {
311311
// This has nothing here because it means we did string
312-
// concatenation (e.g. "Hello " + "World!"). This means
312+
// concatenation (e.g. "Hello " += "World!"). This means
313313
// we don't want the note in the else clause to be emitted
314314
} else if let ty::TyParam(_) = lhs_ty.sty {
315315
// FIXME: point to span of param
@@ -381,7 +381,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
381381
if let Some(missing_trait) = missing_trait {
382382
if op.node == hir::BinOpKind::Add &&
383383
self.check_str_addition(expr, lhs_expr, rhs_expr, lhs_ty,
384-
rhs_ty, &mut err) {
384+
rhs_ty, &mut err, false) {
385385
// This has nothing here because it means we did string
386386
// concatenation (e.g. "Hello " + "World!"). This means
387387
// we don't want the note in the else clause to be emitted
@@ -410,13 +410,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
410410
(lhs_ty, rhs_ty, return_ty)
411411
}
412412

413-
fn check_str_addition(&self,
414-
expr: &'gcx hir::Expr,
415-
lhs_expr: &'gcx hir::Expr,
416-
rhs_expr: &'gcx hir::Expr,
417-
lhs_ty: Ty<'tcx>,
418-
rhs_ty: Ty<'tcx>,
419-
err: &mut errors::DiagnosticBuilder) -> bool {
413+
fn check_str_addition(
414+
&self,
415+
expr: &'gcx hir::Expr,
416+
lhs_expr: &'gcx hir::Expr,
417+
rhs_expr: &'gcx hir::Expr,
418+
lhs_ty: Ty<'tcx>,
419+
rhs_ty: Ty<'tcx>,
420+
err: &mut errors::DiagnosticBuilder,
421+
is_assign: bool,
422+
) -> bool {
420423
let codemap = self.tcx.sess.codemap();
421424
let msg = "`to_owned()` can be used to create an owned `String` \
422425
from a string reference. String concatenation \
@@ -428,34 +431,36 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
428431
match (&lhs_ty.sty, &rhs_ty.sty) {
429432
(&TyRef(_, l_ty, _), &TyRef(_, r_ty, _))
430433
if l_ty.sty == TyStr && r_ty.sty == TyStr => {
431-
err.span_label(expr.span,
432-
"`+` can't be used to concatenate two `&str` strings");
433-
match codemap.span_to_snippet(lhs_expr.span) {
434-
Ok(lstring) => err.span_suggestion(lhs_expr.span,
435-
msg,
436-
format!("{}.to_owned()", lstring)),
437-
_ => err.help(msg),
438-
};
434+
if !is_assign {
435+
err.span_label(expr.span,
436+
"`+` can't be used to concatenate two `&str` strings");
437+
match codemap.span_to_snippet(lhs_expr.span) {
438+
Ok(lstring) => err.span_suggestion(lhs_expr.span,
439+
msg,
440+
format!("{}.to_owned()", lstring)),
441+
_ => err.help(msg),
442+
};
443+
}
439444
true
440445
}
441446
(&TyRef(_, l_ty, _), &TyAdt(..))
442447
if l_ty.sty == TyStr && &format!("{:?}", rhs_ty) == "std::string::String" => {
443448
err.span_label(expr.span,
444449
"`+` can't be used to concatenate a `&str` with a `String`");
445-
match codemap.span_to_snippet(lhs_expr.span) {
446-
Ok(lstring) => err.span_suggestion(lhs_expr.span,
447-
msg,
448-
format!("{}.to_owned()", lstring)),
449-
_ => err.help(msg),
450-
};
451-
match codemap.span_to_snippet(rhs_expr.span) {
452-
Ok(rstring) => {
453-
err.span_suggestion(rhs_expr.span,
454-
"you also need to borrow the `String` on the right to \
455-
get a `&str`",
456-
format!("&{}", rstring));
450+
match (
451+
codemap.span_to_snippet(lhs_expr.span),
452+
codemap.span_to_snippet(rhs_expr.span),
453+
is_assign,
454+
) {
455+
(Ok(l), Ok(r), false) => {
456+
err.multipart_suggestion(msg, vec![
457+
(lhs_expr.span, format!("{}.to_owned()", l)),
458+
(rhs_expr.span, format!("&{}", r)),
459+
]);
460+
}
461+
_ => {
462+
err.help(msg);
457463
}
458-
_ => {}
459464
};
460465
true
461466
}

0 commit comments

Comments
 (0)