aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2015-11-13 21:11:42 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2015-11-13 21:11:42 +0000
commit5f0ba74583162080121162e6832e131222a97e78 (patch)
tree7f2c561457336fc4f7da2aca28df95d5c98a0c45 /gcc
parentae66757f2399774a38d73c1fce3344d04e2a56e2 (diff)
downloadgcc-5f0ba74583162080121162e6832e131222a97e78.zip
gcc-5f0ba74583162080121162e6832e131222a97e78.tar.gz
gcc-5f0ba74583162080121162e6832e131222a97e78.tar.bz2
re PR fortran/68319 (ICE on using interface with included entry)
2015-11-13 Steven G. Kargl <kargl@gccc.gnu.org> 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 <kargl@gccc.gnu.org> PR fortran/68319 * gfortran.dg/pr68319.f90: New test. From-SVN: r230351
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/decl.c16
-rw-r--r--gcc/fortran/io.c9
-rw-r--r--gcc/fortran/match.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr68319.f9026
6 files changed, 72 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b2c1d9b..a455b6b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2015-11-13 Steven G. Kargl <kargl@gccc.gnu.org>
+
+ 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 <dmalcolm@redhat.com>
* error.c (gfc_warning): Pass line_table to rich_location ctor.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index c10557e..6d76a7f 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 dbd02b3..8cf952f 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 d4ba350..22b0d7d 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 deb1a71..e01d0c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-13 Steven G. Kargl <kargl@gccc.gnu.org>
+
+ PR fortran/68319
+ * gfortran.dg/pr68319.f90: New test.
+
2015-11-13 Michael Meissner <meissner@linux.vnet.ibm.com>
* 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 0000000..941316d
--- /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