From cacd9357ba39fde8f2a5f903045a56d3808e5671 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Fri, 7 Nov 2025 16:39:12 -0800 Subject: [PATCH] SystemVerilog: grammar for assignment patterns on LHS This adds the grammar needed for parsing assignment patterns on the LHS of assignments. Their use is errored as unsupported in the type checker. --- .../verilog/assignments/assignment-pattern-lhs1.desc | 6 +++--- regression/verilog/assignments/assignment-pattern-lhs1.sv | 4 +--- src/verilog/parser.y | 1 + src/verilog/verilog_typecheck.cpp | 7 ++++++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/regression/verilog/assignments/assignment-pattern-lhs1.desc b/regression/verilog/assignments/assignment-pattern-lhs1.desc index c5d370335..f7f64cde7 100644 --- a/regression/verilog/assignments/assignment-pattern-lhs1.desc +++ b/regression/verilog/assignments/assignment-pattern-lhs1.desc @@ -1,8 +1,8 @@ -KNOWNBUG +CORE assignment-pattern-lhs1.sv -^EXIT=0$ +^file .* line 9: no support for assignment patterns on LHS of an assignment$ +^EXIT=2$ ^SIGNAL=0$ -- -- -This does not parse. diff --git a/regression/verilog/assignments/assignment-pattern-lhs1.sv b/regression/verilog/assignments/assignment-pattern-lhs1.sv index c30da43cd..27509c5be 100644 --- a/regression/verilog/assignments/assignment-pattern-lhs1.sv +++ b/regression/verilog/assignments/assignment-pattern-lhs1.sv @@ -1,14 +1,12 @@ module main; - typedef struct packed {int a, b;} S; - S my_s; int x, y; initial begin // Assignment pattern on LHS. // Does not parse with Icarus Verilog, VCS, XCelium. // Works with Riviera, Questa. - '{x, y} = S'{1, 2}; + '{x, y} = '{1, 2}; assert(x == 1 && y == 2); end diff --git a/src/verilog/parser.y b/src/verilog/parser.y index 6e550094c..92e1ffa54 100644 --- a/src/verilog/parser.y +++ b/src/verilog/parser.y @@ -4549,6 +4549,7 @@ variable_lvalue: | '{' variable_concatenation_lvalue_brace '}' { init($$, ID_concatenation); swapop($$, $2); } */ + | assignment_pattern ; variable_concatenation_lvalue_brace: diff --git a/src/verilog/verilog_typecheck.cpp b/src/verilog/verilog_typecheck.cpp index 3784a9b10..ee0a73619 100644 --- a/src/verilog/verilog_typecheck.cpp +++ b/src/verilog/verilog_typecheck.cpp @@ -760,6 +760,11 @@ void verilog_typecheckt::check_lhs( { check_lhs(to_member_expr(lhs).struct_op(), vassign); } + else if(lhs.id() == ID_verilog_assignment_pattern) + { + throw errort().with_location(lhs.source_location()) + << "no support for assignment patterns on LHS of an assignment"; + } else { throw errort() << "typechecking: failed to get identifier on LHS " @@ -1019,8 +1024,8 @@ void verilog_typecheckt::convert_assign( convert_expr(lhs); convert_expr(rhs); - assignment_conversion(rhs, lhs.type()); check_lhs(lhs, blocking?A_BLOCKING:A_NON_BLOCKING); + assignment_conversion(rhs, lhs.type()); } /*******************************************************************\