From c9e7aecf1d027589166e6c214c8a0a04158a8e70 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 1 Oct 2022 23:50:23 +0200 Subject: [PATCH] Implement `has_aa_term()` for cast expressions If the base expression of a cast expression has an automatic term then the cast expression itself has an automatic term. Make sure this is implemented so that an error is properly reported when using such an expression in a context where automatic variables are not allowed. Signed-off-by: Lars-Peter Clausen --- PExpr.cc | 15 +++++++++++++++ PExpr.h | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/PExpr.cc b/PExpr.cc index ff67da5e0..9038db959 100644 --- a/PExpr.cc +++ b/PExpr.cc @@ -142,6 +142,11 @@ PECastSize::~PECastSize() { } +bool PECastSize::has_aa_term(Design *des, NetScope *scope) const +{ + return base_->has_aa_term(des, scope); +} + PECastType::PECastType(data_type_t*t, PExpr*b) : target_(t), base_(b) { @@ -151,12 +156,22 @@ PECastType::~PECastType() { } +bool PECastType::has_aa_term(Design *des, NetScope *scope) const +{ + return base_->has_aa_term(des, scope); +} + PECastSign::PECastSign(bool signed_flag, PExpr *base) : base_(base) { signed_flag_ = signed_flag; } +bool PECastSign::has_aa_term(Design *des, NetScope *scope) const +{ + return base_->has_aa_term(des, scope); +} + PEBComp::PEBComp(char op, PExpr*l, PExpr*r) : PEBinary(op, l, r) { diff --git a/PExpr.h b/PExpr.h index f84e7d290..c765bec36 100644 --- a/PExpr.h +++ b/PExpr.h @@ -972,6 +972,8 @@ class PECastSize : public PExpr { unsigned expr_wid, unsigned flags) const; + virtual bool has_aa_term(Design *des, NetScope *scope) const; + virtual unsigned test_width(Design*des, NetScope*scope, width_mode_t&mode); @@ -997,6 +999,8 @@ class PECastType : public PExpr { virtual NetExpr*elaborate_expr(Design*des, NetScope*scope, unsigned expr_wid, unsigned flags) const; + virtual bool has_aa_term(Design *des, NetScope *scope) const; + virtual unsigned test_width(Design*des, NetScope*scope, width_mode_t&mode); @@ -1020,6 +1024,8 @@ class PECastSign : public PExpr { NetExpr* elaborate_expr(Design *des, NetScope *scope, unsigned expr_wid, unsigned flags) const; + virtual bool has_aa_term(Design *des, NetScope *scope) const; + unsigned test_width(Design *des, NetScope *scope, width_mode_t &mode); private: