mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 01:04:03 +00:00
Auto merge of #58010 - Zoxc:parallel-passes, r=michaelwoerister
Move privacy checking later in the pipeline and make some passes run in parallel r? @michaelwoerister
This commit is contained in:
commit
ad433894ab
@ -30,7 +30,7 @@ use syntax::util::parser::ExprPrecedence;
|
||||
use crate::ty::AdtKind;
|
||||
use crate::ty::query::Providers;
|
||||
|
||||
use rustc_data_structures::sync::{ParallelIterator, par_iter, Send, Sync, scope};
|
||||
use rustc_data_structures::sync::{ParallelIterator, par_iter, Send, Sync};
|
||||
use rustc_data_structures::thin_vec::ThinVec;
|
||||
|
||||
use serialize::{self, Encoder, Encodable, Decoder, Decodable};
|
||||
@ -763,23 +763,17 @@ impl Crate {
|
||||
pub fn par_visit_all_item_likes<'hir, V>(&'hir self, visitor: &V)
|
||||
where V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send
|
||||
{
|
||||
scope(|s| {
|
||||
s.spawn(|_| {
|
||||
par_iter(&self.items).for_each(|(_, item)| {
|
||||
visitor.visit_item(item);
|
||||
});
|
||||
parallel!({
|
||||
par_iter(&self.items).for_each(|(_, item)| {
|
||||
visitor.visit_item(item);
|
||||
});
|
||||
|
||||
s.spawn(|_| {
|
||||
par_iter(&self.trait_items).for_each(|(_, trait_item)| {
|
||||
visitor.visit_trait_item(trait_item);
|
||||
});
|
||||
}, {
|
||||
par_iter(&self.trait_items).for_each(|(_, trait_item)| {
|
||||
visitor.visit_trait_item(trait_item);
|
||||
});
|
||||
|
||||
s.spawn(|_| {
|
||||
par_iter(&self.impl_items).for_each(|(_, impl_item)| {
|
||||
visitor.visit_impl_item(impl_item);
|
||||
});
|
||||
}, {
|
||||
par_iter(&self.impl_items).for_each(|(_, impl_item)| {
|
||||
visitor.visit_impl_item(impl_item);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -189,7 +189,6 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
|
||||
for &module in tcx.hir().krate().modules.keys() {
|
||||
tcx.ensure().check_mod_liveness(tcx.hir().local_def_id(module));
|
||||
}
|
||||
tcx.sess.abort_if_errors();
|
||||
}
|
||||
|
||||
pub fn provide(providers: &mut Providers<'_>) {
|
||||
|
@ -85,7 +85,7 @@ pub struct Session {
|
||||
/// in order to avoid redundantly verbose output (Issue #24690, #44953).
|
||||
pub one_time_diagnostics: Lock<FxHashSet<(DiagnosticMessageId, Option<Span>, String)>>,
|
||||
pub plugin_llvm_passes: OneThread<RefCell<Vec<String>>>,
|
||||
pub plugin_attributes: OneThread<RefCell<Vec<(String, AttributeType)>>>,
|
||||
pub plugin_attributes: Lock<Vec<(String, AttributeType)>>,
|
||||
pub crate_types: Once<Vec<config::CrateType>>,
|
||||
pub dependency_formats: Once<dependency_format::Dependencies>,
|
||||
/// The crate_disambiguator is constructed out of all the `-C metadata`
|
||||
@ -1178,7 +1178,7 @@ pub fn build_session_(
|
||||
buffered_lints: Lock::new(Some(Default::default())),
|
||||
one_time_diagnostics: Default::default(),
|
||||
plugin_llvm_passes: OneThread::new(RefCell::new(Vec::new())),
|
||||
plugin_attributes: OneThread::new(RefCell::new(Vec::new())),
|
||||
plugin_attributes: Lock::new(Vec::new()),
|
||||
crate_types: Once::new(),
|
||||
dependency_formats: Once::new(),
|
||||
crate_disambiguator: Once::new(),
|
||||
|
@ -127,6 +127,13 @@ cfg_if! {
|
||||
pub use self::serial_join as join;
|
||||
pub use self::serial_scope as scope;
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! parallel {
|
||||
($($blocks:tt),*) => {
|
||||
$($blocks)*;
|
||||
}
|
||||
}
|
||||
|
||||
pub use std::iter::Iterator as ParallelIterator;
|
||||
|
||||
pub fn par_iter<T: IntoIterator>(t: T) -> T::IntoIter {
|
||||
@ -271,6 +278,26 @@ cfg_if! {
|
||||
use std::thread;
|
||||
pub use rayon::{join, scope};
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! parallel {
|
||||
(impl [$($c:tt,)*] [$block:tt $(, $rest:tt)*]) => {
|
||||
parallel!(impl [$block, $($c,)*] [$($rest),*])
|
||||
};
|
||||
(impl [$($blocks:tt,)*] []) => {
|
||||
::rustc_data_structures::sync::scope(|s| {
|
||||
$(
|
||||
s.spawn(|_| $blocks);
|
||||
)*
|
||||
})
|
||||
};
|
||||
($($blocks:tt),*) => {
|
||||
// Reverse the order of the blocks since Rayon executes them in reverse order
|
||||
// when using a single thread. This ensures the execution order matches that
|
||||
// of a single threaded rustc
|
||||
parallel!(impl [] [$($blocks),*]);
|
||||
};
|
||||
}
|
||||
|
||||
pub use rayon_core::WorkerLocal;
|
||||
|
||||
pub use rayon::iter::ParallelIterator;
|
||||
|
@ -1222,26 +1222,28 @@ where
|
||||
// tcx available.
|
||||
time(sess, "dep graph tcx init", || rustc_incremental::dep_graph_tcx_init(tcx));
|
||||
|
||||
time(sess, "looking for entry point", || {
|
||||
middle::entry::find_entry_point(tcx)
|
||||
});
|
||||
parallel!({
|
||||
time(sess, "looking for entry point", || {
|
||||
middle::entry::find_entry_point(tcx)
|
||||
});
|
||||
|
||||
time(sess, "looking for plugin registrar", || {
|
||||
plugin::build::find_plugin_registrar(tcx)
|
||||
});
|
||||
time(sess, "looking for plugin registrar", || {
|
||||
plugin::build::find_plugin_registrar(tcx)
|
||||
});
|
||||
|
||||
time(sess, "looking for derive registrar", || {
|
||||
proc_macro_decls::find(tcx)
|
||||
});
|
||||
|
||||
time(sess, "loop checking", || loops::check_crate(tcx));
|
||||
|
||||
time(sess, "attribute checking", || {
|
||||
hir::check_attr::check_crate(tcx)
|
||||
});
|
||||
|
||||
time(sess, "stability checking", || {
|
||||
stability::check_unstable_api_usage(tcx)
|
||||
time(sess, "looking for derive registrar", || {
|
||||
proc_macro_decls::find(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "loop checking", || loops::check_crate(tcx));
|
||||
}, {
|
||||
time(sess, "attribute checking", || {
|
||||
hir::check_attr::check_crate(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "stability checking", || {
|
||||
stability::check_unstable_api_usage(tcx)
|
||||
});
|
||||
});
|
||||
|
||||
// passes are timed inside typeck
|
||||
@ -1253,27 +1255,31 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
time(sess, "rvalue promotion", || {
|
||||
rvalue_promotion::check_crate(tcx)
|
||||
time(sess, "misc checking", || {
|
||||
parallel!({
|
||||
time(sess, "rvalue promotion", || {
|
||||
rvalue_promotion::check_crate(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "intrinsic checking", || {
|
||||
middle::intrinsicck::check_crate(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "match checking", || mir::matchck_crate(tcx));
|
||||
}, {
|
||||
// this must run before MIR dump, because
|
||||
// "not all control paths return a value" is reported here.
|
||||
//
|
||||
// maybe move the check to a MIR pass?
|
||||
time(sess, "liveness checking", || {
|
||||
middle::liveness::check_crate(tcx)
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
time(sess, "privacy checking", || {
|
||||
rustc_privacy::check_crate(tcx)
|
||||
});
|
||||
|
||||
time(sess, "intrinsic checking", || {
|
||||
middle::intrinsicck::check_crate(tcx)
|
||||
});
|
||||
|
||||
time(sess, "match checking", || mir::matchck_crate(tcx));
|
||||
|
||||
// this must run before MIR dump, because
|
||||
// "not all control paths return a value" is reported here.
|
||||
//
|
||||
// maybe move the check to a MIR pass?
|
||||
time(sess, "liveness checking", || {
|
||||
middle::liveness::check_crate(tcx)
|
||||
});
|
||||
// Abort so we don't try to construct MIR with liveness errors.
|
||||
// We also won't want to continue with errors from rvalue promotion
|
||||
tcx.sess.abort_if_errors();
|
||||
|
||||
time(sess, "borrow checking", || {
|
||||
if tcx.use_ast_borrowck() {
|
||||
@ -1297,7 +1303,7 @@ where
|
||||
|
||||
time(sess, "layout testing", || layout_test::test_layout(tcx));
|
||||
|
||||
// Avoid overwhelming user with errors if type checking failed.
|
||||
// Avoid overwhelming user with errors if borrow checking failed.
|
||||
// I'm not sure how helpful this is, to be honest, but it avoids
|
||||
// a
|
||||
// lot of annoying errors in the compile-fail tests (basically,
|
||||
@ -1307,14 +1313,22 @@ where
|
||||
return Ok(f(tcx, rx, sess.compile_status()));
|
||||
}
|
||||
|
||||
time(sess, "death checking", || middle::dead::check_crate(tcx));
|
||||
|
||||
time(sess, "unused lib feature checking", || {
|
||||
stability::check_unused_or_stable_features(tcx)
|
||||
time(sess, "misc checking", || {
|
||||
parallel!({
|
||||
time(sess, "privacy checking", || {
|
||||
rustc_privacy::check_crate(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "death checking", || middle::dead::check_crate(tcx));
|
||||
}, {
|
||||
time(sess, "unused lib feature checking", || {
|
||||
stability::check_unused_or_stable_features(tcx)
|
||||
});
|
||||
}, {
|
||||
time(sess, "lint checking", || lint::check_crate(tcx));
|
||||
});
|
||||
});
|
||||
|
||||
time(sess, "lint checking", || lint::check_crate(tcx));
|
||||
|
||||
return Ok(f(tcx, rx, tcx.sess.compile_status()));
|
||||
},
|
||||
)
|
||||
|
@ -30,6 +30,7 @@ extern crate rustc;
|
||||
extern crate rustc_allocator;
|
||||
extern crate rustc_target;
|
||||
extern crate rustc_borrowck;
|
||||
#[macro_use]
|
||||
extern crate rustc_data_structures;
|
||||
extern crate rustc_errors as errors;
|
||||
extern crate rustc_passes;
|
||||
|
@ -44,7 +44,6 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
|
||||
let def_id = tcx.hir().body_owner_def_id(body_id);
|
||||
tcx.const_is_rvalue_promotable_to_static(def_id);
|
||||
}
|
||||
tcx.sess.abort_if_errors();
|
||||
}
|
||||
|
||||
fn const_is_rvalue_promotable_to_static<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
|
@ -1,4 +1,4 @@
|
||||
mod Foo {
|
||||
mod foo {
|
||||
struct Bar(u32);
|
||||
|
||||
pub fn bar() -> Bar { //~ ERROR E0446
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0446]: private type `Foo::Bar` in public interface
|
||||
error[E0446]: private type `foo::Bar` in public interface
|
||||
--> $DIR/E0446.rs:4:5
|
||||
|
|
||||
LL | struct Bar(u32);
|
||||
| - `Foo::Bar` declared as private
|
||||
| - `foo::Bar` declared as private
|
||||
LL |
|
||||
LL | / pub fn bar() -> Bar { //~ ERROR E0446
|
||||
LL | | Bar(0)
|
||||
|
@ -1,4 +1,4 @@
|
||||
mod Bar {
|
||||
mod bar {
|
||||
pub struct Foo {
|
||||
pub a: isize,
|
||||
b: isize,
|
||||
@ -10,10 +10,10 @@ mod Bar {
|
||||
);
|
||||
}
|
||||
|
||||
fn pat_match(foo: Bar::Foo) {
|
||||
let Bar::Foo{a:a, b:b} = foo; //~ ERROR E0451
|
||||
fn pat_match(foo: bar::Foo) {
|
||||
let bar::Foo{a, b} = foo; //~ ERROR E0451
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let f = Bar::Foo{ a: 0, b: 0 }; //~ ERROR E0451
|
||||
let f = bar::Foo{ a: 0, b: 0 }; //~ ERROR E0451
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
error[E0451]: field `b` of struct `Bar::Foo` is private
|
||||
--> $DIR/E0451.rs:14:23
|
||||
error[E0451]: field `b` of struct `bar::Foo` is private
|
||||
--> $DIR/E0451.rs:14:21
|
||||
|
|
||||
LL | let Bar::Foo{a:a, b:b} = foo; //~ ERROR E0451
|
||||
| ^^^ field `b` is private
|
||||
LL | let bar::Foo{a, b} = foo; //~ ERROR E0451
|
||||
| ^ field `b` is private
|
||||
|
||||
error[E0451]: field `b` of struct `Bar::Foo` is private
|
||||
error[E0451]: field `b` of struct `bar::Foo` is private
|
||||
--> $DIR/E0451.rs:18:29
|
||||
|
|
||||
LL | let f = Bar::Foo{ a: 0, b: 0 }; //~ ERROR E0451
|
||||
LL | let f = bar::Foo{ a: 0, b: 0 }; //~ ERROR E0451
|
||||
| ^^^^ field `b` is private
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -6,12 +6,12 @@ use self::foo::S;
|
||||
mod foo {
|
||||
use std::cell::{UnsafeCell};
|
||||
|
||||
static mut count : UnsafeCell<u64> = UnsafeCell::new(1);
|
||||
static mut COUNT : UnsafeCell<u64> = UnsafeCell::new(1);
|
||||
|
||||
pub struct S { pub a: u8, pub b: String, secret_uid: u64 }
|
||||
|
||||
pub fn make_secrets(a: u8, b: String) -> S {
|
||||
let val = unsafe { let p = count.get(); let val = *p; *p = val + 1; val };
|
||||
let val = unsafe { let p = COUNT.get(); let val = *p; *p = val + 1; val };
|
||||
println!("creating {}, uid {}", b, val);
|
||||
S { a: a, b: b, secret_uid: val }
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ mod traits {
|
||||
|
||||
pub type Alias<T: PrivTr> = T; //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
//~| WARNING hard error
|
||||
//~| WARNING bounds on generic parameters are not enforced in type aliases
|
||||
pub trait Tr1: PrivTr {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
//~^ WARNING hard error
|
||||
pub trait Tr2<T: PrivTr> {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
@ -74,6 +75,7 @@ mod traits_where {
|
||||
pub type Alias<T> where T: PrivTr = T;
|
||||
//~^ ERROR private trait `traits_where::PrivTr` in public interface
|
||||
//~| WARNING hard error
|
||||
//~| WARNING where clauses are not enforced in type aliases
|
||||
pub trait Tr2<T> where T: PrivTr {}
|
||||
//~^ ERROR private trait `traits_where::PrivTr` in public interface
|
||||
//~| WARNING hard error
|
||||
|
@ -112,7 +112,7 @@ LL | pub type Alias<T: PrivTr> = T; //~ ERROR private trait `traits::PrivTr`
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:52:5
|
||||
--> $DIR/private-in-public-warn.rs:53:5
|
||||
|
|
||||
LL | pub trait Tr1: PrivTr {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -121,7 +121,7 @@ LL | pub trait Tr1: PrivTr {} //~ ERROR private trait `traits::PrivTr` in pu
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:54:5
|
||||
--> $DIR/private-in-public-warn.rs:55:5
|
||||
|
|
||||
LL | pub trait Tr2<T: PrivTr> {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -130,7 +130,7 @@ LL | pub trait Tr2<T: PrivTr> {} //~ ERROR private trait `traits::PrivTr` in
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:56:5
|
||||
--> $DIR/private-in-public-warn.rs:57:5
|
||||
|
|
||||
LL | / pub trait Tr3 {
|
||||
LL | | //~^ ERROR private trait `traits::PrivTr` in public interface
|
||||
@ -145,7 +145,7 @@ LL | | }
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:60:9
|
||||
--> $DIR/private-in-public-warn.rs:61:9
|
||||
|
|
||||
LL | fn f<T: PrivTr>(arg: T) {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -154,7 +154,7 @@ LL | fn f<T: PrivTr>(arg: T) {} //~ ERROR private trait `traits::PrivTr`
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:63:5
|
||||
--> $DIR/private-in-public-warn.rs:64:5
|
||||
|
|
||||
LL | impl<T: PrivTr> Pub<T> {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -163,7 +163,7 @@ LL | impl<T: PrivTr> Pub<T> {} //~ ERROR private trait `traits::PrivTr` in p
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:65:5
|
||||
--> $DIR/private-in-public-warn.rs:66:5
|
||||
|
|
||||
LL | impl<T: PrivTr> PubTr for Pub<T> {} //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -172,7 +172,7 @@ LL | impl<T: PrivTr> PubTr for Pub<T> {} //~ ERROR private trait `traits::Pr
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits_where::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:74:5
|
||||
--> $DIR/private-in-public-warn.rs:75:5
|
||||
|
|
||||
LL | pub type Alias<T> where T: PrivTr = T;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -181,7 +181,7 @@ LL | pub type Alias<T> where T: PrivTr = T;
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits_where::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:77:5
|
||||
--> $DIR/private-in-public-warn.rs:79:5
|
||||
|
|
||||
LL | pub trait Tr2<T> where T: PrivTr {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -190,7 +190,7 @@ LL | pub trait Tr2<T> where T: PrivTr {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits_where::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:81:9
|
||||
--> $DIR/private-in-public-warn.rs:83:9
|
||||
|
|
||||
LL | fn f<T>(arg: T) where T: PrivTr {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -199,7 +199,7 @@ LL | fn f<T>(arg: T) where T: PrivTr {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits_where::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:85:5
|
||||
--> $DIR/private-in-public-warn.rs:87:5
|
||||
|
|
||||
LL | impl<T> Pub<T> where T: PrivTr {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -208,7 +208,7 @@ LL | impl<T> Pub<T> where T: PrivTr {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `traits_where::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:88:5
|
||||
--> $DIR/private-in-public-warn.rs:90:5
|
||||
|
|
||||
LL | impl<T> PubTr for Pub<T> where T: PrivTr {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -217,7 +217,7 @@ LL | impl<T> PubTr for Pub<T> where T: PrivTr {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `generics::PrivTr<generics::Pub>` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:99:5
|
||||
--> $DIR/private-in-public-warn.rs:101:5
|
||||
|
|
||||
LL | pub trait Tr1: PrivTr<Pub> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -226,7 +226,7 @@ LL | pub trait Tr1: PrivTr<Pub> {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private type `generics::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-warn.rs:102:5
|
||||
--> $DIR/private-in-public-warn.rs:104:5
|
||||
|
|
||||
LL | pub trait Tr2: PubTr<Priv> {} //~ ERROR private type `generics::Priv` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -235,7 +235,7 @@ LL | pub trait Tr2: PubTr<Priv> {} //~ ERROR private type `generics::Priv` i
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private type `generics::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-warn.rs:104:5
|
||||
--> $DIR/private-in-public-warn.rs:106:5
|
||||
|
|
||||
LL | pub trait Tr3: PubTr<[Priv; 1]> {} //~ ERROR private type `generics::Priv` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -244,7 +244,7 @@ LL | pub trait Tr3: PubTr<[Priv; 1]> {} //~ ERROR private type `generics::Pr
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private type `generics::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-warn.rs:106:5
|
||||
--> $DIR/private-in-public-warn.rs:108:5
|
||||
|
|
||||
LL | pub trait Tr4: PubTr<Pub<Priv>> {} //~ ERROR private type `generics::Priv` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -253,7 +253,7 @@ LL | pub trait Tr4: PubTr<Pub<Priv>> {} //~ ERROR private type `generics::Pr
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error[E0446]: private type `impls::Priv` in public interface
|
||||
--> $DIR/private-in-public-warn.rs:133:9
|
||||
--> $DIR/private-in-public-warn.rs:135:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `impls::Priv` declared as private
|
||||
@ -262,7 +262,7 @@ LL | type Alias = Priv; //~ ERROR private type `impls::Priv` in public i
|
||||
| ^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error: private type `aliases_pub::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-warn.rs:204:9
|
||||
--> $DIR/private-in-public-warn.rs:206:9
|
||||
|
|
||||
LL | pub fn f(arg: Priv) {} //~ ERROR private type `aliases_pub::Priv` in public interface
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -271,7 +271,7 @@ LL | pub fn f(arg: Priv) {} //~ ERROR private type `aliases_pub::Priv` i
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error[E0446]: private type `aliases_pub::Priv` in public interface
|
||||
--> $DIR/private-in-public-warn.rs:208:9
|
||||
--> $DIR/private-in-public-warn.rs:210:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `aliases_pub::Priv` declared as private
|
||||
@ -280,7 +280,7 @@ LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in pu
|
||||
| ^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0446]: private type `aliases_pub::Priv` in public interface
|
||||
--> $DIR/private-in-public-warn.rs:211:9
|
||||
--> $DIR/private-in-public-warn.rs:213:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `aliases_pub::Priv` declared as private
|
||||
@ -289,7 +289,7 @@ LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in pu
|
||||
| ^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0446]: private type `aliases_pub::Priv` in public interface
|
||||
--> $DIR/private-in-public-warn.rs:214:9
|
||||
--> $DIR/private-in-public-warn.rs:216:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `aliases_pub::Priv` declared as private
|
||||
@ -298,7 +298,7 @@ LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in pu
|
||||
| ^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0446]: private type `aliases_pub::Priv` in public interface
|
||||
--> $DIR/private-in-public-warn.rs:217:9
|
||||
--> $DIR/private-in-public-warn.rs:219:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `aliases_pub::Priv` declared as private
|
||||
@ -307,7 +307,7 @@ LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in pu
|
||||
| ^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error: private trait `aliases_priv::PrivTr1` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:247:5
|
||||
--> $DIR/private-in-public-warn.rs:249:5
|
||||
|
|
||||
LL | pub trait Tr1: PrivUseAliasTr {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -316,7 +316,7 @@ LL | pub trait Tr1: PrivUseAliasTr {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private trait `aliases_priv::PrivTr1<aliases_priv::Priv2>` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-warn.rs:250:5
|
||||
--> $DIR/private-in-public-warn.rs:252:5
|
||||
|
|
||||
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -325,7 +325,7 @@ LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error: private type `aliases_priv::Priv2` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-warn.rs:250:5
|
||||
--> $DIR/private-in-public-warn.rs:252:5
|
||||
|
|
||||
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -333,6 +333,23 @@ LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
warning: bounds on generic parameters are not enforced in type aliases
|
||||
--> $DIR/private-in-public-warn.rs:50:23
|
||||
|
|
||||
LL | pub type Alias<T: PrivTr> = T; //~ ERROR private trait `traits::PrivTr` in public interface
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: #[warn(type_alias_bounds)] on by default
|
||||
= help: the bound will not be checked when the type alias is used, and should be removed
|
||||
|
||||
warning: where clauses are not enforced in type aliases
|
||||
--> $DIR/private-in-public-warn.rs:75:29
|
||||
|
|
||||
LL | pub type Alias<T> where T: PrivTr = T;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= help: the clause will not be checked when the type alias is used, and should be removed
|
||||
|
||||
error: aborting due to 36 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0446`.
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(associated_consts)]
|
||||
#![feature(decl_macro)]
|
||||
#![allow(private_in_public)]
|
||||
|
||||
@ -15,6 +14,7 @@ mod m {
|
||||
pub struct PubTupleStruct(u8);
|
||||
impl PubTupleStruct { fn method() {} }
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
struct Priv;
|
||||
pub type Alias = Priv;
|
||||
pub struct Pub<T = Alias>(pub T);
|
||||
|
Loading…
Reference in New Issue
Block a user