diff options
author | Craig Burley <craig@jcb-sc.com> | 1999-05-15 15:46:16 +0000 |
---|---|---|
committer | Craig Burley <burley@gcc.gnu.org> | 1999-05-15 11:46:16 -0400 |
commit | ff852b44545f35144c7f30d9f1216df05cb39b55 (patch) | |
tree | e34430028463cc12d8cccfae35f3b14838e3bfdf /gcc/f/expr.c | |
parent | 1907bb7c749b14c8e7636a36615e69b14e66a8b6 (diff) | |
download | gcc-ff852b44545f35144c7f30d9f1216df05cb39b55.zip gcc-ff852b44545f35144c7f30d9f1216df05cb39b55.tar.gz gcc-ff852b44545f35144c7f30d9f1216df05cb39b55.tar.bz2 |
fix INTEGER*8 subscripts, add -fflatten-arrays
From-SVN: r26948
Diffstat (limited to 'gcc/f/expr.c')
-rw-r--r-- | gcc/f/expr.c | 61 |
1 files changed, 55 insertions, 6 deletions
diff --git a/gcc/f/expr.c b/gcc/f/expr.c index 83838c7..67b3765 100644 --- a/gcc/f/expr.c +++ b/gcc/f/expr.c @@ -12267,7 +12267,6 @@ again: /* :::::::::::::::::::: */ case FFEEXPR_contextINDEX_: case FFEEXPR_contextSFUNCDEFINDEX_: - case FFEEXPR_contextRETURN: if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0))) break; switch ((expr == NULL) ? FFEINFO_basictypeNONE @@ -12290,7 +12289,6 @@ again: /* :::::::::::::::::::: */ break; } /* Fall through. */ - case FFEINFO_basictypeINTEGER: case FFEINFO_basictypeHOLLERITH: case FFEINFO_basictypeTYPELESS: error = FALSE; @@ -12299,6 +12297,11 @@ again: /* :::::::::::::::::::: */ FFEEXPR_contextLET); break; + case FFEINFO_basictypeINTEGER: + /* Specifically, allow INTEGER(KIND=2), aka INTEGER*8, through + unmolested. Leave it to downstream to handle kinds. */ + break; + default: error = TRUE; break; @@ -12306,6 +12309,44 @@ again: /* :::::::::::::::::::: */ break; /* expr==NULL ok for substring; element case caught by callback. */ + case FFEEXPR_contextRETURN: + if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0))) + break; + switch ((expr == NULL) ? FFEINFO_basictypeNONE + : ffeinfo_basictype (info)) + { + case FFEINFO_basictypeNONE: + error = FALSE; + break; + + case FFEINFO_basictypeLOGICAL: + expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL, + FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE, + FFEEXPR_contextLET); + /* Fall through. */ + case FFEINFO_basictypeREAL: + case FFEINFO_basictypeCOMPLEX: + if (ffe_is_pedantic ()) + { + error = TRUE; + break; + } + /* Fall through. */ + case FFEINFO_basictypeINTEGER: + case FFEINFO_basictypeHOLLERITH: + case FFEINFO_basictypeTYPELESS: + error = FALSE; + expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER, + FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE, + FFEEXPR_contextLET); + break; + + default: + error = TRUE; + break; + } + break; + case FFEEXPR_contextDO: if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0))) break; @@ -18602,7 +18643,8 @@ ffeexpr_token_elements_ (ffelexToken ft, ffebld expr, ffelexToken t) ffeexpr_stack_->immediate = FALSE; break; } - if (ffebld_op (expr) == FFEBLD_opCONTER) + if (ffebld_op (expr) == FFEBLD_opCONTER + && ffebld_kindtype (expr) == FFEINFO_kindtypeINTEGERDEFAULT) { val = ffebld_constant_integerdefault (ffebld_conter (expr)); @@ -18913,26 +18955,33 @@ ffeexpr_token_substring_1_ (ffelexToken ft, ffebld last, ffelexToken t) ffetargetIntegerDefault last_val; ffetargetCharacterSize size; ffetargetCharacterSize strop_size_max; + bool first_known; string = ffeexpr_stack_->exprstack; strop = string->u.operand; info = ffebld_info (strop); - if ((first == NULL) || (ffebld_op (first) == FFEBLD_opCONTER)) + if (first == NULL + || (ffebld_op (first) == FFEBLD_opCONTER + && ffebld_kindtype (first) == FFEINFO_kindtypeINTEGERDEFAULT)) { /* The starting point is known. */ first_val = (first == NULL) ? 1 : ffebld_constant_integerdefault (ffebld_conter (first)); + first_known = TRUE; } else { /* Assume start of the entity. */ first_val = 1; + first_known = FALSE; } - if ((last != NULL) && (ffebld_op (last) == FFEBLD_opCONTER)) + if (last != NULL + && (ffebld_op (last) == FFEBLD_opCONTER + && ffebld_kindtype (last) == FFEINFO_kindtypeINTEGERDEFAULT)) { /* The ending point is known. */ last_val = ffebld_constant_integerdefault (ffebld_conter (last)); - if ((first == NULL) || (ffebld_op (first) == FFEBLD_opCONTER)) + if (first_known) { /* The beginning point is a constant. */ if (first_val <= last_val) size = last_val - first_val + 1; |