diff options
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index f881bb1..4a7a951 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -4373,7 +4373,8 @@ gfc_build_intrinsic_call (const char* name, locus where, unsigned numarg, ...) and just the return status (SUCCESS / FAILURE) be requested. */ gfc_try -gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context) +gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, + const char* context) { gfc_symbol* sym = NULL; bool is_pointer; @@ -4441,6 +4442,19 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context) return FAILURE; } + /* F2008, C1303. */ + if (!alloc_obj + && (attr.lock_comp + || (e->ts.type == BT_DERIVED + && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV + && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE))) + { + if (context) + gfc_error ("LOCK_TYPE in variable definition context (%s) at %L", + context, &e->where); + return FAILURE; + } + /* INTENT(IN) dummy argument. Check this, unless the object itself is the component of sub-component of a pointer. Obviously, procedure pointers are of no interest here. */ @@ -4555,7 +4569,8 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context) } /* Target must be allowed to appear in a variable definition context. */ - if (gfc_check_vardef_context (assoc->target, pointer, NULL) == FAILURE) + if (gfc_check_vardef_context (assoc->target, pointer, false, NULL) + == FAILURE) { if (context) gfc_error ("Associate-name '%s' can not appear in a variable" |