diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr77959.f90 | 16 |
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. @@ -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 |