diff options
author | Tristan Gingold <tgingold@free.fr> | 2015-01-20 15:20:13 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2015-01-20 15:20:13 +0100 |
commit | 68379e7e41aa07de23978535e1f1dc82986e0bfc (patch) | |
tree | 4ee52f2d32cc83e4ed7bc7995e11819e99658989 | |
parent | adc13ed3c08140e48d977d4295d59a1a005cab1a (diff) | |
download | ghdl-68379e7e41aa07de23978535e1f1dc82986e0bfc.tar.gz ghdl-68379e7e41aa07de23978535e1f1dc82986e0bfc.tar.bz2 ghdl-68379e7e41aa07de23978535e1f1dc82986e0bfc.zip |
sem_names: extract Free_Old_Entity_Name (from Finish_Sem_Name). Add comments.
-rw-r--r-- | src/vhdl/sem_names.adb | 32 | ||||
-rw-r--r-- | src/vhdl/translate/trans-chap7.adb | 1 |
2 files changed, 23 insertions, 10 deletions
diff --git a/src/vhdl/sem_names.adb b/src/vhdl/sem_names.adb index 756066c36..87f9402c6 100644 --- a/src/vhdl/sem_names.adb +++ b/src/vhdl/sem_names.adb @@ -1391,6 +1391,19 @@ package body Sem_Names is end case; end Finish_Sem_Denoting_Name; + + -- Free overload list of NAME but keep RES interpretation. + procedure Free_Old_Entity_Name (Name : Iir; Res : Iir) + is + Old_Res : constant Iir := Get_Named_Entity (Name); + begin + if Old_Res /= Null_Iir and then Old_Res /= Res then + pragma Assert (Is_Overload_List (Old_Res)); + Sem_Name_Free_Result (Old_Res, Res); + end if; + Set_Named_Entity (Name, Res); + end Free_Old_Entity_Name; + function Finish_Sem_Name_1 (Name : Iir; Res : Iir) return Iir is Prefix : Iir; @@ -1457,18 +1470,20 @@ package body Sem_Names is null; when Iir_Kind_Implicit_Dereference => -- The name may not have a prefix. - Prefix := Finish_Sem_Name (Name, Get_Prefix (Res)); + Prefix := Finish_Sem_Name_1 (Name, Get_Prefix (Res)); Set_Prefix (Res, Prefix); Finish_Sem_Dereference (Res); return Res; when Iir_Kind_Function_Call => case Get_Kind (Name) is when Iir_Kind_Parenthesis_Name => + -- Usual case. Prefix := Finish_Sem_Name (Get_Prefix (Name), Get_Implementation (Res)); Finish_Sem_Function_Call (Res, Prefix); Free_Iir (Name); when Iir_Kinds_Denoting_Name => + -- Call without association list. Prefix := Finish_Sem_Name (Name, Get_Implementation (Res)); Finish_Sem_Function_Call (Res, Prefix); when others => @@ -1558,18 +1573,15 @@ package body Sem_Names is return Res; end Finish_Sem_Name_1; - function Finish_Sem_Name (Name : Iir; Res : Iir) return Iir - is - Old_Res : Iir; + function Finish_Sem_Name (Name : Iir; Res : Iir) return Iir is begin if Get_Kind (Res) /= Iir_Kind_Implicit_Dereference then - Old_Res := Get_Named_Entity (Name); - if Old_Res /= Null_Iir and then Old_Res /= Res then - pragma Assert (Is_Overload_List (Old_Res)); - Sem_Name_Free_Result (Old_Res, Res); - end if; - Set_Named_Entity (Name, Res); + -- There is no corresponding name for implicit_dereference (because + -- it is implicit). + -- Free overload list (but keep RES interpretation) for other cases. + Free_Old_Entity_Name (Name, Res); end if; + return Finish_Sem_Name_1 (Name, Res); end Finish_Sem_Name; diff --git a/src/vhdl/translate/trans-chap7.adb b/src/vhdl/translate/trans-chap7.adb index 06d5e6ad2..f65d02012 100644 --- a/src/vhdl/translate/trans-chap7.adb +++ b/src/vhdl/translate/trans-chap7.adb @@ -3774,6 +3774,7 @@ package body Trans.Chap7 is Get_Ortho_Type (Expr_Type, Mode_Value); Val : Iir_Int64; begin + -- Get the value now, as it may generate a constraint_error. Val := Get_Physical_Value (Expr); return New_Lit (New_Signed_Literal (Otype, Integer_64 (Val))); exception |