Auto merge of #75070 - Manishearth:rollup-2kgcaw5, r=Manishearth

Rollup of 5 pull requests

Successful merges:

 - #74980 (pprust: adjust mixed comment printing and add regression test for #74745)
 - #75009 (Document the discrepancy in the mask type for _mm_shuffle_ps)
 - #75031 (Do not trigger `unused_{braces,parens}` lints with `yield`)
 - #75059 (fix typos)
 - #75064 (compiletest: Support ignoring tests requiring missing LLVM components)

Failed merges:

r? @ghost
This commit is contained in:
bors 2020-08-02 22:07:32 +00:00
commit 81e754c359
45 changed files with 191 additions and 56 deletions

View File

@ -2101,7 +2101,7 @@ impl<T: ?Sized> Unpin for Rc<T> {}
///
/// - This function is safe for any argument if `T` is sized, and
/// - if `T` is unsized, the pointer must have appropriate pointer metadata
/// aquired from the real instance that you are getting this offset for.
/// acquired from the real instance that you are getting this offset for.
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
// Align the unsized value to the end of the `RcBox`.
// Because it is ?Sized, it will always be the last field in memory.

View File

@ -2255,7 +2255,7 @@ impl<T: ?Sized> Unpin for Arc<T> {}
///
/// - This function is safe for any argument if `T` is sized, and
/// - if `T` is unsized, the pointer must have appropriate pointer metadata
/// aquired from the real instance that you are getting this offset for.
/// acquired from the real instance that you are getting this offset for.
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
// Align the unsized value to the end of the `ArcInner`.
// Because it is `?Sized`, it will always be the last field in memory.

View File

