summaryrefslogtreecommitdiff
path: root/gcc/fortran/primary.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/primary.c')
-rw-r--r--gcc/fortran/primary.c46
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);