diff --git a/src/doc/reference.md b/src/doc/reference.md
index 9851e1c28fb..15ae686d965 100644
--- a/src/doc/reference.md
+++ b/src/doc/reference.md
@@ -2467,6 +2467,12 @@ The currently implemented features of the reference compiler are:
 
 * `associated_types` - Allows type aliases in traits. Experimental.
 
+* `no_std` - Allows the `#![no_std]` crate attribute, which disables the implicit
+             `extern crate std`. This typically requires use of the unstable APIs
+             behind the libstd "facade", such as libcore and libcollections. It
+             may also cause problems when using syntax extensions, including
+             `#[derive]`.
+
 If a feature is promoted to a language feature, then all existing programs will
 start to receive compilation warnings about #[feature] directives which enabled
 the new feature (because the directive is no longer necessary). However, if a
diff --git a/src/doc/trpl/unsafe.md b/src/doc/trpl/unsafe.md
index 3acd1eefe89..b364d00f95c 100644
--- a/src/doc/trpl/unsafe.md
+++ b/src/doc/trpl/unsafe.md
@@ -433,6 +433,7 @@ attribute attached to the crate.
 ```ignore
 // a minimal library
 #![crate_type="lib"]
+#![feature(no_std)]
 #![no_std]
 # // fn main() {} tricked you, rustdoc!
 ```
@@ -446,8 +447,8 @@ The function marked `#[start]` is passed the command line parameters
 in the same format as C:
 
 ```
+#![feature(lang_items, start, no_std)]
 #![no_std]
-#![feature(lang_items, start)]
 
 // Pull in the system libc library for what crt0.o likely requires
 extern crate libc;
@@ -473,6 +474,7 @@ correct ABI and the correct name, which requires overriding the
 compiler's name mangling too:
 
 ```ignore
+#![feature(no_std)]
 #![no_std]
 #![no_main]
 #![feature(lang_items, start)]
@@ -528,8 +530,8 @@ As an example, here is a program that will calculate the dot product of two
 vectors provided from C, using idiomatic Rust practices.
 
 ```
+#![feature(lang_items, start, no_std)]
 #![no_std]
-#![feature(lang_items, start)]
 
 # extern crate libc;
 extern crate core;
@@ -652,8 +654,8 @@ and one for deallocation. A freestanding program that uses the `Box`
 sugar for dynamic allocations via `malloc` and `free`:
 
 ```
+#![feature(lang_items, box_syntax, start, no_std)]
 #![no_std]
-#![feature(lang_items, box_syntax, start)]
 
 extern crate libc;
 
diff --git a/src/liballoc/lib.rs b/src/liballoc/lib.rs
index b3a7e3dbdeb..81391fd63eb 100644
--- a/src/liballoc/lib.rs
+++ b/src/liballoc/lib.rs
@@ -65,6 +65,7 @@
        html_favicon_url = "http://www.rust-lang.org/favicon.ico",
        html_root_url = "http://doc.rust-lang.org/nightly/")]
 
+#![feature(no_std)]
 #![no_std]
 #![feature(lang_items, unsafe_destructor)]
 #![feature(box_syntax)]
diff --git a/src/libcollections/lib.rs b/src/libcollections/lib.rs
index 05d84eda13d..f220724c42e 100644
--- a/src/libcollections/lib.rs
+++ b/src/libcollections/lib.rs
@@ -33,6 +33,7 @@
 #![cfg_attr(test, feature(test))]
 #![cfg_attr(test, allow(deprecated))] // rand
 
+#![feature(no_std)]
 #![no_std]
 
 #[macro_use]
diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs
index 4c031b3e7cc..df4942b509b 100644
--- a/src/libcore/lib.rs
+++ b/src/libcore/lib.rs
@@ -56,6 +56,7 @@
        html_root_url = "http://doc.rust-lang.org/nightly/",
        html_playground_url = "http://play.rust-lang.org/")]
 
+#![feature(no_std)]
 #![no_std]
 #![allow(raw_pointer_derive)]
 #![deny(missing_docs)]
diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs
index 060e7ef4033..38d5c5eb27a 100644
--- a/src/liblibc/lib.rs
+++ b/src/liblibc/lib.rs
@@ -16,6 +16,7 @@
 #![cfg_attr(not(feature = "cargo-build"), staged_api)]
 #![cfg_attr(not(feature = "cargo-build"), feature(core))]
 #![feature(int_uint)]
+#![feature(no_std)]
 #![no_std]
 #![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
        html_favicon_url = "http://www.rust-lang.org/favicon.ico",
diff --git a/src/librand/lib.rs b/src/librand/lib.rs
index 777b1ed8ceb..4113718cfd1 100644
--- a/src/librand/lib.rs
+++ b/src/librand/lib.rs
@@ -23,6 +23,7 @@
        html_root_url = "http://doc.rust-lang.org/nightly/",
        html_playground_url = "http://play.rust-lang.org/")]
 #![feature(int_uint)]
+#![feature(no_std)]
 #![no_std]
 #![unstable(feature = "rand")]
 #![feature(staged_api)]
diff --git a/src/librustc_bitflags/lib.rs b/src/librustc_bitflags/lib.rs
index 0139dfbd50b..370a5d48dec 100644
--- a/src/librustc_bitflags/lib.rs
+++ b/src/librustc_bitflags/lib.rs
@@ -12,6 +12,7 @@
 #![feature(staged_api)]
 #![staged_api]
 #![crate_type = "rlib"]
+#![feature(no_std)]
 #![no_std]
 #![unstable(feature = "rustc_private")]
 
diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs
index 8761b5f72ec..9df90258462 100644
--- a/src/librustc_driver/test.rs
+++ b/src/librustc_driver/test.rs
@@ -43,7 +43,7 @@ struct RH<'a> {
     sub: &'a [RH<'a>]
 }
 
-static EMPTY_SOURCE_STR: &'static str = "#![no_std]";
+static EMPTY_SOURCE_STR: &'static str = "#![feature(no_std)] #![no_std]";
 
 struct ExpectErrorEmitter {
     messages: Vec<String>
diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs
index e5408615900..2a523356f62 100644
--- a/src/libstd/lib.rs
+++ b/src/libstd/lib.rs
@@ -124,6 +124,7 @@
 #![cfg_attr(test, feature(test))]
 
 // Don't link to std. We are std.
+#![feature(no_std)]
 #![no_std]
 
 #![deny(missing_docs)]
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 12efd959918..c8ab46ff8fd 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -122,7 +122,10 @@ static KNOWN_FEATURES: &'static [(&'static str, &'static str, Status)] = &[
     ("staged_api", "1.0.0", Active),
 
     // Allows using items which are missing stability attributes
-    ("unmarked_api", "1.0.0", Active)
+    ("unmarked_api", "1.0.0", Active),
+
+    // Allows using #![no_std]
+    ("no_std", "1.0.0", Active),
 ];
 
 enum Status {
@@ -466,6 +469,11 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
                               attr.span,
                               "language items are subject to change");
         }
+
+        if attr.check_name("no_std") {
+            self.gate_feature("no_std", attr.span,
+                              "no_std is experimental");
+        }
     }
 
     fn visit_pat(&mut self, pattern: &ast::Pat) {
diff --git a/src/libunicode/lib.rs b/src/libunicode/lib.rs
index 60fa8f0db11..54c8fcd205b 100644
--- a/src/libunicode/lib.rs
+++ b/src/libunicode/lib.rs
@@ -29,6 +29,7 @@
        html_favicon_url = "http://www.rust-lang.org/favicon.ico",
        html_root_url = "http://doc.rust-lang.org/nightly/",
        html_playground_url = "http://play.rust-lang.org/")]
+#![feature(no_std)]
 #![no_std]
 #![feature(slicing_syntax)]
 #![feature(int_uint)]
diff --git a/src/test/auxiliary/lang-item-public.rs b/src/test/auxiliary/lang-item-public.rs
index e99a8f0b877..834667968c8 100644
--- a/src/test/auxiliary/lang-item-public.rs
+++ b/src/test/auxiliary/lang-item-public.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(no_std)]
 #![no_std]
 #![feature(lang_items)]
 
