diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2017-11-09 19:12:41 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2017-11-09 19:12:41 +0000 |
commit | 6e307219b955b80e6669acadae72c183f0eda248 (patch) | |
tree | 4afaf01334bb2ba941218b9e57539348c63c514c | |
parent | 1fb84d5b0a2dcdb8fd5aa39680df651811d55fbb (diff) | |
download | gcc-6e307219b955b80e6669acadae72c183f0eda248.zip gcc-6e307219b955b80e6669acadae72c183f0eda248.tar.gz gcc-6e307219b955b80e6669acadae72c183f0eda248.tar.bz2 |
re PR fortran/78619 (ICE in copy_reference_ops_from_ref, at tree-ssa-sccvn.c:889)
2017-11-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78619
* check.c (same_type_check): Introduce a new argument 'assoc'
with default value false. If this is true, use the symbol type
spec of BT_PROCEDURE expressions.
(gfc_check_associated): Set 'assoc' true in the call to
'same_type_check'.
2017-11-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78619
* gfortran.dg/pr78619.f90: New test.
From-SVN: r254605
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/check.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr78619.f90 | 21 |
4 files changed, 48 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9be20c8..7d01627 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2017-11-09 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/78619 + * check.c (same_type_check): Introduce a new argument 'assoc' + with default value false. If this is true, use the symbol type + spec of BT_PROCEDURE expressions. + (gfc_check_associated): Set 'assoc' true in the call to + 'same_type_check'. + 2017-11-09 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/78814 diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 914dbf9..a147449 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -427,15 +427,22 @@ less_than_bitsize2 (const char *arg1, gfc_expr *expr1, const char *arg2, /* Make sure two expressions have the same type. */ static bool -same_type_check (gfc_expr *e, int n, gfc_expr *f, int m) +same_type_check (gfc_expr *e, int n, gfc_expr *f, int m, bool assoc = false) { gfc_typespec *ets = &e->ts; gfc_typespec *fts = &f->ts; - if (e->ts.type == BT_PROCEDURE && e->symtree->n.sym) - ets = &e->symtree->n.sym->ts; - if (f->ts.type == BT_PROCEDURE && f->symtree->n.sym) - fts = &f->symtree->n.sym->ts; + if (assoc) + { + /* Procedure pointer component expressions have the type of the interface + procedure. If they are being tested for association with a procedure + pointer (ie. not a component), the type of the procedure must be + determined. */ + if (e->ts.type == BT_PROCEDURE && e->symtree->n.sym) + ets = &e->symtree->n.sym->ts; + if (f->ts.type == BT_PROCEDURE && f->symtree->n.sym) + fts = &f->symtree->n.sym->ts; + } if (gfc_compare_types (ets, fts)) return true; @@ -1002,7 +1009,7 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target) } t = true; - if (!same_type_check (pointer, 0, target, 1)) + if (!same_type_check (pointer, 0, target, 1, true)) t = false; if (!rank_check (target, 0, pointer->rank)) t = false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ee000b..17fa766 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-09 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/78619 + * gfortran.dg/pr78619.f90: New test. + 2017-11-09 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/78814 diff --git a/gcc/testsuite/gfortran.dg/pr78619.f90 b/gcc/testsuite/gfortran.dg/pr78619.f90 new file mode 100644 index 0000000..5fbe185 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr78619.f90 @@ -0,0 +1,21 @@ +! { dg-do compile } +! { dg-options "-Werror -O3" } +! +! Tests the fix for PR78619, in which the recursive use of 'f' at line 13 +! caused an ICE. +! +! Contributed by Gerhard Steinmetz <gerhard.steinmetz.fortran@t-online.de> +! + print *, g(1.0) ! 'g' is OK +contains + function f(x) result(z) + real :: x, z + z = sign(1.0, f) ! { dg-error "calling itself recursively|must be the same type" } + end + real function g(x) + real :: x + g = -1 + g = -sign(1.0, g) ! This is OK. + end +end +! { dg-message "all warnings being treated as errors" "" { target *-*-* } 0 } |