From 20ee53c2f1570eac8b3221865d83bfa5993f6a70 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Thu, 7 Apr 2016 00:42:29 +0000 Subject: [PATCH 1/3] Improve path resolution diagnostics --- src/librustc_resolve/lib.rs | 133 ++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 66 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 98e40d7313327..e8adb1d94ba4d 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1716,9 +1716,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { match self.resolve_crate_relative_path(prefix.span, &prefix.segments, TypeNS) { - Some(def) => + Ok(def) => self.record_def(item.id, PathResolution::new(def, 0)), - None => { + Err(true) => self.record_def(item.id, err_path_resolution()), + Err(false) => { resolve_error(self, prefix.span, ResolutionError::FailedToResolve( @@ -1837,7 +1838,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { trait_path: &Path, path_depth: usize) -> Result { - if let Some(path_res) = self.resolve_path(id, trait_path, path_depth, TypeNS) { + self.resolve_path(id, trait_path, path_depth, TypeNS).and_then(|path_res| { if let Def::Trait(_) = path_res.base_def { debug!("(resolving trait) found trait def: {:?}", path_res); Ok(path_res) @@ -1857,9 +1858,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { } } err.emit(); - Err(()) + Err(true) } - } else { + }).map_err(|error_reported| { + if error_reported { return } // find possible candidates let trait_name = trait_path.segments.last().unwrap().identifier.name; @@ -1882,8 +1884,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { ); resolve_error(self, trait_path.span, error); - Err(()) - } + }) } fn resolve_generics(&mut self, generics: &Generics) { @@ -1892,15 +1893,17 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { &hir::WherePredicate::BoundPredicate(_) | &hir::WherePredicate::RegionPredicate(_) => {} &hir::WherePredicate::EqPredicate(ref eq_pred) => { - let path_res = self.resolve_path(eq_pred.id, &eq_pred.path, 0, TypeNS); - if let Some(PathResolution { base_def: Def::TyParam(..), .. }) = path_res { - self.record_def(eq_pred.id, path_res.unwrap()); - } else { - resolve_error(self, - eq_pred.span, - ResolutionError::UndeclaredAssociatedType); + self.resolve_path(eq_pred.id, &eq_pred.path, 0, TypeNS).and_then(|path_res| { + if let PathResolution { base_def: Def::TyParam(..), .. } = path_res { + Ok(self.record_def(eq_pred.id, path_res)) + } else { + Err(false) + } + }).map_err(|error_reported| { self.record_def(eq_pred.id, err_path_resolution()); - } + if error_reported { return } + resolve_error(self, eq_pred.span, ResolutionError::UndeclaredAssociatedType); + }).unwrap_or(()); } } } @@ -2170,21 +2173,18 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { // This is a path in the type namespace. Walk through scopes // looking for it. - match resolution { - Some(def) => { - // Write the result into the def map. - debug!("(resolving type) writing resolution for `{}` (id {}) = {:?}", - path_names_to_string(path, 0), - ty.id, - def); - self.record_def(ty.id, def); - } - None => { - self.record_def(ty.id, err_path_resolution()); - - // Keep reporting some errors even if they're ignored above. - self.resolve_path(ty.id, path, 0, TypeNS); + if let Some(def) = resolution { + // Write the result into the def map. + debug!("(resolving type) writing resolution for `{}` (id {}) = {:?}", + path_names_to_string(path, 0), ty.id, def); + self.record_def(ty.id, def); + } else { + self.record_def(ty.id, err_path_resolution()); + // Keep reporting some errors even if they're ignored above. + if let Err(true) = self.resolve_path(ty.id, path, 0, TypeNS) { + // `resolve_path` already reported the error + } else { let kind = if maybe_qself.is_some() { "associated type" } else { @@ -2483,11 +2483,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { PatKind::Struct(ref path, _, _) => { match self.resolve_path(pat_id, path, 0, TypeNS) { - Some(definition) => { + Ok(definition) => { self.record_def(pattern.id, definition); } - result => { - debug!("(resolving pattern) didn't find struct def: {:?}", result); + Err(true) => self.record_def(pattern.id, err_path_resolution()), + Err(false) => { resolve_error( self, path.span, @@ -2554,14 +2554,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { } let mut resolution = self.with_no_errors(|this| { - this.resolve_path(id, path, 0, namespace) + this.resolve_path(id, path, 0, namespace).ok() }); for depth in 1..max_assoc_types { if resolution.is_some() { break; } self.with_no_errors(|this| { - resolution = this.resolve_path(id, path, depth, TypeNS); + resolution = this.resolve_path(id, path, depth, TypeNS).ok(); }); } if let Some(Def::Mod(_)) = resolution.map(|r| r.base_def) { @@ -2574,7 +2574,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { /// Skips `path_depth` trailing segments, which is also reflected in the /// returned value. See `middle::def::PathResolution` for more info. fn resolve_path(&mut self, id: NodeId, path: &Path, path_depth: usize, namespace: Namespace) - -> Option { + -> Result { let span = path.span; let segments = &path.segments[..path.segments.len() - path_depth]; @@ -2613,14 +2613,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { // // Such behavior is required for backward compatibility. // The same fallback is used when `a` resolves to nothing. - let unqualified_def = resolve_identifier_with_fallback(self, true); - return unqualified_def.and_then(|def| self.adjust_local_def(def, span)).map(mk_res); + let def = resolve_identifier_with_fallback(self, true).ok_or(false); + return def.and_then(|def| self.adjust_local_def(def, span).ok_or(true)).map(mk_res); } let unqualified_def = resolve_identifier_with_fallback(self, false); let def = self.resolve_module_relative_path(span, segments, namespace); match (def, unqualified_def) { - (Some(d), Some(ref ud)) if d == ud.def => { + (Ok(d), Some(ref ud)) if d == ud.def => { self.session .add_lint(lint::builtin::UNUSED_QUALIFICATIONS, id, @@ -2741,7 +2741,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { span: Span, segments: &[hir::PathSegment], namespace: Namespace) - -> Option { + -> Result { let module_path = segments.split_last() .unwrap() .1 @@ -2762,9 +2762,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { }; resolve_error(self, span, ResolutionError::FailedToResolve(&msg)); - return None; + return Err(true); } - Indeterminate => return None, + Indeterminate => return Err(false), Success(resulting_module) => { containing_module = resulting_module; } @@ -2775,7 +2775,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { result.success().map(|binding| { self.check_privacy(containing_module, name, binding, span); binding.def().unwrap() - }) + }).ok_or(false) } /// Invariant: This must be called only during main resolution, not during @@ -2784,7 +2784,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { span: Span, segments: &[hir::PathSegment], namespace: Namespace) - -> Option { + -> Result { let module_path = segments.split_last() .unwrap() .1 @@ -2810,10 +2810,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { }; resolve_error(self, span, ResolutionError::FailedToResolve(&msg)); - return None; + return Err(true); } - Indeterminate => return None, + Indeterminate => return Err(false), Success(resulting_module) => { containing_module = resulting_module; @@ -2825,7 +2825,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { result.success().map(|binding| { self.check_privacy(containing_module, name, binding, span); binding.def().unwrap() - }) + }).ok_or(false) } fn with_no_errors(&mut self, f: F) -> T @@ -3040,25 +3040,25 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { }); self.record_def(expr.id, err_path_resolution()); - match type_res.map(|r| r.base_def) { - Some(Def::Struct(..)) => { - let mut err = resolve_struct_error(self, - expr.span, - ResolutionError::StructVariantUsedAsFunction(&path_name)); - - let msg = format!("did you mean to write: `{} {{ /* fields */ }}`?", - path_name); - if self.emit_errors { - err.fileline_help(expr.span, &msg); - } else { - err.span_help(expr.span, &msg); - } - err.emit(); - } - _ => { - // Keep reporting some errors even if they're ignored above. - self.resolve_path(expr.id, path, 0, ValueNS); + if let Ok(Def::Struct(..)) = type_res.map(|r| r.base_def) { + let error_variant = ResolutionError::StructVariantUsedAsFunction(&path_name); + let mut err = resolve_struct_error(self, expr.span, error_variant); + + let msg = format!("did you mean to write: `{} {{ /* fields */ }}`?", + path_name); + + if self.emit_errors { + err.fileline_help(expr.span, &msg); + } else { + err.span_help(expr.span, &msg); + } + err.emit(); + } else { + // Keep reporting some errors even if they're ignored above. + if let Err(true) = self.resolve_path(expr.id, path, 0, ValueNS) { + // `resolve_path` already reported the error + } else { let mut method_scope = false; self.value_ribs.iter().rev().all(|rib| { method_scope = match rib.kind { @@ -3132,8 +3132,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { // check to ensure that the path is actually a structure; that // is checked later during typeck. match self.resolve_path(expr.id, path, 0, TypeNS) { - Some(definition) => self.record_def(expr.id, definition), - None => { + Ok(definition) => self.record_def(expr.id, definition), + Err(true) => self.record_def(expr.id, err_path_resolution()), + Err(false) => { debug!("(resolving expression) didn't find struct def",); resolve_error(self, From 35f5e18f75d07873be768c2afe65d13d3a25f9d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Thu, 7 Apr 2016 03:48:52 +0000 Subject: [PATCH 2/3] Fix fallout in tests --- .../compile-fail-fulldeps/macro-crate-doesnt-resolve.rs | 1 - src/test/compile-fail/bad-module.rs | 2 +- src/test/compile-fail/bad-type-env-capture.rs | 1 - src/test/compile-fail/export-fully-qualified.rs | 2 +- src/test/compile-fail/export2.rs | 2 +- src/test/compile-fail/inner-static-type-parameter.rs | 1 - src/test/compile-fail/issue-12796.rs | 1 - src/test/compile-fail/issue-3021-b.rs | 1 - src/test/compile-fail/issue-3021-c.rs | 2 -- src/test/compile-fail/issue-3021-d.rs | 2 -- src/test/compile-fail/issue-3021.rs | 1 - src/test/compile-fail/issue-3214.rs | 1 - src/test/compile-fail/issue-3521-2.rs | 1 - src/test/compile-fail/issue-3521.rs | 3 +-- src/test/compile-fail/issue-3668-2.rs | 1 - src/test/compile-fail/issue-3668.rs | 1 - src/test/compile-fail/issue-5997-enum.rs | 1 - src/test/compile-fail/issue-5997-struct.rs | 3 +-- src/test/compile-fail/issue-6642.rs | 1 - src/test/compile-fail/macro-inner-attributes.rs | 1 - src/test/compile-fail/no-link.rs | 1 - .../compile-fail/resolve-type-param-in-item-in-trait.rs | 8 ++------ 22 files changed, 7 insertions(+), 31 deletions(-) diff --git a/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs b/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs index 8ac03606720e4..1fbde00a3dfde 100644 --- a/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs +++ b/src/test/compile-fail-fulldeps/macro-crate-doesnt-resolve.rs @@ -16,5 +16,4 @@ extern crate macro_crate_test; fn main() { macro_crate_test::foo(); //~^ ERROR failed to resolve. Use of undeclared type or module `macro_crate_test` - //~^^ ERROR unresolved name `macro_crate_test::foo` } diff --git a/src/test/compile-fail/bad-module.rs b/src/test/compile-fail/bad-module.rs index edc118cb0399b..0cd3a8853185f 100644 --- a/src/test/compile-fail/bad-module.rs +++ b/src/test/compile-fail/bad-module.rs @@ -8,6 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: unresolved name +// error-pattern: failed to resolve. Use of undeclared type or module `thing` fn main() { let foo = thing::len(Vec::new()); } diff --git a/src/test/compile-fail/bad-type-env-capture.rs b/src/test/compile-fail/bad-type-env-capture.rs index a3139905244c6..c1547dd82b3b2 100644 --- a/src/test/compile-fail/bad-type-env-capture.rs +++ b/src/test/compile-fail/bad-type-env-capture.rs @@ -10,6 +10,5 @@ fn foo() { fn bar(b: T) { } //~ ERROR can't use type parameters from outer - //~^ ERROR type name `T` is undefined or not in scope } fn main() { } diff --git a/src/test/compile-fail/export-fully-qualified.rs b/src/test/compile-fail/export-fully-qualified.rs index 2ba2ef1c05a04..166ef7ab87fcd 100644 --- a/src/test/compile-fail/export-fully-qualified.rs +++ b/src/test/compile-fail/export-fully-qualified.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: unresolved name +// error-pattern: failed to resolve. Use of undeclared type or module `foo` // In this test baz isn't resolved when called as foo.baz even though // it's called from inside foo. This is somewhat surprising and may diff --git a/src/test/compile-fail/export2.rs b/src/test/compile-fail/export2.rs index 6104c02c90a03..f7b1400aa45ac 100644 --- a/src/test/compile-fail/export2.rs +++ b/src/test/compile-fail/export2.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: unresolved name +// error-pattern: failed to resolve. Use of undeclared type or module `bar` mod foo { pub fn x() { bar::x(); } diff --git a/src/test/compile-fail/inner-static-type-parameter.rs b/src/test/compile-fail/inner-static-type-parameter.rs index 6fcda66486b78..a6a3319845836 100644 --- a/src/test/compile-fail/inner-static-type-parameter.rs +++ b/src/test/compile-fail/inner-static-type-parameter.rs @@ -15,7 +15,6 @@ enum Bar { What } //~ ERROR parameter `T` is never used fn foo() { static a: Bar = Bar::What; //~^ ERROR cannot use an outer type parameter in this context - //~| ERROR type name `T` is undefined or not in scope } fn main() { diff --git a/src/test/compile-fail/issue-12796.rs b/src/test/compile-fail/issue-12796.rs index 33fbdce4ee25a..0c3c82a99f28f 100644 --- a/src/test/compile-fail/issue-12796.rs +++ b/src/test/compile-fail/issue-12796.rs @@ -12,7 +12,6 @@ trait Trait { fn outer(&self) { fn inner(_: &Self) { //~^ ERROR can't use type parameters from outer function - //~^^ ERROR use of `Self` outside of an impl or trait } } } diff --git a/src/test/compile-fail/issue-3021-b.rs b/src/test/compile-fail/issue-3021-b.rs index 5c539cd739cef..2b0a24cfdb35f 100644 --- a/src/test/compile-fail/issue-3021-b.rs +++ b/src/test/compile-fail/issue-3021-b.rs @@ -17,7 +17,6 @@ fn siphash(k0 : u64) { impl siphash { pub fn reset(&mut self) { self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR can't capture dynamic environment - //~^ ERROR unresolved name `k0` } } } diff --git a/src/test/compile-fail/issue-3021-c.rs b/src/test/compile-fail/issue-3021-c.rs index 03473bd44cc1b..635006a3b4dad 100644 --- a/src/test/compile-fail/issue-3021-c.rs +++ b/src/test/compile-fail/issue-3021-c.rs @@ -13,8 +13,6 @@ fn siphash() { trait t { fn g(&self, x: T) -> T; //~ ERROR can't use type parameters from outer function; try using //~^ ERROR can't use type parameters from outer function; try using - //~^^ ERROR type name `T` is undefined or not in scope - //~^^^ ERROR type name `T` is undefined or not in scope } } diff --git a/src/test/compile-fail/issue-3021-d.rs b/src/test/compile-fail/issue-3021-d.rs index ecc8ac34ecf2b..c23e12e713aad 100644 --- a/src/test/compile-fail/issue-3021-d.rs +++ b/src/test/compile-fail/issue-3021-d.rs @@ -29,9 +29,7 @@ fn siphash(k0 : u64, k1 : u64) { impl siphash for SipState { fn reset(&self) { self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR can't capture dynamic environment - //~^ ERROR unresolved name `k0` self.v1 = k1 ^ 0x646f72616e646f6d; //~ ERROR can't capture dynamic environment - //~^ ERROR unresolved name `k1` } fn result(&self) -> u64 { return mk_result(self); } } diff --git a/src/test/compile-fail/issue-3021.rs b/src/test/compile-fail/issue-3021.rs index 7cf772b072879..f93a333d2aea7 100644 --- a/src/test/compile-fail/issue-3021.rs +++ b/src/test/compile-fail/issue-3021.rs @@ -20,7 +20,6 @@ fn siphash(k0 : u64) { impl SipHash for SipState { fn reset(&self) { self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR can't capture dynamic environment - //~^ ERROR unresolved name `k0` } } panic!(); diff --git a/src/test/compile-fail/issue-3214.rs b/src/test/compile-fail/issue-3214.rs index 4f955df82051f..d3b932fbc53ef 100644 --- a/src/test/compile-fail/issue-3214.rs +++ b/src/test/compile-fail/issue-3214.rs @@ -11,7 +11,6 @@ fn foo() { struct foo { x: T, //~ ERROR can't use type parameters from outer function; - //~^ ERROR type name `T` is undefined or not in scope } impl Drop for foo { diff --git a/src/test/compile-fail/issue-3521-2.rs b/src/test/compile-fail/issue-3521-2.rs index ad5bc4e445c98..6cd2c02c417ea 100644 --- a/src/test/compile-fail/issue-3521-2.rs +++ b/src/test/compile-fail/issue-3521-2.rs @@ -13,7 +13,6 @@ fn main() { static y: isize = foo + 1; //~^ ERROR attempt to use a non-constant value in a constant - //~| ERROR unresolved name `foo` println!("{}", y); } diff --git a/src/test/compile-fail/issue-3521.rs b/src/test/compile-fail/issue-3521.rs index 34cd8cae2de32..52375ef281ace 100644 --- a/src/test/compile-fail/issue-3521.rs +++ b/src/test/compile-fail/issue-3521.rs @@ -15,8 +15,7 @@ fn main() { enum Stuff { Bar = foo //~^ ERROR attempt to use a non-constant value in a constant - //~| ERROR unresolved name `foo` - //~^^^ ERROR constant evaluation error: non-constant path in constant expression + //~^^ ERROR constant evaluation error: non-constant path in constant expression } println!("{}", Stuff::Bar); diff --git a/src/test/compile-fail/issue-3668-2.rs b/src/test/compile-fail/issue-3668-2.rs index a09c8090de06d..16fb2f68133f2 100644 --- a/src/test/compile-fail/issue-3668-2.rs +++ b/src/test/compile-fail/issue-3668-2.rs @@ -11,7 +11,6 @@ fn f(x:isize) { static child: isize = x + 1; //~^ ERROR attempt to use a non-constant value in a constant - //~| ERROR unresolved name `x` } fn main() {} diff --git a/src/test/compile-fail/issue-3668.rs b/src/test/compile-fail/issue-3668.rs index 9b7476244f0d2..9c31dc1e38ef8 100644 --- a/src/test/compile-fail/issue-3668.rs +++ b/src/test/compile-fail/issue-3668.rs @@ -17,7 +17,6 @@ impl PTrait for P { fn getChildOption(&self) -> Option> { static childVal: Box

= self.child.get(); //~^ ERROR attempt to use a non-constant value in a constant - //~| ERROR unresolved name `self` panic!(); } } diff --git a/src/test/compile-fail/issue-5997-enum.rs b/src/test/compile-fail/issue-5997-enum.rs index 20d239c6ae046..463fdaa106926 100644 --- a/src/test/compile-fail/issue-5997-enum.rs +++ b/src/test/compile-fail/issue-5997-enum.rs @@ -11,7 +11,6 @@ fn f() -> bool { enum E { V(Z) } //~^ ERROR can't use type parameters from outer function - //~^^ ERROR type name `Z` is undefined or not in scope true } diff --git a/src/test/compile-fail/issue-5997-struct.rs b/src/test/compile-fail/issue-5997-struct.rs index 40be2f04cb43c..e9cfafc98df0e 100644 --- a/src/test/compile-fail/issue-5997-struct.rs +++ b/src/test/compile-fail/issue-5997-struct.rs @@ -9,8 +9,7 @@ // except according to those terms. fn f() -> bool { - struct S(T); //~ ERROR type name `T` is undefined or not in scope - //~^ ERROR can't use type parameters from outer function; try using + struct S(T); //~ ERROR can't use type parameters from outer function; try using true } diff --git a/src/test/compile-fail/issue-6642.rs b/src/test/compile-fail/issue-6642.rs index 2c1809d4d4886..1fe10ba7a27bb 100644 --- a/src/test/compile-fail/issue-6642.rs +++ b/src/test/compile-fail/issue-6642.rs @@ -13,7 +13,6 @@ impl A { fn m(&self) { fn x() { self.m() //~ ERROR can't capture dynamic environment in a fn item - //~^ ERROR unresolved name `self` } } } diff --git a/src/test/compile-fail/macro-inner-attributes.rs b/src/test/compile-fail/macro-inner-attributes.rs index abf0ed420e7a2..1111b21d4550c 100644 --- a/src/test/compile-fail/macro-inner-attributes.rs +++ b/src/test/compile-fail/macro-inner-attributes.rs @@ -26,6 +26,5 @@ test!(b, fn main() { a::bar(); //~^ ERROR failed to resolve. Use of undeclared type or module `a` - //~^^ ERROR unresolved name `a::bar` b::bar(); } diff --git a/src/test/compile-fail/no-link.rs b/src/test/compile-fail/no-link.rs index a9c2b6a942c65..957b6cda55311 100644 --- a/src/test/compile-fail/no-link.rs +++ b/src/test/compile-fail/no-link.rs @@ -14,6 +14,5 @@ extern crate libc; fn main() { unsafe { libc::abs(0); //~ ERROR Use of undeclared type or module `libc` - //~^ ERROR unresolved name `libc::abs` } } diff --git a/src/test/compile-fail/resolve-type-param-in-item-in-trait.rs b/src/test/compile-fail/resolve-type-param-in-item-in-trait.rs index 92134ecde91aa..30ff1ed0e26f7 100644 --- a/src/test/compile-fail/resolve-type-param-in-item-in-trait.rs +++ b/src/test/compile-fail/resolve-type-param-in-item-in-trait.rs @@ -18,7 +18,6 @@ trait TraitA { //~^ ERROR parameter `B` is never used Variance(A) //~^ ERROR can't use type parameters from outer function - //~^^ ERROR type name `A` is undefined or not in scope } } } @@ -27,8 +26,7 @@ trait TraitB { fn outer(self) { struct Foo(A); //~^ ERROR can't use type parameters from outer function - //~^^ ERROR type name `A` is undefined or not in scope - //~^^^ ERROR parameter `B` is never used + //~^^ ERROR parameter `B` is never used } } @@ -36,8 +34,7 @@ trait TraitC { fn outer(self) { struct Foo { a: A } //~^ ERROR can't use type parameters from outer function - //~^^ ERROR type name `A` is undefined or not in scope - //~^^^ ERROR parameter `B` is never used + //~^^ ERROR parameter `B` is never used } } @@ -45,7 +42,6 @@ trait TraitD { fn outer(self) { fn foo(a: A) { } //~^ ERROR can't use type parameters from outer function - //~^^ ERROR type name `A` is undefined or not in scope } } From 07dac9732d65dcb1f5aefc8be46ba366fb657d08 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Thu, 7 Apr 2016 04:13:34 +0000 Subject: [PATCH 3/3] Fix tidy errors --- src/librustc_resolve/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index e8adb1d94ba4d..3f18aa3565402 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1902,7 +1902,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { }).map_err(|error_reported| { self.record_def(eq_pred.id, err_path_resolution()); if error_reported { return } - resolve_error(self, eq_pred.span, ResolutionError::UndeclaredAssociatedType); + let error_variant = ResolutionError::UndeclaredAssociatedType; + resolve_error(self, eq_pred.span, error_variant); }).unwrap_or(()); } } @@ -3042,7 +3043,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { self.record_def(expr.id, err_path_resolution()); if let Ok(Def::Struct(..)) = type_res.map(|r| r.base_def) { - let error_variant = ResolutionError::StructVariantUsedAsFunction(&path_name); + let error_variant = + ResolutionError::StructVariantUsedAsFunction(&path_name); let mut err = resolve_struct_error(self, expr.span, error_variant); let msg = format!("did you mean to write: `{} {{ /* fields */ }}`?",