aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2008-02-29 22:50:25 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2008-02-29 22:50:25 +0000
commit44000dbbe05896777b4781f5c274272c15097861 (patch)
tree6b8d4f59dabb468ef7b4fe96a4195f38a77e215b /gcc
parentc17ee676e55b86d2c9d61b569a8c7e0cd8fb6d4c (diff)
downloadgcc-44000dbbe05896777b4781f5c274272c15097861.zip
gcc-44000dbbe05896777b4781f5c274272c15097861.tar.gz
gcc-44000dbbe05896777b4781f5c274272c15097861.tar.bz2
re PR fortran/35059 (Seg fault when max constructor limit reached)
2008-02-29 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/35059 * expr.c (find_array_element): Modify traversing the constructor to avoid trying to access NULL memory pointed to by next for the last element. (find_array_section): Exit while loop if cons->next is NULL. * trans-expr.c (gfc_conv_scalar_char_value): Initialize gfc_typespec. (gfc_conv_function_call): Same. * decl.c (gfc_match_implicit): Same. * trans-intrinsic.c (gfc_conv_intrinsic_sr_kind): Same. From-SVN: r132782
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/decl.c2
-rw-r--r--gcc/fortran/expr.c27
-rw-r--r--gcc/fortran/trans-expr.c2
-rw-r--r--gcc/fortran/trans-intrinsic.c2
5 files changed, 32 insertions, 13 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 20e5ae3..841c9d4 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2008-02-29 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/35059
+ * expr.c (find_array_element): Modify traversing the constructor to
+ avoid trying to access NULL memory pointed to by next for the
+ last element. (find_array_section): Exit while loop if cons->next is
+ NULL.
+ * trans-expr.c (gfc_conv_scalar_char_value): Initialize gfc_typespec.
+ (gfc_conv_function_call): Same.
+ * decl.c (gfc_match_implicit): Same.
+ * trans-intrinsic.c (gfc_conv_intrinsic_sr_kind): Same.
+
2008-02-28 Daniel Franke <franke.daniel@gmail.com>
PR fortran/31463
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index d830687..892c80a 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -2506,6 +2506,8 @@ gfc_match_implicit (void)
int c;
match m;
+ gfc_clear_ts (&ts);
+
/* We don't allow empty implicit statements. */
if (gfc_match_eos () == MATCH_YES)
{
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 0b0fd09..329bc72 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1051,18 +1051,19 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
mpz_mul (span, span, tmp);
}
- if (cons)
- {
- for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
- {
- if (cons->iterator)
- {
- cons = NULL;
- goto depart;
- }
- cons = cons->next;
- }
- }
+ for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
+ {
+ if (cons)
+ {
+ if (cons->iterator)
+ {
+ cons = NULL;
+
+ goto depart;
+ }
+ cons = cons->next;
+ }
+ }
depart:
mpz_clear (delta);
@@ -1341,7 +1342,7 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
cons = base;
}
- while (mpz_cmp (ptr, index) > 0)
+ while (cons && cons->next && mpz_cmp (ptr, index) > 0)
{
mpz_add_ui (index, index, one);
cons = cons->next;
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index a348451..9b33d37 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -1275,6 +1275,7 @@ gfc_conv_scalar_char_value (gfc_symbol *sym, gfc_se *se, gfc_expr **expr)
if ((*expr)->expr_type == EXPR_CONSTANT)
{
gfc_typespec ts;
+ gfc_clear_ts (&ts);
*expr = gfc_int_expr ((int)(*expr)->value.character.string[0]);
if ((*expr)->ts.kind != gfc_c_int_kind)
@@ -2250,6 +2251,7 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
stringargs = NULL_TREE;
var = NULL_TREE;
len = NULL_TREE;
+ gfc_clear_ts (&ts);
if (sym->from_intmod == INTMOD_ISO_C_BINDING)
{
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 77bad73..49f2094 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -3764,6 +3764,8 @@ gfc_conv_intrinsic_sr_kind (gfc_se *se, gfc_expr *expr)
else
{
gfc_typespec ts;
+ gfc_clear_ts (&ts);
+
if (actual->expr->ts.kind != gfc_c_int_kind)
{
/* The arguments to SELECTED_REAL_KIND are INTEGER(4). */