diff --git a/src/sema/eval.rs b/src/sema/eval.rs index f5568076b..864cef13b 100644 --- a/src/sema/eval.rs +++ b/src/sema/eval.rs @@ -309,22 +309,31 @@ pub fn eval_const_rational( var_no, .. } => { - let expr = ns.contracts[*contract_no].variables[*var_no] + if let Some(init) = ns.contracts[*contract_no].variables[*var_no] .initializer .as_ref() - .unwrap() - .clone(); - - eval_const_rational(&expr, ns) + { + eval_const_rational(&init.clone(), ns) + } else { + Err(Diagnostic::error( + expr.loc(), + "constant variable has no value".to_string(), + )) + } } Expression::ConstantVariable { contract_no: None, var_no, .. } => { - let expr = ns.constants[*var_no].initializer.as_ref().unwrap().clone(); - - eval_const_rational(&expr, ns) + if let Some(init) = ns.constants[*var_no].initializer.as_ref() { + eval_const_rational(&init.clone(), ns) + } else { + Err(Diagnostic::error( + expr.loc(), + "constant variable has no value".to_string(), + )) + } } _ => Err(Diagnostic::error( expr.loc(), diff --git a/tests/contract_testcases/polkadot/large_exponent_const_rational.sol b/tests/contract_testcases/polkadot/large_exponent_const_rational.sol new file mode 100644 index 000000000..ca5f61179 --- /dev/null +++ b/tests/contract_testcases/polkadot/large_exponent_const_rational.sol @@ -0,0 +1,7 @@ +contract C { + uint public constant Y = 0e1000; + constructor(int[Y - .1] memory w) {} +} + +// ---- Expect: diagnostics ---- +// error: 2:30-36: exponent '1000' too large