about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_const_eval/src/transform/promote_consts.rs14
-rw-r--r--src/test/ui/consts/promoted_const_call.rs5
-rw-r--r--src/test/ui/consts/promoted_const_call.stderr23
-rw-r--r--src/test/ui/consts/promoted_const_call2.rs6
-rw-r--r--src/test/ui/consts/promoted_const_call2.stderr30
-rw-r--r--src/test/ui/consts/promoted_const_call3.rs4
-rw-r--r--src/test/ui/consts/promoted_const_call3.stderr33
7 files changed, 99 insertions, 16 deletions
diff --git a/compiler/rustc_const_eval/src/transform/promote_consts.rs b/compiler/rustc_const_eval/src/transform/promote_consts.rs
index f48bcd90809..b0e4f9bc123 100644
--- a/compiler/rustc_const_eval/src/transform/promote_consts.rs
+++ b/compiler/rustc_const_eval/src/transform/promote_consts.rs
@@ -216,12 +216,6 @@ impl<'tcx> Validator<'_, 'tcx> {
                     return Err(Unpromotable);
                 }
 
-                // We cannot promote things that need dropping, since the promoted value
-                // would not get dropped.
-                if self.qualif_local::<qualifs::NeedsDrop>(place.local) {
-                    return Err(Unpromotable);
-                }
-
                 Ok(())
             }
             _ => bug!(),
