From 8803eb3288861971795a627917c5c15aee8d9197 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Tue, 22 Sep 2015 16:15:41 -0700 Subject: [PATCH] Handle numeric literals with no digits. --- lexor.lex | 8 ++++++++ pform.cc | 23 ++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lexor.lex b/lexor.lex index d14e38694..cf86e7a57 100644 --- a/lexor.lex +++ b/lexor.lex @@ -862,6 +862,14 @@ verinum*make_unsized_binary(const char*txt) for (const char*idx = ptr ; *idx ; idx += 1) if (*idx != '_') size += 1; + if (size == 0) { + VLerror(yylloc, "Numeric literal has no digits in it."); + verinum*out = new verinum(); + out->has_sign(sign_flag); + out->is_single(single_flag); + return out; + } + if ((based_size > 0) && (size > based_size)) yywarn(yylloc, "extra digits given for sized binary constant."); diff --git a/pform.cc b/pform.cc index 594026993..2f3431589 100644 --- a/pform.cc +++ b/pform.cc @@ -1087,16 +1087,21 @@ verinum* pform_verinum_with_size(verinum*siz, verinum*val, verinum::V pad; - switch (val->get(val->len()-1)) { - case verinum::Vz: - pad = verinum::Vz; - break; - case verinum::Vx: + if (val->len() == 0) { pad = verinum::Vx; - break; - default: - pad = verinum::V0; - break; + } else { + + switch (val->get(val->len()-1)) { + case verinum::Vz: + pad = verinum::Vz; + break; + case verinum::Vx: + pad = verinum::Vx; + break; + default: + pad = verinum::V0; + break; + } } verinum*res = new verinum(pad, size, true);