better error for bad depth on macro metavar expr

This commit is contained in:
Michael Goulet 2022-07-17 00:04:30 +00:00
parent a289cfcfb3
commit dd109c8c10
5 changed files with 39 additions and 9 deletions

View File

@ -512,7 +512,18 @@ fn out_of_bounds_err<'a>(
span: Span, span: Span,
ty: &str, ty: &str,
) -> DiagnosticBuilder<'a, ErrorGuaranteed> { ) -> DiagnosticBuilder<'a, ErrorGuaranteed> {
cx.struct_span_err(span, &format!("{ty} depth must be less than {max}")) let msg = if max == 0 {
format!(
"meta-variable expression `{ty}` with depth parameter \
must be called inside of a macro repetition"
)
} else {
format!(
"depth parameter on meta-variable expression `{ty}` \
must be less than {max}"
)
};
cx.struct_span_err(span, &msg)
} }
fn transcribe_metavar_expr<'a>( fn transcribe_metavar_expr<'a>(

View File

@ -0,0 +1,12 @@
#![feature(macro_metavar_expr)]
macro_rules! metavar {
( $i:expr ) => {
${length(0)}
//~^ ERROR meta-variable expression `length` with depth parameter must be called inside of a macro repetition
};
}
const _: i32 = metavar!(0);
fn main() {}

View File

@ -0,0 +1,8 @@
error: meta-variable expression `length` with depth parameter must be called inside of a macro repetition
--> $DIR/meta-variable-depth-outside-repeat.rs:5:10
|
LL | ${length(0)}
| ^^^^^^^^^^^
error: aborting due to previous error

View File

@ -5,7 +5,7 @@ macro_rules! a {
( (
${count(foo, 0)}, ${count(foo, 0)},
${count(foo, 10)}, ${count(foo, 10)},
//~^ ERROR count depth must be less than 4 //~^ ERROR depth parameter on meta-variable expression `count` must be less than 4
) )
}; };
} }
@ -17,7 +17,7 @@ macro_rules! b {
${ignore(foo)} ${ignore(foo)}
${index(0)}, ${index(0)},
${index(10)}, ${index(10)},
//~^ ERROR index depth must be less than 3 //~^ ERROR depth parameter on meta-variable expression `index` must be less than 3
)* )* )* )* )* )*
) )
}; };
@ -30,15 +30,14 @@ macro_rules! c {
${ignore(foo)} ${ignore(foo)}
${length(0)} ${length(0)}
${length(10)} ${length(10)}
//~^ ERROR length depth must be less than 2 //~^ ERROR depth parameter on meta-variable expression `length` must be less than 2
)* )* )* )*
) )
}; };
} }
fn main() { fn main() {
a!( { [ (a) ] [ (b c) ] } ); a!( { [ (a) ] [ (b c) ] } );
b!( { [ a b ] } ); b!( { [ a b ] } );
c!( { a } ); c!({ a });
} }

View File

@ -1,16 +1,16 @@
error: count depth must be less than 4 error: depth parameter on meta-variable expression `count` must be less than 4
--> $DIR/out-of-bounds-arguments.rs:7:14 --> $DIR/out-of-bounds-arguments.rs:7:14
| |
LL | ${count(foo, 10)}, LL | ${count(foo, 10)},
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
error: index depth must be less than 3 error: depth parameter on meta-variable expression `index` must be less than 3
--> $DIR/out-of-bounds-arguments.rs:19:18 --> $DIR/out-of-bounds-arguments.rs:19:18
| |
LL | ${index(10)}, LL | ${index(10)},
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: length depth must be less than 2 error: depth parameter on meta-variable expression `length` must be less than 2
--> $DIR/out-of-bounds-arguments.rs:32:18 --> $DIR/out-of-bounds-arguments.rs:32:18
| |
LL | ${length(10)} LL | ${length(10)}