From d83a4cf15dd544bbdcbe205217785b293dffd028 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 16 Aug 2019 16:00:25 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/opt81.adb | 20 ++++++++++++++++++++ gcc/testsuite/gnat.dg/opt81.ads | 15 +++++++++++++++ gcc/tree-sra.c | 6 +++++- 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gnat.dg/opt81.adb create mode 100644 gcc/testsuite/gnat.dg/opt81.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5badf3ff1e..e14ab3d7c91 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-08-16 Eric Botcazou + + * tree-sra.c (build_reconstructed_reference): Return NULL_TREE instead + of NULL. Add guard for broken VIEW_CONVERT_EXPRs. + 2019-08-16 Martin Sebor * tree.def (TYPE_SIZE): Clarify. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f00d1ceab7..9b7eff98811 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-08-16 Eric Botcazou + + * gnat.dg/opt81.ad[sb]: New test. + 2019-08-16 Martin Sebor PR testsuite/91458 diff --git a/gcc/testsuite/gnat.dg/opt81.adb b/gcc/testsuite/gnat.dg/opt81.adb new file mode 100644 index 00000000000..057d846e5cd --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt81.adb @@ -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; diff --git a/gcc/testsuite/gnat.dg/opt81.ads b/gcc/testsuite/gnat.dg/opt81.ads new file mode 100644 index 00000000000..743dcc2ef10 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt81.ads @@ -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; diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 03c1a2ae9e9..1505ce57d30 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -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; -- 2.30.2