aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vhdl/vhdl-parse.adb37
-rw-r--r--src/vhdl/vhdl-sem_stmts.adb8
2 files changed, 23 insertions, 22 deletions
diff --git a/src/vhdl/vhdl-parse.adb b/src/vhdl/vhdl-parse.adb
index 228bb29af..e958b8f09 100644
--- a/src/vhdl/vhdl-parse.adb
+++ b/src/vhdl/vhdl-parse.adb
@@ -7598,26 +7598,23 @@ package body Vhdl.Parse is
function Parse_Sequential_Assignment_Statement (Target : Iir) return Iir
is
Stmt : Iir;
- Call : Iir;
- begin
- if Current_Token = Tok_Less_Equal then
- return Parse_Signal_Assignment_Statement (Target);
- elsif Current_Token = Tok_Assign then
- return Parse_Variable_Assignment_Statement (Target);
- elsif Current_Token = Tok_Semi_Colon then
- return Parenthesis_Name_To_Procedure_Call
- (Target, Iir_Kind_Procedure_Call_Statement);
- else
- Error_Msg_Parse
- ("""<="" or "":="" expected instead of %t", +Current_Token);
- Stmt := Create_Iir (Iir_Kind_Procedure_Call_Statement);
- Call := Create_Iir (Iir_Kind_Procedure_Call);
- Set_Prefix (Call, Target);
- Set_Procedure_Call (Stmt, Call);
- Set_Location (Call);
- Resync_To_End_Of_Statement;
- return Stmt;
- end if;
+ begin
+ case Current_Token is
+ when Tok_Less_Equal =>
+ return Parse_Signal_Assignment_Statement (Target);
+ when Tok_Assign =>
+ return Parse_Variable_Assignment_Statement (Target);
+ when Tok_Semi_Colon =>
+ return Parenthesis_Name_To_Procedure_Call
+ (Target, Iir_Kind_Procedure_Call_Statement);
+ when others =>
+ Error_Msg_Parse
+ ("""<="" or "":="" expected instead of %t", +Current_Token);
+ Stmt := Create_Iir (Iir_Kind_Variable_Assignment_Statement);
+ Set_Expression (Stmt, Target);
+ Resync_To_End_Of_Statement;
+ return Stmt;
+ end case;
end Parse_Sequential_Assignment_Statement;
-- precond: CASE
diff --git a/src/vhdl/vhdl-sem_stmts.adb b/src/vhdl/vhdl-sem_stmts.adb
index dfe49cfd2..f9290c61c 100644
--- a/src/vhdl/vhdl-sem_stmts.adb
+++ b/src/vhdl/vhdl-sem_stmts.adb
@@ -1021,7 +1021,9 @@ package body Vhdl.Sem_Stmts is
for S in Resolve_Stages loop
Done := False;
- Target := Sem_Expression_Wildcard (Target, Stmt_Type);
+ if Target /= Null_Iir then
+ Target := Sem_Expression_Wildcard (Target, Stmt_Type);
+ end if;
if Target = Null_Iir then
Target_Type := Stmt_Type;
-- To avoid spurious errors, assume the target is fully
@@ -1073,7 +1075,9 @@ package body Vhdl.Sem_Stmts is
exit when Done;
if not Is_Defined_Type (Stmt_Type) then
Error_Msg_Sem (+Stmt, "cannot resolve type");
- if Get_Kind (Target) = Iir_Kind_Aggregate then
+ if Target /= Null_Iir
+ and then Get_Kind (Target) = Iir_Kind_Aggregate
+ then
-- Try to give an advice.
Error_Msg_Sem (+Stmt, "use a qualified expression for the RHS");
end if;