about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/consts/promoted_const_call.rs3
-rw-r--r--src/test/ui/consts/promoted_const_call.stderr24
-rw-r--r--src/test/ui/consts/promoted_const_call4.rs18
-rw-r--r--src/test/ui/consts/promoted_const_call5.rs42
-rw-r--r--src/test/ui/consts/promoted_const_call5.stderr74
5 files changed, 160 insertions, 1 deletions
diff --git a/src/test/ui/consts/promoted_const_call.rs b/src/test/ui/consts/promoted_const_call.rs
index cd71939f561..30ae730535c 100644
--- a/src/test/ui/consts/promoted_const_call.rs
+++ b/src/test/ui/consts/promoted_const_call.rs
@@ -13,4 +13,7 @@ fn main() {
     let _: &'static _ = &id(&Panic);
     //~^ ERROR: temporary value dropped while borrowed
     //~| ERROR: temporary value dropped while borrowed
+    let _: &'static _ = &&(Panic, 0).1;
+    //~^ ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
 }
diff --git a/src/test/ui/consts/promoted_const_call.stderr b/src/test/ui/consts/promoted_const_call.stderr
index 502b432587f..83cc16f6f94 100644
--- a/src/test/ui/consts/promoted_const_call.stderr
+++ b/src/test/ui/consts/promoted_const_call.stderr
@@ -38,6 +38,28 @@ LL |     let _: &'static _ = &id(&Panic);
    |            |                 creates a temporary value which is freed while still in use
    |            type annotation requires that borrow lasts for `'static`
 
-error: aborting due to 4 previous errors
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call.rs:16:26
+   |
+LL |     let _: &'static _ = &&(Panic, 0).1;
+   |            ----------    ^^^^^^^^^^^^^ 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:16:27
+   |
+LL |     let _: &'static _ = &&(Panic, 0).1;
+   |            ----------     ^^^^^^^^^^ 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: aborting due to 6 previous errors
 
 For more information about this error, try `rustc --explain E0716`.
diff --git a/src/test/ui/consts/promoted_const_call4.rs b/src/test/ui/consts/promoted_const_call4.rs
new file mode 100644
index 00000000000..82a17b7bf86
--- /dev/null
+++ b/src/test/ui/consts/promoted_const_call4.rs
@@ -0,0 +1,18 @@
+// run-pass
+
+use std::sync::atomic::*;
+
+static FLAG: AtomicBool = AtomicBool::new(false);
+
+struct NoisyDrop(&'static str);
+impl Drop for NoisyDrop {
+    fn drop(&mut self) {
+        FLAG.store(true, Ordering::SeqCst);
+    }
+}
+fn main() {
+    {
+        let _val = &&(NoisyDrop("drop!"), 0).1;
+    }
+    assert!(FLAG.load(Ordering::SeqCst));
+}
diff --git a/src/test/ui/consts/promoted_const_call5.rs b/src/test/ui/consts/promoted_const_call5.rs
new file mode 100644
index 00000000000..3ac8d358ce4
--- /dev/null
+++ b/src/test/ui/consts/promoted_const_call5.rs
@@ -0,0 +1,42 @@
+#![feature(rustc_attrs)]
+#![feature(staged_api)]
+#![stable(feature = "a", since = "1.0.0")]
+
+#[rustc_promotable]
+#[stable(feature = "a", since = "1.0.0")]
+#[rustc_const_stable(feature = "a", since = "1.0.0")]
+pub const fn id<T>(x: &'static T) -> &'static T { x }
+
+#[rustc_promotable]
+#[stable(feature = "a", since = "1.0.0")]
+#[rustc_const_stable(feature = "a", since = "1.0.0")]
+pub const fn new_string() -> String {
+    String::new()
+}
+
+#[rustc_promotable]
+#[stable(feature = "a", since = "1.0.0")]
+#[rustc_const_stable(feature = "a", since = "1.0.0")]
+pub const fn new_manually_drop<T>(t: T) -> std::mem::ManuallyDrop<T>  {
+    std::mem::ManuallyDrop::new(t)
+}
+
+
+const C: () = {
+    let _: &'static _ = &id(&new_string());
+    //~^ ERROR destructor of `String` cannot be evaluated at compile-time
+    //~| ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
+
+    let _: &'static _ = &new_manually_drop(new_string());
+    //~^ ERROR: temporary value dropped while borrowed
+};
+
+fn main() {
+    let _: &'static _ = &id(&new_string());
+    //~^ ERROR: temporary value dropped while borrowed
+    //~| ERROR: temporary value dropped while borrowed
+
+    let _: &'static _ = &new_manually_drop(new_string());
+    //~^ ERROR: temporary value dropped while borrowed
+}
diff --git a/src/test/ui/consts/promoted_const_call5.stderr b/src/test/ui/consts/promoted_const_call5.stderr
new file mode 100644
index 00000000000..f736220b183
--- /dev/null
+++ b/src/test/ui/consts/promoted_const_call5.stderr
@@ -0,0 +1,74 @@
+error[E0493]: destructor of `String` cannot be evaluated at compile-time
+  --> $DIR/promoted_const_call5.rs:26:30
+   |
+LL |     let _: &'static _ = &id(&new_string());
+   |                              ^^^^^^^^^^^^ - value is dropped here
+   |                              |
+   |                              the destructor for this type cannot be evaluated in constants
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call5.rs:26:26
+   |
+LL |     let _: &'static _ = &id(&new_string());
+   |            ----------    ^^^^^^^^^^^^^^^^^ 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_call5.rs:26:30
+   |
+LL |     let _: &'static _ = &id(&new_string());
+   |                          ----^^^^^^^^^^^^-- temporary value is freed at the end of this statement
+   |                          |   |
+   |                          |   creates a temporary value which is freed while still in use
+   |                          argument requires that borrow lasts for `'static`
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call5.rs:31:26
+   |
+LL |     let _: &'static _ = &new_manually_drop(new_string());
+   |            ----------    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call5.rs:36:26
+   |
+LL |     let _: &'static _ = &id(&new_string());
+   |            ----------    ^^^^^^^^^^^^^^^^^ 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_call5.rs:36:30
+   |
+LL |     let _: &'static _ = &id(&new_string());
+   |                          ----^^^^^^^^^^^^-- temporary value is freed at the end of this statement
+   |                          |   |
+   |                          |   creates a temporary value which is freed while still in use
+   |                          argument requires that borrow lasts for `'static`
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/promoted_const_call5.rs:40:26
+   |
+LL |     let _: &'static _ = &new_manually_drop(new_string());
+   |            ----------    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 7 previous errors
+
+Some errors have detailed explanations: E0493, E0716.
+For more information about an error, try `rustc --explain E0493`.