about summary refs log tree commit diff
path: root/src/test/ui/zero-sized
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/zero-sized')
-rw-r--r--src/test/ui/zero-sized/zero-size-type-destructors.rs21
-rw-r--r--src/test/ui/zero-sized/zero-sized-binary-heap-push.rs20
-rw-r--r--src/test/ui/zero-sized/zero-sized-btreemap-insert.rs25
-rw-r--r--src/test/ui/zero-sized/zero-sized-linkedlist-push.rs29
-rw-r--r--src/test/ui/zero-sized/zero-sized-tuple-struct.rs12
-rw-r--r--src/test/ui/zero-sized/zero-sized-vec-deque-push.rs32
-rw-r--r--src/test/ui/zero-sized/zero-sized-vec-push.rs20
7 files changed, 159 insertions, 0 deletions
diff --git a/src/test/ui/zero-sized/zero-size-type-destructors.rs b/src/test/ui/zero-sized/zero-size-type-destructors.rs
new file mode 100644
index 00000000000..98b5a439c82
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-size-type-destructors.rs
@@ -0,0 +1,21 @@
+// run-pass
+#![allow(non_upper_case_globals)]
+
+static mut destructions : isize = 3;
+
+pub fn foo() {
+    struct Foo;
+
+    impl Drop for Foo {
+        fn drop(&mut self) {
+          unsafe { destructions -= 1 };
+        }
+    };
+
+    let _x = [Foo, Foo, Foo];
+}
+
+pub fn main() {
+  foo();
+  assert_eq!(unsafe { destructions }, 0);
+}
diff --git a/src/test/ui/zero-sized/zero-sized-binary-heap-push.rs b/src/test/ui/zero-sized/zero-sized-binary-heap-push.rs
new file mode 100644
index 00000000000..6553c5adbe7
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-binary-heap-push.rs
@@ -0,0 +1,20 @@
+// run-pass
+#![allow(unused_variables)]
+use std::collections::BinaryHeap;
+use std::iter::Iterator;
+
+fn main() {
+    const N: usize = 8;
+
+    for len in 0..N {
+        let mut tester = BinaryHeap::with_capacity(len);
+        assert_eq!(tester.len(), 0);
+        assert!(tester.capacity() >= len);
+        for bit in 0..len {
+            tester.push(());
+        }
+        assert_eq!(tester.len(), len);
+        assert_eq!(tester.iter().count(), len);
+        tester.clear();
+    }
+}
diff --git a/src/test/ui/zero-sized/zero-sized-btreemap-insert.rs b/src/test/ui/zero-sized/zero-sized-btreemap-insert.rs
new file mode 100644
index 00000000000..52edb33d6ad
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-btreemap-insert.rs
@@ -0,0 +1,25 @@
+// run-pass
+#![allow(unused_variables)]
+#![allow(unused_imports)]
+use std::cmp::{Ord, Ordering, PartialOrd};
+use std::collections::BTreeMap;
+use std::iter::Iterator;
+
+#[derive(Eq, Hash, Debug, Ord, PartialEq, PartialOrd)]
+struct Zst;
+
+fn main() {
+    const N: usize = 8;
+
+    for len in 0..N {
+        let mut tester = BTreeMap::new();
+        assert_eq!(tester.len(), 0);
+        for bit in 0..len {
+            tester.insert(Zst, ());
+        }
+        assert_eq!(tester.len(), if len == 0 { 0 } else { 1 });
+        assert_eq!(tester.iter().count(), if len == 0 { 0 } else { 1 });
+        assert_eq!(tester.get(&Zst).is_some(), len > 0);
+        tester.clear();
+    }
+}
diff --git a/src/test/ui/zero-sized/zero-sized-linkedlist-push.rs b/src/test/ui/zero-sized/zero-sized-linkedlist-push.rs
new file mode 100644
index 00000000000..03724085f5f
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-linkedlist-push.rs
@@ -0,0 +1,29 @@
+// run-pass
+use std::collections::LinkedList;
+use std::iter::Iterator;
+
+fn main() {
+    const N: usize = 8;
+
+    // Test that for all possible sequences of push_front / push_back,
+    // we end up with a LinkedList of the correct size
+
+    for len in 0..N {
+        let mut tester = LinkedList::new();
+        assert_eq!(tester.len(), 0);
+        assert_eq!(tester.front(), None);
+        for case in 0..(1 << len) {
+            assert_eq!(tester.len(), 0);
+            for bit in 0..len {
+                if case & (1 << bit) != 0 {
+                    tester.push_front(());
+                } else {
+                    tester.push_back(());
+                }
+            }
+            assert_eq!(tester.len(), len);
+            assert_eq!(tester.iter().count(), len);
+            tester.clear();
+        }
+    }
+}
diff --git a/src/test/ui/zero-sized/zero-sized-tuple-struct.rs b/src/test/ui/zero-sized/zero-sized-tuple-struct.rs
new file mode 100644
index 00000000000..6c438720e5d
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-tuple-struct.rs
@@ -0,0 +1,12 @@
+// run-pass
+#![allow(unused_assignments)]
+
+// Make sure that the constructor args are codegened for zero-sized tuple structs
+
+struct Foo(());
+
+fn main() {
+    let mut a = 1;
+    Foo({ a = 2 });
+    assert_eq!(a, 2);
+}
diff --git a/src/test/ui/zero-sized/zero-sized-vec-deque-push.rs b/src/test/ui/zero-sized/zero-sized-vec-deque-push.rs
new file mode 100644
index 00000000000..c541208703b
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-vec-deque-push.rs
@@ -0,0 +1,32 @@
+// run-pass
+use std::collections::VecDeque;
+use std::iter::Iterator;
+
+fn main() {
+    const N: usize = 8;
+
+    // Zero sized type
+    struct Zst;
+
+    // Test that for all possible sequences of push_front / push_back,
+    // we end up with a deque of the correct size
+
+    for len in 0..N {
+        let mut tester = VecDeque::with_capacity(len);
+        assert_eq!(tester.len(), 0);
+        assert!(tester.capacity() >= len);
+        for case in 0..(1 << len) {
+            assert_eq!(tester.len(), 0);
+            for bit in 0..len {
+                if case & (1 << bit) != 0 {
+                    tester.push_front(Zst);
+                } else {
+                    tester.push_back(Zst);
+                }
+            }
+            assert_eq!(tester.len(), len);
+            assert_eq!(tester.iter().count(), len);
+            tester.clear();
+        }
+    }
+}
diff --git a/src/test/ui/zero-sized/zero-sized-vec-push.rs b/src/test/ui/zero-sized/zero-sized-vec-push.rs
new file mode 100644
index 00000000000..9e9fbc972d5
--- /dev/null
+++ b/src/test/ui/zero-sized/zero-sized-vec-push.rs
@@ -0,0 +1,20 @@
+// run-pass
+#![allow(unused_variables)]
+use std::iter::Iterator;
+use std::vec::Vec;
+
+fn main() {
+    const N: usize = 8;
+
+    for len in 0..N {
+        let mut tester = Vec::with_capacity(len);
+        assert_eq!(tester.len(), 0);
+        assert!(tester.capacity() >= len);
+        for bit in 0..len {
+            tester.push(());
+        }
+        assert_eq!(tester.len(), len);
+        assert_eq!(tester.iter().count(), len);
+        tester.clear();
+    }
+}