From eeed05d9cdca03607b4376ba18439b1089d6c77b Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 19 Feb 2022 08:21:46 +0100 Subject: [PATCH] Handle class new assignment to non-class variables Using a class new operator on a non-class variable should result in an error. At the moment when using a class new operator on a dynamic array or queue will result in an segmentation fault. This is because the implementation assumes that the left hand side is of a class type. Add a check in the class new operator implementation that the type of the left hand side is a class. Report an error if it is not. Signed-off-by: Lars-Peter Clausen --- elab_expr.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/elab_expr.cc b/elab_expr.cc index f47ec86fb..844c1e89c 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -6594,14 +6594,21 @@ NetExpr* PENewClass::elaborate_expr_constructor_(Design*des, NetScope*scope, NetExpr* PENewClass::elaborate_expr(Design*des, NetScope*scope, ivl_type_t ntype, unsigned flags) const { - NetExpr*obj = new NetENew(ntype); - obj->set_line(*this); - // Find the constructor for the class. If there is no // constructor then the result of this expression is the // allocation alone. const netclass_t*ctype = dynamic_cast (ntype); + if (!ctype) { + cerr << get_fileline() << ": error: class new not allowed here. " + << "Left-hand side is not of class type." << endl; + des->errors++; + return 0; + } + + NetExpr*obj = new NetENew(ntype); + obj->set_line(*this); + obj = elaborate_expr_constructor_(des, scope, ctype, obj, flags); return obj; }