blob: e3ac2d58a3e2723b92ccdcba1fab50feffe0863b [file] [edit]
#![feature(staged_api)]
// Impl blocks and items defined inside impl blocks only. Trait-associated item declarations are
// tested in `associated_items.rs`; any trait items below are scaffolding for impl-item assertions.
// Staged API still requires stability attributes on stable trait items even when the assertions
// below focus on the corresponding impl items.
#[stable(feature = "stable_impl_target", since = "1.0.0")]
pub struct StableImplTarget;
#[stable(feature = "stable_trait_for_impl", since = "1.0.0")]
pub trait StableTraitForImpl {
#[stable(feature = "stable_trait_output", since = "1.0.0")]
type StableOutput;
#[stable(feature = "stable_trait_assoc_const", since = "1.0.0")]
const STABLE_ASSOC_CONST: usize;
#[stable(feature = "stable_trait_method", since = "1.0.0")]
fn stable_trait_method(&self);
}
#[stable(feature = "stable_trait_with_unstable_method_for_impl", since = "1.0.0")]
pub trait StableTraitWithUnstableMethodForImpl {
#[unstable(feature = "unstable_trait_method_for_stable_impl", issue = "none")]
fn unstable_trait_method_for_stable_impl(&self);
}
#[unstable(feature = "unstable_trait_for_impl", issue = "none")]
pub trait UnstableTraitForImpl {
type UnstableOutput;
const UNSTABLE_ASSOC_CONST: usize;
fn unstable_trait_method(&self);
}
//@ is "$.index[?(@.docs=='stable inherent impl')].stability.feature" '"stable_inherent_impl"'
//@ is "$.index[?(@.docs=='stable inherent impl')].stability.level.stable.since" '"2.0.0"'
/// stable inherent impl
#[stable(feature = "stable_inherent_impl", since = "2.0.0")]
impl StableImplTarget {
//@ is "$.index[?(@.name=='stable_inherent_method')].stability.feature" '"stable_inherent_method_feature"'
//@ is "$.index[?(@.name=='stable_inherent_method')].stability.level.stable.since" '"2.1.0"'
//@ is "$.index[?(@.name=='stable_inherent_method')].attrs" []
#[stable(feature = "stable_inherent_method_feature", since = "2.1.0")]
pub fn stable_inherent_method(&self) {}
//@ is "$.index[?(@.name=='UNSTABLE_ASSOC_CONST_IN_IMPL')].stability.level" '"unstable"'
//@ is "$.index[?(@.name=='UNSTABLE_ASSOC_CONST_IN_IMPL')].stability.feature" '"unstable_assoc_const_in_impl_feature"'
#[unstable(feature = "unstable_assoc_const_in_impl_feature", issue = "none")]
pub const UNSTABLE_ASSOC_CONST_IN_IMPL: usize = 2;
}
//@ is "$.index[?(@.docs=='unstable inherent impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.docs=='unstable inherent impl')].stability.feature" '"unstable_inherent_impl"'
/// unstable inherent impl
#[unstable(feature = "unstable_inherent_impl", issue = "none")]
impl StableImplTarget {
// The instability of the inherent `impl` block is inherited by the item.
//@ is "$.index[?(@.name=='method_inside_unstable_inherent_impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.name=='method_inside_unstable_inherent_impl')].stability.feature" '"unstable_inherent_impl"'
pub fn method_inside_unstable_inherent_impl(&self) {}
}
// For trait impl items, `stability: null` means the implementation item has no separate
// stability attribute of its own. To decide whether the implemented method/type/const is usable,
// consumers need to combine the trait item stability with the impl block stability.
//
// The stable impl below intentionally does not copy either stable or unstable trait-item
// stability onto the implemented item. The unstable impl case is different: rustc records the
// impl block's instability on contained impl items, so JSON exposes that inherited instability.
//@ is "$.index[?(@.docs=='stable trait impl with unstable trait method')].stability.feature" '"stable_trait_impl_with_unstable_trait_method"'
//@ is "$.index[?(@.docs=='stable trait impl with unstable trait method')].stability.level.stable.since" '"3.0.0"'
/// stable trait impl with unstable trait method
#[stable(feature = "stable_trait_impl_with_unstable_trait_method", since = "3.0.0")]
impl StableTraitWithUnstableMethodForImpl for StableImplTarget {
// The impl item has no separate stability record; the trait method is unstable.
//@ is "$.index[?(@.docs=='method for unstable trait item inside stable trait impl')].stability" null
/// method for unstable trait item inside stable trait impl
fn unstable_trait_method_for_stable_impl(&self) {}
}
//@ is "$.index[?(@.docs=='stable trait impl')].stability.feature" '"stable_trait_impl"'
//@ is "$.index[?(@.docs=='stable trait impl')].stability.level.stable.since" '"3.0.0"'
/// stable trait impl
#[stable(feature = "stable_trait_impl", since = "3.0.0")]
impl StableTraitForImpl for StableImplTarget {
// These impl items likewise have no separate stability records.
// Their trait item declarations and the impl block are all stable.
//@ is "$.index[?(@.docs=='assoc type inside stable trait impl')].stability" null
/// assoc type inside stable trait impl
type StableOutput = usize;
//@ is "$.index[?(@.docs=='assoc const inside stable trait impl')].stability" null
/// assoc const inside stable trait impl
const STABLE_ASSOC_CONST: usize = 0;
//@ is "$.index[?(@.docs=='method inside stable trait impl')].stability" null
/// method inside stable trait impl
fn stable_trait_method(&self) {}
}
//@ is "$.index[?(@.docs=='unstable trait impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.docs=='unstable trait impl')].stability.feature" '"unstable_trait_impl"'
/// unstable trait impl
#[unstable(feature = "unstable_trait_impl", issue = "none")]
impl UnstableTraitForImpl for StableImplTarget {
// These associated items inherit the impl block's instability in rustdoc JSON.
//@ is "$.index[?(@.docs=='assoc type inside unstable trait impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.docs=='assoc type inside unstable trait impl')].stability.feature" '"unstable_trait_impl"'
/// assoc type inside unstable trait impl
type UnstableOutput = usize;
//@ is "$.index[?(@.docs=='assoc const inside unstable trait impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.docs=='assoc const inside unstable trait impl')].stability.feature" '"unstable_trait_impl"'
/// assoc const inside unstable trait impl
const UNSTABLE_ASSOC_CONST: usize = 0;
//@ is "$.index[?(@.docs=='method inside unstable trait impl')].stability.level" '"unstable"'
//@ is "$.index[?(@.docs=='method inside unstable trait impl')].stability.feature" '"unstable_trait_impl"'
/// method inside unstable trait impl
fn unstable_trait_method(&self) {}
}