{
gfc_expr *result;
- if (e->expr_type != EXPR_CONSTANT)
- return NULL;
-
- result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
- &e->where);
+ if (e->expr_type == EXPR_CONSTANT)
+ {
+ result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
+ &e->where);
+ mpz_set_si (result->value.integer, e->value.character.length);
+ return range_check (result, "LEN");
+ }
- mpz_set_si (result->value.integer, e->value.character.length);
- return range_check (result, "LEN");
+ if (e->ts.cl != NULL && e->ts.cl->length != NULL
+ && e->ts.cl->length->expr_type == EXPR_CONSTANT)
+ {
+ result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
+ &e->where);
+ mpz_set (result->value.integer, e->ts.cl->length->value.integer);
+ return range_check (result, "LEN");
+ }
+
+ return NULL;
}
{
gfc_expr *result;
- result = gfc_get_expr ();
- result->expr_type = EXPR_NULL;
-
if (mold == NULL)
- result->ts.type = BT_UNKNOWN;
- else
{
- result->ts = mold->ts;
- result->where = mold->where;
+ result = gfc_get_expr ();
+ result->ts.type = BT_UNKNOWN;
}
+ else
+ result = gfc_copy_expr (mold);
+ result->expr_type = EXPR_NULL;
return result;
}
{
if (lenset == 0)
{
- mpz_set_ui (result->value.integer, len);
+ mpz_set_ui (result->value.integer, 1);
return result;
}
{
if (lenset == 0)
{
- mpz_set_ui (result->value.integer, 1);
+ mpz_set_ui (result->value.integer, len);
return result;
}
for (index = len; index > 0; index --)