diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2011-01-09 15:37:47 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2011-01-09 15:37:47 +0000 |
commit | 32df61aee46663b8813d3e620d947c24b9f6d634 (patch) | |
tree | 7073e7c8d0f79c5f589d5e321cebea3799e98e12 /gcc/fortran/resolve.c | |
parent | 8df6219395528dafbec01a93e2c0da388112fd12 (diff) | |
download | gcc-32df61aee46663b8813d3e620d947c24b9f6d634.zip gcc-32df61aee46663b8813d3e620d947c24b9f6d634.tar.gz gcc-32df61aee46663b8813d3e620d947c24b9f6d634.tar.bz2 |
re PR fortran/38536 (ICE with C_LOC in resolve.c due to not properly going through expr->ref)
2011-01-09 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/38536
* resolve.c (is_scalar_expr_ptr): For a substring reference,
use gfc_dep_compare_expr to compare start and end expession.
Add FIXME for using gfc_deb_compare_expr elsewhere.
2011-01-09 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/38536
* gfortran.dg/iso_c_binding_c_loc_char_1.f03: New test.
From-SVN: r168614
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index fec84cc..b86c430 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2567,21 +2567,11 @@ is_scalar_expr_ptr (gfc_expr *expr) switch (ref->type) { case REF_SUBSTRING: - if (ref->u.ss.length != NULL - && ref->u.ss.length->length != NULL - && ref->u.ss.start - && ref->u.ss.start->expr_type == EXPR_CONSTANT - && ref->u.ss.end - && ref->u.ss.end->expr_type == EXPR_CONSTANT) - { - start = (int) mpz_get_si (ref->u.ss.start->value.integer); - end = (int) mpz_get_si (ref->u.ss.end->value.integer); - if (end - start + 1 != 1) - retval = FAILURE; - } - else - retval = FAILURE; + if (ref->u.ss.start == NULL || ref->u.ss.end == NULL + || gfc_dep_compare_expr (ref->u.ss.start, ref->u.ss.end) != 0) + retval = FAILURE; break; + case REF_ARRAY: if (ref->u.ar.type == AR_ELEMENT) retval = SUCCESS; @@ -2610,7 +2600,8 @@ is_scalar_expr_ptr (gfc_expr *expr) { /* We have constant lower and upper bounds. If the difference between is 1, it can be considered a - scalar. */ + scalar. + FIXME: Use gfc_dep_compare_expr instead. */ start = (int) mpz_get_si (ref->u.ar.as->lower[0]->value.integer); end = (int) mpz_get_si |