]> git.lizzy.rs Git - rust.git/commit
Auto merge of #22899 - huonw:macro-stability, r=alexcrichton
authorbors <bors@rust-lang.org>
Fri, 6 Mar 2015 05:20:11 +0000 (05:20 +0000)
committerbors <bors@rust-lang.org>
Fri, 6 Mar 2015 05:20:11 +0000 (05:20 +0000)
commit1fe8f221450bad3ffb1351c6549f67c18ce0b94e
tree475876888ff3be07f3b72e58bc3c7d3554107f1a
parentb0746ff19b3bc204215f04bbb5756159f9bc5c92
parentb5c6ab20b7d1f4d6b0cc31c2987b2e0f8ea43e0c
Auto merge of #22899 - huonw:macro-stability, r=alexcrichton

Unstable items used in a macro expansion will now always trigger
stability warnings, *unless* the unstable items are directly inside a
macro marked with `#[allow_internal_unstable]`. IOW, the compiler warns
unless the span of the unstable item is a subspan of the definition of a
macro marked with that attribute.

E.g.

    #[allow_internal_unstable]
    macro_rules! foo {
        ($e: expr) => {{
            $e;
            unstable(); // no warning
            only_called_by_foo!();
        }}
    }

    macro_rules! only_called_by_foo {
        () => { unstable() } // warning
    }

    foo!(unstable()) // warning

The unstable inside `foo` is fine, due to the attribute. But the
`unstable` inside `only_called_by_foo` is not, since that macro doesn't
have the attribute, and the `unstable` passed into `foo` is also not
fine since it isn't contained in the macro itself (that is, even though
it is only used directly in the macro).

In the process this makes the stability tracking much more precise,
e.g. previously `println!("{}", unstable())` got no warning, but now it
does. As such, this is a bug fix that may cause [breaking-change]s.

The attribute is definitely feature gated, since it explicitly allows
side-stepping the feature gating system.

---

This updates `thread_local!` macro to use the attribute, since it uses
unstable features internally (initialising a struct with unstable
fields).
src/librustc/metadata/macro_import.rs
src/libsyntax/ext/base.rs
src/libsyntax/ext/expand.rs
src/libsyntax/feature_gate.rs