This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] PR32088 - Fix implicit typing of RESULT variables
- From: Tobias Burnus <burnus at net-b dot de>
- To: "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sun, 27 May 2007 18:57:03 +0200
- Subject: [patch, fortran] PR32088 - Fix implicit typing of RESULT variables
:ADDPATCH fortran:
The following program gave an ICE:
subroutine dummy
contains
function quadric(a,b) result(c)
dimension a(0:3),b(0:3),c(0:9)
c(0)=1.1
end function
end
the problem was that the dimension of the result variable was not set to
the function symbol itself. (Thanks to Paul for the patch
gfc_check_function_type, which he could not attach to the PR as
gcc.gnu.org is very slow/unreachable.)
I changed to error message to match the other implicitly typing errors,
which I think is also a bit clearer.
While debugging the problem (also called playing around), I saw that the
message printed by resolve_contained_fntype was a bit misleading
(function name vs. result variable name), I therefore changed the
message. (Note: sym == sym->result if no RESULT is present, see decl.c)
Build and check-gfortran tested on x86_64-unknown-linux-gnu, OK for the
trunk? (This is a 4.3 regression)
Tobias
PS: We are down to currently 46
wrong-code/rejects-valid/ice-on-valid-code PRs; of which 21 have the
wrong-code keyword and 4 are only in <= 4.2.
fortran/
2007-05-27 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
PR fortran/32088
* symbol.c (gfc_check_function_type): Copy dimensions of
result variable.
* resolve.c (resolve_contained_fntype): Improve symbol output in
the error message.
testsuite/
2007-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/32088
* gfortran.dg/func_result_3.f90: New.
Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c (revision 125113)
+++ gcc/fortran/symbol.c (working copy)
@@ -271,13 +271,18 @@ gfc_check_function_type (gfc_namespace *
== SUCCESS)
{
if (proc->result != proc)
- proc->ts = proc->result->ts;
+ {
+ proc->ts = proc->result->ts;
+ proc->as = gfc_copy_array_spec (proc->result->as);
+ proc->attr.dimension = proc->result->attr.dimension;
+ proc->attr.pointer = proc->result->attr.pointer;
+ proc->attr.allocatable = proc->result->attr.allocatable;
+ }
}
else
{
- gfc_error ("unable to implicitly type the function result "
- "'%s' at %L", proc->result->name,
- &proc->result->declared_at);
+ gfc_error ("Function result '%s' at %L has no IMPLICIT type",
+ proc->result->name, &proc->result->declared_at);
proc->result->attr.untyped = 1;
}
}
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 125113)
+++ gcc/fortran/resolve.c (working copy)
@@ -289,18 +289,20 @@ resolve_contained_fntype (gfc_symbol *sy
return;
/* Try to find out of what the return type is. */
- if (sym->result != NULL)
- sym = sym->result;
-
- if (sym->ts.type == BT_UNKNOWN)
+ if (sym->result->ts.type == BT_UNKNOWN)
{
- t = gfc_set_default_type (sym, 0, ns);
+ t = gfc_set_default_type (sym->result, 0, ns);
- if (t == FAILURE && !sym->attr.untyped)
+ if (t == FAILURE && !sym->result->attr.untyped)
{
- gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
- sym->name, &sym->declared_at); /* FIXME */
- sym->attr.untyped = 1;
+ if (sym->result == sym)
+ gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
+ sym->name, &sym->declared_at);
+ else
+ gfc_error ("Result '%s' of contained function '%s' at %L has "
+ "no IMPLICIT type", sym->result->name, sym->name,
+ &sym->result->declared_at);
+ sym->result->attr.untyped = 1;
}
}
@@ -310,9 +312,9 @@ resolve_contained_fntype (gfc_symbol *sy
in external functions. Internal function results are not on that list;
ergo, not permitted. */
- if (sym->ts.type == BT_CHARACTER)
+ if (sym->result->ts.type == BT_CHARACTER)
{
- gfc_charlen *cl = sym->ts.cl;
+ gfc_charlen *cl = sym->result->ts.cl;
if (!cl || !cl->length)
gfc_error ("Character-valued internal function '%s' at %L must "
"not be assumed length", sym->name, &sym->declared_at);
Index: gcc/testsuite/gfortran.dg/func_result_3.f90
===================================================================
--- gcc/testsuite/gfortran.dg/func_result_3.f90 (revision 0)
+++ gcc/testsuite/gfortran.dg/func_result_3.f90 (revision 0)
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! PR fortran/32088
+!
+! Test implicitly defined result variables
+!
+subroutine dummy
+contains
+ function quadric(a,b) result(c)
+ intent(in) a,b; dimension a(0:3),b(0:3),c(0:9)
+ c(0)=a(0)*b(0); c(1:3)=a(1:)*b(0)+a(0)*b(1:); c(4:6)=a(1:)*b(1:)
+ c(7:9)=(/a(1)*b(2)+b(1)*a(2),a(1)*b(3)+b(1)*a(3),a(2)*b(3)+b(2)*a(3)/)
+ end function
+end subroutine dummy
+
+subroutine dummy2
+implicit none
+contains
+ function quadric(a,b) result(c) ! { dg-error "no IMPLICIT type" }
+ real :: a, b
+ intent(in) a,b; dimension a(0:3),b(0:3),c(0:9)
+ c(0)=a(0)*b(0); c(1:3)=a(1:)*b(0)+a(0)*b(1:); c(4:6)=a(1:)*b(1:)
+ c(7:9)=(/a(1)*b(2)+b(1)*a(2),a(1)*b(3)+b(1)*a(3),a(2)*b(3)+b(2)*a(3)/)
+ end function
+end subroutine dummy2
+end