summary refs log tree commit diff
path: root/compiler/rustc_parse/src/parser
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2021-11-22 20:16:28 -0800
committerDavid Tolnay <dtolnay@gmail.com>2021-11-25 15:05:07 -0800
commit87a7defa8e08c971a30b152509c6c1ab9f718092 (patch)
treec3cfee726de210a8dd3003d8cbce105a1aa603bb /compiler/rustc_parse/src/parser
parent0cbb00f89875c085181f1d55bbe46d39ec36be3f (diff)
downloadrust-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.rs34
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);
                 }
             }