if (ffesymbol_where (s) == FFEINFO_whereGLOBAL) ffesymbol_globalize (s);
ffeexpr_token_funsubstr_ (ffelexToken ft, ffebld expr, ffelexToken t){  ffeinfoKind kind;  ffeinfoWhere where;  ffesymbol s;  ffesymbolAttrs sa;  ffebld symter = ffeexpr_stack_->exprstack->u.operand;  bool needs_type;  ffeintrinGen gen;  ffeintrinSpec spec;  ffeintrinImp imp;  s = ffebld_symter (symter);  sa = ffesymbol_attrs (s);  where = ffesymbol_where (s);  /* We get here only if we don't already know enough about FOO when seeing a     FOO(stuff) reference, and FOO might turn out to be a CHARACTER type.  If     "stuff" is a substring reference, then FOO is a CHARACTER scalar type.     Else FOO is a function, either intrinsic or external.  If intrinsic, it     wouldn't necessarily be CHARACTER type, so unless it has already been     declared DUMMY, it hasn't had its type established yet.  It can't be     CHAR*(*) in any case, though it can have an explicit CHAR*n type.  */  assert (!(sa & ~(FFESYMBOL_attrsDUMMY		   | FFESYMBOL_attrsTYPE)));  needs_type = !(ffesymbol_attrs (s) & FFESYMBOL_attrsDUMMY);  ffesymbol_signal_change (s);	/* Probably already done, but in case.... */  if (ffelex_token_type (t) == FFELEX_typeCOLON)    {				/* Definitely an ENTITY (char substring). */      if (needs_type && !ffeimplic_establish_symbol (s))	{	  ffesymbol_error (s, ffeexpr_stack_->tokens[0]);	  return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);	}      ffesymbol_set_info (s,			  ffeinfo_new (ffesymbol_basictype (s),				       ffesymbol_kindtype (s),				       ffesymbol_rank (s),				       FFEINFO_kindENTITY,				       (where == FFEINFO_whereNONE)				       ? FFEINFO_whereLOCAL				       : where,				       ffesymbol_size (s)));      ffebld_set_info (symter, ffeinfo_use (ffesymbol_info (s)));      ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);      ffesymbol_resolve_intrin (s);      s = ffecom_sym_learned (s);      ffesymbol_signal_unreported (s);	/* For debugging purposes. */      ffeexpr_stack_->exprstack->u.operand	= ffeexpr_collapse_symter (symter, ffeexpr_tokens_[0]);      return (ffelexHandler) ffeexpr_token_substring_ (ft, expr, t);    }  /* The "stuff" isn't a substring notation, so we now know the overall     reference is to a function.  */  if (ffeintrin_is_intrinsic (ffesymbol_text (s), ffeexpr_stack_->tokens[0],			      FALSE, &gen, &spec, &imp, &kind))    {      ffebld_symter_set_generic (symter, gen);      ffebld_symter_set_specific (symter, spec);      ffebld_symter_set_implementation (symter, imp);      ffesymbol_set_generic (s, gen);      ffesymbol_set_specific (s, spec);      ffesymbol_set_implementation (s, imp);      ffesymbol_set_info (s,			  ffeinfo_new (FFEINFO_basictypeNONE,				       FFEINFO_kindtypeNONE,				       0,				       kind,				       FFEINFO_whereINTRINSIC,				       FFETARGET_charactersizeNONE));    }  else    {				/* Not intrinsic, now needs CHAR type. */      if (!ffeimplic_establish_symbol (s))	{	  ffesymbol_error (s, ffeexpr_stack_->tokens[0]);	  return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);	}      ffesymbol_set_info (s,			  ffeinfo_new (ffesymbol_basictype (s),				       ffesymbol_kindtype (s),				       ffesymbol_rank (s),				       FFEINFO_kindFUNCTION,				       (where == FFEINFO_whereNONE)				       ? FFEINFO_whereGLOBAL				       : where,				       ffesymbol_size (s)));    }  ffebld_set_info (symter, ffeinfo_use (ffesymbol_info (s)));  ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);  ffesymbol_resolve_intrin (s);  s = ffecom_sym_learned (s);  ffesymbol_signal_unreported (s);	/* For debugging purposes. */  ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);  return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);}