diff options
author | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-02 17:09:58 +0000 |
---|---|---|
committer | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-02 17:09:58 +0000 |
commit | 3e715c81ec696dc122ad9f27356bb25e381e5394 (patch) | |
tree | a9c5829a131f0881ac6b0d89cb235321f6bb720c /gcc/fortran/match.c | |
parent | 565bef3b86ed472b88644fb60edf711cc1679ca1 (diff) | |
download | gcc-3e715c81ec696dc122ad9f27356bb25e381e5394.tar.gz |
2010-11-02 Steven G. Kargl < kargl@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
PR fortran/45170
* array.c (gfc_match_array_constructor): Reject deferred type
parameter (DTP) in type-spec.
* decl.c (char_len_param_value, match_char_length,
gfc_match_char_spec, build_sym, variable_decl,
enumerator_decl): Support DTP.
* expr.c (check_inquiry): Fix check due to support for DTP.
* gfortran.h (gfc_typespec): Add Boolean 'deferred'.
* misc.c (gfc_clear_ts): Set it to false.
* match.c (gfc_match_allocate): Support DTP.
* resolve.c (resolve_allocate_expr): Not-implemented error for
* DTP.
(resolve_fl_variable): Add DTP constraint check.
* trans-decl.c (gfc_trans_deferred_vars): Add not-implemented
error for DTP.
2010-11-02 Steven G. Kargl < kargl@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
PR fortran/45170
* gfortran.dg/deferred_type_param_1.f90: New.
* gfortran.dg/deferred_type_param_2.f90: New.
* gfortran.dg/initialization_1.f90: Update dg-errors.
* gfortran.dg/initialization_9.f90: Update dg-errors.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166205 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/match.c')
-rw-r--r-- | gcc/fortran/match.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 1b895f0b872..41818e9defa 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -2845,12 +2845,12 @@ gfc_match_allocate (void) gfc_typespec ts; gfc_symbol *sym; match m; - locus old_locus; - bool saw_stat, saw_errmsg, saw_source, saw_mold, b1, b2, b3; + locus old_locus, deferred_locus; + bool saw_stat, saw_errmsg, saw_source, saw_mold, saw_deferred, b1, b2, b3; head = tail = NULL; stat = errmsg = source = mold = tmp = NULL; - saw_stat = saw_errmsg = saw_source = saw_mold = false; + saw_stat = saw_errmsg = saw_source = saw_mold = saw_deferred = false; if (gfc_match_char ('(') != MATCH_YES) goto syntax; @@ -2879,6 +2879,13 @@ gfc_match_allocate (void) if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: typespec in " "ALLOCATE at %L", &old_locus) == FAILURE) goto cleanup; + + if (ts.deferred) + { + gfc_error ("Type-spec at %L cannot contain a deferred " + "type parameter", &old_locus); + goto cleanup; + } } else { @@ -2912,6 +2919,12 @@ gfc_match_allocate (void) goto cleanup; } + if (tail->expr->ts.deferred) + { + saw_deferred = true; + deferred_locus = tail->expr->where; + } + /* The ALLOCATE statement had an optional typespec. Check the constraints. */ if (ts.type != BT_UNKNOWN) @@ -3095,7 +3108,6 @@ alloc_opt_list: break; } - if (gfc_match (" )%t") != MATCH_YES) goto syntax; @@ -3106,6 +3118,14 @@ alloc_opt_list: &mold->where, &source->where); goto cleanup; } + + /* Check F03:C623, */ + if (saw_deferred && ts.type == BT_UNKNOWN && !source) + { + gfc_error ("Allocate-object at %L with a deferred type parameter " + "requires either a type-spec or SOURCE tag", &deferred_locus); + goto cleanup; + } new_st.op = EXEC_ALLOCATE; new_st.expr1 = stat; |