aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2009-04-26 19:27:50 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2009-04-26 19:27:50 +0000
commit5846213b872f73949db3a85c7da529aa8941dd99 (patch)
tree627a6547015316bec10ca0cb4869fd5c4695b060 /gcc
parent17c665a9974c98d2835680cdc6fd92408f1c87f3 (diff)
downloadgcc-5846213b872f73949db3a85c7da529aa8941dd99.zip
gcc-5846213b872f73949db3a85c7da529aa8941dd99.tar.gz
gcc-5846213b872f73949db3a85c7da529aa8941dd99.tar.bz2
re PR fortran/39893 ([4.4] gfortran ICE on invalid program)
2009-04-26 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/39893 * gfortran.dg/assumed_charlen_dummy.f90: New Test. 2009-04-26 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/39893 fortran/data.c (gfc_assign_data_value): If the lvalue is an assumed character length entity in a data statement, then return FAILURE to prevent segmentation fault. From-SVN: r146816
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/data.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/assumed_charlen_dummy.f9010
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6c2a442..daafc06 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2009-04-26 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/39893
+ fortran/data.c (gfc_assign_data_value): If the lvalue is an
+ assumed character length entity in a data statement, then
+ return FAILURE to prevent segmentation fault.
+
2009-04-26 Jakub Jelinek <jakub@redhat.com>
* trans-decl.c: Include pointer-set.h.
diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c
index 09dde15..5829c7f 100644
--- a/gcc/fortran/data.c
+++ b/gcc/fortran/data.c
@@ -416,7 +416,11 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index)
}
if (ref || last_ts->type == BT_CHARACTER)
- expr = create_character_intializer (init, last_ts, ref, rvalue);
+ {
+ if (lvalue->ts.cl->length == NULL && !(ref && ref->u.ss.length != NULL))
+ return FAILURE;
+ expr = create_character_intializer (init, last_ts, ref, rvalue);
+ }
else
{
/* Overwriting an existing initializer is non-standard but usually only
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c9f21cf..2c080fa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-04-26 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/39893
+ * gfortran.dg/assumed_charlen_dummy.f90: New Test.
+
2009-04-26 Jakub Jelinek <jakub@redhat.com>
PR inline-asm/39543
diff --git a/gcc/testsuite/gfortran.dg/assumed_charlen_dummy.f90 b/gcc/testsuite/gfortran.dg/assumed_charlen_dummy.f90
new file mode 100644
index 0000000..04f0b9f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assumed_charlen_dummy.f90
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! Test the fix for PR fortran/39893.
+! Original testcase provided by Deji Akingunola.
+! Reduced testcase provided by Dominique d'Humieres.
+!
+ SUBROUTINE XAUTOGET()
+ CHARACTER*(*) DICBA ! { dg-error "Entity with assumed character" }
+ DATA DICBA /"CLIP" /
+ RETURN
+ END