@@ -58,6 +58,9 @@ enum QueryModifier {
58
58
59
59
/// Use a separate query provider for local and extern crates
60
60
SeparateProvideExtern ( Ident ) ,
61
+
62
+ /// Always remap the ParamEnv's constness before hashing and passing to the query provider
63
+ RemapEnvConstness ( Ident ) ,
61
64
}
62
65
63
66
impl Parse for QueryModifier {
@@ -123,6 +126,8 @@ impl Parse for QueryModifier {
123
126
Ok ( QueryModifier :: EvalAlways ( modifier) )
124
127
} else if modifier == "separate_provide_extern" {
125
128
Ok ( QueryModifier :: SeparateProvideExtern ( modifier) )
129
+ } else if modifier == "remap_env_constness" {
130
+ Ok ( QueryModifier :: RemapEnvConstness ( modifier) )
126
131
} else {
127
132
Err ( Error :: new ( modifier. span ( ) , "unknown query modifier" ) )
128
133
}
@@ -222,6 +227,9 @@ struct QueryModifiers {
222
227
223
228
/// Use a separate query provider for local and extern crates
224
229
separate_provide_extern : Option < Ident > ,
230
+
231
+ /// Always remap the ParamEnv's constness before hashing.
232
+ remap_env_constness : Option < Ident > ,
225
233
}
226
234
227
235
/// Process query modifiers into a struct, erroring on duplicates
@@ -236,6 +244,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
236
244
let mut anon = None ;
237
245
let mut eval_always = None ;
238
246
let mut separate_provide_extern = None ;
247
+ let mut remap_env_constness = None ;
239
248
for modifier in query. modifiers . 0 . drain ( ..) {
240
249
match modifier {
241
250
QueryModifier :: LoadCached ( tcx, id, block) => {
@@ -335,6 +344,12 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
335
344
}
336
345
separate_provide_extern = Some ( ident) ;
337
346
}
347
+ QueryModifier :: RemapEnvConstness ( ident) => {
348
+ if remap_env_constness. is_some ( ) {
349
+ panic ! ( "duplicate modifier `remap_env_constness` for query `{}`" , query. name) ;
350
+ }
351
+ remap_env_constness = Some ( ident)
352
+ }
338
353
}
339
354
}
340
355
let desc = desc. unwrap_or_else ( || {
@@ -351,6 +366,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
351
366
anon,
352
367
eval_always,
353
368
separate_provide_extern,
369
+ remap_env_constness,
354
370
}
355
371
}
356
372
@@ -485,6 +501,10 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
485
501
if let Some ( separate_provide_extern) = & modifiers. separate_provide_extern {
486
502
attributes. push ( quote ! { ( #separate_provide_extern) } ) ;
487
503
}
504
+ // Pass on the remap_env_constness modifier
505
+ if let Some ( remap_env_constness) = & modifiers. remap_env_constness {
506
+ attributes. push ( quote ! { ( #remap_env_constness) } ) ;
507
+ }
488
508
489
509
// This uses the span of the query definition for the commas,
490
510
// which can be important if we later encounter any ambiguity
0 commit comments