Auto merge of #44212 - eddyb:drop-const, r=nikomatsakis
Allow Drop types in const's too, with #![feature(drop_types_in_const)]. Implements the remaining amendment, see #33156. cc @SergioBenitez r? @nikomatsakis
This commit is contained in:
commit
18366f4e8a
6 changed files with 44 additions and 15 deletions
|
|
@ -14,6 +14,6 @@ impl Drop for A {
|
|||
}
|
||||
|
||||
const FOO: A = A;
|
||||
//~^ ERROR: constants are not allowed to have destructors
|
||||
//~^ ERROR: destructors in constants are an unstable feature
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -16,11 +16,18 @@ impl Drop for WithDtor {
|
|||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
static FOO: Option<&'static WithDtor> = Some(&WithDtor);
|
||||
static PROMOTION_FAIL_S: Option<&'static WithDtor> = Some(&WithDtor);
|
||||
//~^ ERROR statics are not allowed to have destructors
|
||||
//~| ERROR borrowed value does not live long enoug
|
||||
|
||||
static BAR: i32 = (WithDtor, 0).1;
|
||||
const PROMOTION_FAIL_C: Option<&'static WithDtor> = Some(&WithDtor);
|
||||
//~^ ERROR constants are not allowed to have destructors
|
||||
//~| ERROR borrowed value does not live long enoug
|
||||
|
||||
static EARLY_DROP_S: i32 = (WithDtor, 0).1;
|
||||
//~^ ERROR statics are not allowed to have destructors
|
||||
|
||||
const EARLY_DROP_C: i32 = (WithDtor, 0).1;
|
||||
//~^ ERROR constants are not allowed to have destructors
|
||||
|
||||
fn main () {}
|
||||
|
|
|
|||
|
|
@ -10,14 +10,32 @@
|
|||
|
||||
#![feature(drop_types_in_const)]
|
||||
|
||||
use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
|
||||
|
||||
static DROP_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
|
||||
struct A(i32);
|
||||
|
||||
impl Drop for A {
|
||||
fn drop(&mut self) {}
|
||||
fn drop(&mut self) {
|
||||
// update global drop count
|
||||
DROP_COUNTER.fetch_add(1, Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
|
||||
static FOO: A = A(123);
|
||||
const BAR: A = A(456);
|
||||
|
||||
impl A {
|
||||
const BAZ: A = A(789);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("{}", &FOO.0);
|
||||
assert_eq!(DROP_COUNTER.load(Ordering::SeqCst), 0);
|
||||
assert_eq!(&FOO.0, &123);
|
||||
assert_eq!(DROP_COUNTER.load(Ordering::SeqCst), 0);
|
||||
assert_eq!(BAR.0, 456);
|
||||
assert_eq!(DROP_COUNTER.load(Ordering::SeqCst), 1);
|
||||
assert_eq!(A::BAZ.0, 789);
|
||||
assert_eq!(DROP_COUNTER.load(Ordering::SeqCst), 2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(drop_types_in_const)]
|
||||
|
||||
struct Foo {
|
||||
a: u32
|
||||
}
|
||||
|
|
@ -24,7 +26,7 @@ impl Drop for Bar {
|
|||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
const F : Foo = Foo { a : 0 };
|
||||
const F : Foo = (Foo { a : 0 }, Foo { a : 1 }).1;
|
||||
|
||||
fn main() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0493]: constants are not allowed to have destructors
|
||||
--> $DIR/E0493.rs:27:17
|
||||
--> $DIR/E0493.rs:29:17
|
||||
|
|
||||
16 | fn drop(&mut self) {}
|
||||
18 | fn drop(&mut self) {}
|
||||
| --------------------- destructor defined here
|
||||
...
|
||||
27 | const F : Foo = Foo { a : 0 };
|
||||
| ^^^^^^^^^^^^^ constants cannot have destructors
|
||||
29 | const F : Foo = (Foo { a : 0 }, Foo { a : 1 }).1;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constants cannot have destructors
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue