aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-08-16 16:00:25 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-08-16 16:00:25 +0000
commitd83a4cf15dd544bbdcbe205217785b293dffd028 (patch)
treedabd78b240dc4fd5668aad10f42d5563101a0a15 /gcc
parentdc139eb184d5361147ac32c290a074a3bc28e29e (diff)
downloadgcc-d83a4cf15dd544bbdcbe205217785b293dffd028.zip
gcc-d83a4cf15dd544bbdcbe205217785b293dffd028.tar.gz
gcc-d83a4cf15dd544bbdcbe205217785b293dffd028.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/opt81.adb20
-rw-r--r--gcc/testsuite/gnat.dg/opt81.ads15
-rw-r--r--gcc/tree-sra.c6
5 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5badf3..e14ab3d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9f00d1c..9b7eff9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gnat.dg/opt81.adb b/gcc/testsuite/gnat.dg/opt81.adb
new file mode 100644
index 0000000..057d846
--- /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 0000000..743dcc2
--- /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 03c1a2a..1505ce5 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;