diff options
Diffstat (limited to 'gcc/fortran/resolve.cc')
| -rw-r--r-- | gcc/fortran/resolve.cc | 48 | 
1 files changed, 47 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index ecd2ada..5fa408e 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -8461,7 +8461,20 @@ check_default_none_expr (gfc_expr **e, int *, void *data)  		break;  	      ns2 = ns2->parent;  	    } -	  if (ns2 != NULL) + +	  /* A DO CONCURRENT iterator cannot appear in a locality spec.  */ +	  if (sym->ns->code->ext.concur.forall_iterator) +	    { +	      gfc_forall_iterator *iter +		= sym->ns->code->ext.concur.forall_iterator; +	      for (; iter; iter = iter->next) +		if (iter->var->symtree +		    && strcmp(sym->name, iter->var->symtree->name) == 0) +		  return 0; +	    } + +	  /* A named constant is not a variable, so skip test.  */ +	  if (ns2 != NULL && sym->attr.flavor != FL_PARAMETER)  	    {  	      gfc_error ("Variable %qs at %L not specified in a locality spec "  			"of DO CONCURRENT at %L but required due to " @@ -15385,6 +15398,39 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)        return false;      } +  /* F2018:C1585: "The function result of a pure function shall not be both +     polymorphic and allocatable, or have a polymorphic allocatable ultimate +     component."  */ +  if (sym->attr.pure && sym->result && sym->ts.u.derived) +    { +      if (sym->ts.type == BT_CLASS +	  && sym->attr.class_ok +	  && CLASS_DATA (sym->result) +	  && CLASS_DATA (sym->result)->attr.allocatable) +	{ +	  gfc_error ("Result variable %qs of pure function at %L is " +		     "polymorphic allocatable", +		     sym->result->name, &sym->result->declared_at); +	  return false; +	} + +      if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->components) +	{ +	  gfc_component *c = sym->ts.u.derived->components; +	  for (; c; c = c->next) +	    if (c->ts.type == BT_CLASS +		&& CLASS_DATA (c) +		&& CLASS_DATA (c)->attr.allocatable) +	      { +		gfc_error ("Result variable %qs of pure function at %L has " +			   "polymorphic allocatable component %qs", +			   sym->result->name, &sym->result->declared_at, +			   c->name); +		return false; +	      } +	} +    } +    if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)      {        gfc_formal_arglist *curr_arg;  | 
