Commit 77f72c95 by Paul Thomas

re PR fortran/49630 ([OOP] ICE on obsolescent deferred-length type bound character function)

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
parent fe5309c5
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
* resolve.c (resolve_ordinary_assign): Force the creation of a
vtable for assignment of non-polymorphic expressions to an
......
......@@ -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++;
......
......@@ -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.
......
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
* gfortran.dg/unlimited_polymorphic_30.f03: New test.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment