Check types for privacy
This commit is contained in:
parent
cd72f2e269
commit
85fb9e0d91
11 changed files with 581 additions and 7 deletions
41
src/test/compile-fail/auxiliary/private-inferred-type.rs
Normal file
41
src/test/compile-fail/auxiliary/private-inferred-type.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
fn priv_fn() {}
|
||||
enum PrivEnum { Variant }
|
||||
pub enum PubEnum { Variant }
|
||||
trait PrivTrait { fn method() {} }
|
||||
impl PrivTrait for u8 {}
|
||||
pub trait PubTrait { fn method() {} }
|
||||
impl PubTrait for u8 {}
|
||||
struct PrivTupleStruct(u8);
|
||||
pub struct PubTupleStruct(u8);
|
||||
impl PubTupleStruct { fn method() {} }
|
||||
|
||||
struct Priv;
|
||||
pub type Alias = Priv;
|
||||
pub struct Pub<T = Alias>(pub T);
|
||||
|
||||
impl Pub<Priv> {
|
||||
pub fn static_method() {}
|
||||
}
|
||||
|
||||
pub macro m() {
|
||||
priv_fn;
|
||||
PrivEnum::Variant;
|
||||
PubEnum::Variant;
|
||||
<u8 as PrivTrait>::method;
|
||||
<u8 as PubTrait>::method;
|
||||
PrivTupleStruct;
|
||||
PubTupleStruct;
|
||||
Pub::static_method;
|
||||
}
|
||||
|
|
@ -22,11 +22,11 @@ mod foo {
|
|||
x: i32,
|
||||
}
|
||||
|
||||
let s = S { x: 0 };
|
||||
let _ = s.x;
|
||||
let s = S { x: 0 }; //~ ERROR type `foo::S` is private
|
||||
let _ = s.x; //~ ERROR type `foo::S` is private
|
||||
|
||||
let t = T(0);
|
||||
let _ = t.0;
|
||||
let t = T(0); //~ ERROR type `foo::T` is private
|
||||
let _ = t.0; //~ ERROR type `foo::T` is private
|
||||
|
||||
let s = $S { $x: 0, x: 1 };
|
||||
assert_eq!((s.$x, s.x), (0, 1));
|
||||
|
|
@ -19,7 +19,7 @@ mod foo {
|
|||
}
|
||||
|
||||
pub macro m() {
|
||||
let _: () = S.f();
|
||||
let _: () = S.f(); //~ ERROR type `fn(&foo::S) {foo::S::f}` is private
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
// aux-build:intercrate.rs
|
||||
|
||||
// error-pattern:type `fn() -> u32 {intercrate::foo::bar::f}` is private
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
extern crate intercrate;
|
||||
28
src/test/compile-fail/private-inferred-type-1.rs
Normal file
28
src/test/compile-fail/private-inferred-type-1.rs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
trait Arr0 {
|
||||
fn arr0_secret(&self);
|
||||
}
|
||||
trait TyParam {
|
||||
fn ty_param_secret(&self);
|
||||
}
|
||||
|
||||
mod m {
|
||||
struct Priv;
|
||||
|
||||
impl ::Arr0 for [Priv; 0] { fn arr0_secret(&self) {} }
|
||||
impl ::TyParam for Option<Priv> { fn ty_param_secret(&self) {} }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
[].arr0_secret(); //~ ERROR type `m::Priv` is private
|
||||
None.ty_param_secret(); //~ ERROR type `m::Priv` is private
|
||||
}
|
||||
29
src/test/compile-fail/private-inferred-type-2.rs
Normal file
29
src/test/compile-fail/private-inferred-type-2.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// aux-build:private-inferred-type.rs
|
||||
|
||||
extern crate private_inferred_type as ext;
|
||||
|
||||
mod m {
|
||||
struct Priv;
|
||||
pub struct Pub<T>(pub T);
|
||||
|
||||
impl Pub<Priv> {
|
||||
pub fn get_priv() -> Priv { Priv }
|
||||
pub fn static_method() {}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
m::Pub::get_priv; //~ ERROR type `m::Priv` is private
|
||||
m::Pub::static_method; //~ ERROR type `m::Priv` is private
|
||||
ext::Pub::static_method; //~ ERROR type `ext::Priv` is private
|
||||
}
|
||||
26
src/test/compile-fail/private-inferred-type-3.rs
Normal file
26
src/test/compile-fail/private-inferred-type-3.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// aux-build:private-inferred-type.rs
|
||||
|
||||
// error-pattern:type `fn() {ext::priv_fn}` is private
|
||||
// error-pattern:type `ext::PrivEnum` is private
|
||||
// error-pattern:type `fn() {<u8 as ext::PrivTrait>::method}` is private
|
||||
// error-pattern:type `fn(u8) -> ext::PrivTupleStruct {ext::PrivTupleStruct::{{constructor}}}` is pr
|
||||
// error-pattern:type `fn(u8) -> ext::PubTupleStruct {ext::PubTupleStruct::{{constructor}}}` is priv
|
||||
// error-pattern:type `ext::Priv` is private
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
extern crate private_inferred_type as ext;
|
||||
|
||||
fn main() {
|
||||
ext::m!();
|
||||
}
|
||||
83
src/test/compile-fail/private-inferred-type.rs
Normal file
83
src/test/compile-fail/private-inferred-type.rs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(conservative_impl_trait)]
|
||||
#![feature(decl_macro)]
|
||||
|
||||
mod m {
|
||||
fn priv_fn() {}
|
||||
enum PrivEnum { Variant }
|
||||
pub enum PubEnum { Variant }
|
||||
trait PrivTrait { fn method() {} }
|
||||
impl PrivTrait for u8 {}
|
||||
pub trait PubTrait { fn method() {} }
|
||||
impl PubTrait for u8 {}
|
||||
struct PrivTupleStruct(u8);
|
||||
pub struct PubTupleStruct(u8);
|
||||
impl PubTupleStruct { fn method() {} }
|
||||
|
||||
struct Priv;
|
||||
pub type Alias = Priv;
|
||||
pub struct Pub<T = Alias>(pub T);
|
||||
|
||||
impl Pub<Priv> {
|
||||
pub fn static_method() {}
|
||||
}
|
||||
|
||||
pub macro m() {
|
||||
priv_fn; //~ ERROR type `fn() {m::priv_fn}` is private
|
||||
PrivEnum::Variant; //~ ERROR type `m::PrivEnum` is private
|
||||
PubEnum::Variant; // OK
|
||||
<u8 as PrivTrait>::method; //~ ERROR type `fn() {<u8 as m::PrivTrait>::method}` is private
|
||||
<u8 as PubTrait>::method; // OK
|
||||
PrivTupleStruct;
|
||||
//~^ ERROR type `fn(u8) -> m::PrivTupleStruct {m::PrivTupleStruct::{{constructor}}}` is priv
|
||||
PubTupleStruct;
|
||||
//~^ ERROR type `fn(u8) -> m::PubTupleStruct {m::PubTupleStruct::{{constructor}}}` is privat
|
||||
Pub::static_method; //~ ERROR type `m::Priv` is private
|
||||
}
|
||||
|
||||
trait Trait {}
|
||||
pub trait TraitWithTyParam<T> {}
|
||||
pub trait TraitWithAssocTy { type X; }
|
||||
impl Trait for u8 {}
|
||||
impl<T> TraitWithTyParam<T> for u8 {}
|
||||
impl TraitWithAssocTy for u8 { type X = Priv; }
|
||||
|
||||
pub fn leak_anon1() -> impl Trait + 'static { 0 }
|
||||
pub fn leak_anon2() -> impl TraitWithTyParam<Alias> { 0 }
|
||||
pub fn leak_anon3() -> impl TraitWithAssocTy<X = Alias> { 0 }
|
||||
|
||||
pub fn leak_dyn1() -> Box<Trait + 'static> { Box::new(0) }
|
||||
pub fn leak_dyn2() -> Box<TraitWithTyParam<Alias>> { Box::new(0) }
|
||||
pub fn leak_dyn3() -> Box<TraitWithAssocTy<X = Alias>> { Box::new(0) }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
m::Alias {}; //~ ERROR type `m::Priv` is private
|
||||
m::Pub { 0: m::Alias {} }; //~ ERROR type `m::Priv` is private
|
||||
m::m!();
|
||||
|
||||
m::leak_anon1(); //~ ERROR trait `m::Trait` is private
|
||||
m::leak_anon2(); //~ ERROR type `m::Priv` is private
|
||||
m::leak_anon3(); //~ ERROR type `m::Priv` is private
|
||||
|
||||
m::leak_dyn1(); //~ ERROR type `m::Trait + 'static` is private
|
||||
m::leak_dyn2(); //~ ERROR type `m::Priv` is private
|
||||
m::leak_dyn3(); //~ ERROR type `m::Priv` is private
|
||||
|
||||
// Check that messages are not duplicated for various kinds of assignments
|
||||
let a = m::Alias {}; //~ ERROR type `m::Priv` is private
|
||||
let mut b = a; //~ ERROR type `m::Priv` is private
|
||||
b = a; //~ ERROR type `m::Priv` is private
|
||||
match a { //~ ERROR type `m::Priv` is private
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
37
src/test/compile-fail/private-type-in-interface.rs
Normal file
37
src/test/compile-fail/private-type-in-interface.rs
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// aux-build:private-inferred-type.rs
|
||||
|
||||
#![feature(conservative_impl_trait)]
|
||||
|
||||
extern crate private_inferred_type as ext;
|
||||
|
||||
mod m {
|
||||
struct Priv;
|
||||
pub type Alias = Priv;
|
||||
}
|
||||
|
||||
fn f(_: m::Alias) {} //~ ERROR type `m::Priv` is private
|
||||
//~^ ERROR type `m::Priv` is private
|
||||
fn f_ext(_: ext::Alias) {} //~ ERROR type `ext::Priv` is private
|
||||
//~^ ERROR type `ext::Priv` is private
|
||||
|
||||
trait Tr1 {}
|
||||
impl m::Alias {} //~ ERROR type `m::Priv` is private
|
||||
impl Tr1 for ext::Alias {} //~ ERROR type `ext::Priv` is private
|
||||
//~^ ERROR type `ext::Priv` is private
|
||||
|
||||
trait Tr2<T> {}
|
||||
impl<T> Tr2<T> for u8 {}
|
||||
fn g() -> impl Tr2<m::Alias> { 0 } //~ ERROR type `m::Priv` is private
|
||||
fn g_ext() -> impl Tr2<ext::Alias> { 0 } //~ ERROR type `ext::Priv` is private
|
||||
|
||||
fn main() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue