/* { dg-do compile } */ /* { dg-additional-options "-g" } */ typedef long unsigned int size_t; typedef signed int __int32_t; typedef __int32_t int32_t; typedef long int ptrdiff_t; typedef enum { BT_UNKNOWN = 0, BT_INTEGER, BT_LOGICAL, BT_REAL, BT_COMPLEX, BT_DERIVED, BT_CHARACTER, BT_CLASS, BT_PROCEDURE, BT_HOLLERITH, BT_VOID, BT_ASSUMED, BT_UNION, BT_BOZ } bt; typedef int32_t GFC_INTEGER_4; typedef ptrdiff_t index_type; typedef size_t gfc_charlen_type; typedef struct descriptor_dimension { index_type _stride; index_type lower_bound; } descriptor_dimension; typedef struct { descriptor_dimension dim[15]; } gfc_full_array_i4; typedef void (*formatted_dtio)(void *, GFC_INTEGER_4 *, char *, gfc_full_array_i4 *, GFC_INTEGER_4 *, char *, gfc_charlen_type, gfc_charlen_type); typedef enum { DECIMAL_POINT, DECIMAL_COMMA, DECIMAL_UNSPECIFIED } unit_decimal; typedef struct st_parameter_dt { union { struct { struct gfc_unit *current_unit; unsigned namelist_mode : 1; unsigned unit_is_internal : 1; formatted_dtio fdtio_ptr; } p; } u; } st_parameter_dt; typedef struct gfc_unit { int unit_number; unit_decimal decimal_status; int (*next_char_fn_ptr) (st_parameter_dt *); void (*push_char_fn_ptr) (st_parameter_dt *, int); } gfc_unit; void read_real (st_parameter_dt *dtp) { int c; int seen_dp; seen_dp = 0; for (;;) { c = ((dtp)->u.p.current_unit->next_char_fn_ptr (dtp)); if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA) c = '.'; switch (c) { case '.': if (seen_dp) goto bad_real; seen_dp = 1; ((dtp)->u.p.current_unit->push_char_fn_ptr (dtp, c)); goto real_loop; case 'E': case 'e': case 'D': case 'd': case 'Q': case 'q': goto exp1; case '+': case '-': ((dtp)->u.p.current_unit->push_char_fn_ptr (dtp, 'e')); goto got_repeat; } } got_repeat: real_loop: for (;;) { c = ((dtp)->u.p.current_unit->next_char_fn_ptr (dtp)); switch (c) { case '.': if (seen_dp) goto bad_real; seen_dp = 1; ((dtp)->u.p.current_unit->push_char_fn_ptr (dtp, c)); } } exp1: bad_real: return; }