re PR fortran/49630 ([OOP] ICE on obsolescent deferred-length type bound character...
authorPaul Thomas <pault@gcc.gnu.org>
Thu, 21 Jun 2018 22:38:55 +0000 (22:38 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Thu, 21 Jun 2018 22:38:55 +0000 (22:38 +0000)
2018-06-21  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/49630
* resolve.c (resolve_contained_fntype): Change standard ref.
from F95 to F2003: C418. Correct a spelling error in a comment.
It is an error for an abstract interface to have an assumed
character length result.
* trans-expr.c (gfc_conv_procedure_call): Likewise change the
standard reference.

2018-06-21  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/49630
* gfortran.dg/assumed_charlen_function_7.f90: New test.

From-SVN: r261868

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/assumed_charlen_function_7.f90 [new file with mode: 0644]

index 852f36e8f7cf66728ac92b06e270dd607982ebb8..2e665d95a0fe4bf1e5b4db6998f6fc6dda728e26 100644 (file)
@@ -1,3 +1,13 @@
+2018-06-21  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/49630
+       * resolve.c (resolve_contained_fntype): Change standard ref.
+       from F95 to F2003: C418. Correct a spelling error in a comment.
+       It is an error for an abstract interface to have an assumed
+       character length result.
+       * trans-expr.c (gfc_conv_procedure_call): Likewise change the
+       standard reference.
+
 2018-06-21  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/83118
index 1cc31652920eafda93edbf868826410f7df2df09..41040544ce5225e87d4b4e1b8f8b777aebfe2c98 100644 (file)
@@ -601,9 +601,10 @@ resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
        }
     }
 
-  /* Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character
+  /* Fortran 2003 Draft Standard, page 535, C418, on type-param-value
      type, lists the only ways a character length value of * can be used:
-     dummy arguments of procedures, named constants, and function results
+     dummy arguments of procedures, named constants, function results and
+     in allocate statements if the allocate_object is an assumed length dummy
      in external functions.  Internal function results and results of module
      procedures are not on this list, ergo, not permitted.  */
 
@@ -3103,7 +3104,7 @@ resolve_function (gfc_expr *expr)
       return false;
     }
 
-  /* If this ia a deferred TBP with an abstract interface (which may
+  /* If this is a deferred TBP with an abstract interface (which may
      of course be referenced), expr->value.function.esym will be set.  */
   if (sym && sym->attr.abstract && !expr->value.function.esym)
     {
@@ -3112,6 +3113,17 @@ resolve_function (gfc_expr *expr)
       return false;
     }
 
+  /* If this is a deferred TBP with an abstract interface, its result
+     cannot be an assumed length character (F2003: C418).  */
+  if (sym && sym->attr.abstract && sym->attr.function
+      && sym->result->ts.u.cl->length == NULL)
+    {
+      gfc_error ("ABSTRACT INTERFACE %qs at %L must not have an assumed "
+                "character length result (F2003: C418)", sym->name,
+                &sym->declared_at);
+      return false;
+    }
+
   /* Switch off assumed size checking and do this again for certain kinds
      of procedure, once the procedure itself is resolved.  */
   need_full_assumed_size++;
index f369b1b1be961a6285c2f82a855bdc21ab195c8f..dfc44f753e5b85bc08e437b635294c6db178ecb4 100644 (file)
@@ -5941,7 +5941,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
     {
       if (ts.u.cl->length == NULL)
        {
-         /* Assumed character length results are not allowed by 5.1.1.5 of the
+         /* Assumed character length results are not allowed by C418 of the 2003
             standard and are trapped in resolve.c; except in the case of SPREAD
             (and other intrinsics?) and dummy functions.  In the case of SPREAD,
             we take the character length of the first argument for the result.
index 60d02cb4b9d4466c32a86dd8ab068c348ed201aa..e1aeb10f1543fbd352dd8aba5a0d750bbff81427 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-21  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/49630
+       * gfortran.dg/assumed_charlen_function_7.f90: New test.
+
 2018-06-21  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/83118
diff --git a/gcc/testsuite/gfortran.dg/assumed_charlen_function_7.f90 b/gcc/testsuite/gfortran.dg/assumed_charlen_function_7.f90
new file mode 100644 (file)
index 0000000..b36bb87
--- /dev/null
@@ -0,0 +1,34 @@
+! { dg-do compile }
+!
+! Test the fix for PR49630, comment #11.
+!
+! Contributed by Vittorio Zecca  <zeccav@gmail.com>
+!
+module abc
+  implicit none
+  type,abstract::abc_abstract
+  contains
+    procedure(abc_interface),deferred::abc_function
+  end type abc_abstract
+  type,extends(abc_abstract)::abc_type
+  contains
+    procedure::abc_function
+  end type abc_type
+  abstract interface
+    function abc_interface(this) ! { dg-error "assumed character length result" }
+      import abc_abstract
+      class(abc_abstract),intent(in)::this
+      character(len=*)::abc_interface
+    end function abc_interface
+  end interface
+contains
+  function abc_function(this)
+    class(abc_type),intent(in)::this
+    character(len=5)::abc_function
+    abc_function="hello"
+  end function abc_function
+  subroutine do_something(this)
+    class(abc_abstract),intent(in)::this
+    print *,this%abc_function()
+  end subroutine do_something
+end module abc