diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-03-19 20:24:08 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-03-19 20:24:08 +0100 |
commit | 6094361eab9089f97a0851844d64d40d1ebc5c82 (patch) | |
tree | 39251d6d74fd12638c267b93be5eda1ceb35bef9 | |
parent | 9a80de30f485c9af8aaeb9eeb9ec986c7fffa6f8 (diff) | |
download | ghdl-6094361eab9089f97a0851844d64d40d1ebc5c82.tar.gz ghdl-6094361eab9089f97a0851844d64d40d1ebc5c82.tar.bz2 ghdl-6094361eab9089f97a0851844d64d40d1ebc5c82.zip |
vhdl: handle alias of protected objects. Fix #1688
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 6 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_names.adb | 25 |
2 files changed, 23 insertions, 8 deletions
diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index 00a14c8b4..37ca1646b 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -1668,7 +1668,8 @@ package body Trans.Chap4 is when Type_Mode_Bounded_Arrays | Type_Mode_Bounded_Records | Type_Mode_Acc - | Type_Mode_Bounds_Acc => + | Type_Mode_Bounds_Acc + | Type_Mode_Protected => -- Create an object pointer. -- At elaboration: copy base from name. Atype := Tinfo.Ortho_Ptr_Type (Mode); @@ -1762,7 +1763,8 @@ package body Trans.Chap4 is (Decl_Type, T2M (Decl_Type, Mode), Name_Type, N, Decl); when Type_Mode_Acc - | Type_Mode_Bounds_Acc => + | Type_Mode_Bounds_Acc + | Type_Mode_Protected => New_Assign_Stmt (Get_Var (A), M2Addr (N)); when Type_Mode_Scalar => case Mode is diff --git a/src/vhdl/vhdl-sem_names.adb b/src/vhdl/vhdl-sem_names.adb index 18051465c..957eb54ce 100644 --- a/src/vhdl/vhdl-sem_names.adb +++ b/src/vhdl/vhdl-sem_names.adb @@ -549,6 +549,8 @@ package body Vhdl.Sem_Names is is Prefix : Iir; Obj : Iir; + Obj_Alias : Iir; + Obj_Type : Iir; begin if Get_Kind (Name) /= Iir_Kind_Selected_Name then return; @@ -556,18 +558,29 @@ package body Vhdl.Sem_Names is Prefix := Get_Prefix (Name); Obj := Get_Named_Entity (Prefix); - if Obj /= Null_Iir - and then Kind_In (Obj, Iir_Kind_Variable_Declaration, - Iir_Kind_Interface_Variable_Declaration) - and then Get_Type (Obj) /= Null_Iir + if Obj = Null_Iir then + return; + end if; + if Get_Kind (Obj) = Iir_Kind_Object_Alias_Declaration then + Obj_Alias := Get_Named_Entity (Get_Name (Obj)); + else + Obj_Alias := Obj; + end if; + + if Kind_In (Obj_Alias, Iir_Kind_Variable_Declaration, + Iir_Kind_Interface_Variable_Declaration) then - if Get_Kind (Get_Type (Obj)) /= Iir_Kind_Protected_Type_Declaration + Obj_Type := Get_Type (Obj_Alias); + if Obj_Type = Null_Iir then + return; + end if; + if Get_Kind (Obj_Type) /= Iir_Kind_Protected_Type_Declaration then Error_Msg_Sem (+Prefix, "type of the prefix should be a protected type"); return; end if; - Set_Method_Object (Call, Obj); + Set_Method_Object (Call, Obj_Alias); Set_Use_Flag (Obj, True); end if; end Name_To_Method_Object; |