re PR fortran/24748 (substring of implicitly typed variable not rejected)
authorAsher Langton <langton2@llnl.gov>
Thu, 22 Jun 2006 18:30:18 +0000 (18:30 +0000)
committerAsher Langton <langton@gcc.gnu.org>
Thu, 22 Jun 2006 18:30:18 +0000 (18:30 +0000)
PR fortran/24748
* primary.c (gfc_match_rvalue): Don't call match_substring for
implicit non-character types.

PR fortran/24748
* gfortran.dg/implicit_8.f90: New.

From-SVN: r114901

gcc/fortran/ChangeLog
gcc/fortran/primary.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/implicit_8.f90 [new file with mode: 0644]

index 55e66cdfdc88230fd90c5b23ca53ba135e6ae687..a02bebdede7b1c2470eddab5a19ee14f211f4083 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-22  Asher Langton  <langton2@llnl.gov>
+
+       PR fortran/24748
+       * primary.c (gfc_match_rvalue): Don't call match_substring for
+       implicit non-character types.
+
 2006-06-22  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/26769
index 8fe129457b4fe59afec7de2a59b6edbbe29f4975..ad569fcf6b643f69b78bf9758bec6be2e80c91c1 100644 (file)
@@ -1912,6 +1912,8 @@ gfc_match_rvalue (gfc_expr ** result)
   gfc_expr *e;
   match m, m2;
   int i;
+  gfc_typespec *ts;
+  bool implicit_char;
 
   m = gfc_match_name (name);
   if (m != MATCH_YES)
@@ -2156,10 +2158,22 @@ gfc_match_rvalue (gfc_expr ** result)
 
       if (m2 != MATCH_YES)
        {
+         /* Try to figure out whether we're dealing with a character type.
+            We're peeking ahead here, because we don't want to call 
+            match_substring if we're dealing with an implicitly typed
+            non-character variable.  */
+         implicit_char = false;
+         if (sym->ts.type == BT_UNKNOWN)
+           {
+             ts = gfc_get_default_type (sym,NULL);
+             if (ts->type == BT_CHARACTER)
+               implicit_char = true;
+           }
+
          /* See if this could possibly be a substring reference of a name
             that we're not sure is a variable yet.  */
 
-         if ((sym->ts.type == BT_UNKNOWN || sym->ts.type == BT_CHARACTER)
+         if ((implicit_char || sym->ts.type == BT_CHARACTER)
              && match_substring (sym->ts.cl, 0, &e->ref) == MATCH_YES)
            {
 
index e7d6f9d942a10aebe4bde7951f9786cd3b75eb4d..87319529d336b5c583496539d48fc9c024c20868 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-22  Asher Langton  <langton2@llnl.gov>
+
+       PR fortran/24748
+       * gfortran.dg/implicit_8.f90: New.
+
 2006-06-22  Zdenek Dvorak <dvorakz@suse.cz>
 
        PR rtl-optimization/28121
diff --git a/gcc/testsuite/gfortran.dg/implicit_8.f90 b/gcc/testsuite/gfortran.dg/implicit_8.f90
new file mode 100644 (file)
index 0000000..bdd11e6
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! PR 24748
+
+! The compiler used to crash trying to take a substring of an implicit 
+! real scalar.
+subroutine variant1
+ ybtable=ylocal(1:2)  ! { dg-error "Syntax error in argument list" }
+end
+
+! We want the behavior to be the same whether ylocal is implicitly 
+! or explicitly typed.
+subroutine variant2
+ real ylocal
+ ybtable=ylocal(1:2)  ! { dg-error "Syntax error in argument list" }
+end
+