diff --git a/src/test/stdtest/c_vec.rs b/src/test/stdtest/c_vec.rs
new file mode 100644
index 00000000000..2af2398662c
--- /dev/null
+++ b/src/test/stdtest/c_vec.rs
@@ -0,0 +1,57 @@
+// -*- rust -*-
+use std;
+import std::c_vec::*;
+import std::ctypes::*;
+
+#[link_name = ""]
+#[abi = "cdecl"]
+native mod libc {
+    fn malloc(n: size_t) -> *mutable u8;
+    fn free(m: *mutable u8);
+}
+
+fn malloc(n: size_t) -> t<u8> {
+    let mem = libc::malloc(n);
+
+    assert mem as int != 0;
+
+    ret unsafe { create_with_dtor(mem, n, bind libc::free(mem)) };
+}
+
+#[test]
+fn test_basic() {
+    let cv = malloc(16u);
+
+    set(cv, 3u, 8u8);
+    set(cv, 4u, 9u8);
+    assert get(cv, 3u) == 8u8;
+    assert get(cv, 4u) == 9u8;
+    assert size(cv) == 16u;
+}
+
+#[test]
+#[should_fail]
+fn test_overrun_get() {
+    let cv = malloc(16u);
+
+    get(cv, 17u);
+}
+
+#[test]
+#[should_fail]
+fn test_overrun_set() {
+    let cv = malloc(16u);
+
+    set(cv, 17u, 0u8);
+}
+
+#[test]
+fn test_and_I_mean_it() {
+    let cv = malloc(16u);
+    let p = unsafe { ptr(cv) };
+
+    set(cv, 0u, 32u8);
+    set(cv, 1u, 33u8);
+    assert unsafe { *p } == 32u8;
+    set(cv, 2u, 34u8); /* safety */
+}
diff --git a/src/test/stdtest/stdtest.rc b/src/test/stdtest/stdtest.rc
index a31f2430629..9d714f8f9c5 100644
--- a/src/test/stdtest/stdtest.rc
+++ b/src/test/stdtest/stdtest.rc
@@ -3,6 +3,7 @@ use std;
 mod bitv;
 mod bool;
 mod box;
+mod c_vec;
 mod char;
 mod comm;
 mod deque;