// 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 for S { //~ ERROR use of unstable library feature 'unstable_default' fn foo() -> usize { 0 } } impl Trait1 for S { //~ ERROR use of unstable library feature 'unstable_default' fn foo() -> isize { 0 } } impl Trait2 for S { //~ ERROR use of unstable library feature 'unstable_default' fn foo() -> usize { 0 } } impl Trait3 for S { fn foo() -> usize { 0 } // ok } fn main() { let _ = S; let _: Struct1 = Struct1 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default' let _ = STRUCT1; // ok let _: Struct1 = STRUCT1; // ok let _: Struct1 = STRUCT1; //~ ERROR use of unstable library feature 'unstable_default' let _: Struct1 = 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 = Struct2 { field: 1 }; // ok let _ = STRUCT2; let _: Struct2 = STRUCT2; // ok let _: Struct2 = STRUCT2; // ok let _: Struct2 = 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 = STRUCT3; //~ ERROR use of unstable library feature 'unstable_default' let _: Struct3 = STRUCT3; // ok let _: Struct3 = Struct3 { field1: 0, field2: 0 }; //~ ERROR use of unstable library feature 'unstable_default' let _: Struct3 = 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 = Struct3 { field1: 0, field2: 0 }; // ok let _ = STRUCT3.field2 + 1; // ok let _ = STRUCT3.field2 + 1usize; // ok let _ = STRUCT4; let _: Struct4 = Struct4 { field: 1 }; //~^ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] //~^^ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] //~^^^ use of deprecated item 'unstable_generic_param::Struct4::field': test [deprecated] let _ = STRUCT4; let _: Struct4 = STRUCT4; //~ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] let _: Struct4 = STRUCT4; //~ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] let _: Struct4 = Struct4 { field: 0 }; //~^ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] //~^^ use of deprecated item 'unstable_generic_param::Struct4': test [deprecated] //~^^^ use of deprecated item 'unstable_generic_param::Struct4::field': test [deprecated] let _ = STRUCT5; let _: Struct5 = Struct5 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default' //~^ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] //~^^ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] //~^^^ use of deprecated item 'unstable_generic_param::Struct5::field': test [deprecated] let _ = STRUCT5; let _: Struct5 = STRUCT5; //~ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] let _: Struct5 = STRUCT5; //~ ERROR use of unstable library feature 'unstable_default' //~^ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] let _: Struct5 = Struct5 { field: 0 }; //~ ERROR use of unstable library feature 'unstable_default' //~^ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] //~^^ use of deprecated item 'unstable_generic_param::Struct5': test [deprecated] //~^^^ use of deprecated item 'unstable_generic_param::Struct5::field': test [deprecated] let _: Struct6 = Struct6 { field: 1 }; // ok let _: Struct6 = Struct6 { field: 0 }; // ok let _: Box1 = Box1::new(1); //~ ERROR use of unstable library feature 'box_alloc_param' let _: Box1 = Box1::new(1); // ok let _: Box2 = Box2::new(1); // ok let _: Box2 = Box2::new(1); // ok let _: Box3 = Box3::new(1); // ok }