diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2005-11-21 16:05:58 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2005-11-21 16:05:58 +0000 |
commit | b95605fb0c2052fcd1c2239acaa58748c9efc687 (patch) | |
tree | fa5a3b80e00abb2726bdd692a6e324db16c02eb7 /gcc | |
parent | 078152a256a43a888048dcec5e2c6d503db5b75c (diff) | |
download | gcc-b95605fb0c2052fcd1c2239acaa58748c9efc687.zip gcc-b95605fb0c2052fcd1c2239acaa58748c9efc687.tar.gz gcc-b95605fb0c2052fcd1c2239acaa58748c9efc687.tar.bz2 |
re PR fortran/24223 (Gfortran crashes in two places)
2005-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24223
* resolve.c (resolve_contained_fntype) Error if an internal
function is assumed character length.
PR fortran/24705
* trans-decl.c (gfc_create_module_variable) Skip ICE in
when backend decl has been built and the symbol is marked
as being in an equivalence statement.
2005-11-21 Paul Thomas <pault@gcc.gnu.org
PR fortran/24223
* gfortran.dg/substring_equivalence.f90: New test.
PR fortran/24705
* gfortran.dg/auto_internal_assumed.f90: New test.
From-SVN: r107310
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 13 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rwxr-xr-x | gcc/testsuite/gfortran.dg/auto_internal_assumed.f90 | 13 | ||||
-rwxr-xr-x | gcc/testsuite/gfortran.dg/substring_equivalence.f90 | 8 |
6 files changed, 55 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1d7f9cf7..355430d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2005-11-21 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/24223 + * resolve.c (resolve_contained_fntype) Error if an internal + function is assumed character length. + + PR fortran/24705 + * trans-decl.c (gfc_create_module_variable) Skip ICE in + when backend decl has been built and the symbol is marked + as being in an equivalence statement. + 2005-11-20 Toon Moene <toon@moene.indiv.nluug.nl> * invoke.texi: Remove superfluous @item. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 0f17585..cb9c65b 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -294,6 +294,19 @@ resolve_contained_fntype (gfc_symbol * sym, gfc_namespace * ns) sym->attr.untyped = 1; } } + + /*Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character type, + lists the only ways a character length value of * can be used: dummy arguments + of proceedures, named constants, and function results in external functions. + Internal function results are not on that list; ergo, not permitted. */ + + if (sym->ts.type == BT_CHARACTER) + { + gfc_charlen *cl = sym->ts.cl; + if (!cl || !cl->length) + gfc_error ("Character-valued internal function '%s' at %L must " + "not be assumed length", sym->name, &sym->declared_at); + } } diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 04f037b..37e9db8 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -2366,7 +2366,8 @@ gfc_create_module_variable (gfc_symbol * sym) return; /* Equivalenced variables arrive here after creation. */ - if (sym->backend_decl && sym->equiv_built) + if (sym->backend_decl + && (sym->equiv_built || sym->attr.in_equivalence)) return; if (sym->backend_decl) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 045cf0a..5dd8d06 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2005-11-21 Paul Thomas <pault@gcc.gnu.org + + PR fortran/24223 + * gfortran.dg/substring_equivalence.f90: New test. + + PR fortran/24705 + * gfortran.dg/auto_internal_assumed.f90: New test. + 2005-11-21 Uros Bizjak <uros@kss-loka.si> * gcc.dg/fold-div-2.c: New test. diff --git a/gcc/testsuite/gfortran.dg/auto_internal_assumed.f90 b/gcc/testsuite/gfortran.dg/auto_internal_assumed.f90 new file mode 100755 index 0000000..c053216 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_internal_assumed.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! Test fix of PR24705 - ICE on assumed character length +! internal function. +! +character (6) :: c + c = f1 () ! { dg-error "must not be assumed length" } + if (c .ne. 'abcdef') call abort +contains + function f1 () + character (*) :: f1 + f1 = 'abcdef' + end function f1 +end
\ No newline at end of file diff --git a/gcc/testsuite/gfortran.dg/substring_equivalence.f90 b/gcc/testsuite/gfortran.dg/substring_equivalence.f90 new file mode 100755 index 0000000..622e1fc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substring_equivalence.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! Tests fix for PR24223 - ICE on equivalence staement. +! +module FLAGS + character(len=5) :: Encodings + character :: at, dev + equivalence ( encodings(1:1),at ), ( encodings(2:2),dev) +end module FLAGS |