aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/lib-xref.adb
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2017-09-06 12:01:58 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2017-09-06 12:01:58 +0200
commit9fb1e654f463fe3e30dccee2b6622c95edcf5d25 (patch)
treed3b790355af00b0aa6795455db68661ca27241ea /gcc/ada/lib-xref.adb
parent68ec1a494cc8c24b59a99294f86991523cd9832c (diff)
downloadgcc-9fb1e654f463fe3e30dccee2b6622c95edcf5d25.zip
gcc-9fb1e654f463fe3e30dccee2b6622c95edcf5d25.tar.gz
gcc-9fb1e654f463fe3e30dccee2b6622c95edcf5d25.tar.bz2
[multiple changes]
2017-09-06 Yannick Moy <moy@adacore.com> * treepr.adb (Print_Entity_Info): Do not print empty Elist. 2017-09-06 Yannick Moy <moy@adacore.com> * inline.adb (Can_Be_Inlined_In_GNATprove_Mode): Do not consider calls to subprograms in other units as possibly inlined. 2017-09-06 Ed Schonberg <schonberg@adacore.com> * freeze.adb (Freeze_Entity): For a derived type that has no explicit delayed aspects but may inherit delayed aspects from its parent type, analyze aspect at freeze point for proper capture of an inherited aspect. 2017-09-06 Arnaud Charlet <charlet@adacore.com> * lib-xref.adb (Get_Through_Renamings): Get through subprogram renamings; also, avoid repeated calls to Renamed_Object when getting through object renamings. 2017-09-06 Ed Schonberg <schonberg@adacore.com> * sem_ch3.adb (Array_Type_Declaration): Handle properly an array type declaration in a private part, when an index is a subtype indication of a discrete type with a private partial view. 2017-09-06 Javier Miranda <miranda@adacore.com> * exp_ch4.adb (Expand_Modular_Op): Force generating temporary to improve the generated code. 2017-09-06 Tristan Gingold <gingold@adacore.com> * s-fatgen.adb: Minor typo fix in comment. 2017-09-06 Ed Schonberg <schonberg@adacore.com> * exp_ch5.adb (Make_Field_Assign): If the type of the right-hand side has stored constraint, use its values (except for those that are renamings of parent discriminants) to produce additional assignments for the discriminants of the left-hand side, which are invisible in the righ-hand side and not retrievable as selected components. 2017-09-06 Ed Schonberg <schonberg@adacore.com> * sem_util.adb (Needs_One_Formal): The first formal of such a function must be a controlling formal, so that Obj.F (X, Y) can have the interpretation F(Obj)(X, Y). * sem_util.ads: Clarify documentation. 2017-09-06 Eric Botcazou <ebotcazou@adacore.com> * table.ads, table.adb: Restore original implementation. * namet.h (Names_Ptr): Adjust back. (Name_Chars_Ptr): Likewise. * uintp.h (Uints_Ptr): Likewise. (Udigits_Ptr): Likewise. * g-table.ads: Remove pragma Compiler_Unit_Warning. * par_sco.adb: Do not with GNAT.Table and use Table consistently. * scos.ads: Replace GNAT.Table with Table and adjust instantiations. * spark_xrefs.ads: Likewise. * scos.h: Undo latest changes. 2017-09-06 Ed Schonberg <schonberg@adacore.com> * sem_ch12.adb (Analyze_Subprogram_Instantiation): Propagate No_Return flag to instance if pragma applies to generic unit. This must be done explicitly because the pragma does not appear directly in the generic declaration (unlike the corresponding aspect specification). From-SVN: r251765
Diffstat (limited to 'gcc/ada/lib-xref.adb')
-rw-r--r--gcc/ada/lib-xref.adb58
1 files changed, 49 insertions, 9 deletions
diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb
index bcb1b6c..d40f0d4 100644
--- a/gcc/ada/lib-xref.adb
+++ b/gcc/ada/lib-xref.adb
@@ -413,17 +413,57 @@ package body Lib.Xref is
---------------------------
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;
+ case Ekind (E) is
+ -- For subprograms we just need to check once if they are have a
+ -- Renamed_Entity, because Renamed_Entity is set transitively.
+
+ when Subprogram_Kind =>
+ declare
+ Renamed : constant Entity_Id := Renamed_Entity (E);
+
+ begin
+ if Present (Renamed) then
+ return Renamed;
+ else
+ return E;
+ end if;
+ end;
+
+ -- For objects we need to repeatedly call Renamed_Object, because
+ -- it is not transitive.
+
+ when Object_Kind =>
+ declare
+ Obj : Entity_Id := E;
+
+ begin
+ loop
+ pragma Assert (Present (Obj));
+
+ declare
+ Renamed : constant Entity_Id := Renamed_Object (Obj);
+ begin
+ if Present (Renamed) then
+ Obj := Get_Enclosing_Object (Renamed);
+
+ -- The renamed expression denotes a non-object,
+ -- e.g. function call, slicing of a function call,
+ -- pointer dereference, etc.
+ if No (Obj) then
+ return Empty;
+ end if;
+ else
+ return Obj;
+ end if;
+ end;
+ end loop;
+ end;
+
+ when others =>
+ return E;
- return Result;
+ end case;
end Get_Through_Renamings;
---------------