diff options
-rw-r--r-- | gcc/fortran/arith.c | 45 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 47 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 1 |
3 files changed, 46 insertions, 47 deletions
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index 070e2bf..9aaf1bc 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -2627,48 +2627,3 @@ gfc_hollerith2logical (gfc_expr *src, int kind) return result; } - - -/* Returns an initializer whose value is one higher than the value of the - LAST_INITIALIZER argument. If the argument is NULL, the - initializers value will be set to zero. The initializer's kind - will be set to gfc_c_int_kind. - - If -fshort-enums is given, the appropriate kind will be selected - later after all enumerators have been parsed. A warning is issued - here if an initializer exceeds gfc_c_int_kind. */ - -gfc_expr * -gfc_enum_initializer (gfc_expr *last_initializer, locus where) -{ - gfc_expr *result; - - result = gfc_get_expr (); - result->expr_type = EXPR_CONSTANT; - result->ts.type = BT_INTEGER; - result->ts.kind = gfc_c_int_kind; - result->where = where; - - mpz_init (result->value.integer); - - if (last_initializer != NULL) - { - mpz_add_ui (result->value.integer, last_initializer->value.integer, 1); - result->where = last_initializer->where; - - if (gfc_check_integer_range (result->value.integer, - gfc_c_int_kind) != ARITH_OK) - { - gfc_error ("Enumerator exceeds the C integer type at %C"); - return NULL; - } - } - else - { - /* Control comes here, if it's the very first enumerator and no - initializer has been given. It will be initialized to zero. */ - mpz_set_si (result->value.integer, 0); - } - - return result; -} diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 7ecb921..1a4ca36 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -6812,6 +6812,51 @@ gfc_match_enum (void) } +/* Returns an initializer whose value is one higher than the value of the + LAST_INITIALIZER argument. If the argument is NULL, the + initializers value will be set to zero. The initializer's kind + will be set to gfc_c_int_kind. + + If -fshort-enums is given, the appropriate kind will be selected + later after all enumerators have been parsed. A warning is issued + here if an initializer exceeds gfc_c_int_kind. */ + +static gfc_expr * +enum_initializer (gfc_expr *last_initializer, locus where) +{ + gfc_expr *result; + + result = gfc_get_expr (); + result->expr_type = EXPR_CONSTANT; + result->ts.type = BT_INTEGER; + result->ts.kind = gfc_c_int_kind; + result->where = where; + + mpz_init (result->value.integer); + + if (last_initializer != NULL) + { + mpz_add_ui (result->value.integer, last_initializer->value.integer, 1); + result->where = last_initializer->where; + + if (gfc_check_integer_range (result->value.integer, + gfc_c_int_kind) != ARITH_OK) + { + gfc_error ("Enumerator exceeds the C integer type at %C"); + return NULL; + } + } + else + { + /* Control comes here, if it's the very first enumerator and no + initializer has been given. It will be initialized to zero. */ + mpz_set_si (result->value.integer, 0); + } + + return result; +} + + /* Match a variable name with an optional initializer. When this subroutine is called, a variable is expected to be parsed next. Depending on what is happening at the moment, updates either the @@ -6872,7 +6917,7 @@ enumerator_decl (void) previous enumerator (stored in last_initializer) is incremented by 1 and is used to initialize the current enumerator. */ if (initializer == NULL) - initializer = gfc_enum_initializer (last_initializer, old_locus); + initializer = enum_initializer (last_initializer, old_locus); if (initializer == NULL || initializer->ts.type != BT_INTEGER) { diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index c8347d0..95661d1 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -2249,7 +2249,6 @@ void gfc_get_errors (int *, int *); /* arith.c */ void gfc_arith_init_1 (void); void gfc_arith_done_1 (void); -gfc_expr *gfc_enum_initializer (gfc_expr *, locus); arith gfc_check_integer_range (mpz_t p, int kind); bool gfc_check_character_range (gfc_char_t, int); |