From 68379e7e41aa07de23978535e1f1dc82986e0bfc Mon Sep 17 00:00:00 2001
From: Tristan Gingold
Date: Tue, 20 Jan 2015 15:20:13 +0100
Subject: sem_names: extract Free_Old_Entity_Name (from Finish_Sem_Name).  Add
 comments.

---
 src/vhdl/sem_names.adb             | 32 ++++++++++++++++++++++----------
 src/vhdl/translate/trans-chap7.adb |  1 +
 2 files changed, 23 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/vhdl/sem_names.adb b/src/vhdl/sem_names.adb
index 756066c..87f9402 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 06d5e6a..f65d020 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
-- 
cgit