[committed] Backports of fortran/27981 and fortran/28548

Steve Kargl sgk@troutmask.apl.washington.edu
Sun Aug 6 02:33:00 GMT 2006


I've committed the attached backported patches to the
4.1 branch.

2006-08-05  Steven G. Kargl <kargls@comcast.nt>

	PR fortran/28548
	* gfortran.dg/elemental_optional_args_1.f90: dg-error becomes
	dg-warning.  Add -pedantic option.

	* resolve.c(resolve_elemental_actual): Add flags.h to use -pedantic
	and exclude conversion functions in conditional.  Change gfc_error
	to gfc_warning.
	(warn_unused_label) Rename to ...
	(warn_unused_fortran_label) avoid warn_unused_label in flags.h.
     
	PR fortran/27981
	* match.c (gfc_match_if):  Handle errors in assignment in simple if.

	* gfortran.dg/simpleif_2.f90: New test.

-- 
Steve
-------------- next part --------------
--- trunk/gcc/fortran/match.c	2006/06/23 19:37:58	114949
+++ trunk/gcc/fortran/match.c	2006/06/23 21:05:04	114950
@@ -1061,6 +1061,12 @@
   gfc_undo_symbols ();
   gfc_current_locus = old_loc;
 
+  /* m can be MATCH_NO or MATCH_ERROR, here.  For MATCH_NO, continue to
+     call the various matchers.  For MATCH_ERROR, a mangled assignment
+     was found.  */
+  if (m == MATCH_ERROR)
+    return MATCH_ERROR;
+
   gfc_match (" if ( %e ) ", &expr);	/* Guaranteed to match */
 
   m = gfc_match_pointer_assignment ();
-------------- next part --------------
Index: gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90	(revision 115942)
+++ gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90	(working copy)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-pedantic" }
 ! Check the fix for PR20893, in which actual arguments could violate: 
 ! "(5) If it is an array, it shall not be supplied as an actual argument to
 ! an elemental procedure unless an array of the same rank is supplied as an
@@ -21,19 +22,19 @@
     end interface
 
 ! check an intrinsic function
-    write(6,*) MAX(A1,A2,A3) ! { dg-error "array and OPTIONAL" }
+    write(6,*) MAX(A1,A2,A3) ! { dg-warning "array and OPTIONAL" }
     write(6,*) MAX(A1,A3,A2)
     write(6,*) MAX(A1,A4,A3)
 ! check an internal elemental function
-    write(6,*) foo(A1,A2,A3) ! { dg-error "array and OPTIONAL" }
+    write(6,*) foo(A1,A2,A3) ! { dg-warning "array and OPTIONAL" }
     write(6,*) foo(A1,A3,A2)
     write(6,*) foo(A1,A4,A3)
 ! check an external elemental function
-    write(6,*) efoo(A1,A2,A3) ! { dg-error "array and OPTIONAL" }
+    write(6,*) efoo(A1,A2,A3) ! { dg-warning "array and OPTIONAL" }
     write(6,*) efoo(A1,A3,A2)
     write(6,*) efoo(A1,A4,A3)
 ! check an elemental subroutine
-    call foobar (A1,A2,A3) ! { dg-error "array and OPTIONAL" } 
+    call foobar (A1,A2,A3) ! { dg-warning "array and OPTIONAL" } 
     call foobar (A1,A2,A4)
     call foobar (A1,A4,A4)
   END SUBROUTINE
@@ -49,4 +50,5 @@
     B1 = 1
   end subroutine foobar
 
-END
\ No newline at end of file
+END
+
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 115942)
+++ gcc/fortran/resolve.c	(working copy)
@@ -23,6 +23,7 @@
 
 #include "config.h"
 #include "system.h"
+#include "flags.h"
 #include "gfortran.h"
 #include "arith.h"  /* For gfc_compare_expr().  */
 #include "dependency.h"
@@ -1007,18 +1008,19 @@
       else if (isym)
 	formal_optional = true;
 
-      if (arg->expr != NULL
+      if (pedantic && arg->expr != NULL
 	    && arg->expr->expr_type == EXPR_VARIABLE
 	    && arg->expr->symtree->n.sym->attr.optional
 	    && formal_optional
 	    && arg->expr->rank
-	    && (set_by_optional || arg->expr->rank != rank)) 
+	    && (set_by_optional || arg->expr->rank != rank)
+	    && !(isym && isym->generic_id == GFC_ISYM_CONVERSION)) 
 	{
-	  gfc_error ("'%s' at %L is an array and OPTIONAL; it cannot "
-		     "therefore be an actual argument of an ELEMENTAL " 
-		     "procedure unless there is a non-optional argument "
-		     "with the same rank (12.4.1.5)",
-		     arg->expr->symtree->n.sym->name, &arg->expr->where);
+	  gfc_warning ("'%s' at %L is an array and OPTIONAL; IF IT IS "
+		       "MISSING, it cannot be the actual argument of an "
+		       "ELEMENTAL procedure unless there is a non-optional"
+		       "argument with the same rank (12.4.1.5)",
+		       arg->expr->symtree->n.sym->name, &arg->expr->where);
 	  return FAILURE;
 	}
     }
@@ -6100,12 +6102,12 @@
 /* Warn about unused labels.  */
 
 static void
-warn_unused_label (gfc_st_label * label)
+warn_unused_fortran_label (gfc_st_label * label)
 {
   if (label == NULL)
     return;
 
-  warn_unused_label (label->left);
+  warn_unused_fortran_label (label->left);
 
   if (label->defined == ST_LABEL_UNKNOWN)
     return;
@@ -6126,7 +6128,7 @@
       break;
     }
 
-  warn_unused_label (label->right);
+  warn_unused_fortran_label (label->right);
 }
 
 
@@ -6649,7 +6651,7 @@
 
   /* Warn about unused labels.  */
   if (gfc_option.warn_unused_labels)
-    warn_unused_label (ns->st_labels);
+    warn_unused_fortran_label (ns->st_labels);
 
   gfc_resolve_uops (ns->uop_root);
     


More information about the Fortran mailing list