]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2012-05-12 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 12 May 2012 09:53:53 +0000 (09:53 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 12 May 2012 09:53:53 +0000 (09:53 +0000)
        PR fortran/49110
        PR fortran/52843
        * resolve.c (resolve_fl_procedure): Don't regard
        character(len=:) as character(*) in the diagnostic.

2012-05-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/49110
        PR fortran/52843
        * gfortran.dg/deferred_type_param_5.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187427 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/deferred_type_param_5.f90 [new file with mode: 0644]

index e761ef5115401151fdbe71e9cc872c770b681a9f..faffa290f24974b2126563fb6e31dc3a59d95899 100644 (file)
@@ -1,3 +1,10 @@
+2012-05-12  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/49110
+       PR fortran/52843
+       * resolve.c (resolve_fl_procedure): Don't regard
+       character(len=:) as character(*) in the diagnostic.
+
 2012-05-11  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/52537
index b3a23ed73c9f3cc1f6dafdf1f95325588f0b082c..4a072303c496208b9871733af489441c0dfbb0e4 100644 (file)
@@ -10726,7 +10726,7 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
      actual length; (ii) To declare a named constant; or (iii) External
      function - but length must be declared in calling scoping unit.  */
   if (sym->attr.function
-      && sym->ts.type == BT_CHARACTER
+      && sym->ts.type == BT_CHARACTER && !sym->ts.deferred
       && sym->ts.u.cl && sym->ts.u.cl->length == NULL)
     {
       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
index 282cfc0e3ec677d4d6b293f28cb632a02100ec2e..5f5e68922729b986f5ab2a8aa7af4e67dbe3d550 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-12  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/49110
+       PR fortran/52843
+       * gfortran.dg/deferred_type_param_5.f90: New.
+
 2012-05-12  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/parse/error47.C: New.
diff --git a/gcc/testsuite/gfortran.dg/deferred_type_param_5.f90 b/gcc/testsuite/gfortran.dg/deferred_type_param_5.f90
new file mode 100644 (file)
index 0000000..8380b9d
--- /dev/null
@@ -0,0 +1,51 @@
+! { dg-do compile }
+!
+! PR fortran/49110
+! PR fortran/52843
+!
+! Based on a contributed code by jwmwalrus@gmail.com
+!
+! Before, character(len=:) result variable were rejected in PURE functions. 
+!
+module mod1
+    use iso_c_binding
+    implicit none
+
+contains
+    pure function c_strlen(str)
+      character(KIND = C_CHAR), intent(IN) :: str(*)
+      integer :: c_strlen,i
+
+      i = 1
+      do
+        if (i < 1) then
+          c_strlen = 0
+          return
+        end if
+        if (str(i) == c_null_char) exit
+        i = i + 1
+      end do
+      c_strlen = i - 1
+    end function c_strlen
+    pure function c2fstring(cbuffer) result(string)
+        character(:), allocatable :: string
+        character(KIND = C_CHAR), intent(IN) :: cbuffer(*)
+        integer :: i
+
+    continue
+        string = REPEAT(' ', c_strlen(cbuffer))
+
+        do i = 1, c_strlen(cbuffer)
+            if (cbuffer(i) == C_NULL_CHAR) exit
+            string(i:i) = cbuffer(i)
+        enddo
+
+        string = TRIM(string)
+    end function
+end module mod1
+
+use mod1
+character(len=:), allocatable :: str
+str = c2fstring("ABCDEF"//c_null_char//"GHI")
+if (len(str) /= 6 .or. str /= "ABCDEF") call abort()
+end