@@ -262,13 +256,17 @@ impl<'tcx> Validator<'_, 'tcx> {
                 }
             }
         } else {
-            let span = self.body.local_decls[local].source_info.span;
-            span_bug!(span, "{:?} not promotable, qualif_local shouldn't have been called", local);
+            false
         }
     }
 
     fn validate_local(&mut self, local: Local) -> Result<(), Unpromotable> {
         if let TempState::Defined { location: loc, uses, valid } = self.temps[local] {
+            // We cannot promote things that need dropping, since the promoted value
+            // would not get dropped.
+            if self.qualif_local::<qualifs::NeedsDrop>(local) {
+                return Err(Unpromotable);
+            }
             valid.or_else(|_| {
                 let ok = {
                     let block = &self.body[loc.block];
diff --git a/src/test/ui/consts/promoted_const_call.rs b/src/test/ui/consts/promoted_const_call.rs
index 465d8e1f402..3034d3da95c 100644
--- a/src/test/ui/consts/promoted_const_call.rs
+++ b/src/test/ui/consts/promoted_const_call.rs
@@ -1,6 +1,3 @@
-// check-pass
-// known-bug: #91009
-
 #![feature(const_mut_refs)]
 #![feature(const_trait_impl)]
 struct Panic;
@@ -8,6 +5,8 @@ impl const Drop for Panic { fn drop(&mut self) { panic!(); } }
 pub const fn id<T>(x: T) -> T { x }
 pub const C: () = {
     let _: &'static _ = &id(&Panic);
+    //~^ ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
 };
 
 fn main() {}
diff --git a/src/test/ui/consts/promoted_const_call.stderr b/src/test/ui/consts/promoted_const_call.stderr
new file mode 100644
index 00000000000..32bb1941a7d
--- /dev/null
+++ b/src/test/ui/consts/promoted_const_call.stderr
@@ -0,0 +1,23 @@
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call.rs:7:26
+   |
+LL |     let _: &'static _ = &id(&Panic);
+   |            ----------    ^^^^^^^^^^ creates a temporary value which is freed while still in use
+   |            |
+   |            type annotation requires that borrow lasts for `'static`
+...
+LL | };
+   | - temporary value is freed at the end of this statement
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call.rs:7:30
+   |
+LL |     let _: &'static _ = &id(&Panic);
+   |            ----------        ^^^^^ - temporary value is freed at the end of this statement
+   |            |                 |
+   |            |                 creates a temporary value which is freed while still in use
+   |            type annotation requires that borrow lasts for `'static`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0716`.
diff --git a/src/test/ui/consts/promoted_const_call2.rs b/src/test/ui/consts/promoted_const_call2.rs
index 82bde2b58d5..7be0bcdf9e9 100644
--- a/src/test/ui/consts/promoted_const_call2.rs
+++ b/src/test/ui/consts/promoted_const_call2.rs
@@ -1,10 +1,10 @@
-// check-pass
-// known-bug: #91009
-
 #![feature(const_precise_live_drops)]
 pub const fn id<T>(x: T) -> T { x }
 pub const C: () = {
     let _: &'static _ = &id(&String::new());
+    //~^ ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
+    //~| ERROR: destructor of `String` cannot be evaluated at compile-time
 };
 
 fn main() {}
diff --git a/src/test/ui/consts/promoted_const_call2.stderr b/src/test/ui/consts/promoted_const_call2.stderr
new file mode 100644
index 00000000000..b93c0862a25
--- /dev/null
+++ b/src/test/ui/consts/promoted_const_call2.stderr
@@ -0,0 +1,30 @@
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call2.rs:4:26
+   |
+LL |     let _: &'static _ = &id(&String::new());
+   |            ----------    ^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
+   |            |
+   |            type annotation requires that borrow lasts for `'static`
+...
+LL | };
+   | - temporary value is freed at the end of this statement
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call2.rs:4:30
+   |
+LL |     let _: &'static _ = &id(&String::new());
+   |            ----------        ^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
+   |            |                 |
+   |            |                 creates a temporary value which is freed while still in use
+   |            type annotation requires that borrow lasts for `'static`
+
+error[E0493]: destructor of `String` cannot be evaluated at compile-time
+  --> $DIR/promoted_const_call2.rs:4:30
+   |
+LL |     let _: &'static _ = &id(&String::new());
+   |                              ^^^^^^^^^^^^^ the destructor for this type cannot be evaluated in constants
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0493, E0716.
+For more information about an error, try `rustc --explain E0493`.
diff --git a/src/test/ui/consts/promoted_const_call3.rs b/src/test/ui/consts/promoted_const_call3.rs
index 3b55a6f247e..05381c751ee 100644
--- a/src/test/ui/consts/promoted_const_call3.rs
+++ b/src/test/ui/consts/promoted_const_call3.rs
@@ -6,9 +6,11 @@ pub const C: () = {
 
     let _: &'static _ = &id(&String::new());
     //~^ ERROR: destructor of `String` cannot be evaluated at compile-time
+    //~| ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
 
     let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
-    // Promoted. bug!
+    //~^ ERROR: temporary value dropped while borrowed
 };
 
 fn main() {}
diff --git a/src/test/ui/consts/promoted_const_call3.stderr b/src/test/ui/consts/promoted_const_call3.stderr
index e436b7c23d4..f6b4b26d21f 100644
--- a/src/test/ui/consts/promoted_const_call3.stderr
+++ b/src/test/ui/consts/promoted_const_call3.stderr
@@ -26,7 +26,38 @@ LL |     let _: &'static _ = &String::new();
 LL | };
    | - temporary value is freed at the end of this statement
 
-error: aborting due to 3 previous errors
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call3.rs:7:26
+   |
+LL |     let _: &'static _ = &id(&String::new());
+   |            ----------    ^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
+   |            |
+   |            type annotation requires that borrow lasts for `'static`
+...
+LL | };
+   | - temporary value is freed at the end of this statement
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call3.rs:7:30
+   |
+LL |     let _: &'static _ = &id(&String::new());
+   |            ----------        ^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
+   |            |                 |
+   |            |                 creates a temporary value which is freed while still in use
+   |            type annotation requires that borrow lasts for `'static`
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call3.rs:12:26
+   |
+LL |     let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
+   |            ----------    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
+   |            |
+   |            type annotation requires that borrow lasts for `'static`
+LL |
+LL | };
+   | - temporary value is freed at the end of this statement
+
+error: aborting due to 6 previous errors
 
 Some errors have detailed explanations: E0493, E0716.
 For more information about an error, try `rustc --explain E0493`.