@ -37,7 +37,7 @@ fn box_clone_and_clone_from_equivalence() {
/// This test might give a false positive in case the box realocates, but the alocator keeps the
/// original pointer.
///
/// On the other hand it won't give a false negative, if it fails than the memory was definitly not
/// On the other hand it won't give a false negative, if it fails than the memory was definitely not
/// reused
#[test]
fn box_clone_from_ptr_stability() {

View File

@ -189,7 +189,7 @@ unsafe impl AllocRef for System {
ReallocPlacement::MayMove if layout.size() == 0 => {
let new_layout =
// SAFETY: The new size and layout alignement guarantees
// are transfered to the caller (they come from parameters).
// are transferred to the caller (they come from parameters).
//
// See the preconditions for `Layout::from_size_align` to
// see what must be checked.
@ -254,7 +254,7 @@ unsafe impl AllocRef for System {
//
// See `GlobalAlloc::realloc` for more informations about the
// guarantees expected by this method. `ptr`, `layout` and
// `new_size` are parameters and the responsability for their
// `new_size` are parameters and the responsibility for their
// correctness is left to the caller.
//
// `realloc` probably checks for `new_size < size` or something

View File

@ -1363,7 +1363,7 @@ mod self_upper_keyword {}
///
/// let r1 = &FOO as *const _;
/// let r2 = &FOO as *const _;
/// // With a strictly read-only static, references will have the same adress
/// // With a strictly read-only static, references will have the same address
/// assert_eq!(r1, r2);
/// // A static item can be used just like a variable in many cases
/// println!("{:?}", FOO);

View File

@ -81,7 +81,7 @@
// see the changes to drop the `Waiter` struct correctly.
// * There is one place where the two atomics `Once.state_and_queue` and
// `Waiter.signaled` come together, and might be reordered by the compiler or
// processor. Because both use Aquire ordering such a reordering is not
// processor. Because both use Acquire ordering such a reordering is not
// allowed, so no need for SeqCst.
use crate::cell::Cell;

@ -1 +1 @@
Subproject commit 311d56cd91609c1c1c0370cbd2ece8e3048653a5
Subproject commit d6822f9c433bd70f786b157f17beaf64ee28d83a

View File

@ -1158,13 +1158,19 @@ impl Step for Compiletest {
cmd.arg("--quiet");
}
let mut llvm_components_passed = false;
let mut copts_passed = false;
if builder.config.llvm_enabled() {
let llvm_config = builder.ensure(native::Llvm { target: builder.config.build });
if !builder.config.dry_run {
let llvm_version = output(Command::new(&llvm_config).arg("--version"));
let llvm_components = output(Command::new(&llvm_config).arg("--components"));
// Remove trailing newline from llvm-config output.
let llvm_version = llvm_version.trim_end();
cmd.arg("--llvm-version").arg(llvm_version);
cmd.arg("--llvm-version")
.arg(llvm_version.trim())
.arg("--llvm-components")
.arg(llvm_components.trim());
llvm_components_passed = true;
}
if !builder.is_rust_llvm(target) {
cmd.arg("--system-llvm");
@ -1182,15 +1188,13 @@ impl Step for Compiletest {
// Only pass correct values for these flags for the `run-make` suite as it
// requires that a C++ compiler was configured which isn't always the case.
if !builder.config.dry_run && suite == "run-make-fulldeps" {
let llvm_components = output(Command::new(&llvm_config).arg("--components"));
cmd.arg("--cc")
.arg(builder.cc(target))
.arg("--cxx")
.arg(builder.cxx(target).unwrap())
.arg("--cflags")
.arg(builder.cflags(target, GitRepo::Rustc).join(" "))
.arg("--llvm-components")
.arg(llvm_components.trim());
.arg(builder.cflags(target, GitRepo::Rustc).join(" "));
copts_passed = true;
if let Some(ar) = builder.ar(target) {
cmd.arg("--ar").arg(ar);
}
@ -1220,15 +1224,11 @@ impl Step for Compiletest {
}
}
if suite != "run-make-fulldeps" {
cmd.arg("--cc")
.arg("")
.arg("--cxx")
.arg("")
.arg("--cflags")
.arg("")
.arg("--llvm-components")
.arg("");
if !llvm_components_passed {
cmd.arg("--llvm-components").arg("");
}
if !copts_passed {
cmd.arg("--cc").arg("").arg("--cxx").arg("").arg("--cflags").arg("");
}
if builder.remote_tested(target) {

View File

@ -450,7 +450,9 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
fn print_comment(&mut self, cmnt: &comments::Comment) {
match cmnt.style {
comments::Mixed => {
self.zerobreak();
if !self.is_beginning_of_line() {
self.zerobreak();
}
if let Some((last, lines)) = cmnt.lines.split_last() {
self.ibox(0);

View File

@ -166,7 +166,7 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> {
return self.unify_const_variable(!a_is_expected, vid, a);
}
(ty::ConstKind::Unevaluated(..), _) if self.tcx.lazy_normalization() => {
// FIXME(#59490): Need to remove the leak check to accomodate
// FIXME(#59490): Need to remove the leak check to accommodate
// escaping bound variables here.
if !a.has_escaping_bound_vars() && !b.has_escaping_bound_vars() {
relation.const_equate_obligation(a, b);
@ -174,7 +174,7 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> {
return Ok(b);
}
(_, ty::ConstKind::Unevaluated(..)) if self.tcx.lazy_normalization() => {
// FIXME(#59490): Need to remove the leak check to accomodate
// FIXME(#59490): Need to remove the leak check to accommodate
// escaping bound variables here.
if !a.has_escaping_bound_vars() && !b.has_escaping_bound_vars() {
relation.const_equate_obligation(a, b);

View File

@ -195,7 +195,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
}
}
if let (Some(ident), true) = (override_error_code, fn_returns.is_empty()) {
// Provide a more targetted error code and description.
// Provide a more targeted error code and description.
err.code(rustc_errors::error_code!(E0772));
err.set_primary_message(&format!(
"{} has {} but calling `{}` introduces an implicit `'static` lifetime \

View File

@ -422,7 +422,7 @@ trait UnusedDelimLint {
lhs_needs_parens
|| (followed_by_block
&& match inner.kind {
ExprKind::Ret(_) | ExprKind::Break(..) => true,
ExprKind::Ret(_) | ExprKind::Break(..) | ExprKind::Yield(..) => true,
_ => parser::contains_exterior_struct_lit(&inner),
})
}

View File

@ -267,7 +267,7 @@ impl<'a, 'tcx> SpecializedEncoder<Span> for EncodeContext<'a, 'tcx> {
// real code should never need to care about this.
//
// 2. Using `Span::def_site` or `Span::mixed_site` will not
// include any hygiene information associated with the defintion
// include any hygiene information associated with the definition
// site. This means that a proc-macro cannot emit a `$crate`
// identifier which resolves to one of its dependencies,
// which also should never come up in practice.

View File

@ -585,7 +585,7 @@ struct OpaqueTypeExpander<'tcx> {
found_recursion: bool,
/// Whether or not to check for recursive opaque types.
/// This is `true` when we're explicitly checking for opaque type
/// recursion, and 'false' otherwise to avoid unecessary work.
/// recursion, and 'false' otherwise to avoid unnecessary work.
check_recursion: bool,
tcx: TyCtxt<'tcx>,
}

View File

@ -524,7 +524,7 @@ impl<'tcx> Validator<'_, 'tcx> {
// The `is_empty` predicate is introduced to exclude the case
// where the projection operations are [ .field, * ].
// The reason is because promotion will be illegal if field
// accesses preceed the dereferencing.
// accesses precede the dereferencing.
// Discussion can be found at
// https://github.com/rust-lang/rust/pull/74945#discussion_r463063247
// There may be opportunity for generalization, but this needs to be

View File

@ -133,7 +133,7 @@ crate enum PatKind<'tcx> {
var: hir::HirId,
ty: Ty<'tcx>,
subpattern: Option<Pat<'tcx>>,
/// Is this the leftmost occurance of the binding, i.e., is `var` the
/// Is this the leftmost occurrence of the binding, i.e., is `var` the
/// `HirId` of this pattern?
is_primary: bool,
},

View File

@ -1717,7 +1717,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
}
// `-Z instrument-coverage` implies:
// * `-Z symbol-mangling-version=v0` - to ensure consistent and reversable name mangling.
// * `-Z symbol-mangling-version=v0` - to ensure consistent and reversible name mangling.
// Note, LLVM coverage tools can analyze coverage over multiple runs, including some
// changes to source code; so mangled names must be consistent across compilations.
// * `-C link-dead-code` - so unexecuted code is still counted as zero, rather than be

View File

@ -63,7 +63,7 @@ impl GatedSpans {
#[derive(Default)]
pub struct SymbolGallery {
/// All symbols occurred and their first occurrance span.
/// All symbols occurred and their first occurrence span.
pub symbols: Lock<BTreeMap<Symbol, Span>>,
}

View File

@ -891,7 +891,7 @@ impl UseSpecializedDecodable for ExpnId {}
#[derive(Default)]
pub struct HygieneEncodeContext {
/// All `SyntaxContexts` for which we have writen `SyntaxContextData` into crate metadata.
/// All `SyntaxContexts` for which we have written `SyntaxContextData` into crate metadata.
/// This is `None` after we finish encoding `SyntaxContexts`, to ensure
/// that we don't accidentally try to encode any more `SyntaxContexts`
serialized_ctxts: Lock<FxHashSet<SyntaxContext>>,
@ -961,7 +961,7 @@ pub struct HygieneDecodeContext {
// Maps serialized `SyntaxContext` ids to a `SyntaxContext` in the current
// global `HygieneData`. When we deserialize a `SyntaxContext`, we need to create
// a new id in the global `HygieneData`. This map tracks the ID we end up picking,
// so that multiple occurences of the same serialized id are decoded to the same
// so that multiple occurrences of the same serialized id are decoded to the same
// `SyntaxContext`
remapped_ctxts: Lock<Vec<Option<SyntaxContext>>>,
// The same as `remapepd_ctxts`, but for `ExpnId`s

View File

@ -456,7 +456,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
//
// Both of these trigger a special `CoerceUnsized`-related error (E0376)
//
// We can take advantage of this fact to avoid performing unecessary work.
// We can take advantage of this fact to avoid performing unnecessary work.
// If either `source` or `target` is a type variable, then any applicable impl
// would need to be generic over the self-type (`impl<T> CoerceUnsized<SomeType> for T`)
// or generic over the `CoerceUnsized` type parameter (`impl<T> CoerceUnsized<T> for

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: -O
// compile-flags: --target aarch64-unknown-linux-gnu
// needs-llvm-components: aarch64
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -1,6 +1,7 @@
// no-system-llvm
// assembly-output: emit-asm
// compile-flags: --target aarch64-unknown-linux-gnu
// needs-llvm-components: aarch64
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -3,6 +3,7 @@
// compile-flags: -O
// compile-flags: --target armv7-unknown-linux-gnueabihf
// compile-flags: -C target-feature=+neon
// needs-llvm-components: arm
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: --target armv7-unknown-linux-gnueabihf
// compile-flags: -C target-feature=+neon
// needs-llvm-components: arm
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -1,6 +1,7 @@
// no-system-llvm
// assembly-output: emit-asm
// compile-flags: --target hexagon-unknown-linux-musl
// needs-llvm-components: hexagon
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: --target nvptx64-nvidia-cuda
// compile-flags: --crate-type cdylib
// needs-llvm-components: nvptx
#![feature(no_core, lang_items, rustc_attrs)]
#![no_core]

View File

@ -3,6 +3,7 @@
// compile-flags: -O
// compile-flags: --target riscv64gc-unknown-linux-gnu
// compile-flags: -C target-feature=+f
// needs-llvm-components: riscv
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -4,6 +4,7 @@
//[riscv64] compile-flags: --target riscv64imac-unknown-none-elf
//[riscv32] compile-flags: --target riscv32imac-unknown-none-elf
// compile-flags: -C target-feature=+d
// needs-llvm-components: riscv
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -1,12 +1,14 @@
// Checks if the correct annotation for the efiapi ABI is passed to llvm.
// revisions:x86_64 i686 arm
// revisions:x86_64 i686 aarch64 arm riscv
// min-llvm-version: 9.0
// needs-llvm-components: aarch64 arm riscv
//[x86_64] compile-flags: --target x86_64-unknown-uefi
//[i686] compile-flags: --target i686-unknown-linux-musl
//[aarch64] compile-flags: --target aarch64-unknown-none
//[arm] compile-flags: --target armv7r-none-eabi
//[riscv] compile-flags: --target riscv64gc-unknown-none-elf
// compile-flags: -C no-prepopulate-passes
#![crate_type = "lib"]
@ -22,6 +24,8 @@ trait Copy { }
//x86_64: define win64cc void @has_efiapi
//i686: define void @has_efiapi
//aarch64: define void @has_efiapi
//arm: define void @has_efiapi
//riscv: define void @has_efiapi
#[no_mangle]
pub extern "efiapi" fn has_efiapi() {}

View File

@ -1,4 +1,5 @@
// compile-flags: -O --target=avr-unknown-unknown --crate-type=rlib
// needs-llvm-components: avr
// This test validates that function pointers can be stored in global variables
// and called upon. It ensures that Rust emits function pointers in the correct

View File

@ -73,7 +73,6 @@ fn f() {
*/
/* */
/*
@ -81,7 +80,6 @@ fn f() {
Space 6+2: compare A
Ogham Space Mark 6+2: compare B
*/
/**/
/*

View File

@ -0,0 +1,5 @@
// ignore-tidy-trailing-newlines
// pretty-compare-only
/*
*/

View File

@ -10,7 +10,7 @@
// const-evaluator computes a value that *does* meet the conditions for
// structural-match, but the const expression itself has abstractions (like
// calls to const functions) that may fit better with a type-based analysis
// rather than a committment to a specific value.
// rather than a commitment to a specific value.
#![warn(indirect_structural_match)]

View File

@ -1,5 +1,5 @@
// This test is from #73976. We previously did not check if a type is monomorphized
// before calculating its type id, which leads to the bizzare behaviour below that
// before calculating its type id, which leads to the bizarre behaviour below that
// TypeId of a generic type does not match itself.
//
// This test case should either run-pass or be rejected at compile time.

View File

@ -3,6 +3,7 @@
// compile-flags: --target=thumbv6m-none-eabi
// ignore-arm
// needs-llvm-components: arm
// error-pattern:target may not be installed
fn main() { }

View File

@ -1,6 +1,7 @@
//~ ERROR 1:1: 1:1: can't find crate for `core` [E0463]
// compile-flags: --target thumbv7em-none-eabihf
// needs-llvm-components: arm
#![deny(unsafe_code)]
#![deny(warnings)]
#![no_std]

View File

@ -1,4 +1,5 @@
// compile-flags: --crate-type dylib --target thumbv7em-none-eabihf
// needs-llvm-components: arm
// build-pass
// error-pattern: dropping unsupported crate type `dylib` for target `thumbv7em-none-eabihf`

View File

@ -0,0 +1,33 @@
#![feature(generator_trait)]
#![feature(generators)]
#![deny(unused_braces, unused_parens)]
use std::ops::Generator;
use std::pin::Pin;
fn main() {
let mut x = |_| {
while let Some(_) = (yield) {}
while let Some(_) = {yield} {}
// Only warn these cases
while let Some(_) = ({yield}) {} //~ ERROR: unnecessary parentheses
while let Some(_) = ((yield)) {} //~ ERROR: unnecessary parentheses
{{yield}}; //~ ERROR: unnecessary braces
{( yield )}; //~ ERROR: unnecessary parentheses
// FIXME: Reduce duplicate warnings.
// Perhaps we should tweak checks in `BlockRetValue`?
while let Some(_) = {(yield)} {}
//~^ ERROR: unnecessary braces
//~| ERROR: unnecessary parentheses
while let Some(_) = {{yield}} {}
//~^ ERROR: unnecessary braces
//~| ERROR: unnecessary braces
// FIXME: It'd be great if we could also warn them.
((yield));
({ yield });
};
let _ = Pin::new(&mut x).resume(Some(5));
}

View File

@ -0,0 +1,62 @@
error: unnecessary parentheses around `let` scrutinee expression
--> $DIR/issue-74883-unused-paren-baren-yield.rs:14:29
|
LL | while let Some(_) = ({yield}) {}
| ^^^^^^^^^ help: remove these parentheses
|
note: the lint level is defined here
--> $DIR/issue-74883-unused-paren-baren-yield.rs:3:24
|
LL | #![deny(unused_braces, unused_parens)]
| ^^^^^^^^^^^^^
error: unnecessary parentheses around `let` scrutinee expression
--> $DIR/issue-74883-unused-paren-baren-yield.rs:15:29
|
LL | while let Some(_) = ((yield)) {}
| ^^^^^^^^^ help: remove these parentheses
error: unnecessary braces around block return value
--> $DIR/issue-74883-unused-paren-baren-yield.rs:16:10
|
LL | {{yield}};
| ^^^^^^^ help: remove these braces
|
note: the lint level is defined here
--> $DIR/issue-74883-unused-paren-baren-yield.rs:3:9
|
LL | #![deny(unused_braces, unused_parens)]
| ^^^^^^^^^^^^^
error: unnecessary parentheses around block return value
--> $DIR/issue-74883-unused-paren-baren-yield.rs:17:10
|
LL | {( yield )};
| ^^^^^^^^^ help: remove these parentheses
error: unnecessary braces around `let` scrutinee expression
--> $DIR/issue-74883-unused-paren-baren-yield.rs:21:29
|
LL | while let Some(_) = {(yield)} {}
| ^^^^^^^^^ help: remove these braces
error: unnecessary parentheses around block return value
--> $DIR/issue-74883-unused-paren-baren-yield.rs:21:30
|
LL | while let Some(_) = {(yield)} {}
| ^^^^^^^ help: remove these parentheses
error: unnecessary braces around `let` scrutinee expression
--> $DIR/issue-74883-unused-paren-baren-yield.rs:24:29
|
LL | while let Some(_) = {{yield}} {}
| ^^^^^^^^^ help: remove these braces
error: unnecessary braces around block return value
--> $DIR/issue-74883-unused-paren-baren-yield.rs:24:30
|
LL | while let Some(_) = {{yield}} {}
| ^^^^^^^ help: remove these braces
error: aborting due to 8 previous errors

View File

@ -23,7 +23,7 @@ struct _ヒb;
struct __χa;
//~^ ERROR type `__χa` should have an upper camel case name
// Besides this, we cannot have two continous underscores in the middle.
// Besides this, we cannot have two continuous underscores in the middle.
struct __否;
//~^ ERROR type `对__否` should have an upper camel case name

View File

@ -18,7 +18,7 @@ fn 编程() {}
fn Ц() {}
//~^ ERROR function `Ц` should have a snake case name
// besides this, you cannot use continous underscores in the middle
// besides this, you cannot use continuous underscores in the middle
fn __隔() {}
//~^ ERROR function `分__隔` should have a snake case name

View File

@ -1,4 +1,4 @@
// Test proc-macro crate can be built without addtional RUSTFLAGS
// Test proc-macro crate can be built without additional RUSTFLAGS
// on musl target
// override -Ctarget-feature=-crt-static from compiletest
// compile-flags: -Ctarget-feature=

View File

@ -149,7 +149,7 @@ fn main() {
1 + 2, 3
- 4, 5
];
// lint if it doesnt
// lint if it doesn't
let _ = &[
-1
-4,

View File

@ -1,3 +1,4 @@
use std::collections::HashSet;
use std::env;
use std::fs::File;
use std::io::prelude::*;
@ -186,6 +187,17 @@ impl EarlyProps {
if config.system_llvm && line.starts_with("no-system-llvm") {
return true;
}
if let Some(needed_components) =
config.parse_name_value_directive(line, "needs-llvm-components")
{
let components: HashSet<_> = config.llvm_components.split_whitespace().collect();
if !needed_components
.split_whitespace()
.all(|needed_component| components.contains(needed_component))
{
return true;
}
}
if let Some(actual_version) = config.llvm_version {
if let Some(rest) = line.strip_prefix("min-llvm-version:").map(str::trim) {
let min_version = extract_llvm_version(rest).unwrap();

View File

@ -178,27 +178,30 @@ pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec<Misma
results
}
fn print_diff(expected: &str, actual: &str, context_size: usize) {
fn write_diff(expected: &str, actual: &str, context_size: usize) -> String {
use std::fmt::Write;
let mut output = String::new();
let diff_results = make_diff(expected, actual, context_size);
for result in diff_results {
let mut line_number = result.line_number;
for line in result.lines {
match line {
DiffLine::Expected(e) => {
println!("-\t{}", e);
writeln!(output, "-\t{}", e).unwrap();
line_number += 1;
}
DiffLine::Context(c) => {
println!("{}\t{}", line_number, c);
writeln!(output, "{}\t{}", line_number, c).unwrap();
line_number += 1;
}
DiffLine::Resulting(r) => {
println!("+\t{}", r);
writeln!(output, "+\t{}", r).unwrap();
}
}
}
println!();
writeln!(output, "").unwrap();
}
output
}
pub fn run(config: Config, testpaths: &TestPaths, revision: Option<&str>) {
@ -655,8 +658,12 @@ impl<'test> TestCx<'test> {
------------------------------------------\n\
{}\n\
------------------------------------------\n\
\n",
expected, actual
diff:\n\
------------------------------------------\n\
{}\n",
expected,
actual,
write_diff(expected, actual, 3),
));
}
}
@ -3227,7 +3234,7 @@ impl<'test> TestCx<'test> {
}
let expected_string = fs::read_to_string(&expected_file).unwrap();
if dumped_string != expected_string {
print_diff(&expected_string, &dumped_string, 3);
print!("{}", write_diff(&expected_string, &dumped_string, 3));
panic!(
"Actual MIR output differs from expected MIR output {}",
expected_file.display()
@ -3452,7 +3459,7 @@ impl<'test> TestCx<'test> {
println!("normalized {}:\n{}\n", kind, actual);
} else {
println!("diff of {}:\n", kind);
print_diff(expected, actual, 3);
print!("{}", write_diff(expected, actual, 3));
}
}