diff options
author | pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-23 22:16:38 +0000 |
---|---|---|
committer | pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-23 22:16:38 +0000 |
commit | ebc8fa5df8e5166f347818f0fefb512e015a51d0 (patch) | |
tree | 7aa1bb5db6f4fe02eac84562f3fded9ea787a940 /gcc/fortran | |
parent | 6829a7fd6e9239dca2f21f904d95290d174358a2 (diff) | |
download | gcc-ebc8fa5df8e5166f347818f0fefb512e015a51d0.tar.gz |
2005-10-23 Andrew Pinski <pinskia@physics.uc.edu>
PR fortran/23635
* gfortran.dg/ichar_1.f90: Add tests for derived types.
2005-10-23 Andrew Pinski <pinskia@physics.uc.edu>
PR fortran/23635
* check.c (gfc_check_ichar_iachar): Move the code around so
that the check on the length is after check for
references.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105829 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/check.c | 45 |
2 files changed, 32 insertions, 20 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 567248af204..095695f3bf0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-10-23 Andrew Pinski <pinskia@physics.uc.edu> + + PR fortran/23635 + * check.c (gfc_check_ichar_iachar): Move the code around so + that the check on the length is after check for + references. + 2005-10-23 Asher Langton <langton2@llnl.gov> * decl.c (match_type_spec): Add a BYTE type as an extension. diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 8c9f5294e16..e2e95017cfc 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -929,16 +929,7 @@ gfc_check_ichar_iachar (gfc_expr * c) if (type_check (c, 0, BT_CHARACTER) == FAILURE) return FAILURE; - /* Check that the argument is length one. Non-constant lengths - can't be checked here, so assume thay are ok. */ - if (c->ts.cl && c->ts.cl->length) - { - /* If we already have a length for this expression then use it. */ - if (c->ts.cl->length->expr_type != EXPR_CONSTANT) - return SUCCESS; - i = mpz_get_si (c->ts.cl->length->value.integer); - } - else if (c->expr_type == EXPR_VARIABLE || c->expr_type == EXPR_SUBSTRING) + if (c->expr_type == EXPR_VARIABLE || c->expr_type == EXPR_SUBSTRING) { gfc_expr *start; gfc_expr *end; @@ -952,18 +943,32 @@ gfc_check_ichar_iachar (gfc_expr * c) gcc_assert (ref == NULL || ref->type == REF_SUBSTRING); if (!ref) - return SUCCESS; - - start = ref->u.ss.start; - end = ref->u.ss.end; + { + /* Check that the argument is length one. Non-constant lengths + can't be checked here, so assume thay are ok. */ + if (c->ts.cl && c->ts.cl->length) + { + /* If we already have a length for this expression then use it. */ + if (c->ts.cl->length->expr_type != EXPR_CONSTANT) + return SUCCESS; + i = mpz_get_si (c->ts.cl->length->value.integer); + } + else + return SUCCESS; + } + else + { + start = ref->u.ss.start; + end = ref->u.ss.end; - gcc_assert (start); - if (end == NULL || end->expr_type != EXPR_CONSTANT - || start->expr_type != EXPR_CONSTANT) - return SUCCESS; + gcc_assert (start); + if (end == NULL || end->expr_type != EXPR_CONSTANT + || start->expr_type != EXPR_CONSTANT) + return SUCCESS; - i = mpz_get_si (end->value.integer) + 1 - - mpz_get_si (start->value.integer); + i = mpz_get_si (end->value.integer) + 1 + - mpz_get_si (start->value.integer); + } } else return SUCCESS; |