summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2016-05-20 15:49:52 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2016-05-20 15:49:52 +0200
commit5dc8dfa86ff0862c8fa93f794f12c03007023b2e (patch)
tree859c5a861794252bc9ba80d6227851fbcd6976b5 /src
parentf22c5aab1e740cf38e0bc04895e2a08597e3b025 (diff)
parentedf1773fb7b56b39e68411d87c86f870697b997b (diff)
downloadrust-5dc8dfa86ff0862c8fa93f794f12c03007023b2e.tar.gz
rust-5dc8dfa86ff0862c8fa93f794f12c03007023b2e.zip
Rollup merge of #33683 - sanxiyn:paren-span, r=nikomatsakis
Preserve span when lowering ExprKind::Paren

Fix #33681.
Diffstat (limited to 'src')
-rw-r--r--src/libcore/macros.rs2
-rw-r--r--src/librustc/hir/lowering.rs6
-rw-r--r--src/test/compile-fail/issue-2392.rs6
-rw-r--r--src/test/compile-fail/paren-span.rs31
4 files changed, 40 insertions, 5 deletions
diff --git a/src/libcore/macros.rs b/src/libcore/macros.rs
index ad90b447508..a40608b0762 100644
--- a/src/libcore/macros.rs
+++ b/src/libcore/macros.rs
@@ -86,7 +86,7 @@ macro_rules! assert {
 #[stable(feature = "rust1", since = "1.0.0")]
 macro_rules! assert_eq {
     ($left:expr , $right:expr) => ({
-        match (&($left), &($right)) {
+        match (&$left, &$right) {
             (left_val, right_val) => {
                 if !(*left_val == *right_val) {
                     panic!("assertion failed: `(left == right)` \
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index ba655b35eda..28506fd20fe 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -1286,8 +1286,12 @@ impl<'a> LoweringContext<'a> {
                                     maybe_expr.as_ref().map(|x| self.lower_expr(x)))
                 }
                 ExprKind::Paren(ref ex) => {
-                    // merge attributes into the inner expression.
                     return self.lower_expr(ex).map(|mut ex| {
+                        // include parens in span, but only if it is a super-span.
+                        if e.span.contains(ex.span) {
+                            ex.span = e.span;
+                        }
+                        // merge attributes into the inner expression.
                         ex.attrs.update(|attrs| {
                             attrs.prepend(e.attrs.clone())
                         });
diff --git a/src/test/compile-fail/issue-2392.rs b/src/test/compile-fail/issue-2392.rs
index 47d50eb9d53..790b774bd21 100644
--- a/src/test/compile-fail/issue-2392.rs
+++ b/src/test/compile-fail/issue-2392.rs
@@ -81,11 +81,11 @@ impl FuncContainerOuter {
     fn run(&self) {
         unsafe {
             (*self.container).f1(1); //~ ERROR no method named `f1` found
-            //~^ NOTE use `(*self.container.f1)(...)`
+            //~^ NOTE use `((*self.container).f1)(...)`
             (*self.container).f2(1); //~ ERROR no method named `f2` found
-            //~^ NOTE use `(*self.container.f2)(...)`
+            //~^ NOTE use `((*self.container).f2)(...)`
             (*self.container).f3(1); //~ ERROR no method named `f3` found
-            //~^ NOTE use `(*self.container.f3)(...)`
+            //~^ NOTE use `((*self.container).f3)(...)`
         }
     }
 }
diff --git a/src/test/compile-fail/paren-span.rs b/src/test/compile-fail/paren-span.rs
new file mode 100644
index 00000000000..8ed5050f3de
--- /dev/null
+++ b/src/test/compile-fail/paren-span.rs
@@ -0,0 +1,31 @@
+// 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.
+
+// Be smart about span of parenthesized expression in macro.
+
+macro_rules! paren {
+    ($e:expr) => (($e))
+    //            ^^^^ do not highlight here
+}
+
+mod m {
+    pub struct S {
+        x: i32
+    }
+    pub fn make() -> S {
+        S { x: 0 }
+    }
+}
+
+fn main() {
+    let s = m::make();
+    paren!(s.x); //~ ERROR field `x` of struct `m::S` is private
+    //     ^^^ highlight here
+}