]> git.lizzy.rs Git - rust.git/commit
Preliminary feature staging
authorBrian Anderson <banderson@mozilla.com>
Tue, 6 Jan 2015 14:26:08 +0000 (06:26 -0800)
committerBrian Anderson <banderson@mozilla.com>
Wed, 7 Jan 2015 23:34:56 +0000 (15:34 -0800)
commitc27133e2ceba52a6f3ff1b9c4bedb901d1bfe251
treec1ddc9c448623138fe79a15b0c68eda00f9ba3a8
parent9f1ead8fadc56bad30dc74f5cc50d78af4fbc972
Preliminary feature staging

This partially implements the feature staging described in the
[release channel RFC][rc]. It does not yet fully conform to the RFC as
written, but does accomplish its goals sufficiently for the 1.0 alpha
release.

It has three primary user-visible effects:

* On the nightly channel, use of unstable APIs generates a warning.
* On the beta channel, use of unstable APIs generates a warning.
* On the beta channel, use of feature gates generates a warning.

Code that does not trigger these warnings is considered 'stable',
modulo pre-1.0 bugs.

Disabling the warnings for unstable APIs continues to be done in the
existing (i.e. old) style, via `#[allow(...)]`, not that specified in
the RFC. I deem this marginally acceptable since any code that must do
this is not using the stable dialect of Rust.

Use of feature gates is itself gated with the new 'unstable_features'
lint, on nightly set to 'allow', and on beta 'warn'.

The attribute scheme used here corresponds to an older version of the
RFC, with the `#[staged_api]` crate attribute toggling the staging
behavior of the stability attributes, but the user impact is only
in-tree so I'm not concerned about having to make design changes later
(and I may ultimately prefer the scheme here after all, with the
`#[staged_api]` crate attribute).

Since the Rust codebase itself makes use of unstable features the
compiler and build system to a midly elaborate dance to allow it to
bootstrap while disobeying these lints (which would otherwise be
errors because Rust builds with `-D warnings`).

This patch includes one significant hack that causes a
regression. Because the `format_args!` macro emits calls to unstable
APIs it would trigger the lint.  I added a hack to the lint to make it
not trigger, but this in turn causes arguments to `println!` not to be
checked for feature gates. I don't presently understand macro
expansion well enough to fix. This is bug #20661.

Closes #16678

[rc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
43 files changed:
configure
mk/main.mk
src/liballoc/lib.rs
src/libarena/lib.rs
src/libcollections/lib.rs
src/libcore/lib.rs
src/libflate/lib.rs
src/libfmt_macros/lib.rs
src/libgetopts/lib.rs
src/libgraphviz/lib.rs
src/liblibc/lib.rs
src/liblog/lib.rs
src/librand/lib.rs
src/librbml/lib.rs
src/libregex/lib.rs
src/librustc/lib.rs
src/librustc/lint/builtin.rs
src/librustc/lint/context.rs
src/librustc/lint/mod.rs
src/librustc/metadata/csearch.rs
src/librustc/middle/stability.rs
src/librustc/session/config.rs
src/librustc_back/lib.rs
src/librustc_borrowck/lib.rs
src/librustc_driver/lib.rs
src/librustc_llvm/lib.rs
src/librustc_resolve/lib.rs
src/librustc_trans/lib.rs
src/librustc_typeck/lib.rs
src/librustdoc/core.rs
src/librustdoc/lib.rs
src/librustdoc/test.rs
src/libserialize/lib.rs
src/libstd/lib.rs
src/libsyntax/codemap.rs
src/libsyntax/lib.rs
src/libsyntax/std_inject.rs
src/libterm/lib.rs
src/libtest/lib.rs
src/libunicode/lib.rs
src/test/compile-fail/feature-gate-feature-gate.rs [new file with mode: 0644]
src/test/compile-fail/feature-gated-feature-in-macro-arg.rs
src/test/pretty/issue-4264.pp