This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch, fortran] Fix PR35779 + some cleanup


Hi all.

Attached patch is mostly cleanup, the actual fix is in array.c 
(match_array_list), where the gfc_init_expr_flag needed to be passed on to 
generate a sensible error message.


gcc/fortran/:
2010-05-13  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/35779
	* intrinsic.c (gfc_init_expr): Renamed to gfc_init_expr_flag.
	Updated all usages.
	* expr.c (init_flag): Removed; use gfc_init_expr_flag everywhere.
	* array.c (match_array_list): Pass on gfc_init_expr_flag when matching
	iterators.

gcc/testsuite/:
2010-05-13  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/35779
	* gfortran.dg/initialization_25.f90: New.


Regression tested on i686-pc-linux-gnu.
Ok for trunk?

	Daniel
Index: intrinsic.c
===================================================================
--- intrinsic.c	(revision 159348)
+++ intrinsic.c	(working copy)
@@ -30,7 +30,7 @@ along with GCC; see the file COPYING3.  
 /* Namespace to hold the resolved symbols for intrinsic subroutines.  */
 static gfc_namespace *gfc_intrinsic_namespace;
 
-int gfc_init_expr = 0;
+bool gfc_init_expr_flag = false;
 
 /* Pointers to an intrinsic function and its argument names that are being
    checked.  */
@@ -3803,7 +3803,7 @@ gfc_intrinsic_func_interface (gfc_expr *
 
   if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
        || isym->id == GFC_ISYM_CMPLX)
-      && gfc_init_expr
+      && gfc_init_expr_flag
       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
 			 "as initialization expression at %L", name,
 			 &expr->where) == FAILURE)
@@ -3879,7 +3879,7 @@ got_specific:
      (4)   A reference to an elemental standard intrinsic function,
            where each argument is an initialization expression  */
 
-  if (gfc_init_expr && isym->elemental && flag
+  if (gfc_init_expr_flag && isym->elemental && flag
       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Elemental function "
 			"as initialization expression with non-integer/non-"
 		        "character arguments at %L", &expr->where) == FAILURE)
Index: array.c
===================================================================
--- array.c	(revision 159348)
+++ array.c	(working copy)
@@ -879,7 +879,7 @@ match_array_list (gfc_constructor_base *
 
   for (n = 1;; n++)
     {
-      m = gfc_match_iterator (&iter, 0);
+      m = gfc_match_iterator (&iter, gfc_init_expr_flag);
       if (m == MATCH_YES)
 	break;
       if (m == MATCH_ERROR)
Index: gfortran.h
===================================================================
--- gfortran.h	(revision 159348)
+++ gfortran.h	(working copy)
@@ -2537,8 +2537,8 @@ void gfc_free_finalizer (gfc_finalizer *
 
 gfc_try gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus);
 
-/* intrinsic.c */
-extern int gfc_init_expr;
+/* intrinsic.c -- true if working in an init-expr, false otherwise.  */
+extern bool gfc_init_expr_flag;
 
 /* Given a symbol that we have decided is intrinsic, mark it as such
    by placing it into a special module that is otherwise impossible to
Index: expr.c
===================================================================
--- expr.c	(revision 159348)
+++ expr.c	(working copy)
@@ -1895,7 +1895,7 @@ gfc_simplify_expr (gfc_expr *p, int type
       /* Only substitute array parameter variables if we are in an
 	 initialization expression, or we want a subsection.  */
       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
-	  && (gfc_init_expr || p->ref
+	  && (gfc_init_expr_flag || p->ref
 	      || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
 	{
 	  if (simplify_parameter_variable (p, type) == FAILURE)
@@ -2626,11 +2626,11 @@ gfc_reduce_init_expr (gfc_expr *expr)
 {
   gfc_try t;
 
-  gfc_init_expr = 1;
+  gfc_init_expr_flag = true;
   t = gfc_resolve_expr (expr);
   if (t == SUCCESS)
     t = check_init_expr (expr);
-  gfc_init_expr = 0;
+  gfc_init_expr_flag = false;
 
   if (t == FAILURE)
     return FAILURE;
@@ -2648,11 +2648,7 @@ gfc_reduce_init_expr (gfc_expr *expr)
 
 
 /* Match an initialization expression.  We work by first matching an
-   expression, then reducing it to a constant.  The reducing it to 
-   constant part requires a global variable to flag the prohibition
-   of a non-integer exponent in -std=f95 mode.  */
-
-bool init_flag = false;
+   expression, then reducing it to a constant.  */
 
 match
 gfc_match_init_expr (gfc_expr **result)
@@ -2663,12 +2659,12 @@ gfc_match_init_expr (gfc_expr **result)
 
   expr = NULL;
 
-  init_flag = true;
+  gfc_init_expr_flag = true;
 
   m = gfc_match_expr (&expr);
   if (m != MATCH_YES)
     {
-      init_flag = false;
+      gfc_init_expr_flag = false;
       return m;
     }
 
@@ -2676,12 +2672,12 @@ gfc_match_init_expr (gfc_expr **result)
   if (t != SUCCESS)
     {
       gfc_free_expr (expr);
-      init_flag = false;
+      gfc_init_expr_flag = false;
       return MATCH_ERROR;
     }
 
   *result = expr;
-  init_flag = false;
+  gfc_init_expr_flag = false;
 
   return MATCH_YES;
 }
Index: arith.c
===================================================================
--- arith.c	(revision 159348)
+++ arith.c	(working copy)
@@ -784,7 +784,6 @@ arith_power (gfc_expr *op1, gfc_expr *op
   int power_sign;
   gfc_expr *result;
   arith rc;
-  extern bool init_flag;
 
   rc = ARITH_OK;
   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
@@ -899,7 +898,7 @@ arith_power (gfc_expr *op1, gfc_expr *op
 
     case BT_REAL:
 
-      if (init_flag)
+      if (gfc_init_expr_flag)
 	{
 	  if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
 			      "exponent in an initialization "
@@ -921,7 +920,7 @@ arith_power (gfc_expr *op1, gfc_expr *op
 
     case BT_COMPLEX:
       {
-	if (init_flag)
+	if (gfc_init_expr_flag)
 	  {
 	    if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
 				"exponent in an initialization "
Index: simplify.c
===================================================================
--- simplify.c	(revision 159348)
+++ simplify.c	(working copy)
@@ -5180,7 +5180,7 @@ gfc_simplify_transfer (gfc_expr *source,
   unsigned char *buffer;
 
   if (!gfc_is_constant_expr (source)
-	|| (gfc_init_expr && !gfc_is_constant_expr (mold))
+	|| (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
 	|| !gfc_is_constant_expr (size))
     return NULL;
 
! { dg-do "compile" }
!
! PR fortran/35779 - unrelated error message
! Tescase contributed by
! Dick Hendrickson <dick DOT hendrickson AT gmail DOT com>
!

  INTEGER :: J1
  INTEGER,PARAMETER :: I3(10) = (/(J1,J1=10,1,-1)/)
  INTEGER,PARAMETER :: I2(10) = (/(J1,J1=its_bad,1,-1)/) ! { dg-error "does not reduce" }
END

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]