diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2020-02-23 06:53:59 +0100 |
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2020-02-24 00:59:38 +0100 |
| commit | 842027f35bd0c957fff862ef864f4fc57988ed7e (patch) | |
| tree | 1650471dca50d27868910854763e4abeeb506553 /src | |
| parent | b01c1e2092b0d3c4e86aedf1e0875898fbde21e3 (diff) | |
| download | rust-842027f35bd0c957fff862ef864f4fc57988ed7e.tar.gz rust-842027f35bd0c957fff862ef864f4fc57988ed7e.zip | |
parse: `NtItem` -> `parse_item_common`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_parse/parser/item.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/parser/issue-48137-macros-cannot-interpolate-impl-items.rs | 34 |
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(); +} |