diff --git a/src/test/auxiliary/no_std_crate.rs b/src/test/auxiliary/no_std_crate.rs
index 7cfae6d121d..d830aef54f5 100644
--- a/src/test/auxiliary/no_std_crate.rs
+++ b/src/test/auxiliary/no_std_crate.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(no_std)]
 #![no_std]
 
 pub fn foo() {}
diff --git a/src/test/auxiliary/weak-lang-items.rs b/src/test/auxiliary/weak-lang-items.rs
index 39462fdc1e5..fa254cb91ad 100644
--- a/src/test/auxiliary/weak-lang-items.rs
+++ b/src/test/auxiliary/weak-lang-items.rs
@@ -13,6 +13,7 @@
 // This aux-file will require the eh_personality function to be codegen'd, but
 // it hasn't been defined just yet. Make sure we don't explode.
 
+#![feature(no_std)]
 #![no_std]
 #![crate_type = "rlib"]
 
diff --git a/src/test/compile-fail/associated-types-ICE-when-projecting-out-of-err.rs b/src/test/compile-fail/associated-types-ICE-when-projecting-out-of-err.rs
index b35d5131c78..621f5ec9660 100644
--- a/src/test/compile-fail/associated-types-ICE-when-projecting-out-of-err.rs
+++ b/src/test/compile-fail/associated-types-ICE-when-projecting-out-of-err.rs
@@ -13,6 +13,7 @@
 
 #![crate_type = "lib"]
 #![feature(lang_items)]
+#![feature(no_std)]
 #![no_std]
 
 #[lang="sized"]
diff --git a/src/test/compile-fail/bad-mid-path-type-params.rs b/src/test/compile-fail/bad-mid-path-type-params.rs
index 79fe4e7165e..c91849ca53e 100644
--- a/src/test/compile-fail/bad-mid-path-type-params.rs
+++ b/src/test/compile-fail/bad-mid-path-type-params.rs
@@ -10,6 +10,7 @@
 
 // ignore-tidy-linelength
 
+#![feature(no_std)]
 #![no_std]
 #![feature(lang_items)]
 
diff --git a/src/test/compile-fail/derive-no-std-not-supported.rs b/src/test/compile-fail/derive-no-std-not-supported.rs
index 7dee78e2672..f82e7f3e36a 100644
--- a/src/test/compile-fail/derive-no-std-not-supported.rs
+++ b/src/test/compile-fail/derive-no-std-not-supported.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(no_std)]
 #![no_std]
 
 extern crate core;
diff --git a/src/test/compile-fail/gated-no-std.rs b/src/test/compile-fail/gated-no-std.rs
new file mode 100644
index 00000000000..893ba8a8a86
--- /dev/null
+++ b/src/test/compile-fail/gated-no-std.rs
@@ -0,0 +1,13 @@
+// Copyright 2105 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![no_std] //~ ERROR no_std is experimental
+
+fn main() {}
diff --git a/src/test/compile-fail/issue-19660.rs b/src/test/compile-fail/issue-19660.rs
index f83037d47bb..14601e67a77 100644
--- a/src/test/compile-fail/issue-19660.rs
+++ b/src/test/compile-fail/issue-19660.rs
@@ -10,7 +10,7 @@
 
 // error-pattern: requires `copy` lang_item
 
-#![feature(lang_items, start)]
+#![feature(lang_items, start, no_std)]
 #![no_std]
 
 #[lang = "sized"]
diff --git a/src/test/compile-fail/lang-item-missing.rs b/src/test/compile-fail/lang-item-missing.rs
index 61d55fd0964..c7426fc6fc1 100644
--- a/src/test/compile-fail/lang-item-missing.rs
+++ b/src/test/compile-fail/lang-item-missing.rs
@@ -13,8 +13,8 @@
 
 // error-pattern: requires `sized` lang_item
 
+#![feature(start, no_std)]
 #![no_std]
