about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2020-02-23 06:53:59 +0100
committerMazdak Farrokhzad <twingoow@gmail.com>2020-02-24 00:59:38 +0100
commit842027f35bd0c957fff862ef864f4fc57988ed7e (patch)
tree1650471dca50d27868910854763e4abeeb506553 /src
parentb01c1e2092b0d3c4e86aedf1e0875898fbde21e3 (diff)
downloadrust-842027f35bd0c957fff862ef864f4fc57988ed7e.tar.gz
rust-842027f35bd0c957fff862ef864f4fc57988ed7e.zip
parse: `NtItem` -> `parse_item_common`.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_parse/parser/item.rs17
-rw-r--r--src/test/ui/parser/issue-48137-macros-cannot-interpolate-impl-items.rs34
2 files changed, 43 insertions, 8 deletions
diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs
index 0e0017d4ee5..6fa9e615b45 100644
--- a/src/librustc_parse/parser/item.rs
+++ b/src/librustc_parse/parser/item.rs
@@ -31,16 +31,10 @@ impl<'a> Parser<'a> {
 
     pub(super) fn parse_item_(
         &mut self,
-        mut attrs: Vec<Attribute>,
+        attrs: Vec<Attribute>,
         macros_allowed: bool,
         attributes_allowed: bool,
     ) -> PResult<'a, Option<P<Item>>> {
-        maybe_whole!(self, NtItem, |item| {
-            let mut item = item;
-            mem::swap(&mut item.attrs, &mut attrs);
-            item.attrs.extend(attrs);
-            Some(item)
-        });
         let item = self.parse_item_common(attrs, macros_allowed, attributes_allowed, |_| true)?;
         if let Some(ref item) = item {
             self.error_on_illegal_default(item.defaultness);
@@ -50,11 +44,18 @@ impl<'a> Parser<'a> {
 
     fn parse_item_common(
         &mut self,
-        attrs: Vec<Attribute>,
+        mut attrs: Vec<Attribute>,
         mac_allowed: bool,
         attrs_allowed: bool,
         req_name: ReqName,
     ) -> PResult<'a, Option<Item>> {
+        maybe_whole!(self, NtItem, |item| {
+            let mut item = item;
+            mem::swap(&mut item.attrs, &mut attrs);
+            item.attrs.extend(attrs);
+            Some(item.into_inner())
+        });
+
         let mut unclosed_delims = vec![];
         let (mut item, tokens) = self.collect_tokens(|this| {
             let item = this.parse_item_common_(attrs, mac_allowed, attrs_allowed, req_name);
diff --git a/src/test/ui/parser/issue-48137-macros-cannot-interpolate-impl-items.rs b/src/test/ui/parser/issue-48137-macros-cannot-interpolate-impl-items.rs
new file mode 100644
index 00000000000..8592f8a7287
--- /dev/null
+++ b/src/test/ui/parser/issue-48137-macros-cannot-interpolate-impl-items.rs
@@ -0,0 +1,34 @@
+// check-pass
+
+fn main() {}
+
+macro_rules! mac_impl {
+    ($i:item) => {
+        struct S;
+        impl S { $i }
+    }
+}
+
+mac_impl! {
+    fn foo() {}
+}
+
+macro_rules! mac_trait {
+    ($i:item) => {
+        trait T { $i }
+    }
+}
+
+mac_trait! {
+    fn foo() {}
+}
+
+macro_rules! mac_extern {
+    ($i:item) => {
+        extern "C" { $i }
+    }
+}
+
+mac_extern! {
+    fn foo();
+}