OSDN Git Service

2011-10-16 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / lib-xref.adb
index e9de179..83a06e4 100644 (file)
@@ -391,6 +391,10 @@ package body Lib.Xref is
       Kind : Entity_Kind;
       --  If Formal is non-Empty, then its Ekind, otherwise E_Void
 
+      function Get_Through_Renamings (E : Entity_Id) return Entity_Id;
+      --  Get the enclosing entity through renamings, which may come from
+      --  source or from the translation of generic instantiations.
+
       function Is_On_LHS (Node : Node_Id) return Boolean;
       --  Used to check if a node is on the left hand side of an assignment.
       --  The following cases are handled:
@@ -412,6 +416,22 @@ package body Lib.Xref is
       --  exceptions where we do not want to set this flag, see body for
       --  details of these exceptional cases.
 
+      ---------------------------
+      -- Get_Through_Renamings --
+      ---------------------------
+
+      function Get_Through_Renamings (E : Entity_Id) return Entity_Id is
+         Result : Entity_Id := E;
+      begin
+         while Present (Result)
+           and then Is_Object (Result)
+           and then Present (Renamed_Object (Result))
+         loop
+            Result := Get_Enclosing_Object (Renamed_Object (Result));
+         end loop;
+         return Result;
+      end Get_Through_Renamings;
+
       ---------------
       -- Is_On_LHS --
       ---------------
@@ -955,11 +975,8 @@ package body Lib.Xref is
          --  the renaming, which is needed to compute a valid set of effects
          --  (reads, writes) for the enclosing subprogram.
 
-         if Alfa_Mode
-           and then Is_Object (Ent)
-           and then Present (Renamed_Object (Ent))
-         then
-            Ent := Get_Enclosing_Object (Renamed_Object (Ent));
+         if Alfa_Mode then
+            Ent := Get_Through_Renamings (Ent);
 
             --  If no enclosing object, then it could be a reference to any
             --  location not tracked individually, like heap-allocated data.
@@ -993,8 +1010,17 @@ package body Lib.Xref is
          if Alfa_Mode then
             Ref_Scope := Alfa.Enclosing_Subprogram_Or_Package (N);
             Ent_Scope := Alfa.Enclosing_Subprogram_Or_Package (Ent);
-            Ent_Scope_File := Get_Source_Unit (Ent_Scope);
 
+            --  Since we are reaching through renamings in Alfa mode, we may
+            --  end up with standard constants. Ignore those.
+
+            if Sloc (Ent_Scope) <= Standard_Location
+              or else Def <= Standard_Location
+            then
+               return;
+            end if;
+
+            Ent_Scope_File := Get_Source_Unit (Ent_Scope);
          else
             Ref_Scope := Empty;
             Ent_Scope := Empty;
@@ -1884,7 +1910,9 @@ package body Lib.Xref is
 
                      Op := Ultimate_Alias (Old_E);
 
-                  --  Normal case of no alias present
+                  --  Normal case of no alias present. We omit generated
+                  --  primitives like tagged equality, that have no source
+                  --  representation.
 
                   else
                      Op := Old_E;
@@ -1892,6 +1920,7 @@ package body Lib.Xref is
 
                   if Present (Op)
                     and then Sloc (Op) /= Standard_Location
+                    and then Comes_From_Source (Op)
                   then
                      declare
                         Loc      : constant Source_Ptr := Sloc (Op);