diff options
| author | David Tolnay <dtolnay@gmail.com> | 2021-11-22 20:16:28 -0800 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2021-11-25 15:05:07 -0800 |
| commit | 87a7defa8e08c971a30b152509c6c1ab9f718092 (patch) | |
| tree | c3cfee726de210a8dd3003d8cbce105a1aa603bb /compiler/rustc_parse/src/parser | |
| parent | 0cbb00f89875c085181f1d55bbe46d39ec36be3f (diff) | |
| download | rust-87a7defa8e08c971a30b152509c6c1ab9f718092.tar.gz rust-87a7defa8e08c971a30b152509c6c1ab9f718092.zip | |
Reject generic arguments on mod style interpolated path
Diffstat (limited to 'compiler/rustc_parse/src/parser')
| -rw-r--r-- | compiler/rustc_parse/src/parser/path.rs | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/compiler/rustc_parse/src/parser/path.rs b/compiler/rustc_parse/src/parser/path.rs index 04ede1f7e3b..e140b23f5d6 100644 --- a/compiler/rustc_parse/src/parser/path.rs +++ b/compiler/rustc_parse/src/parser/path.rs @@ -139,19 +139,32 @@ impl<'a> Parser<'a> { style: PathStyle, ty_generics: Option<&Generics>, ) -> PResult<'a, Path> { - maybe_whole!(self, NtPath, |path| { + let reject_generics_if_mod_style = |parser: &Parser<'_>, path: &Path| { + // Ensure generic arguments don't end up in attribute paths, such as: + // + // macro_rules! m { + // ($p:path) => { #[$p] struct S; } + // } + // + // m!(inline<u8>); //~ ERROR: unexpected generic arguments in path + // if style == PathStyle::Mod && path.segments.iter().any(|segment| segment.args.is_some()) { - self.struct_span_err( - path.segments - .iter() - .filter_map(|segment| segment.args.as_ref()) - .map(|arg| arg.span()) - .collect::<Vec<_>>(), - "unexpected generic arguments in path", - ) - .emit(); + parser + .struct_span_err( + path.segments + .iter() + .filter_map(|segment| segment.args.as_ref()) + .map(|arg| arg.span()) + .collect::<Vec<_>>(), + "unexpected generic arguments in path", + ) + .emit(); } + }; + + maybe_whole!(self, NtPath, |path| { + reject_generics_if_mod_style(self, &path); path }); @@ -160,6 +173,7 @@ impl<'a> Parser<'a> { if let ast::TyKind::Path(None, path) = &ty.kind { let path = path.clone(); self.bump(); + reject_generics_if_mod_style(self, &path); return Ok(path); } } |
