From: Steven G. Kargl Date: Fri, 13 Nov 2015 21:11:42 +0000 (+0000) Subject: re PR fortran/68319 (ICE on using interface with included entry) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5f0ba74583162080121162e6832e131222a97e78;p=gcc.git re PR fortran/68319 (ICE on using interface with included entry) 2015-11-13 Steven G. Kargl PR fortran/68319 * decl.c (gfc_match_data, gfc_match_entry): Enforce F2008:C1206. * io.c (gfc_match_format): Ditto. * match.c (gfc_match_st_function): Ditto. 2015-11-13 Steven G. Kargl PR fortran/68319 * gfortran.dg/pr68319.f90: New test. From-SVN: r230351 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b2c1d9bcb05..a455b6bf531 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2015-11-13 Steven G. Kargl + + PR fortran/68319 + * decl.c (gfc_match_data, gfc_match_entry): Enforce F2008:C1206. + * io.c (gfc_match_format): Ditto. + * match.c (gfc_match_st_function): Ditto. + 2015-11-13 David Malcolm * error.c (gfc_warning): Pass line_table to rich_location ctor. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c10557e968c..6d76a7fd5ae 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -552,6 +552,15 @@ gfc_match_data (void) gfc_data *new_data; match m; + /* Before parsing the rest of a DATA statement, check F2008:c1206. */ + if ((gfc_current_state () == COMP_FUNCTION + || gfc_current_state () == COMP_SUBROUTINE) + && gfc_state_stack->previous->state == COMP_INTERFACE) + { + gfc_error ("DATA statement at %C cannot appear within an INTERFACE"); + return MATCH_ERROR; + } + set_in_match_data (true); for (;;) @@ -5767,6 +5776,13 @@ gfc_match_entry (void) return MATCH_ERROR; } + if ((state == COMP_SUBROUTINE || state == COMP_FUNCTION) + && gfc_state_stack->previous->state == COMP_INTERFACE) + { + gfc_error ("ENTRY statement at %C cannot appear within an INTERFACE"); + return MATCH_ERROR; + } + module_procedure = gfc_current_ns->parent != NULL && gfc_current_ns->parent->proc_name && gfc_current_ns->parent->proc_name->attr.flavor diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index dbd02b35e54..8cf952f95a8 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -1199,6 +1199,15 @@ gfc_match_format (void) return MATCH_ERROR; } + /* Before parsing the rest of a FORMAT statement, check F2008:c1206. */ + if ((gfc_current_state () == COMP_FUNCTION + || gfc_current_state () == COMP_SUBROUTINE) + && gfc_state_stack->previous->state == COMP_INTERFACE) + { + gfc_error ("FORMAT statement at %C cannot appear within an INTERFACE"); + return MATCH_ERROR; + } + if (gfc_statement_label == NULL) { gfc_error ("Missing format label at %C"); diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index d4ba350ab59..22b0d7d42f7 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -4913,6 +4913,15 @@ gfc_match_st_function (void) sym->value = expr; + if ((gfc_current_state () == COMP_FUNCTION + || gfc_current_state () == COMP_SUBROUTINE) + && gfc_state_stack->previous->state == COMP_INTERFACE) + { + gfc_error ("Statement function at %L cannot appear within an INTERFACE", + &expr->where); + return MATCH_ERROR; + } + if (!gfc_notify_std (GFC_STD_F95_OBS, "Statement function at %C")) return MATCH_ERROR; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index deb1a712db2..e01d0c6fc17 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-11-13 Steven G. Kargl + + PR fortran/68319 + * gfortran.dg/pr68319.f90: New test. + 2015-11-13 Michael Meissner * gcc.target/powerpc/float128-hw.c: New test for IEEE 128-bit diff --git a/gcc/testsuite/gfortran.dg/pr68319.f90 b/gcc/testsuite/gfortran.dg/pr68319.f90 new file mode 100644 index 00000000000..941316d71e7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr68319.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! PR fortran/68319 +! +subroutine foo + + interface + + real function bar(i) + f(i) = 2 * i ! { dg-error "cannot appear within" } + end function bar + + real function bah(j) + entry boo(j) ! { dg-error "cannot appear within" } + end function bah + + real function fu(j) + data i /1/ ! { dg-error "cannot appear within" } + end function fu + + real function fee(j) +10 format('(A)') ! { dg-error "cannot appear within" } + end function fee + + end interface + +end subroutine foo