From: Eric Botcazou Date: Sun, 13 Nov 2016 18:08:25 +0000 (+0000) Subject: utils2.c (gnat_protect_expr): Also protect only the address if the expression is... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=96826e28ef9a627b82f1d7ccda0906f20dfe96d5;p=gcc.git utils2.c (gnat_protect_expr): Also protect only the address if the expression is the component of a dereference. * gcc-interface/utils2.c (gnat_protect_expr): Also protect only the address if the expression is the component of a dereference. Do not use a reference type for the final temporary reference. From-SVN: r242358 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e498316e291..f896d14820f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2016-11-13 Eric Botcazou + + * gcc-interface/utils2.c (gnat_protect_expr): Also protect only the + address if the expression is the component of a dereference. + Do not use a reference type for the final temporary reference. + 2016-11-13 Eric Botcazou * gcc-interface/Makefile.in (NO_OMIT_ADAFLAGS): Define. diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index c0d831fb1e5..fc6f1b86bdc 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -2586,6 +2586,12 @@ gnat_protect_expr (tree exp) return t; } + /* Likewise if we're indirectly referencing part of something. */ + if (code == COMPONENT_REF + && TREE_CODE (TREE_OPERAND (exp, 0)) == INDIRECT_REF) + return build3 (code, type, gnat_protect_expr (TREE_OPERAND (exp, 0)), + TREE_OPERAND (exp, 1), NULL_TREE); + /* If this is a COMPONENT_REF of a fat pointer, save the entire fat pointer. This may be more efficient, but will also allow us to more easily find the match for the PLACEHOLDER_EXPR. */ @@ -2605,9 +2611,7 @@ gnat_protect_expr (tree exp) /* Otherwise reference, protect the address and dereference. */ return build_unary_op (INDIRECT_REF, type, - save_expr (build_unary_op (ADDR_EXPR, - build_reference_type (type), - exp))); + save_expr (build_unary_op (ADDR_EXPR, NULL_TREE, exp))); } /* This is equivalent to stabilize_reference_1 in tree.c but we take an extra diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee0282c7870..a273920d43b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-11-13 Eric Botcazou + + * gnat.dg/renaming11.ad[sb]: New test. + 2016-11-13 Eric Botcazou * c-c++-common/dump-ada-spec-6.c: New test. diff --git a/gcc/testsuite/gnat.dg/renaming11.adb b/gcc/testsuite/gnat.dg/renaming11.adb new file mode 100644 index 00000000000..c9241c28d82 --- /dev/null +++ b/gcc/testsuite/gnat.dg/renaming11.adb @@ -0,0 +1,12 @@ +-- { dg-do compile } + +package body Renaming11 is + + function F (Arg: Ptr3) return Integer is + V : Ptr1 renames Arg.all.all; + I : Integer renames V.A(1); + begin + return I; + end; + +end Renaming11; diff --git a/gcc/testsuite/gnat.dg/renaming11.ads b/gcc/testsuite/gnat.dg/renaming11.ads new file mode 100644 index 00000000000..d3dda72ede7 --- /dev/null +++ b/gcc/testsuite/gnat.dg/renaming11.ads @@ -0,0 +1,19 @@ +package Renaming11 is + + subtype Index_Type is Integer range 1..10; + + type Arr is array (Index_Type range <>) of Integer; + + type Rec (Min : Index_Type; Max : Index_Type) is record + A : Arr (Min .. Max); + end record; + + type Ptr1 is access Rec; + + type Ptr2 is access Ptr1; + + type Ptr3 is access Ptr2; + + function F (Arg : Ptr3) return Integer; + +end Renaming11;