-#![feature(start)]
 
 #[start]
 fn start(argc: isize, argv: *const *const u8) -> isize {
diff --git a/src/test/compile-fail/lint-dead-code-1.rs b/src/test/compile-fail/lint-dead-code-1.rs
index b1bb28f7ce7..e91e6efd1cb 100644
--- a/src/test/compile-fail/lint-dead-code-1.rs
+++ b/src/test/compile-fail/lint-dead-code-1.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(no_std)]
 #![no_std]
 #![allow(unused_variables)]
 #![allow(non_camel_case_types)]
diff --git a/src/test/compile-fail/privacy1.rs b/src/test/compile-fail/privacy1.rs
index b2ee62ddabe..7ebbcc2809a 100644
--- a/src/test/compile-fail/privacy1.rs
+++ b/src/test/compile-fail/privacy1.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(lang_items, start)]
+#![feature(lang_items, start, no_std)]
 #![no_std] // makes debugging this test *a lot* easier (during resolve)
 
 #[lang="sized"]
diff --git a/src/test/compile-fail/privacy2.rs b/src/test/compile-fail/privacy2.rs
index b3d7321edab..7b4a2a3595b 100644
--- a/src/test/compile-fail/privacy2.rs
+++ b/src/test/compile-fail/privacy2.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(start)]
+#![feature(start, no_std)]
 #![no_std] // makes debugging this test *a lot* easier (during resolve)
 
 // Test to make sure that globs don't leak in regular `use` statements.
diff --git a/src/test/compile-fail/privacy3.rs b/src/test/compile-fail/privacy3.rs
index 245a9c21a6b..8c9de1fa25c 100644
--- a/src/test/compile-fail/privacy3.rs
+++ b/src/test/compile-fail/privacy3.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(start)]
+#![feature(start, no_std)]
 #![no_std] // makes debugging this test *a lot* easier (during resolve)
 
 // Test to make sure that private items imported through globs remain private
diff --git a/src/test/compile-fail/privacy4.rs b/src/test/compile-fail/privacy4.rs
index e35089b8606..bcb46663aa8 100644
--- a/src/test/compile-fail/privacy4.rs
+++ b/src/test/compile-fail/privacy4.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(lang_items, start)]
+#![feature(lang_items, start, no_std)]
 #![no_std] // makes debugging this test *a lot* easier (during resolve)
 
 #[lang = "sized"] pub trait Sized {}
diff --git a/src/test/compile-fail/regions-bounded-method-type-parameters-trait-bound.rs b/src/test/compile-fail/regions-bounded-method-type-parameters-trait-bound.rs
index acc721f26b3..74c2c6e584b 100644
--- a/src/test/compile-fail/regions-bounded-method-type-parameters-trait-bound.rs
+++ b/src/test/compile-fail/regions-bounded-method-type-parameters-trait-bound.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(lang_items, no_std)]
 #![no_std]
-#![feature(lang_items)]
 
 // Check that explicit region bounds are allowed on the various
 // nominal types (but not on other types) and that they are type
diff --git a/src/test/compile-fail/regions-struct-not-wf.rs b/src/test/compile-fail/regions-struct-not-wf.rs
index 3de137a9efb..3b8312a3019 100644
--- a/src/test/compile-fail/regions-struct-not-wf.rs
+++ b/src/test/compile-fail/regions-struct-not-wf.rs
@@ -10,6 +10,7 @@
 
 // Various examples of structs whose fields are not well-formed.
 
+#![feature(no_std)]
 #![no_std]
 #![allow(dead_code)]
 
diff --git a/src/test/compile-fail/required-lang-item.rs b/src/test/compile-fail/required-lang-item.rs
index ae561878e9b..7d252604883 100644
--- a/src/test/compile-fail/required-lang-item.rs
+++ b/src/test/compile-fail/required-lang-item.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(lang_items)]
+#![feature(lang_items, no_std)]
 #![no_std]
 
 #[lang="sized"] pub trait Sized {}
diff --git a/src/test/compile-fail/weak-lang-item.rs b/src/test/compile-fail/weak-lang-item.rs
index baac192cbf0..42df43934a8 100644
--- a/src/test/compile-fail/weak-lang-item.rs
+++ b/src/test/compile-fail/weak-lang-item.rs
@@ -13,6 +13,7 @@
 // error-pattern: language item required, but not found: `stack_exhausted`
 // error-pattern: language item required, but not found: `eh_personality`
 
