Simplify the pattern unpeeling in lower_pattern_range_endpoint · rust-lang/rust@2fb1261 (original) (raw)

`@@ -161,35 +161,34 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {

`

161

161

`) -> Result<Option<PatRangeBoundary<'tcx>>, ErrorGuaranteed> {

`

162

162

`let Some(expr) = expr else { return Ok(None) };

`

163

163

``

164

``

`-

let (kind, ascr, inline_const) = match self.lower_lit(expr) {

`

165

``

`-

PatKind::ExpandedConstant { subpattern, def_id, is_inline: true } => {

`

166

``

`-

(subpattern.kind, None, def_id.as_local())

`

167

``

`-

}

`

168

``

`-

PatKind::ExpandedConstant { subpattern, is_inline: false, .. } => {

`

169

``

`-

(subpattern.kind, None, None)

`

170

``

`-

}

`

171

``

`-

PatKind::AscribeUserType { ascription, subpattern: box Pat { kind, .. } } => {

`

172

``

`-

(kind, Some(ascription), None)

`

173

``

`-

}

`

174

``

`-

kind => (kind, None, None),

`

175

``

`-

};

`

176

``

`-

let value = match kind {

`

177

``

`-

PatKind::Constant { value } => value,

`

178

``

`-

PatKind::ExpandedConstant { subpattern, .. }

`

179

``

`-

if let PatKind::Constant { value } = subpattern.kind =>

`

180

``

`-

{

`

181

``

`-

value

`

182

``

`-

}

`

183

``

`-

_ => {

`

184

``

`-

let msg = format!(

`

185

``

`` -

"found bad range pattern endpoint {expr:?} outside of error recovery"

``

186

``

`-

);

`

187

``

`-

return Err(self.tcx.dcx().span_delayed_bug(expr.span, msg));

`

``

164

`` +

// Lower the endpoint into a temporary PatKind that will then be

``

``

165

`+

// deconstructed to obtain the constant value and other data.

`

``

166

`+

let mut kind: PatKind<'tcx> = self.lower_lit(expr);

`

``

167

+

``

168

`+

// Unpeel any ascription or inline-const wrapper nodes.

`

``

169

`+

loop {

`

``

170

`+

match kind {

`

``

171

`+

PatKind::AscribeUserType { ascription, subpattern } => {

`

``

172

`+

ascriptions.push(ascription);

`

``

173

`+

kind = subpattern.kind;

`

``

174

`+

}

`

``

175

`+

PatKind::ExpandedConstant { is_inline, def_id, subpattern } => {

`

``

176

`+

if is_inline {

`

``

177

`+

inline_consts.extend(def_id.as_local());

`

``

178

`+

}

`

``

179

`+

kind = subpattern.kind;

`

``

180

`+

}

`

``

181

`+

_ => break,

`

188

182

`}

`

``

183

`+

}

`

``

184

+

``

185

`+

// The unpeeled kind should now be a constant, giving us the endpoint value.

`

``

186

`+

let PatKind::Constant { value } = kind else {

`

``

187

`+

let msg =

`

``

188

`` +

format!("found bad range pattern endpoint {expr:?} outside of error recovery");

``

``

189

`+

return Err(self.tcx.dcx().span_delayed_bug(expr.span, msg));

`

189

190

`};

`

190

191

``

191

``

`-

ascriptions.extend(ascr);

`

192

``

`-

inline_consts.extend(inline_const);

`

193

192

`Ok(Some(PatRangeBoundary::Finite(value)))

`

194

193

`}

`

195

194

``