aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/primary.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/implicit_8.f9016
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 55e66cd..a02bebd 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 8fe1294..ad569fc 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -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)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e7d6f9d..8731952 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..bdd11e6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/implicit_8.f90
@@ -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
+