* match.c (lock_unlock_statement, sync_statement): Fix potential
double freeing.
(sync_statement): Remove unreachable code.
* simplify.c (gfc_simplify_bessel_n2): Avoid double freeing.
(gfc_simplify_repeat): Remove bogus code.
* target-memory.h (gfc_target_encode_expr): Update prototype.
* target-memory.c (gfc_target_encode_expr, encode_array,
encode_derived): Return unsigned HOST_WIDE_INT.
(gfc_target_interpret_expr): Add assert.
(gfc_merge_initializers): Fix "== 0" check for mpz_t.
* symbol.c (gfc_get_typebound_proc): Add assert.
(gfc_merge_initializers): Remove unreachable check.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191343
138bc75d-0d04-0410-961f-
82ee72b054a4
+2012-09-15 Tobias Burnus <burnus@net-b.de>
+
+ * match.c (lock_unlock_statement, sync_statement): Fix potential
+ double freeing.
+ (sync_statement): Remove unreachable code.
+ * simplify.c (gfc_simplify_bessel_n2): Avoid double freeing.
+ (gfc_simplify_repeat): Remove bogus code.
+ * target-memory.h (gfc_target_encode_expr): Update prototype.
+ * target-memory.c (gfc_target_encode_expr, encode_array,
+ encode_derived): Return unsigned HOST_WIDE_INT.
+ (gfc_target_interpret_expr): Add assert.
+ (gfc_merge_initializers): Fix "== 0" check for mpz_t.
+ * symbol.c (gfc_get_typebound_proc): Add assert.
+ (gfc_merge_initializers): Remove unreachable check.
+
2012-09-13 Tobias Burnus <burnus@net-b.de>
PR fortran/54556
gfc_syntax_error (st);
cleanup:
+ if (acq_lock != tmp)
+ gfc_free_expr (acq_lock);
+ if (errmsg != tmp)
+ gfc_free_expr (errmsg);
+ if (stat != tmp)
+ gfc_free_expr (stat);
+
gfc_free_expr (tmp);
gfc_free_expr (lockvar);
- gfc_free_expr (acq_lock);
- gfc_free_expr (stat);
- gfc_free_expr (errmsg);
return MATCH_ERROR;
}
break;
}
- if (m == MATCH_ERROR)
- goto syntax;
-
if (gfc_match (" )%t") != MATCH_YES)
goto syntax;
gfc_syntax_error (st);
cleanup:
+ if (stat != tmp)
+ gfc_free_expr (stat);
+ if (errmsg != tmp)
+ gfc_free_expr (errmsg);
+
gfc_free_expr (tmp);
gfc_free_expr (imageset);
- gfc_free_expr (stat);
- gfc_free_expr (errmsg);
return MATCH_ERROR;
}
mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
- goto error;
+ {
+ /* Range_check frees "e" in that case. */
+ e = NULL;
+ goto error;
+ }
if (jn)
gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
else
ncop = 0;
- len = e->value.character.length;
- nlen = ncop * len;
-
- result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
-
if (ncop == 0)
return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
gfc_symbol*
gfc_get_derived_super_type (gfc_symbol* derived)
{
- if (derived && derived->attr.generic)
+ gcc_assert (derived);
+
+ if (derived->attr.generic)
derived = gfc_find_dt_in_generic (derived);
if (!derived->attr.extension)
return sym;
if (sym->attr.generic)
- for (intr = (sym ? sym->generic : NULL); intr; intr = intr->next)
+ for (intr = sym->generic; intr; intr = intr->next)
if (intr->sym->attr.flavor == FL_DERIVED)
break;
return intr ? intr->sym : NULL;
return the number of bytes of the buffer that have been
used. */
-static int
+static unsigned HOST_WIDE_INT
encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size)
{
mpz_t array_size;
}
-static int
+static unsigned HOST_WIDE_INT
encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size)
{
gfc_constructor *c;
gfc_component *cmp;
int ptr;
tree type;
+ HOST_WIDE_INT size;
type = gfc_typenode_for_spec (&source->ts);
+ TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
if (c->expr->expr_type == EXPR_NULL)
- memset (&buffer[ptr], 0,
- int_size_in_bytes (TREE_TYPE (cmp->backend_decl)));
+ {
+ size = int_size_in_bytes (TREE_TYPE (cmp->backend_decl));
+ gcc_assert (size >= 0);
+ memset (&buffer[ptr], 0, size);
+ }
else
gfc_target_encode_expr (c->expr, &buffer[ptr],
buffer_size - ptr);
}
- return int_size_in_bytes (type);
+ size = int_size_in_bytes (type);
+ gcc_assert (size >= 0);
+ return size;
}
/* Write a constant expression in binary form to a buffer. */
-int
+unsigned HOST_WIDE_INT
gfc_target_encode_expr (gfc_expr *source, unsigned char *buffer,
size_t buffer_size)
{
case BT_DERIVED:
result->representation.length =
gfc_interpret_derived (buffer, buffer_size, result);
+ gcc_assert (result->representation.length >= 0);
break;
default:
{
size_t elt_size = gfc_target_expr_size (c->expr);
- if (c->offset)
+ if (mpz_cmp_si (c->offset, 0) != 0)
len = elt_size * (size_t)mpz_get_si (c->offset);
len = len + gfc_merge_initializers (ts, c->expr, &data[len],
/* Write a constant expression in binary form to a target buffer. */
int gfc_encode_character (int, int, const gfc_char_t *, unsigned char *,
size_t);
-int gfc_target_encode_expr (gfc_expr *, unsigned char *, size_t);
+unsigned HOST_WIDE_INT gfc_target_encode_expr (gfc_expr *, unsigned char *,
+ size_t);
/* Read a target buffer into a constant expression. */