Skip to content

Commit

Permalink
[naga] Improve ConstantEvaluatorError::InvalidCastArg message.
Browse files Browse the repository at this point in the history
  • Loading branch information
jimblandy authored and teoxoy committed Nov 29, 2023
1 parent 08506fe commit a9c5821
Showing 1 changed file with 28 additions and 14 deletions.
42 changes: 28 additions & 14 deletions naga/src/proc/constant_evaluator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ pub enum ConstantEvaluatorError {
InvalidAccessIndexTy,
#[error("Constants don't support array length expressions")]
ArrayLength,
#[error("Cannot cast type")]
InvalidCastArg,
#[error("Cannot cast type `{from}` to `{to}`")]
InvalidCastArg { from: String, to: String },
#[error("Cannot apply the unary op to the argument")]
InvalidUnaryOpArg,
#[error("Cannot apply the binary op to the arguments")]
Expand Down Expand Up @@ -988,6 +988,22 @@ impl<'a> ConstantEvaluator<'a> {

let expr = self.eval_zero_value(expr, span)?;

let make_error = || -> Result<_, ConstantEvaluatorError> {
let ty = self.resolve_type(expr)?;

#[cfg(feature = "wgsl-in")]
let from = ty.to_wgsl(&self.to_ctx());
#[cfg(feature = "wgsl-in")]
let to = target.to_wgsl();

#[cfg(not(feature = "wgsl-in"))]
let from = format!("{ty:?}");
#[cfg(not(feature = "wgsl-in"))]
let to = format!("{target:?}");

Err(ConstantEvaluatorError::InvalidCastArg { from, to })
};

let expr = match self.expressions[expr] {
Expression::Literal(literal) => {
let literal = match target {
Expand All @@ -997,7 +1013,7 @@ impl<'a> ConstantEvaluator<'a> {
Literal::F32(v) => v as i32,
Literal::Bool(v) => v as i32,
Literal::F64(_) | Literal::I64(_) => {
return Err(ConstantEvaluatorError::InvalidCastArg)
return make_error();
}
Literal::AbstractInt(v) => i32::try_from_abstract(v)?,
Literal::AbstractFloat(v) => i32::try_from_abstract(v)?,
Expand All @@ -1008,7 +1024,7 @@ impl<'a> ConstantEvaluator<'a> {
Literal::F32(v) => v as u32,
Literal::Bool(v) => v as u32,
Literal::F64(_) | Literal::I64(_) => {
return Err(ConstantEvaluatorError::InvalidCastArg)
return make_error();
}
Literal::AbstractInt(v) => u32::try_from_abstract(v)?,
Literal::AbstractFloat(v) => u32::try_from_abstract(v)?,
Expand All @@ -1019,7 +1035,7 @@ impl<'a> ConstantEvaluator<'a> {
Literal::F32(v) => v,
Literal::Bool(v) => v as u32 as f32,
Literal::F64(_) | Literal::I64(_) => {
return Err(ConstantEvaluatorError::InvalidCastArg)
return make_error();
}
Literal::AbstractInt(v) => f32::try_from_abstract(v)?,
Literal::AbstractFloat(v) => f32::try_from_abstract(v)?,
Expand All @@ -1030,7 +1046,7 @@ impl<'a> ConstantEvaluator<'a> {
Literal::F32(v) => v as f64,
Literal::F64(v) => v,
Literal::Bool(v) => v as u32 as f64,
Literal::I64(_) => return Err(ConstantEvaluatorError::InvalidCastArg),
Literal::I64(_) => return make_error(),
Literal::AbstractInt(v) => f64::try_from_abstract(v)?,
Literal::AbstractFloat(v) => f64::try_from_abstract(v)?,
}),
Expand All @@ -1043,7 +1059,7 @@ impl<'a> ConstantEvaluator<'a> {
| Literal::I64(_)
| Literal::AbstractInt(_)
| Literal::AbstractFloat(_) => {
return Err(ConstantEvaluatorError::InvalidCastArg)
return make_error();
}
}),
Sc::ABSTRACT_FLOAT => Literal::AbstractFloat(match literal {
Expand All @@ -1055,11 +1071,11 @@ impl<'a> ConstantEvaluator<'a> {
v as f64
}
Literal::AbstractFloat(v) => v,
_ => return Err(ConstantEvaluatorError::InvalidCastArg),
_ => return make_error(),
}),
_ => {
log::debug!("Constant evaluator refused to convert value to {target:?}");
return Err(ConstantEvaluatorError::InvalidCastArg);
return make_error();
}
};
Expression::Literal(literal)
Expand All @@ -1078,7 +1094,7 @@ impl<'a> ConstantEvaluator<'a> {
rows,
scalar: target,
},
_ => return Err(ConstantEvaluatorError::InvalidCastArg),
_ => return make_error(),
};

let mut components = src_components.clone();
Expand All @@ -1104,7 +1120,7 @@ impl<'a> ConstantEvaluator<'a> {
value: cast_value,
}
}
_ => return Err(ConstantEvaluatorError::InvalidCastArg),
_ => return make_error(),
};

self.register_evaluated_expr(expr, span)
Expand Down Expand Up @@ -1141,9 +1157,7 @@ impl<'a> ConstantEvaluator<'a> {
*component = self.cast_array(*component, target, span)?;
}

let first = components
.first()
.ok_or(ConstantEvaluatorError::InvalidCastArg)?;
let first = components.first().unwrap();
let new_base = match self.resolve_type(*first)? {
crate::proc::TypeResolution::Handle(ty) => ty,
crate::proc::TypeResolution::Value(inner) => {
Expand Down

0 comments on commit a9c5821

Please sign in to comment.