From dcd6620e36092c3c812dbf39d19257fe67363f9f Mon Sep 17 00:00:00 2001
From: Takayuki Maeda
Date: Mon, 4 Jul 2022 22:29:03 +0900
Subject: [PATCH 1/7] add regression test for #79467
---
src/test/rustdoc-ui/issue-79467.rs | 8 ++++++++
src/test/rustdoc-ui/issue-79467.stderr | 9 +++++++++
2 files changed, 17 insertions(+)
create mode 100644 src/test/rustdoc-ui/issue-79467.rs
create mode 100644 src/test/rustdoc-ui/issue-79467.stderr
diff --git a/src/test/rustdoc-ui/issue-79467.rs b/src/test/rustdoc-ui/issue-79467.rs
new file mode 100644
index 0000000000000..eb0b9b380714e
--- /dev/null
+++ b/src/test/rustdoc-ui/issue-79467.rs
@@ -0,0 +1,8 @@
+fn g()
+where
+ 'static: 'static,
+ dyn 'static: 'static + Copy, //~ ERROR at least one trait is required for an object type
+{
+}
+
+fn main() {}
diff --git a/src/test/rustdoc-ui/issue-79467.stderr b/src/test/rustdoc-ui/issue-79467.stderr
new file mode 100644
index 0000000000000..561513a432bb5
--- /dev/null
+++ b/src/test/rustdoc-ui/issue-79467.stderr
@@ -0,0 +1,9 @@
+error[E0224]: at least one trait is required for an object type
+ --> $DIR/issue-79467.rs:4:5
+ |
+LL | dyn 'static: 'static + Copy,
+ | ^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0224`.
From b1541ff198d3684c4dfadca02d87677bea04f8c0 Mon Sep 17 00:00:00 2001
From: Chris Denton
Date: Mon, 4 Jul 2022 15:57:10 +0100
Subject: [PATCH 2/7] bootstrap.py: Always use `.exe` for Windows
This ensure that it will run the Windows executable if other files in the directory (such as Linux executables) have the same file name minus the extension.
---
src/bootstrap/bootstrap.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
index 3c2f1bdb142a7..d2d294d9040b9 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -152,6 +152,10 @@ def run(args, verbose=False, exception=False, is_bootstrap=False, **kwargs):
if verbose:
print("running: " + ' '.join(args))
sys.stdout.flush()
+ # Ensure that the .exe is used on Windoows just in case a Linux ELF has been
+ # compiled in the same directory.
+ if os.name == 'nt' and not args[0].endswith('.exe'):
+ args[0] += '.exe'
# Use Popen here instead of call() as it apparently allows powershell on
# Windows to not lock up waiting for input presumably.
ret = subprocess.Popen(args, **kwargs)
From 6f01ff61b3d9d722031fdb39747283c911b97049 Mon Sep 17 00:00:00 2001
From: Ralf Jung
Date: Mon, 4 Jul 2022 08:57:10 -0400
Subject: [PATCH 3/7] interpret: fix CheckedBinOp behavior when overflow
checking is disabled
---
compiler/rustc_const_eval/src/interpret/intrinsics.rs | 4 +++-
compiler/rustc_const_eval/src/interpret/operator.rs | 8 ++++++++
compiler/rustc_const_eval/src/interpret/step.rs | 4 +++-
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/compiler/rustc_const_eval/src/interpret/intrinsics.rs b/compiler/rustc_const_eval/src/interpret/intrinsics.rs
index e51c51cf45e5e..6744aace84969 100644
--- a/compiler/rustc_const_eval/src/interpret/intrinsics.rs
+++ b/compiler/rustc_const_eval/src/interpret/intrinsics.rs
@@ -217,7 +217,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
sym::mul_with_overflow => BinOp::Mul,
_ => bug!(),
};
- self.binop_with_overflow(bin_op, &lhs, &rhs, dest)?;
+ self.binop_with_overflow(
+ bin_op, /*force_overflow_checks*/ true, &lhs, &rhs, dest,
+ )?;
}
sym::saturating_add | sym::saturating_sub => {
let l = self.read_immediate(&args[0])?;
diff --git a/compiler/rustc_const_eval/src/interpret/operator.rs b/compiler/rustc_const_eval/src/interpret/operator.rs
index dec7fa8c4aa96..454243ddca645 100644
--- a/compiler/rustc_const_eval/src/interpret/operator.rs
+++ b/compiler/rustc_const_eval/src/interpret/operator.rs
@@ -12,9 +12,13 @@ use super::{ImmTy, Immediate, InterpCx, Machine, PlaceTy};
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
/// Applies the binary operation `op` to the two operands and writes a tuple of the result
/// and a boolean signifying the potential overflow to the destination.
+ ///
+ /// `force_overflow_checks` indicates whether overflow checks should be done even when
+ /// `tcx.sess.overflow_checks()` is `false`.
pub fn binop_with_overflow(
&mut self,
op: mir::BinOp,
+ force_overflow_checks: bool,
left: &ImmTy<'tcx, M::PointerTag>,
right: &ImmTy<'tcx, M::PointerTag>,
dest: &PlaceTy<'tcx, M::PointerTag>,
@@ -26,6 +30,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
"type mismatch for result of {:?}",
op,
);
+ // As per https://github.com/rust-lang/rust/pull/98738, we always return `false` in the 2nd
+ // component when overflow checking is disabled.
+ let overflowed = overflowed && (force_overflow_checks || self.tcx.sess.overflow_checks());
+ // Write the result to `dest`.
if let Abi::ScalarPair(..) = dest.layout.abi {
// We can use the optimized path and avoid `place_field` (which might do
// `force_allocation`).
diff --git a/compiler/rustc_const_eval/src/interpret/step.rs b/compiler/rustc_const_eval/src/interpret/step.rs
index 98f69456e49aa..2ee7ed57ab5a7 100644
--- a/compiler/rustc_const_eval/src/interpret/step.rs
+++ b/compiler/rustc_const_eval/src/interpret/step.rs
@@ -185,7 +185,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
let left = self.read_immediate(&self.eval_operand(left, None)?)?;
let layout = binop_right_homogeneous(bin_op).then_some(left.layout);
let right = self.read_immediate(&self.eval_operand(right, layout)?)?;
- self.binop_with_overflow(bin_op, &left, &right, &dest)?;
+ self.binop_with_overflow(
+ bin_op, /*force_overflow_checks*/ false, &left, &right, &dest,
+ )?;
}
UnaryOp(un_op, ref operand) => {
From 9ac4a4e67a2d217179a465bc865e31915682c93c Mon Sep 17 00:00:00 2001
From: Chris Denton
Date: Tue, 5 Jul 2022 09:06:43 +0100
Subject: [PATCH 4/7] Fix typo in src/bootstrap/bootstrap.py
Co-authored-by: Marco Colombo
---
src/bootstrap/bootstrap.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
index d2d294d9040b9..9301c5a2ff300 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -152,7 +152,7 @@ def run(args, verbose=False, exception=False, is_bootstrap=False, **kwargs):
if verbose:
print("running: " + ' '.join(args))
sys.stdout.flush()
- # Ensure that the .exe is used on Windoows just in case a Linux ELF has been
+ # Ensure that the .exe is used on Windows just in case a Linux ELF has been
# compiled in the same directory.
if os.name == 'nt' and not args[0].endswith('.exe'):
args[0] += '.exe'
From 9eec33464e775bc8d25889ec93614f0144ae1471 Mon Sep 17 00:00:00 2001
From: Krasimir Georgiev
Date: Tue, 5 Jul 2022 08:59:50 +0000
Subject: [PATCH 5/7] adapt issue-37945 codegen test to accept any order of ops
---
src/test/codegen/issue-37945.rs | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/test/codegen/issue-37945.rs b/src/test/codegen/issue-37945.rs
index 4234c26b5e89b..12fa1e9e56b6a 100644
--- a/src/test/codegen/issue-37945.rs
+++ b/src/test/codegen/issue-37945.rs
@@ -17,7 +17,9 @@ pub fn is_empty_1(xs: Iter) -> bool {
// CHECK-NEXT: start:
// CHECK-NEXT: [[A:%.*]] = icmp ne {{i32\*|ptr}} %xs.1, null
// CHECK-NEXT: tail call void @llvm.assume(i1 [[A]])
-// CHECK-NEXT: [[B:%.*]] = icmp eq {{i32\*|ptr}} %xs.1, %xs.0
+// The order between %xs.0 and %xs.1 on the next line doesn't matter
+// and different LLVM versions produce different order.
+// CHECK-NEXT: [[B:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}}
// CHECK-NEXT: ret i1 [[B:%.*]]
{xs}.next().is_none()
}
@@ -28,7 +30,9 @@ pub fn is_empty_2(xs: Iter) -> bool {
// CHECK-NEXT: start:
// CHECK-NEXT: [[C:%.*]] = icmp ne {{i32\*|ptr}} %xs.1, null
// CHECK-NEXT: tail call void @llvm.assume(i1 [[C]])
-// CHECK-NEXT: [[D:%.*]] = icmp eq {{i32\*|ptr}} %xs.1, %xs.0
+// The order between %xs.0 and %xs.1 on the next line doesn't matter
+// and different LLVM versions produce different order.
+// CHECK-NEXT: [[D:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}}
// CHECK-NEXT: ret i1 [[D:%.*]]
xs.map(|&x| x).next().is_none()
}
From 2f6e99666218a2f4c0e6b958d710aac445ff85c0 Mon Sep 17 00:00:00 2001
From: Ralf Jung
Date: Mon, 4 Jul 2022 19:24:41 -0400
Subject: [PATCH 6/7] always check overflow in CheckedBinOp in CTFE
---
compiler/rustc_const_eval/src/interpret/machine.rs | 8 ++++++++
compiler/rustc_const_eval/src/interpret/operator.rs | 3 ++-
compiler/rustc_middle/src/mir/syntax.rs | 5 +++--
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/compiler/rustc_const_eval/src/interpret/machine.rs b/compiler/rustc_const_eval/src/interpret/machine.rs
index c18ac84171d69..34644f4eb37d2 100644
--- a/compiler/rustc_const_eval/src/interpret/machine.rs
+++ b/compiler/rustc_const_eval/src/interpret/machine.rs
@@ -144,6 +144,9 @@ pub trait Machine<'mir, 'tcx>: Sized {
true
}
+ /// Whether CheckedBinOp MIR statements should actually check for overflow.
+ fn check_binop_checks_overflow(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool;
+
/// Entry point for obtaining the MIR of anything that should get evaluated.
/// So not just functions and shims, but also const/static initializers, anonymous
/// constants, ...
@@ -468,6 +471,11 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
true
}
+ #[inline(always)]
+ fn check_binop_checks_overflow(_ecx: &InterpCx<$mir, $tcx, Self>) -> bool {
+ true
+ }
+
#[inline(always)]
fn call_extra_fn(
_ecx: &mut InterpCx<$mir, $tcx, Self>,
diff --git a/compiler/rustc_const_eval/src/interpret/operator.rs b/compiler/rustc_const_eval/src/interpret/operator.rs
index 454243ddca645..942bdb36645bd 100644
--- a/compiler/rustc_const_eval/src/interpret/operator.rs
+++ b/compiler/rustc_const_eval/src/interpret/operator.rs
@@ -32,7 +32,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
);
// As per https://github.com/rust-lang/rust/pull/98738, we always return `false` in the 2nd
// component when overflow checking is disabled.
- let overflowed = overflowed && (force_overflow_checks || self.tcx.sess.overflow_checks());
+ let overflowed =
+ overflowed && (force_overflow_checks || M::check_binop_checks_overflow(self));
// Write the result to `dest`.
if let Abi::ScalarPair(..) = dest.layout.abi {
// We can use the optimized path and avoid `place_field` (which might do
diff --git a/compiler/rustc_middle/src/mir/syntax.rs b/compiler/rustc_middle/src/mir/syntax.rs
index 3b7eb820df875..2f4c0ae96b383 100644
--- a/compiler/rustc_middle/src/mir/syntax.rs
+++ b/compiler/rustc_middle/src/mir/syntax.rs
@@ -993,8 +993,9 @@ pub enum Rvalue<'tcx> {
/// Same as `BinaryOp`, but yields `(T, bool)` with a `bool` indicating an error condition.
///
- /// When overflow checking is disabled, the error condition is false. Otherwise, the error
- /// condition is determined as described below.
+ /// When overflow checking is disabled and we are generating run-time code, the error condition
+ /// is false. Otherwise, and always during CTFE, the error condition is determined as described
+ /// below.
///
/// For addition, subtraction, and multiplication on integers the error condition is set when
/// the infinite precision result would be unequal to the actual result.
From 46956f76ca6f02e64c372d334be586650e396963 Mon Sep 17 00:00:00 2001
From: Ralf Jung
Date: Sun, 3 Jul 2022 15:46:22 -0400
Subject: [PATCH 7/7] adjust dangling-int-ptr error message
---
.../rustc_const_eval/src/interpret/machine.rs | 4 ++--
.../rustc_const_eval/src/interpret/place.rs | 2 +-
.../rustc_middle/src/mir/interpret/error.rs | 18 ++++++++----------
.../rustc_middle/src/mir/interpret/pointer.rs | 19 +++++++++++++++++--
.../const-ptr/forbidden_slices.32bit.stderr | 10 +++++-----
.../const-ptr/forbidden_slices.64bit.stderr | 10 +++++-----
src/test/ui/consts/const-deref-ptr.stderr | 2 +-
.../consts/const-eval/const_raw_ptr_ops2.rs | 4 ++--
.../const-eval/const_raw_ptr_ops2.stderr | 4 ++--
.../const-eval/ub-wide-ptr.32bit.stderr | 2 +-
.../const-eval/ub-wide-ptr.64bit.stderr | 2 +-
.../mut_ref_in_final_dynamic_check.rs | 2 +-
.../mut_ref_in_final_dynamic_check.stderr | 2 +-
src/test/ui/consts/offset_from_ub.rs | 4 ++--
src/test/ui/consts/offset_from_ub.stderr | 4 ++--
src/test/ui/consts/offset_ub.stderr | 14 +++++++-------
src/test/ui/consts/ptr_comparisons.stderr | 2 +-
src/test/ui/error-codes/E0396-fixed.stderr | 2 +-
18 files changed, 60 insertions(+), 47 deletions(-)
diff --git a/compiler/rustc_const_eval/src/interpret/machine.rs b/compiler/rustc_const_eval/src/interpret/machine.rs
index c18ac84171d69..ac380c7ac1800 100644
--- a/compiler/rustc_const_eval/src/interpret/machine.rs
+++ b/compiler/rustc_const_eval/src/interpret/machine.rs
@@ -513,7 +513,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
_ecx: &InterpCx<$mir, $tcx, Self>,
addr: u64,
) -> Pointer