re PR fortran/37688 (Relax "Symbol is used before it is typed" checking)
2008-10-12 Daniel Kraft <d@domob.eu> PR fortran/37688 * expr.c (gfc_expr_check_typed): Extend permission of untyped expressions to both top-level variable and basic arithmetic expressions. 2008-10-12 Daniel Kraft <d@domob.eu> PR fortran/37688 * gfortran.dg/used_before_typed_6.f90: New test. From-SVN: r141074
This commit is contained in:
parent
b803690ae1
commit
ed42adef44
@ -1,3 +1,9 @@
|
||||
2008-10-12 Daniel Kraft <d@domob.eu>
|
||||
|
||||
PR fortran/37688
|
||||
* expr.c (gfc_expr_check_typed): Extend permission of untyped
|
||||
expressions to both top-level variable and basic arithmetic expressions.
|
||||
|
||||
2008-10-12 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/37787
|
||||
|
@ -3429,9 +3429,11 @@ gfc_expr_set_symbols_referenced (gfc_expr *expr)
|
||||
|
||||
/* Walk an expression tree and check each variable encountered for being typed.
|
||||
If strict is not set, a top-level variable is tolerated untyped in -std=gnu
|
||||
mode; this is for things in legacy-code like:
|
||||
mode as is a basic arithmetic expression using those; this is for things in
|
||||
legacy-code like:
|
||||
|
||||
INTEGER :: arr(n), n
|
||||
INTEGER :: arr(n + 1), n
|
||||
|
||||
The namespace is needed for IMPLICIT typing. */
|
||||
|
||||
@ -3458,9 +3460,26 @@ gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
|
||||
{
|
||||
bool error_found;
|
||||
|
||||
/* If this is a top-level variable, do the check with strict given to us. */
|
||||
if (!strict && e->expr_type == EXPR_VARIABLE && !e->ref)
|
||||
return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
|
||||
/* If this is a top-level variable or EXPR_OP, do the check with strict given
|
||||
to us. */
|
||||
if (!strict)
|
||||
{
|
||||
if (e->expr_type == EXPR_VARIABLE && !e->ref)
|
||||
return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
|
||||
|
||||
if (e->expr_type == EXPR_OP)
|
||||
{
|
||||
gfc_try t = SUCCESS;
|
||||
|
||||
gcc_assert (e->value.op.op1);
|
||||
t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
|
||||
|
||||
if (t == SUCCESS && e->value.op.op2)
|
||||
t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
|
||||
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise, walk the expression and do it strictly. */
|
||||
check_typed_ns = ns;
|
||||
|
@ -1,3 +1,8 @@
|
||||
2008-10-12 Daniel Kraft <d@domob.eu>
|
||||
|
||||
PR fortran/37688
|
||||
* gfortran.dg/used_before_typed_6.f90: New test.
|
||||
|
||||
2008-10-12 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/37787
|
||||
|
20
gcc/testsuite/gfortran.dg/used_before_typed_6.f90
Normal file
20
gcc/testsuite/gfortran.dg/used_before_typed_6.f90
Normal file
@ -0,0 +1,20 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-std=gnu" }
|
||||
|
||||
! Allow legacy code to work even if not only a single symbol is used as
|
||||
! expression but a basic arithmetic expression.
|
||||
|
||||
SUBROUTINE test (n, m)
|
||||
IMPLICIT NONE
|
||||
|
||||
! These should go fine.
|
||||
INTEGER :: arr1(n + 1) ! { dg-bogus "used before it is typed" }
|
||||
INTEGER :: arr2(n / (2 * m**5)) ! { dg-bogus "used before it is typed" }
|
||||
|
||||
! These should fail for obvious reasons.
|
||||
INTEGER :: arr3(n * 1.1) ! { dg-error "must be of INTEGER type" }
|
||||
INTEGER :: arr4(REAL (m)) ! { dg-error "used before it is typed" }
|
||||
INTEGER :: arr5(SIN (m)) ! { dg-error "used before it is typed" }
|
||||
|
||||
INTEGER :: n, m
|
||||
END SUBROUTINE test
|
Loading…
Reference in New Issue
Block a user