tree-sra.c (build_reconstructed_reference): Return NULL_TREE instead of NULL.

* tree-sra.c (build_reconstructed_reference): Return NULL_TREE instead
	of NULL.  Add guard for broken VIEW_CONVERT_EXPRs.

From-SVN: r274576
This commit is contained in:
Eric Botcazou 2019-08-16 16:00:25 +00:00 committed by Eric Botcazou
parent dc139eb184
commit d83a4cf15d
5 changed files with 49 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2019-08-16 Eric Botcazou <ebotcazou@adacore.com>
* tree-sra.c (build_reconstructed_reference): Return NULL_TREE instead
of NULL. Add guard for broken VIEW_CONVERT_EXPRs.
2019-08-16 Martin Sebor <msebor@redhat.com>
* tree.def (TYPE_SIZE): Clarify.

View File

@ -1,3 +1,7 @@
2019-08-16 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt81.ad[sb]: New test.
2019-08-16 Martin Sebor <msebor@redhat.com>
PR testsuite/91458

View File

@ -0,0 +1,20 @@
-- { dg-do compile }
-- { dg-options "-O -gnatws" }
with Unchecked_Conversion;
package body Opt81 is
procedure Copy (From, To : Rec) is
Len : constant Natural := From.A.all'Length;
subtype Fixed_String is String (1 .. Len);
type Fixed_String_Access is access Fixed_String;
function To_Fixed is new
Unchecked_Conversion (Source => String_Access,
Target => Fixed_String_Access);
S : Fixed_String_Access := To_Fixed (To.A);
begin
S (1 .. Len) := From.A.all;
end;
end Opt81;

View File

@ -0,0 +1,15 @@
package Opt81 is
type String_Access is access String;
type Rec is record
A : String_Access;
end record;
for Rec use record
A at 0 range 0 .. (Standard'Word_Size - 1);
end record;
procedure Copy(From, To : Rec);
end Opt81;

View File

@ -1812,11 +1812,15 @@ build_reconstructed_reference (location_t, tree base, struct access *model)
while (!types_compatible_p (TREE_TYPE (expr), TREE_TYPE (base)))
{
if (!handled_component_p (expr))
return NULL;
return NULL_TREE;
prev_expr = expr;
expr = TREE_OPERAND (expr, 0);
}
/* Guard against broken VIEW_CONVERT_EXPRs... */
if (!prev_expr)
return NULL_TREE;
TREE_OPERAND (prev_expr, 0) = base;
tree ref = unshare_expr (model->expr);
TREE_OPERAND (prev_expr, 0) = expr;