mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Prevent macro ambiguity errors
The previous macro_rules! parsers failed when an additional modifier was added with ambiguity errors. The error is pretty unclear as to what exactly the cause here is, but this change simplifies the argument parsing code such that the error is avoided.
This commit is contained in:
parent
6e12110812
commit
e2d3e09b9c
@ -455,28 +455,28 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
|
||||
|
||||
// Pass on the fatal_cycle modifier
|
||||
if let Some(fatal_cycle) = &modifiers.fatal_cycle {
|
||||
attributes.push(quote! { #fatal_cycle });
|
||||
attributes.push(quote! { (#fatal_cycle) });
|
||||
};
|
||||
// Pass on the storage modifier
|
||||
if let Some(ref ty) = modifiers.storage {
|
||||
let span = ty.span();
|
||||
attributes.push(quote_spanned! {span=> storage(#ty) });
|
||||
attributes.push(quote_spanned! {span=> (storage #ty) });
|
||||
};
|
||||
// Pass on the cycle_delay_bug modifier
|
||||
if let Some(cycle_delay_bug) = &modifiers.cycle_delay_bug {
|
||||
attributes.push(quote! { #cycle_delay_bug });
|
||||
attributes.push(quote! { (#cycle_delay_bug) });
|
||||
};
|
||||
// Pass on the no_hash modifier
|
||||
if let Some(no_hash) = &modifiers.no_hash {
|
||||
attributes.push(quote! { #no_hash });
|
||||
attributes.push(quote! { (#no_hash) });
|
||||
};
|
||||
// Pass on the anon modifier
|
||||
if let Some(anon) = &modifiers.anon {
|
||||
attributes.push(quote! { #anon });
|
||||
attributes.push(quote! { (#anon) });
|
||||
};
|
||||
// Pass on the eval_always modifier
|
||||
if let Some(eval_always) = &modifiers.eval_always {
|
||||
attributes.push(quote! { #eval_always });
|
||||
attributes.push(quote! { (#eval_always) });
|
||||
};
|
||||
|
||||
// This uses the span of the query definition for the commas,
|
||||
|
@ -140,11 +140,11 @@ macro_rules! is_eval_always_attr {
|
||||
}
|
||||
|
||||
macro_rules! contains_anon_attr {
|
||||
($($attr:ident $(($($attr_args:tt)*))* ),*) => ({$(is_anon_attr!($attr) | )* false});
|
||||
($(($attr:ident $($attr_args:tt)* )),*) => ({$(is_anon_attr!($attr) | )* false});
|
||||
}
|
||||
|
||||
macro_rules! contains_eval_always_attr {
|
||||
($($attr:ident $(($($attr_args:tt)*))* ),*) => ({$(is_eval_always_attr!($attr) | )* false});
|
||||
($(($attr:ident $($attr_args:tt)* )),*) => ({$(is_eval_always_attr!($attr) | )* false});
|
||||
}
|
||||
|
||||
#[allow(non_upper_case_globals)]
|
||||
|
@ -111,11 +111,11 @@ macro_rules! query_storage {
|
||||
([][$K:ty, $V:ty]) => {
|
||||
<DefaultCacheSelector as CacheSelector<$K, $V>>::Cache
|
||||
};
|
||||
([storage($ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => {
|
||||
([(storage $ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => {
|
||||
<$ty as CacheSelector<$K, $V>>::Cache
|
||||
};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
query_storage!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
query_storage!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -253,17 +253,17 @@ macro_rules! handle_cycle_error {
|
||||
$error.emit();
|
||||
Value::from_cycle_error($tcx)
|
||||
}};
|
||||
([fatal_cycle $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
([(fatal_cycle) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.emit();
|
||||
$tcx.sess.abort_if_errors();
|
||||
unreachable!()
|
||||
}};
|
||||
([cycle_delay_bug $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
([(cycle_delay_bug) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.delay_as_bug();
|
||||
Value::from_cycle_error($tcx)
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
handle_cycle_error!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
handle_cycle_error!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -271,11 +271,11 @@ macro_rules! is_anon {
|
||||
([]) => {{
|
||||
false
|
||||
}};
|
||||
([anon $($rest:tt)*]) => {{
|
||||
([(anon) $($rest:tt)*]) => {{
|
||||
true
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => {
|
||||
is_anon!([$($($modifiers)*)*])
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
is_anon!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -283,11 +283,11 @@ macro_rules! is_eval_always {
|
||||
([]) => {{
|
||||
false
|
||||
}};
|
||||
([eval_always $($rest:tt)*]) => {{
|
||||
([(eval_always) $($rest:tt)*]) => {{
|
||||
true
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => {
|
||||
is_eval_always!([$($($modifiers)*)*])
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
is_eval_always!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -295,11 +295,11 @@ macro_rules! hash_result {
|
||||
([][$hcx:expr, $result:expr]) => {{
|
||||
dep_graph::hash_result($hcx, &$result)
|
||||
}};
|
||||
([no_hash $($rest:tt)*][$hcx:expr, $result:expr]) => {{
|
||||
([(no_hash) $($rest:tt)*][$hcx:expr, $result:expr]) => {{
|
||||
None
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
hash_result!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
hash_result!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user