diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-05-28 20:57:02 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-05-28 20:57:02 +0200 |
commit | ac49cafe30e4b67eebd73d69db45d294ea7e8522 (patch) | |
tree | 61878a382bf646f61674dcb44af8dc571337a564 /src/vhdl | |
parent | 79a66cd66cec9750c2eff204087b0e2b65bb5d4a (diff) | |
download | ghdl-ac49cafe30e4b67eebd73d69db45d294ea7e8522.tar.gz ghdl-ac49cafe30e4b67eebd73d69db45d294ea7e8522.tar.bz2 ghdl-ac49cafe30e4b67eebd73d69db45d294ea7e8522.zip |
vhdl: avoid a crash on forced analysis of a erroneous name expression
Diffstat (limited to 'src/vhdl')
-rw-r--r-- | src/vhdl/vhdl-parse.adb | 37 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_stmts.adb | 8 |
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; |