@@ -2373,17 +2373,22 @@ impl<'tcx> ConstantKind<'tcx> {
2373
2373
param_env : ty:: ParamEnv < ' tcx > ,
2374
2374
span : Option < Span > ,
2375
2375
) -> Result < interpret:: ConstValue < ' tcx > , ErrorHandled > {
2376
- match self {
2376
+ let uneval = match self {
2377
2377
ConstantKind :: Ty ( c) => {
2378
- let val = c. eval ( tcx, param_env, span) ?;
2379
- Ok ( tcx. valtree_to_const_val ( ( self . ty ( ) , val) ) )
2380
- }
2381
- ConstantKind :: Unevaluated ( uneval, _) => {
2382
- // FIXME: We might want to have a `try_eval`-like function on `Unevaluated`
2383
- tcx. const_eval_resolve ( param_env, uneval, span)
2378
+ if let ty:: ConstKind :: Unevaluated ( uv) = c. kind ( ) {
2379
+ // Avoid the round-trip via valtree, evaluate directly to ConstValue.
2380
+ uv. expand ( )
2381
+ } else {
2382
+ // It's already a valtree, or an error.
2383
+ let val = c. eval ( tcx, param_env, span) ?;
2384
+ return Ok ( tcx. valtree_to_const_val ( ( self . ty ( ) , val) ) ) ;
2385
+ }
2384
2386
}
2385
- ConstantKind :: Val ( val, _) => Ok ( val) ,
2386
- }
2387
+ ConstantKind :: Unevaluated ( uneval, _) => uneval,
2388
+ ConstantKind :: Val ( val, _) => return Ok ( val) ,
2389
+ } ;
2390
+ // FIXME: We might want to have a `try_eval`-like function on `Unevaluated`
2391
+ tcx. const_eval_resolve ( param_env, uneval, span)
2387
2392
}
2388
2393
2389
2394
/// Normalizes the constant to a value if possible.
0 commit comments