From 227cf2068420c0147ed2a056e9302c5beaaf21c1 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Mon, 18 Apr 2022 17:18:22 +0200 Subject: [PATCH] PECastType: Use elaborated data type PECastType currently uses the unelaborated data type to make the decision how to implement the cast. The unelaborated data type is provided by the parser and this works as long as the parser knows the data type. But for example with type parameters the actual data type is not known until elaboration. In preparation for supporting type parameters make sure to only use the elaborated type in the PECastType implementation. Signed-off-by: Lars-Peter Clausen --- elab_expr.cc | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/elab_expr.cc b/elab_expr.cc index 3f41c32bb..f47ec86fb 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -3453,12 +3453,16 @@ NetExpr* PECastType::elaborate_expr(Design*des, NetScope*scope, if (sub == 0) return 0; - if (dynamic_cast(target_)) { - return cast_to_real(sub); - } - NetExpr*tmp = 0; - if (target_type_ && target_type_->packed()) { + if (dynamic_cast(target_type_)) { + return cast_to_real(sub); + } else if (dynamic_cast(target_type_)) { + if (base_->expr_type() == IVL_VT_STRING) + return sub; // no conversion + if (base_->expr_type() == IVL_VT_LOGIC || + base_->expr_type() == IVL_VT_BOOL) + return sub; // handled by the target as special cases + } else if (target_type_ && target_type_->packed()) { switch (target_type_->base_type()) { case IVL_VT_BOOL: tmp = cast_to_int2(sub, expr_width_); @@ -3483,15 +3487,6 @@ NetExpr* PECastType::elaborate_expr(Design*des, NetScope*scope, return pad_to_width(tmp, expr_wid, signed_flag_, *this, target_type_); } - if (dynamic_cast(target_)) { - if (base_->expr_type() == IVL_VT_STRING) - return sub; // no conversion - - if (base_->expr_type() == IVL_VT_LOGIC - || base_->expr_type() == IVL_VT_BOOL) - return sub; // handled by the target as special cases - } - cerr << get_fileline() << ": sorry: This cast operation is not yet supported." << endl; des->errors += 1; return 0;