aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2015-10-21 21:40:05 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2015-10-21 21:40:05 +0000
commit44f92b59c2785eb9a77c04baf7b442416f2c2dce (patch)
tree7c9a5887c761c6e53bb17c254c94b09e5d6d5272
parentf9badf7134ba51f5a114d58c10e61cb1acd83997 (diff)
downloadgcc-44f92b59c2785eb9a77c04baf7b442416f2c2dce.zip
gcc-44f92b59c2785eb9a77c04baf7b442416f2c2dce.tar.gz
gcc-44f92b59c2785eb9a77c04baf7b442416f2c2dce.tar.bz2
re PR fortran/67939 (ICE on using data with negative substring range)
2015-10-21 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/67939 * data.c (create_character_initializer): Deal with zero length string. 2015-10-21 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/67939 * gfortran.dg/pr67939.f90: New test. From-SVN: r229153
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/data.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr67939.f9021
4 files changed, 48 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 44c60fa..399dc57 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-21 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/67939
+ * data.c (create_character_initializer): Deal with zero length string.
+
2015-10-19 Steven G. Kargl <kargl@gcc.gnu.org>
* resolve.c (gfc_verify_binding_labels): Check for NULL pointer.
diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c
index ef9101b..07ca6ad 100644
--- a/gcc/fortran/data.c
+++ b/gcc/fortran/data.c
@@ -104,7 +104,7 @@ static gfc_expr *
create_character_initializer (gfc_expr *init, gfc_typespec *ts,
gfc_ref *ref, gfc_expr *rvalue)
{
- int len, start, end;
+ int len, start, end, tlen;
gfc_char_t *dest;
bool alloced_init = false;
@@ -162,12 +162,22 @@ create_character_initializer (gfc_expr *init, gfc_typespec *ts,
else
len = rvalue->value.character.length;
- if (len > end - start)
+ tlen = end - start;
+ if (len > tlen)
{
- gfc_warning_now (0, "Initialization string starting at %L was "
- "truncated to fit the variable (%d/%d)",
- &rvalue->where, end - start, len);
- len = end - start;
+ if (tlen < 0)
+ {
+ gfc_warning_now (0, "Unused initialization string at %L because "
+ "variable has zero length", &rvalue->where);
+ len = 0;
+ }
+ else
+ {
+ gfc_warning_now (0, "Initialization string at %L was truncated to "
+ "fit the variable (%d/%d)", &rvalue->where,
+ tlen, len);
+ len = tlen;
+ }
}
if (rvalue->ts.type == BT_HOLLERITH)
@@ -181,7 +191,7 @@ create_character_initializer (gfc_expr *init, gfc_typespec *ts,
len * sizeof (gfc_char_t));
/* Pad with spaces. Substrings will already be blanked. */
- if (len < end - start && ref == NULL)
+ if (len < tlen && ref == NULL)
gfc_wide_memset (&dest[start + len], ' ', end - (start + len));
if (rvalue->ts.type == BT_HOLLERITH)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cda024d..c6cc423 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-21 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/67939
+ * gfortran.dg/pr67939.f90: New test.
+
2015-10-21 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>
diff --git a/gcc/testsuite/gfortran.dg/pr67939.f90 b/gcc/testsuite/gfortran.dg/pr67939.f90
new file mode 100644
index 0000000..d1694bb
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr67939.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! PR fortran/67939
+! Original code by Gerhard Steinmetz
+! gerhard dot steinmetz dot fortran at t-online dot de
+!
+program p
+ character(100) :: x
+ data x(998:99) /'ab'/ ! { dg-warning "Unused initialization string" }
+ call a
+end
+
+subroutine a
+ character(2) :: x
+ data x(:-1) /'ab'/ ! { dg-warning "Unused initialization string" }
+end subroutine a
+
+subroutine b
+ character(8) :: x
+ data x(3:1) /'abc'/ ! { dg-warning "Unused initialization string" }
+end subroutine b
+