+#![feature(no_std)]
 #![no_std]
 
 extern crate core;
diff --git a/src/test/pretty/issue-4264.pp b/src/test/pretty/issue-4264.pp
index a10e3449039..60660d48274 100644
--- a/src/test/pretty/issue-4264.pp
+++ b/src/test/pretty/issue-4264.pp
@@ -1,3 +1,4 @@
+#![feature(no_std)]
 #![no_std]
 #[prelude_import]
 use std::prelude::v1::*;
diff --git a/src/test/run-make/mismatching-target-triples/bar.rs b/src/test/run-make/mismatching-target-triples/bar.rs
index ed15e5d880a..8695ab58e5f 100755
--- a/src/test/run-make/mismatching-target-triples/bar.rs
+++ b/src/test/run-make/mismatching-target-triples/bar.rs
@@ -7,5 +7,6 @@
 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
+#![feature(no_std)]
 #![no_std]
 extern crate foo;
diff --git a/src/test/run-make/mismatching-target-triples/foo.rs b/src/test/run-make/mismatching-target-triples/foo.rs
index 8afa43710dd..afd4f298a97 100755
--- a/src/test/run-make/mismatching-target-triples/foo.rs
+++ b/src/test/run-make/mismatching-target-triples/foo.rs
@@ -7,5 +7,6 @@
 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
+#![feature(no_std)]
 #![no_std]
 #![crate_type = "lib"]
diff --git a/src/test/run-make/no-duplicate-libs/bar.rs b/src/test/run-make/no-duplicate-libs/bar.rs
index 11834756105..0bec6148189 100644
--- a/src/test/run-make/no-duplicate-libs/bar.rs
+++ b/src/test/run-make/no-duplicate-libs/bar.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(lang_items, no_std)]
 #![no_std]
-#![feature(lang_items)]
 #![crate_type = "dylib"]
 
 extern crate libc;
diff --git a/src/test/run-make/no-duplicate-libs/foo.rs b/src/test/run-make/no-duplicate-libs/foo.rs
index 61a2a51da08..9e8afdc5696 100644
--- a/src/test/run-make/no-duplicate-libs/foo.rs
+++ b/src/test/run-make/no-duplicate-libs/foo.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(lang_items, no_std)]
 #![no_std]
-#![feature(lang_items)]
 #![crate_type = "dylib"]
 
 extern crate libc;
diff --git a/src/test/run-make/pretty-expanded-hygiene/input.pp.rs b/src/test/run-make/pretty-expanded-hygiene/input.pp.rs
index 6febe2ff7c1..6aff4c9b3d5 100755
--- a/src/test/run-make/pretty-expanded-hygiene/input.pp.rs
+++ b/src/test/run-make/pretty-expanded-hygiene/input.pp.rs
@@ -9,6 +9,7 @@
 // except according to those terms.
 
 // minimal junk
+#![feature(no_std)]
 #![no_std]
 
 
diff --git a/src/test/run-make/pretty-expanded-hygiene/input.rs b/src/test/run-make/pretty-expanded-hygiene/input.rs
index c31b67b8043..a46fa12ac05 100755
--- a/src/test/run-make/pretty-expanded-hygiene/input.rs
+++ b/src/test/run-make/pretty-expanded-hygiene/input.rs
@@ -9,6 +9,7 @@
 // except according to those terms.
 
 // minimal junk
+#![feature(no_std)]
 #![no_std]
 
 macro_rules! foo {
diff --git a/src/test/run-make/simd-ffi/simd.rs b/src/test/run-make/simd-ffi/simd.rs
index 0195076fde4..834a2adf01f 100755
--- a/src/test/run-make/simd-ffi/simd.rs
+++ b/src/test/run-make/simd-ffi/simd.rs
@@ -12,6 +12,7 @@
 #![crate_type = "lib"]
 // we can compile to a variety of platforms, because we don't need
 // cross-compiled standard libraries.
+#![feature(no_std)]
 #![no_std]
 
 #![feature(simd, simd_ffi, link_llvm_intrinsics, lang_items)]
diff --git a/src/test/run-make/target-specs/foo.rs b/src/test/run-make/target-specs/foo.rs
index fd112034f40..365fc039a4e 100644
--- a/src/test/run-make/target-specs/foo.rs
+++ b/src/test/run-make/target-specs/foo.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(lang_items)]
+#![feature(lang_items, no_std)]
 #![no_std]
 
 #[lang="copy"]
