Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ICEs when Self is used in type aliases #62417

Merged
merged 4 commits into from
Jul 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/bootstrap/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,11 +197,11 @@ pub struct Compiler {

#[derive(PartialEq, Eq, Copy, Clone, Debug)]
pub enum DocTests {
// Default, run normal tests and doc tests.
/// Run normal tests and doc tests (default).
Yes,
// Do not run any doc tests.
/// Do not run any doc tests.
No,
// Only run doc tests.
/// Only run doc tests.
Only,
}

Expand All @@ -221,10 +221,10 @@ pub enum GitRepo {
/// methods specifically on this structure itself (to make it easier to
/// organize).
pub struct Build {
// User-specified configuration via config.toml
/// User-specified configuration from `config.toml`.
config: Config,

// Derived properties from the above two configurations
// Properties derived from the above configuration
src: PathBuf,
out: PathBuf,
rust_info: channel::GitInfo,
Expand All @@ -240,12 +240,12 @@ pub struct Build {
doc_tests: DocTests,
verbosity: usize,

// Targets for which to build.
// Targets for which to build
build: Interned<String>,
hosts: Vec<Interned<String>>,
targets: Vec<Interned<String>>,

// Stage 0 (downloaded) compiler and cargo or their local rust equivalents.
// Stage 0 (downloaded) compiler and cargo or their local rust equivalents
initial_rustc: PathBuf,
initial_cargo: PathBuf,

Expand All @@ -255,7 +255,7 @@ pub struct Build {
cxx: HashMap<Interned<String>, cc::Tool>,
ar: HashMap<Interned<String>, PathBuf>,
ranlib: HashMap<Interned<String>, PathBuf>,
// Misc
// Miscellaneous
crates: HashMap<Interned<String>, Crate>,
is_sudo: bool,
ci_env: CiEnv,
Expand Down
12 changes: 1 addition & 11 deletions src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2518,17 +2518,7 @@ impl<'a> Resolver<'a> {
debug!("(resolving item) resolving {} ({:?})", name, item.node);

match item.node {
ItemKind::Ty(_, ref generics) => {
self.with_current_self_item(item, |this| {
this.with_generic_param_rib(HasGenericParams(generics, ItemRibKind), |this| {
let item_def_id = this.definitions.local_def_id(item.id);
this.with_self_rib(Res::SelfTy(Some(item_def_id), None), |this| {
visit::walk_item(this, item)
})
})
});
}

ItemKind::Ty(_, ref generics) |
ItemKind::Existential(_, ref generics) |
ItemKind::Fn(_, _, ref generics, _) => {
self.with_generic_param_rib(
Expand Down
4 changes: 2 additions & 2 deletions src/librustc_typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4458,7 +4458,7 @@ pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, t
return;
}

// Make a vector of booleans initially false, set to true when used.
// Make a vector of booleans initially `false`; set to `true` when used.
let mut types_used = vec![false; own_counts.types];

for leaf_ty in ty.walk() {
Expand All @@ -4467,7 +4467,7 @@ pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, t
types_used[index as usize - own_counts.lifetimes] = true;
} else if let ty::Error = leaf_ty.sty {
// If there is already another error, do not emit
// an error for not using a type Parameter.
// an error for not using a type parameter.
assert!(tcx.sess.has_errors());
return;
}
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions src/test/ui/cast_char.stderr → src/test/ui/cast-char.stderr
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
error: only `u8` can be cast into `char`
--> $DIR/cast_char.rs:4:23
--> $DIR/cast-char.rs:4:23
|
LL | const XYZ: char = 0x1F888 as char;
| ^^^^^^^^^^^^^^^ help: use a `char` literal instead: `'\u{1F888}'`
|
note: lint level defined here
--> $DIR/cast_char.rs:1:9
--> $DIR/cast-char.rs:1:9
|
LL | #![deny(overflowing_literals)]
| ^^^^^^^^^^^^^^^^^^^^

error: only `u8` can be cast into `char`
--> $DIR/cast_char.rs:6:22
--> $DIR/cast-char.rs:6:22
|
LL | const XY: char = 129160 as char;
| ^^^^^^^^^^^^^^ help: use a `char` literal instead: `'\u{1F888}'`
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/type-alias/issue-62263-self-in-atb.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
pub trait Trait {
type A;
}

pub type Alias = dyn Trait<A = Self::A>;
//~^ ERROR failed to resolve: use of undeclared type or module `Self` [E0433]

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/type-alias/issue-62263-self-in-atb.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0433]: failed to resolve: use of undeclared type or module `Self`
--> $DIR/issue-62263-self-in-atb.rs:5:32
|
LL | pub type Alias = dyn Trait<A = Self::A>;
| ^^^^ use of undeclared type or module `Self`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0433`.
4 changes: 4 additions & 0 deletions src/test/ui/type-alias/issue-62305-self-assoc-ty.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type Alias = Self::Target;
//~^ ERROR failed to resolve: use of undeclared type or module `Self` [E0433]

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0433]: failed to resolve: use of undeclared type or module `Self`
--> $DIR/issue-62305-self-assoc-ty.rs:1:14
|
LL | type Alias = Self::Target;
| ^^^^ use of undeclared type or module `Self`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0433`.
8 changes: 8 additions & 0 deletions src/test/ui/type-alias/issue-62364-self-ty-arg.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
struct Struct<P1> {
field: P1,
}

type Alias<'a> = Struct<&'a Self>;
//~^ ERROR cannot find type `Self` in this scope [E0411]

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/type-alias/issue-62364-self-ty-arg.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0411]: cannot find type `Self` in this scope
--> $DIR/issue-62364-self-ty-arg.rs:5:29
|
LL | type Alias<'a> = Struct<&'a Self>;
| ^^^^ `Self` is only available in impls, traits, and type definitions

error: aborting due to previous error

For more information about this error, try `rustc --explain E0411`.