Commit b4439561 by Tobias Burnus Committed by Tobias Burnus

Fix error-recovery ICE in check_proc_interface

        PR fortran/58787
        * decl.c (get_proc_name): Return with error before
        creating sym_tree.

        PR fortran/58787
        * gfortran.dg/goacc/pr77765.f90: Modify dg-error.
        * gfortran.dg/interface_42.f90: Ditto.
        * gfortran.dg/internal_references_1.f90: Ditto.
        * gfortran.dg/invalid_procedure_name.f90: Ditto.
        * gfortran.dg/pr65453.f90: Ditto.
        * gfortran.dg/pr77414.f90: Ditto.
        * gfortran.dg/pr78741.f90: Ditto.
        * gfortran.dg/same_name_2.f90: Ditto.

From-SVN: r265125
parent d8d3cc09
2018-10-12 Tobias Burnus <burnus@net-b.de>
PR fortran/58787
* decl.c (get_proc_name): Return with error before
creating sym_tree.
2018-10-11 Tobias Burnus <burnus@net-b.de> 2018-10-11 Tobias Burnus <burnus@net-b.de>
Revert: Revert:
......
...@@ -1231,28 +1231,39 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry) ...@@ -1231,28 +1231,39 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& sym->attr.proc != 0 && sym->attr.proc != 0
&& (sym->attr.subroutine || sym->attr.function || sym->attr.entry) && (sym->attr.subroutine || sym->attr.function || sym->attr.entry)
&& sym->attr.if_source != IFSRC_UNKNOWN) && sym->attr.if_source != IFSRC_UNKNOWN)
gfc_error_now ("Procedure %qs at %C is already defined at %L", {
name, &sym->declared_at); gfc_error_now ("Procedure %qs at %C is already defined at %L",
name, &sym->declared_at);
return true;
}
if (sym->attr.flavor != 0 if (sym->attr.flavor != 0
&& sym->attr.entry && sym->attr.if_source != IFSRC_UNKNOWN) && sym->attr.entry && sym->attr.if_source != IFSRC_UNKNOWN)
gfc_error_now ("Procedure %qs at %C is already defined at %L", {
name, &sym->declared_at); gfc_error_now ("Procedure %qs at %C is already defined at %L",
name, &sym->declared_at);
return true;
}
if (sym->attr.external && sym->attr.procedure if (sym->attr.external && sym->attr.procedure
&& gfc_current_state () == COMP_CONTAINS) && gfc_current_state () == COMP_CONTAINS)
gfc_error_now ("Contained procedure %qs at %C clashes with " {
"procedure defined at %L", gfc_error_now ("Contained procedure %qs at %C clashes with "
name, &sym->declared_at); "procedure defined at %L",
name, &sym->declared_at);
return true;
}
/* Trap a procedure with a name the same as interface in the /* Trap a procedure with a name the same as interface in the
encompassing scope. */ encompassing scope. */
if (sym->attr.generic != 0 if (sym->attr.generic != 0
&& (sym->attr.subroutine || sym->attr.function) && (sym->attr.subroutine || sym->attr.function)
&& !sym->attr.mod_proc) && !sym->attr.mod_proc)
gfc_error_now ("Name %qs at %C is already defined" {
" as a generic interface at %L", gfc_error_now ("Name %qs at %C is already defined"
name, &sym->declared_at); " as a generic interface at %L",
name, &sym->declared_at);
return true;
}
/* Trap declarations of attributes in encompassing scope. The /* Trap declarations of attributes in encompassing scope. The
signature for this is that ts.kind is set. Legitimate signature for this is that ts.kind is set. Legitimate
...@@ -1263,8 +1274,11 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry) ...@@ -1263,8 +1274,11 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& gfc_current_ns->parent != NULL && gfc_current_ns->parent != NULL
&& sym->attr.access == 0 && sym->attr.access == 0
&& !module_fcn_entry) && !module_fcn_entry)
gfc_error_now ("Procedure %qs at %C has an explicit interface " {
gfc_error_now ("Procedure %qs at %C has an explicit interface "
"from a previous declaration", name); "from a previous declaration", name);
return true;
}
} }
/* C1246 (R1225) MODULE shall appear only in the function-stmt or /* C1246 (R1225) MODULE shall appear only in the function-stmt or
...@@ -1276,17 +1290,23 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry) ...@@ -1276,17 +1290,23 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& !current_attr.module_procedure && !current_attr.module_procedure
&& sym->attr.proc == PROC_MODULE && sym->attr.proc == PROC_MODULE
&& gfc_state_stack->state == COMP_CONTAINS) && gfc_state_stack->state == COMP_CONTAINS)
gfc_error_now ("Procedure %qs defined in interface body at %L " {
"clashes with internal procedure defined at %C", gfc_error_now ("Procedure %qs defined in interface body at %L "
name, &sym->declared_at); "clashes with internal procedure defined at %C",
name, &sym->declared_at);
return true;
}
if (sym && !sym->gfc_new if (sym && !sym->gfc_new
&& sym->attr.flavor != FL_UNKNOWN && sym->attr.flavor != FL_UNKNOWN
&& sym->attr.referenced == 0 && sym->attr.subroutine == 1 && sym->attr.referenced == 0 && sym->attr.subroutine == 1
&& gfc_state_stack->state == COMP_CONTAINS && gfc_state_stack->state == COMP_CONTAINS
&& gfc_state_stack->previous->state == COMP_SUBROUTINE) && gfc_state_stack->previous->state == COMP_SUBROUTINE)
gfc_error_now ("Procedure %qs at %C is already defined at %L", {
name, &sym->declared_at); gfc_error_now ("Procedure %qs at %C is already defined at %L",
name, &sym->declared_at);
return true;
}
if (gfc_current_ns->parent == NULL || *result == NULL) if (gfc_current_ns->parent == NULL || *result == NULL)
return rc; return rc;
......
2018-10-12 Tobias Burnus <burnus@net-b.de>
PR fortran/58787
* gfortran.dg/goacc/pr77765.f90: Modify dg-error.
* gfortran.dg/interface_42.f90: Ditto.
* gfortran.dg/internal_references_1.f90: Ditto.
* gfortran.dg/invalid_procedure_name.f90: Ditto.
* gfortran.dg/pr65453.f90: Ditto.
* gfortran.dg/pr77414.f90: Ditto.
* gfortran.dg/pr78741.f90: Ditto.
* gfortran.dg/same_name_2.f90: Ditto.
2018-10-12 Wilco Dijkstra <wdijkstr@arm.com> 2018-10-12 Wilco Dijkstra <wdijkstr@arm.com>
* gcc.target/aarch64/popcnt.c: Test zero-extended popcount. * gcc.target/aarch64/popcnt.c: Test zero-extended popcount.
......
...@@ -13,7 +13,6 @@ contains ...@@ -13,7 +13,6 @@ contains
end module m end module m
! { dg-error "Procedure 'f' at .1. is already defined" "" { target *-*-* } 8 } ! { dg-error "Procedure 'f' at .1. is already defined" "" { target *-*-* } 8 }
! { dg-error "Duplicate RECURSIVE attribute specified" "" { target *-*-* } 8 }
! { dg-error ".1." "" { target *-*-* } 10 } ! { dg-error ".1." "" { target *-*-* } 10 }
! { dg-error "Unexpected ..ACC ROUTINE" "" { target *-*-* } 11 } ! { dg-error "Syntax error in ..ACC ROUTINE . NAME . at .1., invalid function name f" "" { target *-*-* } 11 }
! { dg-error "Expecting END MODULE statement" "" { target *-*-* } 12 } ! { dg-error "Expecting END MODULE statement" "" { target *-*-* } 12 }
...@@ -13,7 +13,7 @@ module copy ...@@ -13,7 +13,7 @@ module copy
contains contains
subroutine foo_da(da, copy) ! { dg-error "defined in interface body" } subroutine foo_da(da, copy) ! { dg-error "defined in interface body|PROCEDURE attribute conflicts with PROCEDURE attribute" }
integer, intent(in) :: da(:) integer, intent(in) :: da(:)
integer, allocatable, intent(out) :: copy(:) integer, allocatable, intent(out) :: copy(:)
allocate( copy( size(da) ) ) allocate( copy( size(da) ) )
...@@ -21,4 +21,4 @@ module copy ...@@ -21,4 +21,4 @@ module copy
end subroutine foo_da end subroutine foo_da
end module copy end module copy
{ dg-prune-output "compilation terminated" } ! { dg-prune-output "compilation terminated" }
...@@ -16,8 +16,8 @@ contains ...@@ -16,8 +16,8 @@ contains
end subroutine end subroutine
subroutine p (i) ! { dg-error "is already defined" } subroutine p (i) ! { dg-error "is already defined" }
integer :: i integer :: i ! { dg-error "Unexpected data declaration statement in CONTAINS section" }
end subroutine end subroutine ! { dg-error "Expecting END MODULE statement" }
end module end module
! !
! PR25124 - would happily ignore the declaration of foo in the main program. ! PR25124 - would happily ignore the declaration of foo in the main program.
...@@ -27,8 +27,8 @@ x = bar () ! This is OK because it is a regular reference. ...@@ -27,8 +27,8 @@ x = bar () ! This is OK because it is a regular reference.
x = foo () x = foo ()
contains contains
function foo () ! { dg-error "explicit interface from a previous" } function foo () ! { dg-error "explicit interface from a previous" }
foo = 1.0 foo = 1.0 ! { dg-error "Unexpected assignment statement in CONTAINS section" }
end function foo end function foo ! { dg-error "Expecting END PROGRAM statement" }
function bar () function bar ()
bar = 1.0 bar = 1.0
end function bar end function bar
......
...@@ -9,6 +9,6 @@ INTERFACE I1 ! { dg-error "" } ...@@ -9,6 +9,6 @@ INTERFACE I1 ! { dg-error "" }
END INTERFACE I1 END INTERFACE I1
CONTAINS CONTAINS
SUBROUTINE I1(I) ! { dg-error "already defined as a generic" } SUBROUTINE I1(I) ! { dg-error "already defined as a generic" }
END SUBROUTINE I1 END SUBROUTINE I1 ! { dg-error "Expecting END PROGRAM statement" }
END END
...@@ -5,4 +5,4 @@ procedure() :: foo ! { dg-error "(1)" } ...@@ -5,4 +5,4 @@ procedure() :: foo ! { dg-error "(1)" }
contains contains
subroutine foo() ! { dg-error "clashes with procedure" } subroutine foo() ! { dg-error "clashes with procedure" }
end end
end end ! { dg-error "Two main PROGRAMs" }
...@@ -4,6 +4,6 @@ subroutine a(x) ! { dg-error "(1)" } ...@@ -4,6 +4,6 @@ subroutine a(x) ! { dg-error "(1)" }
character(*) :: x character(*) :: x
contains contains
subroutine a(x) ! { dg-error " is already defined at" } subroutine a(x) ! { dg-error " is already defined at" }
character(*) :: x character(*) :: x ! { dg-error "Unexpected data declaration statement in CONTAINS section" }
end subroutine a end subroutine a
end subroutine a end subroutine a ! { dg-error "Expecting END PROGRAM statement" }
...@@ -11,6 +11,6 @@ entry g(n, x) ! { dg-error "is already defined" } ...@@ -11,6 +11,6 @@ entry g(n, x) ! { dg-error "is already defined" }
x = 'b' x = 'b'
contains contains
subroutine g ! { dg-error "(1)" } subroutine g ! { dg-error "(1)" }
z(1) = x(1:1) z(1) = x(1:1) ! { dg-error "Unclassifiable statement" }
end end
end end
...@@ -10,6 +10,6 @@ subroutine aa ! { dg-error "Procedure" } ...@@ -10,6 +10,6 @@ subroutine aa ! { dg-error "Procedure" }
write(*,*) 'AA' write(*,*) 'AA'
end subroutine aa end subroutine aa
subroutine aa ! { dg-error "is already defined" } subroutine aa ! { dg-error "is already defined" }
write(*,*) 'BB' write(*,*) 'BB' ! { dg-error "Unexpected WRITE statement in CONTAINS section" }
end subroutine aa end subroutine aa ! { dg-error "Expecting END MODULE statement" }
end module end module
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