From 7ca560d6abc0217943db436bb4b738bf6977cf93 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Thu, 14 May 2015 17:44:08 +1200 Subject: [PATCH] save-analysis: fix a bracket counting bug --- src/librustc_trans/save/mod.rs | 8 ++++---- src/librustc_trans/save/span_utils.rs | 17 +++++++---------- src/test/run-make/save-analysis/foo.rs | 12 ++++++++++++ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/librustc_trans/save/mod.rs b/src/librustc_trans/save/mod.rs index 7e503c6819ba1..1b9976be72f42 100644 --- a/src/librustc_trans/save/mod.rs +++ b/src/librustc_trans/save/mod.rs @@ -111,12 +111,12 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> { let qualname = format!("::{}", self.analysis.ty_cx.map.path_to_string(item.id)); // If the variable is immutable, save the initialising expression. - let value = match mt { - ast::MutMutable => String::from_str(""), - ast::MutImmutable => self.span_utils.snippet(expr.span), + let (value, keyword) = match mt { + ast::MutMutable => (String::from_str(""), keywords::Mut), + ast::MutImmutable => (self.span_utils.snippet(expr.span), keywords::Static), }; - let sub_span = self.span_utils.sub_span_after_keyword(item.span, keywords::Static); + let sub_span = self.span_utils.sub_span_after_keyword(item.span, keyword); Data::VariableData(VariableData { id: item.id, diff --git a/src/librustc_trans/save/span_utils.rs b/src/librustc_trans/save/span_utils.rs index 504663571f533..ba027e4c2d192 100644 --- a/src/librustc_trans/save/span_utils.rs +++ b/src/librustc_trans/save/span_utils.rs @@ -237,7 +237,7 @@ impl<'a> SpanUtils<'a> { let mut toks = self.retokenise_span(span); // We keep track of how many brackets we're nested in - let mut bracket_count = 0; + let mut bracket_count: isize = 0; let mut found_ufcs_sep = false; loop { let ts = toks.real_token(); @@ -255,19 +255,16 @@ impl<'a> SpanUtils<'a> { } bracket_count += match ts.tok { token::Lt => 1, - token::Gt => { - // Ignore the `>::` in `::AssocTy`. - if !found_ufcs_sep && bracket_count == 0 { - found_ufcs_sep = true; - 0 - } else { - -1 - } - } + token::Gt => -1, token::BinOp(token::Shl) => 2, token::BinOp(token::Shr) => -2, _ => 0 }; + // Ignore the `>::` in `::AssocTy`. + if !found_ufcs_sep && bracket_count == -1 { + found_ufcs_sep = true; + bracket_count += 1 + } if ts.tok.is_ident() && bracket_count == nesting { result.push(self.make_sub_span(span, Some(ts.sp)).unwrap()); } diff --git a/src/test/run-make/save-analysis/foo.rs b/src/test/run-make/save-analysis/foo.rs index baf6999b10a69..07b99dff4e0fa 100644 --- a/src/test/run-make/save-analysis/foo.rs +++ b/src/test/run-make/save-analysis/foo.rs @@ -352,3 +352,15 @@ impl Iterator for nofields { panic!() } } + +trait Pattern<'a> { + type Searcher; +} + +struct CharEqPattern; + +impl<'a> Pattern<'a> for CharEqPattern { + type Searcher = CharEqPattern; +} + +struct CharSearcher<'a>(>::Searcher);