diff options
Diffstat (limited to 'gcc/fortran/primary.c')
-rw-r--r-- | gcc/fortran/primary.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index f79ed228d2f..83d9132b41f 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -1,5 +1,6 @@ /* Primary expression subroutines - Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012 Free Software Foundation, Inc. Contributed by Andy Vaught @@ -224,6 +225,9 @@ match_integer_constant (gfc_expr **result, int signflag) if (kind == -1) return MATCH_ERROR; + if (kind == 4 && gfc_option.flag_integer4_kind == 8) + kind = 8; + if (gfc_validate_kind (BT_INTEGER, kind, true) < 0) { gfc_error ("Integer kind %d at %C not available", kind); @@ -636,6 +640,26 @@ done: goto cleanup; } kind = gfc_default_double_kind; + + if (kind == 4) + { + if (gfc_option.flag_real4_kind == 8) + kind = 8; + if (gfc_option.flag_real4_kind == 10) + kind = 10; + if (gfc_option.flag_real4_kind == 16) + kind = 16; + } + + if (kind == 8) + { + if (gfc_option.flag_real8_kind == 4) + kind = 4; + if (gfc_option.flag_real8_kind == 10) + kind = 10; + if (gfc_option.flag_real8_kind == 16) + kind = 16; + } break; case 'q': @@ -666,6 +690,26 @@ done: if (kind == -2) kind = gfc_default_real_kind; + if (kind == 4) + { + if (gfc_option.flag_real4_kind == 8) + kind = 8; + if (gfc_option.flag_real4_kind == 10) + kind = 10; + if (gfc_option.flag_real4_kind == 16) + kind = 16; + } + + if (kind == 8) + { + if (gfc_option.flag_real8_kind == 4) + kind = 4; + if (gfc_option.flag_real8_kind == 10) + kind = 10; + if (gfc_option.flag_real8_kind == 16) + kind = 16; + } + if (gfc_validate_kind (BT_REAL, kind, true) < 0) { gfc_error ("Invalid real kind %d at %C", kind); |