Auto merge of #77118 - exrook:stability-generic-parameters-2, r=varkor

Stability annotations on generic parameters (take 2.5)

Rebase of #72314 + more tests

Implements rust-lang/wg-allocators#2.
This commit is contained in:
bors 2020-09-27 12:51:21 +00:00
commit d902752866
9 changed files with 1171 additions and 34 deletions

View File

@ -1822,6 +1822,9 @@ impl EncodeContext<'a, 'tcx> {
EntryKind::TypeParam,
default.is_some(),
);
if default.is_some() {
self.encode_stability(def_id.to_def_id());
}
}
GenericParamKind::Const { .. } => {
self.encode_info_for_generic_param(
@ -1829,6 +1832,7 @@ impl EncodeContext<'a, 'tcx> {
EntryKind::ConstParam,
true,
);
// FIXME(const_generics:defaults)
}
}
}

View File

@ -392,9 +392,27 @@ impl<'tcx> TyCtxt<'tcx> {
/// If the item defined by `def_id` is unstable and the corresponding `#![feature]` does not
/// exist, emits an error.
///
/// Additionally, this function will also check if the item is deprecated. If so, and `id` is
/// not `None`, a deprecated lint attached to `id` will be emitted.
/// This function will also check if the item is deprecated.
/// If so, and `id` is not `None`, a deprecated lint attached to `id` will be emitted.
pub fn check_stability(self, def_id: DefId, id: Option<HirId>, span: Span) {
self.check_optional_stability(def_id, id, span, |span, def_id| {
// The API could be uncallable for other reasons, for example when a private module
// was referenced.
self.sess.delay_span_bug(span, &format!("encountered unmarked API: {:?}", def_id));
})
}
/// Like `check_stability`, except that we permit items to have custom behaviour for
/// missing stability attributes (not necessarily just emit a `bug!`). This is necessary
/// for default generic parameters, which only have stability attributes if they were
/// added after the type on which they're defined.
pub fn check_optional_stability(
self,
def_id: DefId,
id: Option<HirId>,
span: Span,
unmarked: impl FnOnce(Span, DefId) -> (),
) {
let soft_handler = |lint, span, msg: &_| {
self.struct_span_lint_hir(lint, id.unwrap_or(hir::CRATE_HIR_ID), span, |lint| {
lint.build(msg).emit()
@ -405,11 +423,7 @@ impl<'tcx> TyCtxt<'tcx> {
EvalResult::Deny { feature, reason, issue, is_soft } => {
report_unstable(self.sess, feature, reason, issue, is_soft, span, soft_handler)
}
EvalResult::Unmarked => {
// The API could be uncallable for other reasons, for example when a private module
// was referenced.
self.sess.delay_span_bug(span, &format!("encountered unmarked API: {:?}", def_id));
}
EvalResult::Unmarked => unmarked(span, def_id),
}
}

View File

@ -37,6 +37,24 @@ enum AnnotationKind {
Container,
}
/// Whether to inherit deprecation flags for nested items. In most cases, we do want to inherit
/// deprecation, because nested items rarely have individual deprecation attributes, and so
/// should be treated as deprecated if their parent is. However, default generic parameters
/// have separate deprecation attributes from their parents, so we do not wish to inherit
/// deprecation in this case. For example, inheriting deprecation for `T` in `Foo<T>`
/// would cause a duplicate warning arising from both `Foo` and `T` being deprecated.
#[derive(Clone)]
enum InheritDeprecation {
Yes,
No,
}
impl InheritDeprecation {
fn yes(&self) -> bool {
matches!(self, InheritDeprecation::Yes)
}
}
// A private tree-walker for producing an Index.
struct Annotator<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
@ -56,6 +74,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
attrs: &[Attribute],
item_sp: Span,
kind: AnnotationKind,
inherit_deprecation: InheritDeprecation,
visit_children: F,
) where
F: FnOnce(&mut Self),
@ -63,7 +82,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
debug!("annotate(id = {:?}, attrs = {:?})", hir_id, attrs);
let mut did_error = false;
if !self.tcx.features().staged_api {
did_error = self.forbid_staged_api_attrs(hir_id, attrs);
did_error = self.forbid_staged_api_attrs(hir_id, attrs, inherit_deprecation.clone());
}
let depr =
@ -80,9 +99,11 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
let depr_entry = DeprecationEntry::local(depr.clone(), hir_id);
self.index.depr_map.insert(hir_id, depr_entry);
} else if let Some(parent_depr) = self.parent_depr.clone() {
is_deprecated = true;
info!("tagging child {:?} as deprecated from parent", hir_id);
self.index.depr_map.insert(hir_id, parent_depr);
if inherit_deprecation.yes() {
is_deprecated = true;
info!("tagging child {:?} as deprecated from parent", hir_id);
self.index.depr_map.insert(hir_id, parent_depr);
}
}
if self.tcx.features().staged_api {
@ -186,7 +207,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
if stab.is_none() {
debug!("annotate: stab not found, parent = {:?}", self.parent_stab);
if let Some(stab) = self.parent_stab {
if stab.level.is_unstable() {
if inherit_deprecation.yes() && stab.level.is_unstable() {
self.index.stab_map.insert(hir_id, stab);
}
}
@ -237,7 +258,12 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
}
// returns true if an error occurred, used to suppress some spurious errors
fn forbid_staged_api_attrs(&mut self, hir_id: HirId, attrs: &[Attribute]) -> bool {
fn forbid_staged_api_attrs(
&mut self,
hir_id: HirId,
attrs: &[Attribute],
inherit_deprecation: InheritDeprecation,
) -> bool {
// Emit errors for non-staged-api crates.
let unstable_attrs = [
sym::unstable,
@ -265,7 +291,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
// Propagate unstability. This can happen even for non-staged-api crates in case
// -Zforce-unstable-if-unmarked is set.
if let Some(stab) = self.parent_stab {
if stab.level.is_unstable() {
if inherit_deprecation.yes() && stab.level.is_unstable() {
self.index.stab_map.insert(hir_id, stab);
}
}
@ -301,54 +327,119 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
}
hir::ItemKind::Struct(ref sd, _) => {
if let Some(ctor_hir_id) = sd.ctor_hir_id() {
self.annotate(ctor_hir_id, &i.attrs, i.span, AnnotationKind::Required, |_| {})
self.annotate(
ctor_hir_id,
&i.attrs,
i.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|_| {},
)
}
}
_ => {}
}
self.annotate(i.hir_id, &i.attrs, i.span, kind, |v| intravisit::walk_item(v, i));
self.annotate(i.hir_id, &i.attrs, i.span, kind, InheritDeprecation::Yes, |v| {
intravisit::walk_item(v, i)
});
self.in_trait_impl = orig_in_trait_impl;
}
fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) {
self.annotate(ti.hir_id, &ti.attrs, ti.span, AnnotationKind::Required, |v| {
intravisit::walk_trait_item(v, ti);
});
self.annotate(
ti.hir_id,
&ti.attrs,
ti.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|v| {
intravisit::walk_trait_item(v, ti);
},
);
}
fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) {
let kind =
if self.in_trait_impl { AnnotationKind::Prohibited } else { AnnotationKind::Required };
self.annotate(ii.hir_id, &ii.attrs, ii.span, kind, |v| {
self.annotate(ii.hir_id, &ii.attrs, ii.span, kind, InheritDeprecation::Yes, |v| {
intravisit::walk_impl_item(v, ii);
});
}
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) {
self.annotate(var.id, &var.attrs, var.span, AnnotationKind::Required, |v| {
if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
v.annotate(ctor_hir_id, &var.attrs, var.span, AnnotationKind::Required, |_| {});
}
self.annotate(
var.id,
&var.attrs,
var.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|v| {
if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
v.annotate(
ctor_hir_id,
&var.attrs,
var.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|_| {},
);
}
intravisit::walk_variant(v, var, g, item_id)
})
intravisit::walk_variant(v, var, g, item_id)
},
)
}
fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) {
self.annotate(s.hir_id, &s.attrs, s.span, AnnotationKind::Required, |v| {
intravisit::walk_struct_field(v, s);
});
self.annotate(
s.hir_id,
&s.attrs,
s.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|v| {
intravisit::walk_struct_field(v, s);
},
);
}
fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) {
self.annotate(i.hir_id, &i.attrs, i.span, AnnotationKind::Required, |v| {
intravisit::walk_foreign_item(v, i);
});
self.annotate(
i.hir_id,
&i.attrs,
i.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|v| {
intravisit::walk_foreign_item(v, i);
},
);
}
fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) {
self.annotate(md.hir_id, &md.attrs, md.span, AnnotationKind::Required, |_| {});
self.annotate(
md.hir_id,
&md.attrs,
md.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|_| {},
);
}
fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam<'tcx>) {
let kind = match &p.kind {
// FIXME(const_generics:defaults)
hir::GenericParamKind::Type { default, .. } if default.is_some() => {
AnnotationKind::Container
}
_ => AnnotationKind::Prohibited,
};
self.annotate(p.hir_id, &p.attrs, p.span, kind, InheritDeprecation::No, |v| {
intravisit::walk_generic_param(v, p);
});
}
}
@ -422,6 +513,10 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> {
fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) {
self.check_missing_stability(md.hir_id, md.span);
}
// Note that we don't need to `check_missing_stability` for default generic parameters,
// as we assume that any default generic parameters without attributes are automatically
// stable (assuming they have not inherited instability from their parent).
}
fn new_index(tcx: TyCtxt<'tcx>) -> Index<'tcx> {
@ -484,6 +579,7 @@ fn new_index(tcx: TyCtxt<'tcx>) -> Index<'tcx> {
&krate.item.attrs,
krate.item.span,
AnnotationKind::Required,
InheritDeprecation::Yes,
|v| intravisit::walk_crate(v, krate),
);
}

View File

@ -360,7 +360,21 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
(GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
self.ast_region_to_region(&lt, Some(param)).into()
}
(GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
(GenericParamDefKind::Type { has_default, .. }, GenericArg::Type(ty)) => {
if *has_default {
tcx.check_optional_stability(
param.def_id,
Some(arg.id()),
arg.span(),
|_, _| {
// Default generic parameters may not be marked
// with stability attributes, i.e. when the
// default parameter was defined at the same time
// as the rest of the type. As such, we ignore missing
// stability attributes.
},
)
}
if let (hir::TyKind::Infer, false) = (&ty.kind, self.allow_ty_infer()) {
inferred_params.push(ty.span);
tcx.ty_error().into()

View File

@ -0,0 +1,229 @@
#![crate_type = "lib"]
#![feature(staged_api)]
#![stable(feature = "stable_test_feature", since = "1.0.0")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub trait Trait1<#[unstable(feature = "unstable_default", issue = "none")] T = ()> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
fn foo() -> T;
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub trait Trait2<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
fn foo() -> T;
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub trait Trait3<T = ()> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
fn foo() -> T;
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field: T,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct2<T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field: T,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct3<A = isize, #[unstable(feature = "unstable_default", issue = "none")] B = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field1: A,
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field2: B,
}
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct4<A = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field: A,
}
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct5<#[unstable(feature = "unstable_default", issue = "none")] A = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field: A,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Struct6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub field: T,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT1: Struct1 = Struct1 { field: 1 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT2: Struct2 = Struct2 { field: 1 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT3: Struct3 = Struct3 { field1: 1, field2: 2 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT4: Struct4 = Struct4 { field: 1 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT5: Struct5 = Struct5 { field: 1 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum2<T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Ok(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Err(#[stable(feature = "stable_test_feature", since = "1.0.0")] E),
}
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum4<T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM1: Enum1 = Enum1::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM2: Enum2 = Enum2::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM3: Enum3 = Enum3::Ok(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM3B: Enum3 = Enum3::Err(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM4: Enum4 = Enum4::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM5: Enum5 = Enum5::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias2<T = usize> = Option<T>;
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> =
Result<T, E>;
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias4<T = usize> = Option<T>;
#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> = Option<T>;
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS1: Alias1 = Alias1::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS2: Alias2 = Alias2::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS3: Alias3 = Alias3::Ok(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS3B: Alias3 = Alias3::Err(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS4: Alias4 = Alias4::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS5: Alias5 = Alias5::Some(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub trait Alloc {}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct System {}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
impl Alloc for System {}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Box1<T, #[unstable(feature = "box_alloc_param", issue = "none")] A: Alloc = System> {
ptr: *mut T,
alloc: A,
}
impl<T> Box1<T, System> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub fn new(mut t: T) -> Self {
unsafe { Self { ptr: &mut t, alloc: System {} } }
}
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Box2<T, A: Alloc = System> {
ptr: *mut T,
alloc: A,
}
impl<T> Box2<T, System> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub fn new(mut t: T) -> Self {
Self { ptr: &mut t, alloc: System {} }
}
}
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub struct Box3<T> {
ptr: *mut T,
}
impl<T> Box3<T> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub fn new(mut t: T) -> Self {
Self { ptr: &mut t }
}
}

View File

@ -0,0 +1,12 @@
// ignore-tidy-linelength
// aux-build:unstable_generic_param.rs
extern crate unstable_generic_param;
use unstable_generic_param::*;
impl<T> Trait3<usize> for T where T: Trait2<usize> { //~ ERROR use of unstable library feature 'unstable_default'
fn foo() -> usize { T::foo() }
}
fn main() {}

View File

@ -0,0 +1,11 @@
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability-where.rs:8:45
|
LL | impl<T> Trait3<usize> for T where T: Trait2<usize> {
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0658`.

View File

@ -0,0 +1,264 @@
// ignore-tidy-linelength
// aux-build:unstable_generic_param.rs
#![feature(unstable_default6)]
extern crate unstable_generic_param;
use unstable_generic_param::*;
struct R;
impl Trait1 for S {
fn foo() -> () { () } // ok
}
struct S;
impl Trait1<usize> for S { //~ ERROR use of unstable library feature 'unstable_default'
fn foo() -> usize { 0 }
}
impl Trait1<isize> for S { //~ ERROR use of unstable library feature 'unstable_default'
fn foo() -> isize { 0 }
}
impl Trait2<usize> for S { //~ ERROR use of unstable library feature 'unstable_default'
fn foo() -> usize { 0 }
}
impl Trait3<usize> for S {
fn foo() -> usize { 0 } // ok
}
fn main() {
let _ = S;
let _: Struct1<isize> = Struct1 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default'
let _ = STRUCT1; // ok
let _: Struct1 = STRUCT1; // ok
let _: Struct1<usize> = STRUCT1; //~ ERROR use of unstable library feature 'unstable_default'
let _: Struct1<isize> = Struct1 { field: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
// Instability is not enforced for generic type parameters used in public fields.
// Note how the unstable type default `usize` leaks,
// and can be used without the 'unstable_default' feature.
let _ = STRUCT1.field;
let _ = Struct1 { field: 1 };
let _ = Struct1 { field: () };
let _ = Struct1 { field: 1isize };
let _: Struct1 = Struct1 { field: 1 };
let _: usize = STRUCT1.field;
let _ = STRUCT1.field + 1;
let _ = STRUCT1.field + 1usize;
let _ = Struct2 { field: 1 }; // ok
let _: Struct2 = Struct2 { field: 1 }; // ok
let _: Struct2<usize> = Struct2 { field: 1 }; // ok
let _ = STRUCT2;
let _: Struct2 = STRUCT2; // ok
let _: Struct2<usize> = STRUCT2; // ok
let _: Struct2<isize> = Struct2 { field: 0 }; // ok
let _ = STRUCT2.field; // ok
let _: usize = STRUCT2.field; // ok
let _ = STRUCT2.field + 1; // ok
let _ = STRUCT2.field + 1usize; // ok
let _ = STRUCT3;
let _: Struct3 = STRUCT3; // ok
let _: Struct3<isize, usize> = STRUCT3; //~ ERROR use of unstable library feature 'unstable_default'
let _: Struct3<isize> = STRUCT3; // ok
let _: Struct3<isize, isize> = Struct3 { field1: 0, field2: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
let _: Struct3<usize, usize> = Struct3 { field1: 0, field2: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
let _ = STRUCT3.field1; // ok
let _: isize = STRUCT3.field1; // ok
let _ = STRUCT3.field1 + 1; // ok
// Note the aforementioned leak.
let _: usize = STRUCT3.field2; // ok
let _: Struct3<usize> = Struct3 { field1: 0, field2: 0 }; // ok
let _ = STRUCT3.field2 + 1; // ok
let _ = STRUCT3.field2 + 1usize; // ok
let _ = STRUCT4;
let _: Struct4<isize> = Struct4 { field: 1 };
//~^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
//~^^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
//~^^^ use of deprecated field `unstable_generic_param::Struct4::field`: test [deprecated]
let _ = STRUCT4;
let _: Struct4 = STRUCT4; //~ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
let _: Struct4<usize> = STRUCT4; //~ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
let _: Struct4<isize> = Struct4 { field: 0 };
//~^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
//~^^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
//~^^^ use of deprecated field `unstable_generic_param::Struct4::field`: test [deprecated]
let _ = STRUCT5;
let _: Struct5<isize> = Struct5 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
//~^^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
//~^^^ use of deprecated field `unstable_generic_param::Struct5::field`: test [deprecated]
let _ = STRUCT5;
let _: Struct5 = STRUCT5; //~ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
let _: Struct5<usize> = STRUCT5; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
let _: Struct5<isize> = Struct5 { field: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
//~^^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
//~^^^ use of deprecated field `unstable_generic_param::Struct5::field`: test [deprecated]
let _: Struct6<isize> = Struct6 { field: 1 }; // ok
let _: Struct6<isize> = Struct6 { field: 0 }; // ok
let _: Alias1<isize> = Alias1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
let _ = ALIAS1; // ok
let _: Alias1 = ALIAS1; // ok
let _: Alias1<usize> = ALIAS1; //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias1<isize> = Alias1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
// Instability is not enforced for generic type parameters used in public fields.
// Note how the unstable type default `usize` leaks,
// and can be used without the 'unstable_default' feature.
let _ = Alias1::Some(1);
let _ = Alias1::Some(());
let _ = Alias1::Some(1isize);
let _: Alias1 = Alias1::Some(1);
let _: usize = ALIAS1.unwrap();
let _ = ALIAS1.unwrap() + 1;
let _ = ALIAS1.unwrap() + 1usize;
let _ = Alias2::Some(1); // ok
let _: Alias2 = Alias2::Some(1); // ok
let _: Alias2<usize> = Alias2::Some(1); // ok
let _ = ALIAS2;
let _: Alias2 = ALIAS2; // ok
let _: Alias2<usize> = ALIAS2; // ok
let _: Alias2<isize> = Alias2::Some(0); // ok
let _ = ALIAS2.unwrap(); // ok
let _: usize = ALIAS2.unwrap(); // ok
let _ = ALIAS2.unwrap() + 1; // ok
let _ = ALIAS2.unwrap() + 1usize; // ok
let _ = ALIAS3;
let _: Alias3 = ALIAS3; // ok
let _: Alias3<isize, usize> = ALIAS3; //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias3<isize> = ALIAS3; // ok
let _: Alias3<isize, isize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias3<usize, usize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _ = ALIAS3.unwrap(); // ok
let _: isize = ALIAS3.unwrap(); // ok
let _ = ALIAS3.unwrap() + 1; // ok
// Note the aforementioned leak.
let _: usize = ALIAS3B.unwrap_err(); // ok
let _: Alias3<usize> = Alias3::Err(0); // ok
let _ = ALIAS3B.unwrap_err() + 1; // ok
let _ = ALIAS3B.unwrap_err() + 1usize; // ok
let _ = ALIAS4;
let _: Alias4<isize> = Alias4::Some(1);
//~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _ = ALIAS4;
let _: Alias4 = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _: Alias4<usize> = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _: Alias4<isize> = Alias4::Some(0);
//~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _ = ALIAS5;
let _: Alias5<isize> = Alias5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _ = ALIAS5;
let _: Alias5 = ALIAS5; //~ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _: Alias5<usize> = ALIAS5; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _: Alias5<isize> = Alias5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _: Alias6<isize> = Alias6::Some(1); // ok
let _: Alias6<isize> = Alias6::Some(0); // ok
let _: Enum1<isize> = Enum1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
let _ = ENUM1; // ok
let _: Enum1 = ENUM1; // ok
let _: Enum1<usize> = ENUM1; //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum1<isize> = Enum1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
// Instability is not enforced for generic type parameters used in public fields.
// Note how the unstable type default `usize` leaks,
// and can be used without the 'unstable_default' feature.
let _ = Enum1::Some(1);
let _ = Enum1::Some(());
let _ = Enum1::Some(1isize);
let _: Enum1 = Enum1::Some(1);
if let Enum1::Some(x) = ENUM1 {let _: usize = x;}
if let Enum1::Some(x) = ENUM1 {let _ = x + 1;}
if let Enum1::Some(x) = ENUM1 {let _ = x + 1usize;}
let _ = Enum2::Some(1); // ok
let _: Enum2 = Enum2::Some(1); // ok
let _: Enum2<usize> = Enum2::Some(1); // ok
let _ = ENUM2;
let _: Enum2 = ENUM2; // ok
let _: Enum2<usize> = ENUM2; // ok
let _: Enum2<isize> = Enum2::Some(0); // ok
if let Enum2::Some(x) = ENUM2 {let _ = x;} // ok
if let Enum2::Some(x) = ENUM2 {let _: usize = x;} // ok
if let Enum2::Some(x) = ENUM2 {let _ = x + 1;} // ok
if let Enum2::Some(x) = ENUM2 {let _ = x + 1usize;} // ok
let _ = ENUM3;
let _: Enum3 = ENUM3; // ok
let _: Enum3<isize, usize> = ENUM3; //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum3<isize> = ENUM3; // ok
let _: Enum3<isize, isize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum3<usize, usize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
if let Enum3::Ok(x) = ENUM3 {let _ = x;} // ok
if let Enum3::Ok(x) = ENUM3 {let _: isize = x;} // ok
if let Enum3::Ok(x) = ENUM3 {let _ = x + 1;} // ok
// Note the aforementioned leak.
if let Enum3::Err(x) = ENUM3B {let _: usize = x;} // ok
let _: Enum3<usize> = Enum3::Err(0); // ok
if let Enum3::Err(x) = ENUM3B {let _ = x + 1;} // ok
if let Enum3::Err(x) = ENUM3B {let _ = x + 1usize;} // ok
let _ = ENUM4;
let _: Enum4<isize> = Enum4::Some(1);
//~^ use of deprecated variant `unstable_generic_param::Enum4::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _ = ENUM4;
let _: Enum4 = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _: Enum4<usize> = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _: Enum4<isize> = Enum4::Some(0);
//~^ use of deprecated variant `unstable_generic_param::Enum4::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _ = ENUM5;
let _: Enum5<isize> = Enum5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated variant `unstable_generic_param::Enum5::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _ = ENUM5;
let _: Enum5 = ENUM5; //~ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _: Enum5<usize> = ENUM5; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _: Enum5<isize> = Enum5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated variant `unstable_generic_param::Enum5::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _: Enum6<isize> = Enum6::Some(1); // ok
let _: Enum6<isize> = Enum6::Some(0); // ok
let _: Box1<isize, System> = Box1::new(1); //~ ERROR use of unstable library feature 'box_alloc_param'
let _: Box1<isize> = Box1::new(1); // ok
let _: Box2<isize, System> = Box2::new(1); // ok
let _: Box2<isize> = Box2::new(1); // ok
let _: Box3<isize> = Box3::new(1); // ok
}

View File

@ -0,0 +1,493 @@
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:17:13
|
LL | impl Trait1<usize> for S {
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:21:13
|
LL | impl Trait1<isize> for S {
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:25:13
|
LL | impl Trait2<usize> for S {
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:84:29
|
LL | let _: Struct4<isize> = Struct4 { field: 1 };
| ^^^^^^^
|
= note: `#[warn(deprecated)]` on by default
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:84:12
|
LL | let _: Struct4<isize> = Struct4 { field: 1 };
| ^^^^^^^^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:89:12
|
LL | let _: Struct4 = STRUCT4;
| ^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:90:12
|
LL | let _: Struct4<usize> = STRUCT4;
| ^^^^^^^^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:91:29
|
LL | let _: Struct4<isize> = Struct4 { field: 0 };
| ^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct4`: test
--> $DIR/generics-default-stability.rs:91:12
|
LL | let _: Struct4<isize> = Struct4 { field: 0 };
| ^^^^^^^^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:97:29
|
LL | let _: Struct5<isize> = Struct5 { field: 1 };
| ^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:97:12
|
LL | let _: Struct5<isize> = Struct5 { field: 1 };
| ^^^^^^^^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:102:12
|
LL | let _: Struct5 = STRUCT5;
| ^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:103:12
|
LL | let _: Struct5<usize> = STRUCT5;
| ^^^^^^^^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:105:29
|
LL | let _: Struct5<isize> = Struct5 { field: 0 };
| ^^^^^^^
warning: use of deprecated struct `unstable_generic_param::Struct5`: test
--> $DIR/generics-default-stability.rs:105:12
|
LL | let _: Struct5<isize> = Struct5 { field: 0 };
| ^^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:160:28
|
LL | let _: Alias4<isize> = Alias4::Some(1);
| ^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:160:12
|
LL | let _: Alias4<isize> = Alias4::Some(1);
| ^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:164:12
|
LL | let _: Alias4 = ALIAS4;
| ^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:165:12
|
LL | let _: Alias4<usize> = ALIAS4;
| ^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:166:28
|
LL | let _: Alias4<isize> = Alias4::Some(0);
| ^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias4`: test
--> $DIR/generics-default-stability.rs:166:12
|
LL | let _: Alias4<isize> = Alias4::Some(0);
| ^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:171:28
|
LL | let _: Alias5<isize> = Alias5::Some(1);
| ^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:171:12
|
LL | let _: Alias5<isize> = Alias5::Some(1);
| ^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:175:12
|
LL | let _: Alias5 = ALIAS5;
| ^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:176:12
|
LL | let _: Alias5<usize> = ALIAS5;
| ^^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:178:28
|
LL | let _: Alias5<isize> = Alias5::Some(0);
| ^^^^^^^^^^^^
warning: use of deprecated type alias `unstable_generic_param::Alias5`: test
--> $DIR/generics-default-stability.rs:178:12
|
LL | let _: Alias5<isize> = Alias5::Some(0);
| ^^^^^^^^^^^^^
warning: use of deprecated variant `unstable_generic_param::Enum4::Some`: test
--> $DIR/generics-default-stability.rs:232:27
|
LL | let _: Enum4<isize> = Enum4::Some(1);
| ^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum4`: test
--> $DIR/generics-default-stability.rs:232:12
|
LL | let _: Enum4<isize> = Enum4::Some(1);
| ^^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum4`: test
--> $DIR/generics-default-stability.rs:236:12
|
LL | let _: Enum4 = ENUM4;
| ^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum4`: test
--> $DIR/generics-default-stability.rs:237:12
|
LL | let _: Enum4<usize> = ENUM4;
| ^^^^^^^^^^^^
warning: use of deprecated variant `unstable_generic_param::Enum4::Some`: test
--> $DIR/generics-default-stability.rs:238:27
|
LL | let _: Enum4<isize> = Enum4::Some(0);
| ^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum4`: test
--> $DIR/generics-default-stability.rs:238:12
|
LL | let _: Enum4<isize> = Enum4::Some(0);
| ^^^^^^^^^^^^
warning: use of deprecated variant `unstable_generic_param::Enum5::Some`: test
--> $DIR/generics-default-stability.rs:243:27
|
LL | let _: Enum5<isize> = Enum5::Some(1);
| ^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum5`: test
--> $DIR/generics-default-stability.rs:243:12
|
LL | let _: Enum5<isize> = Enum5::Some(1);
| ^^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum5`: test
--> $DIR/generics-default-stability.rs:247:12
|
LL | let _: Enum5 = ENUM5;
| ^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum5`: test
--> $DIR/generics-default-stability.rs:248:12
|
LL | let _: Enum5<usize> = ENUM5;
| ^^^^^^^^^^^^
warning: use of deprecated variant `unstable_generic_param::Enum5::Some`: test
--> $DIR/generics-default-stability.rs:250:27
|
LL | let _: Enum5<isize> = Enum5::Some(0);
| ^^^^^^^^^^^
warning: use of deprecated enum `unstable_generic_param::Enum5`: test
--> $DIR/generics-default-stability.rs:250:12
|
LL | let _: Enum5<isize> = Enum5::Some(0);
| ^^^^^^^^^^^^
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:36:20
|
LL | let _: Struct1<isize> = Struct1 { field: 1 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:40:20
|
LL | let _: Struct1<usize> = STRUCT1;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:41:20
|
LL | let _: Struct1<isize> = Struct1 { field: 0 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:70:27
|
LL | let _: Struct3<isize, usize> = STRUCT3;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:72:27
|
LL | let _: Struct3<isize, isize> = Struct3 { field1: 0, field2: 0 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:73:27
|
LL | let _: Struct3<usize, usize> = Struct3 { field1: 0, field2: 0 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:97:20
|
LL | let _: Struct5<isize> = Struct5 { field: 1 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:103:20
|
LL | let _: Struct5<usize> = STRUCT5;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:105:20
|
LL | let _: Struct5<isize> = Struct5 { field: 0 };
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:113:19
|
LL | let _: Alias1<isize> = Alias1::Some(1);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:117:19
|
LL | let _: Alias1<usize> = ALIAS1;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:118:19
|
LL | let _: Alias1<isize> = Alias1::Some(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:146:26
|
LL | let _: Alias3<isize, usize> = ALIAS3;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:148:26
|
LL | let _: Alias3<isize, isize> = Alias3::Ok(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:149:26
|
LL | let _: Alias3<usize, usize> = Alias3::Ok(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:171:19
|
LL | let _: Alias5<isize> = Alias5::Some(1);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:176:19
|
LL | let _: Alias5<usize> = ALIAS5;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:178:19
|
LL | let _: Alias5<isize> = Alias5::Some(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:185:18
|
LL | let _: Enum1<isize> = Enum1::Some(1);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:189:18
|
LL | let _: Enum1<usize> = ENUM1;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:190:18
|
LL | let _: Enum1<isize> = Enum1::Some(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:218:25
|
LL | let _: Enum3<isize, usize> = ENUM3;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:220:25
|
LL | let _: Enum3<isize, isize> = Enum3::Ok(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:221:25
|
LL | let _: Enum3<usize, usize> = Enum3::Ok(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:243:18
|
LL | let _: Enum5<isize> = Enum5::Some(1);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:248:18
|
LL | let _: Enum5<usize> = ENUM5;
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'unstable_default'
--> $DIR/generics-default-stability.rs:250:18
|
LL | let _: Enum5<isize> = Enum5::Some(0);
| ^^^^^
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
error[E0658]: use of unstable library feature 'box_alloc_param'
--> $DIR/generics-default-stability.rs:257:24
|
LL | let _: Box1<isize, System> = Box1::new(1);
| ^^^^^^
|
= help: add `#![feature(box_alloc_param)]` to the crate attributes to enable
warning: use of deprecated field `unstable_generic_param::Struct4::field`: test
--> $DIR/generics-default-stability.rs:84:39
|
LL | let _: Struct4<isize> = Struct4 { field: 1 };
| ^^^^^^^^
warning: use of deprecated field `unstable_generic_param::Struct4::field`: test
--> $DIR/generics-default-stability.rs:91:39
|
LL | let _: Struct4<isize> = Struct4 { field: 0 };
| ^^^^^^^^
warning: use of deprecated field `unstable_generic_param::Struct5::field`: test
--> $DIR/generics-default-stability.rs:97:39
|
LL | let _: Struct5<isize> = Struct5 { field: 1 };
| ^^^^^^^^
warning: use of deprecated field `unstable_generic_param::Struct5::field`: test
--> $DIR/generics-default-stability.rs:105:39
|
LL | let _: Struct5<isize> = Struct5 { field: 0 };
| ^^^^^^^^
error: aborting due to 31 previous errors; 40 warnings emitted
For more information about this error, try `rustc --explain E0658`.