aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c13
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gfortran.dg/pr77959.f9016
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 63034cd..732ccb2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-10-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/77959
+ * expr.c (expand_expr_real_1) <case CONST_DECL>: For EXPAND_WRITE
+ return a MEM.
+
2016-10-14 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sparc-passes.def: New file.
diff --git a/gcc/expr.c b/gcc/expr.c
index b587da8..28242b2 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -9915,6 +9915,19 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode,
}
case CONST_DECL:
+ if (modifier == EXPAND_WRITE)
+ {
+ /* Writing into CONST_DECL is always invalid, but handle it
+ gracefully. */
+ addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
+ machine_mode address_mode = targetm.addr_space.address_mode (as);
+ op0 = expand_expr_addr_expr_1 (exp, NULL_RTX, address_mode,
+ EXPAND_NORMAL, as);
+ op0 = memory_address_addr_space (mode, op0, as);
+ temp = gen_rtx_MEM (mode, op0);
+ set_mem_addr_space (temp, as);
+ return temp;
+ }
return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
case REAL_CST:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 25115d4..849c6e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-10-14 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/77959
+ * gfortran.dg/pr77959.f90: New test.
+
DR 1511 - const volatile variables and ODR
* g++.dg/DRs/dr1511-1.C: New test.
* g++.dg/DRs/dr1511-2.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr77959.f90 b/gcc/testsuite/gfortran.dg/pr77959.f90
new file mode 100644
index 0000000..36754a0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr77959.f90
@@ -0,0 +1,16 @@
+! PR middle-end/77959
+! { dg-do compile }
+! { dg-options "-O2" }
+
+program pr77959
+ interface
+ subroutine foo(x) ! { dg-warning "Type mismatch in argument" }
+ real :: x
+ end
+ end interface
+ call foo(1.0)
+end
+subroutine foo(x)
+ complex :: x
+ x = x + 1
+end