Skip to content

Commit

Permalink
Auto merge of #91263 - Mark-Simulacrum:beta-next, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
[beta] backports

* relate lifetime in TypeOutlives bounds on drop impls #90840
*  [beta] [1.57] Disable LLVM newPM by default #91189

r? `@Mark-Simulacrum`
  • Loading branch information
bors committed Nov 27, 2021
2 parents ef1a3b9 + 150bd8b commit 7e15b23
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 10 deletions.
12 changes: 4 additions & 8 deletions compiler/rustc_codegen_llvm/src/back/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,18 +378,14 @@ fn get_pgo_sample_use_path(config: &ModuleConfig) -> Option<CString> {
}

pub(crate) fn should_use_new_llvm_pass_manager(
cgcx: &CodegenContext<LlvmCodegenBackend>,
_cgcx: &CodegenContext<LlvmCodegenBackend>,
config: &ModuleConfig,
) -> bool {
// The new pass manager is enabled by default for LLVM >= 13.
// This matches Clang, which also enables it since Clang 13.

// FIXME: There are some perf issues with the new pass manager
// when targeting s390x, so it is temporarily disabled for that
// arch, see https://github.com/rust-lang/rust/issues/89609
// The new pass manager is causing significant performance issues such as #91128, and is
// therefore disabled in stable versions of rustc by default.
config
.new_llvm_pass_manager
.unwrap_or_else(|| cgcx.target_arch != "s390x" && llvm_util::get_version() >= (13, 0, 0))
.unwrap_or(false)
}

pub(crate) unsafe fn optimize_with_new_llvm_pass_manager(
Expand Down
8 changes: 6 additions & 2 deletions compiler/rustc_typeck/src/check/dropck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,12 @@ fn ensure_drop_predicates_are_implied_by_item_defn<'tcx>(
ty::PredicateKind::ConstEvaluatable(a),
ty::PredicateKind::ConstEvaluatable(b),
) => tcx.try_unify_abstract_consts((a, b)),
(ty::PredicateKind::TypeOutlives(a), ty::PredicateKind::TypeOutlives(b)) => {
relator.relate(predicate.rebind(a.0), p.rebind(b.0)).is_ok()
(
ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(ty_a, lt_a)),
ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(ty_b, lt_b)),
) => {
relator.relate(predicate.rebind(ty_a), p.rebind(ty_b)).is_ok()
&& relator.relate(predicate.rebind(lt_a), p.rebind(lt_b)).is_ok()
}
_ => predicate == p,
}
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/dropck/relate_lt_in_type_outlives_bound.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
struct Wrapper<'a, T>(&'a T)
where
T: 'a;

impl<'a, T> Drop for Wrapper<'a, T>
where
T: 'static,
//~^ error: `Drop` impl requires `T: 'static` but the struct it is implemented for does not
{
fn drop(&mut self) {}
}

fn main() {}
17 changes: 17 additions & 0 deletions src/test/ui/dropck/relate_lt_in_type_outlives_bound.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0367]: `Drop` impl requires `T: 'static` but the struct it is implemented for does not
--> $DIR/relate_lt_in_type_outlives_bound.rs:7:8
|
LL | T: 'static,
| ^^^^^^^
|
note: the implementor must specify the same requirement
--> $DIR/relate_lt_in_type_outlives_bound.rs:1:1
|
LL | / struct Wrapper<'a, T>(&'a T)
LL | | where
LL | | T: 'a;
| |__________^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0367`.

0 comments on commit 7e15b23

Please sign in to comment.