-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #31641 - petrochenkov:reach, r=alexcrichton
Fixes #16734 and probably some other issues This is a continuation of #29822, but the algorithm is mostly a copy of #29973, so r? @alexcrichton or @nikomatsakis
- Loading branch information
Showing
4 changed files
with
316 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// Copyright 2016 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. | ||
|
||
use inner_private_module::*; | ||
|
||
mod inner_private_module { | ||
pub struct Unnameable1; | ||
pub struct Unnameable2; | ||
#[derive(Clone, Copy)] | ||
pub struct Unnameable3; | ||
pub struct Unnameable4; | ||
pub struct Unnameable5; | ||
pub struct Unnameable6; | ||
pub struct Unnameable7; | ||
#[derive(Default)] | ||
pub struct Unnameable8; | ||
pub enum UnnameableEnum { | ||
NameableVariant | ||
} | ||
pub trait UnnameableTrait { | ||
type Alias: Default; | ||
} | ||
|
||
impl Unnameable1 { | ||
pub fn method_of_unnameable_type1(&self) -> &'static str { | ||
"Hello1" | ||
} | ||
} | ||
impl Unnameable2 { | ||
pub fn method_of_unnameable_type2(&self) -> &'static str { | ||
"Hello2" | ||
} | ||
} | ||
impl Unnameable3 { | ||
pub fn method_of_unnameable_type3(&self) -> &'static str { | ||
"Hello3" | ||
} | ||
} | ||
impl Unnameable4 { | ||
pub fn method_of_unnameable_type4(&self) -> &'static str { | ||
"Hello4" | ||
} | ||
} | ||
impl Unnameable5 { | ||
pub fn method_of_unnameable_type5(&self) -> &'static str { | ||
"Hello5" | ||
} | ||
} | ||
impl Unnameable6 { | ||
pub fn method_of_unnameable_type6(&self) -> &'static str { | ||
"Hello6" | ||
} | ||
} | ||
impl Unnameable7 { | ||
pub fn method_of_unnameable_type7(&self) -> &'static str { | ||
"Hello7" | ||
} | ||
} | ||
impl Unnameable8 { | ||
pub fn method_of_unnameable_type8(&self) -> &'static str { | ||
"Hello8" | ||
} | ||
} | ||
impl UnnameableEnum { | ||
pub fn method_of_unnameable_enum(&self) -> &'static str { | ||
"HelloEnum" | ||
} | ||
} | ||
} | ||
|
||
pub fn function_returning_unnameable_type() -> Unnameable1 { | ||
Unnameable1 | ||
} | ||
|
||
pub const CONSTANT_OF_UNNAMEABLE_TYPE: Unnameable2 = | ||
Unnameable2; | ||
|
||
pub fn function_accepting_unnameable_type(_: Option<Unnameable3>) {} | ||
|
||
pub type AliasOfUnnameableType = Unnameable4; | ||
|
||
impl Unnameable1 { | ||
pub fn inherent_method_returning_unnameable_type(&self) -> Unnameable5 { | ||
Unnameable5 | ||
} | ||
} | ||
|
||
pub trait Tr { | ||
fn trait_method_returning_unnameable_type(&self) -> Unnameable6 { | ||
Unnameable6 | ||
} | ||
} | ||
impl Tr for Unnameable1 {} | ||
|
||
pub use inner_private_module::UnnameableEnum::NameableVariant; | ||
|
||
pub struct Struct { | ||
pub field_of_unnameable_type: Unnameable7 | ||
} | ||
|
||
pub static STATIC: Struct = Struct { field_of_unnameable_type: Unnameable7 } ; | ||
|
||
impl UnnameableTrait for AliasOfUnnameableType { | ||
type Alias = Unnameable8; | ||
} | ||
|
||
pub fn generic_function<T: UnnameableTrait>() -> T::Alias { | ||
Default::default() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
// Copyright 2016 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:reachable-unnameable-items.rs | ||
|
||
#![feature(braced_empty_structs)] | ||
#![feature(recover)] | ||
|
||
extern crate reachable_unnameable_items; | ||
use reachable_unnameable_items::*; | ||
|
||
fn main() { | ||
let res1 = function_returning_unnameable_type().method_of_unnameable_type1(); | ||
let res2 = CONSTANT_OF_UNNAMEABLE_TYPE.method_of_unnameable_type2(); | ||
let res4 = AliasOfUnnameableType{}.method_of_unnameable_type4(); | ||
let res5 = function_returning_unnameable_type().inherent_method_returning_unnameable_type(). | ||
method_of_unnameable_type5(); | ||
let res6 = function_returning_unnameable_type().trait_method_returning_unnameable_type(). | ||
method_of_unnameable_type6(); | ||
let res7 = STATIC.field_of_unnameable_type.method_of_unnameable_type7(); | ||
let res8 = generic_function::<AliasOfUnnameableType>().method_of_unnameable_type8(); | ||
let res_enum = NameableVariant.method_of_unnameable_enum(); | ||
assert_eq!(res1, "Hello1"); | ||
assert_eq!(res2, "Hello2"); | ||
assert_eq!(res4, "Hello4"); | ||
assert_eq!(res5, "Hello5"); | ||
assert_eq!(res6, "Hello6"); | ||
assert_eq!(res7, "Hello7"); | ||
assert_eq!(res8, "Hello8"); | ||
assert_eq!(res_enum, "HelloEnum"); | ||
|
||
let none = None; | ||
function_accepting_unnameable_type(none); | ||
let _guard = std::panic::recover(|| none.unwrap().method_of_unnameable_type3()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// Copyright 2016 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(staged_api)] | ||
#![stable(feature = "a", since = "b")] | ||
|
||
mod inner_private_module { | ||
// UnnameableTypeAlias isn't marked as reachable, so no stability annotation is required here | ||
pub type UnnameableTypeAlias = u8; | ||
} | ||
|
||
#[stable(feature = "a", since = "b")] | ||
pub fn f() -> inner_private_module::UnnameableTypeAlias { | ||
0 | ||
} | ||
|
||
fn main() {} |