diff --git a/src/test/run-pass/derive-no-std.rs b/src/test/run-pass/derive-no-std.rs
index c9bbb204ab7..d3034c2d485 100644
--- a/src/test/run-pass/derive-no-std.rs
+++ b/src/test/run-pass/derive-no-std.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(no_std)]
 #![no_std]
 
 extern crate core;
diff --git a/src/test/run-pass/for-loop-no-std.rs b/src/test/run-pass/for-loop-no-std.rs
index 5911e95349f..30c2aec33ad 100644
--- a/src/test/run-pass/for-loop-no-std.rs
+++ b/src/test/run-pass/for-loop-no-std.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(lang_items, start, no_std)]
 #![no_std]
-#![feature(lang_items, start)]
 
 extern crate "std" as other;
 
diff --git a/src/test/run-pass/format-no-std.rs b/src/test/run-pass/format-no-std.rs
index 43f7b6f4033..44d80490e69 100644
--- a/src/test/run-pass/format-no-std.rs
+++ b/src/test/run-pass/format-no-std.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(lang_items, start, no_std)]
 #![no_std]
-#![feature(lang_items, start)]
 
 extern crate "std" as other;
 
diff --git a/src/test/run-pass/lang-item-public.rs b/src/test/run-pass/lang-item-public.rs
index 2d70fa0c819..350ec68a7d1 100644
--- a/src/test/run-pass/lang-item-public.rs
+++ b/src/test/run-pass/lang-item-public.rs
@@ -12,8 +12,8 @@
 // ignore-android
 // ignore-windows #13361
 
+#![feature(lang_items, start, no_std)]
 #![no_std]
-#![feature(lang_items, start)]
 
 extern crate "lang-item-public" as lang_lib;
 
diff --git a/src/test/run-pass/no-std-xcrate2.rs b/src/test/run-pass/no-std-xcrate2.rs
index dcafb5f451f..f5f34607aff 100644
--- a/src/test/run-pass/no-std-xcrate2.rs
+++ b/src/test/run-pass/no-std-xcrate2.rs
@@ -16,6 +16,7 @@
 // This tests that libraries built with #[no_std] can be linked to crates with
 // #[no_std] and actually run.
 
+#![feature(no_std)]
 #![no_std]
 
 extern crate no_std_crate;
diff --git a/src/test/run-pass/smallest-hello-world.rs b/src/test/run-pass/smallest-hello-world.rs
index 4913b34c4b3..197890c1277 100644
--- a/src/test/run-pass/smallest-hello-world.rs
+++ b/src/test/run-pass/smallest-hello-world.rs
@@ -12,8 +12,8 @@
 
 // Smallest "hello world" with a libc runtime
 
+#![feature(intrinsics, lang_items, start, no_std)]
 #![no_std]
-#![feature(intrinsics, lang_items, start)]
 
 extern crate libc;
 
diff --git a/src/test/run-pass/use.rs b/src/test/run-pass/use.rs
index a2e1d8a5671..65a392e63c5 100644
--- a/src/test/run-pass/use.rs
+++ b/src/test/run-pass/use.rs
@@ -10,7 +10,7 @@
 // except according to those terms.
 
 #![allow(unused_imports)]
-#![feature(start)]
+#![feature(start, no_std)]
 #![no_std]
 
 extern crate std;
diff --git a/src/test/run-pass/vec-macro-no-std.rs b/src/test/run-pass/vec-macro-no-std.rs
index c6c37017349..47b87fce2ab 100644
--- a/src/test/run-pass/vec-macro-no-std.rs
+++ b/src/test/run-pass/vec-macro-no-std.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(lang_items, start)]
+#![feature(lang_items, start, no_std)]
 #![no_std]
 
 extern crate "std" as other;