diff options
| author | Matthew Jasper <mjjasper1@gmail.com> | 2019-11-23 14:15:49 +0000 |
|---|---|---|
| committer | Matthew Jasper <mjjasper1@gmail.com> | 2019-11-24 18:06:13 +0000 |
| commit | a8efd31f2b97a043d73db2131dddfedd65485d50 (patch) | |
| tree | d5eef5952391f5bf162f3ce4a4470255157843f0 /src/librustc_parse/parser | |
| parent | 9420ff4c0ebea44b167d530bb59f9d5721d8ff0b (diff) | |
| download | rust-a8efd31f2b97a043d73db2131dddfedd65485d50.tar.gz rust-a8efd31f2b97a043d73db2131dddfedd65485d50.zip | |
Add raw address of expressions to the AST and HIR
Diffstat (limited to 'src/librustc_parse/parser')
| -rw-r--r-- | src/librustc_parse/parser/diagnostics.rs | 2 | ||||
| -rw-r--r-- | src/librustc_parse/parser/expr.rs | 25 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/librustc_parse/parser/diagnostics.rs b/src/librustc_parse/parser/diagnostics.rs index eab35a86c69..8a79a733c30 100644 --- a/src/librustc_parse/parser/diagnostics.rs +++ b/src/librustc_parse/parser/diagnostics.rs @@ -726,7 +726,7 @@ impl<'a> Parser<'a> { let sum_with_parens = pprust::to_string(|s| { s.s.word("&"); s.print_opt_lifetime(lifetime); - s.print_mutability(mut_ty.mutbl); + s.print_mutability(mut_ty.mutbl, false); s.popen(); s.print_type(&mut_ty.ty); s.print_type_bounds(" +", &bounds); diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index a56a7bf1802..81442143f53 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -442,11 +442,7 @@ impl<'a> Parser<'a> { (lo.to(span), self.mk_unary(UnOp::Deref, e)) } token::BinOp(token::And) | token::AndAnd => { - self.expect_and()?; - let m = self.parse_mutability(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - (lo.to(span), ExprKind::AddrOf(m, e)) + self.parse_address_of(lo)? } token::Ident(..) if self.token.is_keyword(kw::Box) => { self.bump(); @@ -596,6 +592,25 @@ impl<'a> Parser<'a> { } } + /// Parse `& mut? <expr>` or `& raw [ const | mut ] <expr>` + fn parse_address_of(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { + self.expect_and()?; + let (k, m) = if self.check_keyword(kw::Raw) + && self.look_ahead(1, Token::is_mutability) + { + let found_raw = self.eat_keyword(kw::Raw); + assert!(found_raw); + let mutability = self.parse_const_or_mut().unwrap(); + self.sess.gated_spans.gate(sym::raw_ref_op, lo.to(self.prev_span)); + (ast::BorrowKind::Raw, mutability) + } else { + (ast::BorrowKind::Ref, self.parse_mutability()) + }; + let e = self.parse_prefix_expr(None); + let (span, e) = self.interpolated_or_expr_span(e)?; + Ok((lo.to(span), ExprKind::AddrOf(k, m, e))) + } + /// Parses `a.b` or `a(13)` or `a[4]` or just `a`. fn parse_dot_or_call_expr( &mut self, |
