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/vhdl-parse.adb | |
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/vhdl-parse.adb')
-rw-r--r-- | src/vhdl/vhdl-parse.adb | 37 |
1 files changed, 17 insertions, 20 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 |