Fix associative array default type resolution

This commit is contained in:
Wilson Snyder 2025-09-17 23:39:47 -04:00
parent 7f871467bf
commit c15489b711
3 changed files with 44 additions and 2 deletions

View File

@ -5008,7 +5008,10 @@ class WidthVisitor final : public VNVisitor {
}
void patternAssoc(AstPattern* nodep, AstAssocArrayDType* arrayDtp, AstPatMember* defaultp) {
AstNode* defaultValuep = nullptr;
if (defaultp) defaultValuep = defaultp->lhssp()->unlinkFrBack();
if (defaultp) {
defaultp->dtypep(arrayDtp->subDTypep());
defaultValuep = patternMemberValueIterate(defaultp);
}
AstNodeExpr* newp = new AstConsAssoc{nodep->fileline(), defaultValuep};
newp->dtypeFrom(arrayDtp);
for (AstPatMember* patp = VN_AS(nodep->itemsp(), PatMember); patp;
@ -5037,7 +5040,10 @@ class WidthVisitor final : public VNVisitor {
void patternWildcard(AstPattern* nodep, AstWildcardArrayDType* arrayDtp,
AstPatMember* defaultp) {
AstNode* defaultValuep = nullptr;
if (defaultp) defaultValuep = defaultp->lhssp()->unlinkFrBack();
if (defaultp) {
defaultp->dtypep(arrayDtp->subDTypep());
defaultValuep = patternMemberValueIterate(defaultp);
}
AstNode* newp = new AstConsWildcard{nodep->fileline(), defaultValuep};
newp->dtypeFrom(arrayDtp);
for (AstPatMember* patp = VN_AS(nodep->itemsp(), PatMember); patp;

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2025 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
import vltest_bootstrap
test.scenarios('linter')
test.lint()
test.passes()

View File

@ -0,0 +1,20 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2025 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
module t;
class param_comp #(
type T = bit
);
static function int get_type();
endfunction
endclass
class test;
virtual function void check_phase();
int m_param_comp_bit_expect_wrapper[string] = '{default: param_comp#(bit)::get_type()};
endfunction
endclass
endmodule