From 67eb28c8b8081b781c04e368766dab06fa13ed15 Mon Sep 17 00:00:00 2001
From: Janne Blomqvist <jb@gcc.gnu.org>
Date: Thu, 21 Jun 2012 21:47:01 +0300
Subject: [PATCH] PR 39654 FTELL intrinsic function return type.

frontend ChangeLog:

2012-06-21  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/39654
	* iresolve.c (gfc_resolve_ftell): Fix result kind and use new
	library function.


library ChangeLog:

2012-06-21  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/39654
	* io/intrinsics.c (ftell2): New function.
	* gfortran.map (_gfortran_ftell2): Export function.

From-SVN: r188858
---
 gcc/fortran/ChangeLog       |  6 ++++++
 gcc/fortran/iresolve.c      |  4 ++--
 libgfortran/ChangeLog       |  6 ++++++
 libgfortran/gfortran.map    |  5 +++++
 libgfortran/io/intrinsics.c | 20 ++++++++++++++++++++
 5 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ef2dc36166b1..f3265721de8c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-21  Janne Blomqvist  <jb@gcc.gnu.org>
+
+	PR fortran/39654
+	* iresolve.c (gfc_resolve_ftell): Fix result kind and use new
+	library function.
+
 2012-06-18  Tobias Burnus  <burnus@net-b.de>
 
 	* intrinsic.h (gfc_resolve_rank): New prototype.
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c
index 2a494550bbc8..6d1e8b2a1766 100644
--- a/gcc/fortran/iresolve.c
+++ b/gcc/fortran/iresolve.c
@@ -2480,7 +2480,7 @@ gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
   gfc_clear_ts (&ts);
 
   f->ts.type = BT_INTEGER;
-  f->ts.kind = gfc_index_integer_kind;
+  f->ts.kind = gfc_intio_kind;
   if (u->ts.kind != gfc_c_int_kind)
     {
       ts.type = BT_INTEGER;
@@ -2490,7 +2490,7 @@ gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
       gfc_convert_type (u, &ts, 2);
     }
 
-  f->value.function.name = gfc_get_string (PREFIX ("ftell"));
+  f->value.function.name = gfc_get_string (PREFIX ("ftell2"));
 }
 
 
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 6f204f147695..96a8e8ba42af 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-21  Janne Blomqvist  <jb@gcc.gnu.org>
+
+	PR fortran/39654
+	* io/intrinsics.c (ftell2): New function.
+	* gfortran.map (_gfortran_ftell2): Export function.
+
 2012-06-04  Robert Mason  <rbmj@verizon.net>
 	    Janne Blomqvist  <jb@gcc.gnu.org>
 
diff --git a/libgfortran/gfortran.map b/libgfortran/gfortran.map
index 211db00cd108..217d2a3cf51a 100644
--- a/libgfortran/gfortran.map
+++ b/libgfortran/gfortran.map
@@ -1189,6 +1189,11 @@ GFORTRAN_1.4 {
     _gfortran_eoshift2_16_char4;
 } GFORTRAN_1.3; 
 
+GFORTRAN_1.5 {
+  global:
+    _gfortran_ftell2;
+} GFORTRAN_1.4; 
+
 F2C_1.0 {
   global:
     _gfortran_f2c_specific__abs_c4;
diff --git a/libgfortran/io/intrinsics.c b/libgfortran/io/intrinsics.c
index 576434a8e4c0..9abadae43739 100644
--- a/libgfortran/io/intrinsics.c
+++ b/libgfortran/io/intrinsics.c
@@ -272,6 +272,10 @@ gf_ftell (int unit)
   return ret;
 }
 
+
+/* Here is the ftell function with an incorrect return type; retained
+   due to ABI compatibility.  */
+
 extern size_t PREFIX(ftell) (int *);
 export_proto_np(PREFIX(ftell));
 
@@ -281,6 +285,22 @@ PREFIX(ftell) (int * unit)
   return gf_ftell (*unit);
 }
 
+
+/* Here is the ftell function with the correct return type, ensuring
+   that large files can be supported as long as the target supports
+   large integers; as of 4.8 the FTELL intrinsic function will call
+   this one instead of the old ftell above.  */
+
+extern GFC_IO_INT PREFIX(ftell2) (int *);
+export_proto_np(PREFIX(ftell2));
+
+GFC_IO_INT
+PREFIX(ftell2) (int * unit)
+{
+  return gf_ftell (*unit);
+}
+
+
 #define FTELL_SUB(kind) \
   extern void ftell_i ## kind ## _sub (int *, GFC_INTEGER_ ## kind *); \
   export_proto(ftell_i ## kind ## _sub); \
-- 
GitLab