PageRenderTime 117ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 2ms

/gcc-2.95.2/gcc/f/expr.c

https://bitbucket.org/monaka/brightv-buildenv
C | 17141 lines | 13729 code | 2051 blank | 1361 comment | 2451 complexity | 37669c40c33a4929d1f2149bbd001c83 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0
  1. /* expr.c -- Implementation File (module.c template V1.0)
  2. Copyright (C) 1995-1998 Free Software Foundation, Inc.
  3. Contributed by James Craig Burley.
  4. This file is part of GNU Fortran.
  5. GNU Fortran is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9. GNU Fortran is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GNU Fortran; see the file COPYING. If not, write to
  15. the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  16. 02111-1307, USA.
  17. Related Modules:
  18. None.
  19. Description:
  20. Handles syntactic and semantic analysis of Fortran expressions.
  21. Modifications:
  22. */
  23. /* Include files. */
  24. #include "proj.h"
  25. #include "expr.h"
  26. #include "bad.h"
  27. #include "bld.h"
  28. #include "com.h"
  29. #include "global.h"
  30. #include "implic.h"
  31. #include "intrin.h"
  32. #include "info.h"
  33. #include "lex.h"
  34. #include "malloc.h"
  35. #include "src.h"
  36. #include "st.h"
  37. #include "symbol.h"
  38. #include "str.h"
  39. #include "target.h"
  40. #include "where.h"
  41. /* Externals defined here. */
  42. /* Simple definitions and enumerations. */
  43. typedef enum
  44. {
  45. FFEEXPR_exprtypeUNKNOWN_,
  46. FFEEXPR_exprtypeOPERAND_,
  47. FFEEXPR_exprtypeUNARY_,
  48. FFEEXPR_exprtypeBINARY_,
  49. FFEEXPR_exprtype_
  50. } ffeexprExprtype_;
  51. typedef enum
  52. {
  53. FFEEXPR_operatorPOWER_,
  54. FFEEXPR_operatorMULTIPLY_,
  55. FFEEXPR_operatorDIVIDE_,
  56. FFEEXPR_operatorADD_,
  57. FFEEXPR_operatorSUBTRACT_,
  58. FFEEXPR_operatorCONCATENATE_,
  59. FFEEXPR_operatorLT_,
  60. FFEEXPR_operatorLE_,
  61. FFEEXPR_operatorEQ_,
  62. FFEEXPR_operatorNE_,
  63. FFEEXPR_operatorGT_,
  64. FFEEXPR_operatorGE_,
  65. FFEEXPR_operatorNOT_,
  66. FFEEXPR_operatorAND_,
  67. FFEEXPR_operatorOR_,
  68. FFEEXPR_operatorXOR_,
  69. FFEEXPR_operatorEQV_,
  70. FFEEXPR_operatorNEQV_,
  71. FFEEXPR_operator_
  72. } ffeexprOperator_;
  73. typedef enum
  74. {
  75. FFEEXPR_operatorprecedenceHIGHEST_ = 1,
  76. FFEEXPR_operatorprecedencePOWER_ = 1,
  77. FFEEXPR_operatorprecedenceMULTIPLY_ = 2,
  78. FFEEXPR_operatorprecedenceDIVIDE_ = 2,
  79. FFEEXPR_operatorprecedenceADD_ = 3,
  80. FFEEXPR_operatorprecedenceSUBTRACT_ = 3,
  81. FFEEXPR_operatorprecedenceLOWARITH_ = 3,
  82. FFEEXPR_operatorprecedenceCONCATENATE_ = 3,
  83. FFEEXPR_operatorprecedenceLT_ = 4,
  84. FFEEXPR_operatorprecedenceLE_ = 4,
  85. FFEEXPR_operatorprecedenceEQ_ = 4,
  86. FFEEXPR_operatorprecedenceNE_ = 4,
  87. FFEEXPR_operatorprecedenceGT_ = 4,
  88. FFEEXPR_operatorprecedenceGE_ = 4,
  89. FFEEXPR_operatorprecedenceNOT_ = 5,
  90. FFEEXPR_operatorprecedenceAND_ = 6,
  91. FFEEXPR_operatorprecedenceOR_ = 7,
  92. FFEEXPR_operatorprecedenceXOR_ = 8,
  93. FFEEXPR_operatorprecedenceEQV_ = 8,
  94. FFEEXPR_operatorprecedenceNEQV_ = 8,
  95. FFEEXPR_operatorprecedenceLOWEST_ = 8,
  96. FFEEXPR_operatorprecedence_
  97. } ffeexprOperatorPrecedence_;
  98. #define FFEEXPR_operatorassociativityL2R_ TRUE
  99. #define FFEEXPR_operatorassociativityR2L_ FALSE
  100. #define FFEEXPR_operatorassociativityPOWER_ FFEEXPR_operatorassociativityR2L_
  101. #define FFEEXPR_operatorassociativityMULTIPLY_ FFEEXPR_operatorassociativityL2R_
  102. #define FFEEXPR_operatorassociativityDIVIDE_ FFEEXPR_operatorassociativityL2R_
  103. #define FFEEXPR_operatorassociativityADD_ FFEEXPR_operatorassociativityL2R_
  104. #define FFEEXPR_operatorassociativitySUBTRACT_ FFEEXPR_operatorassociativityL2R_
  105. #define FFEEXPR_operatorassociativityCONCATENATE_ FFEEXPR_operatorassociativityL2R_
  106. #define FFEEXPR_operatorassociativityLT_ FFEEXPR_operatorassociativityL2R_
  107. #define FFEEXPR_operatorassociativityLE_ FFEEXPR_operatorassociativityL2R_
  108. #define FFEEXPR_operatorassociativityEQ_ FFEEXPR_operatorassociativityL2R_
  109. #define FFEEXPR_operatorassociativityNE_ FFEEXPR_operatorassociativityL2R_
  110. #define FFEEXPR_operatorassociativityGT_ FFEEXPR_operatorassociativityL2R_
  111. #define FFEEXPR_operatorassociativityGE_ FFEEXPR_operatorassociativityL2R_
  112. #define FFEEXPR_operatorassociativityNOT_ FFEEXPR_operatorassociativityL2R_
  113. #define FFEEXPR_operatorassociativityAND_ FFEEXPR_operatorassociativityL2R_
  114. #define FFEEXPR_operatorassociativityOR_ FFEEXPR_operatorassociativityL2R_
  115. #define FFEEXPR_operatorassociativityXOR_ FFEEXPR_operatorassociativityL2R_
  116. #define FFEEXPR_operatorassociativityEQV_ FFEEXPR_operatorassociativityL2R_
  117. #define FFEEXPR_operatorassociativityNEQV_ FFEEXPR_operatorassociativityL2R_
  118. typedef enum
  119. {
  120. FFEEXPR_parentypeFUNCTION_,
  121. FFEEXPR_parentypeSUBROUTINE_,
  122. FFEEXPR_parentypeARRAY_,
  123. FFEEXPR_parentypeSUBSTRING_,
  124. FFEEXPR_parentypeFUNSUBSTR_,/* Ambig: check for colon after first expr. */
  125. FFEEXPR_parentypeEQUIVALENCE_, /* Ambig: ARRAY_ or SUBSTRING_. */
  126. FFEEXPR_parentypeANY_, /* Allow basically anything. */
  127. FFEEXPR_parentype_
  128. } ffeexprParenType_;
  129. typedef enum
  130. {
  131. FFEEXPR_percentNONE_,
  132. FFEEXPR_percentLOC_,
  133. FFEEXPR_percentVAL_,
  134. FFEEXPR_percentREF_,
  135. FFEEXPR_percentDESCR_,
  136. FFEEXPR_percent_
  137. } ffeexprPercent_;
  138. /* Internal typedefs. */
  139. typedef struct _ffeexpr_expr_ *ffeexprExpr_;
  140. typedef bool ffeexprOperatorAssociativity_;
  141. typedef struct _ffeexpr_stack_ *ffeexprStack_;
  142. /* Private include files. */
  143. /* Internal structure definitions. */
  144. struct _ffeexpr_expr_
  145. {
  146. ffeexprExpr_ previous;
  147. ffelexToken token;
  148. ffeexprExprtype_ type;
  149. union
  150. {
  151. struct
  152. {
  153. ffeexprOperator_ op;
  154. ffeexprOperatorPrecedence_ prec;
  155. ffeexprOperatorAssociativity_ as;
  156. }
  157. operator;
  158. ffebld operand;
  159. }
  160. u;
  161. };
  162. struct _ffeexpr_stack_
  163. {
  164. ffeexprStack_ previous;
  165. mallocPool pool;
  166. ffeexprContext context;
  167. ffeexprCallback callback;
  168. ffelexToken first_token;
  169. ffeexprExpr_ exprstack;
  170. ffelexToken tokens[10]; /* Used in certain cases, like (unary)
  171. open-paren. */
  172. ffebld expr; /* For first of
  173. complex/implied-do/substring/array-elements
  174. / actual-args expression. */
  175. ffebld bound_list; /* For tracking dimension bounds list of
  176. array. */
  177. ffebldListBottom bottom; /* For building lists. */
  178. ffeinfoRank rank; /* For elements in an array reference. */
  179. bool constant; /* TRUE while elements seen so far are
  180. constants. */
  181. bool immediate; /* TRUE while elements seen so far are
  182. immediate/constants. */
  183. ffebld next_dummy; /* Next SFUNC dummy arg in arg list. */
  184. ffebldListLength num_args; /* Number of dummy args expected in arg list. */
  185. bool is_rhs; /* TRUE if rhs context, FALSE otherwise. */
  186. ffeexprPercent_ percent; /* Current %FOO keyword. */
  187. };
  188. struct _ffeexpr_find_
  189. {
  190. ffelexToken t;
  191. ffelexHandler after;
  192. int level;
  193. };
  194. /* Static objects accessed by functions in this module. */
  195. static ffeexprStack_ ffeexpr_stack_; /* Expression stack for semantic. */
  196. static ffelexToken ffeexpr_tokens_[10]; /* Scratchpad tokens for syntactic. */
  197. static ffestrOther ffeexpr_current_dotdot_; /* Current .FOO. keyword. */
  198. static long ffeexpr_hollerith_count_; /* ffeexpr_token_number_ and caller. */
  199. static int ffeexpr_level_; /* Level of DATA implied-DO construct. */
  200. static bool ffeexpr_is_substr_ok_; /* If OPEN_PAREN as binary "op" ok. */
  201. static struct _ffeexpr_find_ ffeexpr_find_;
  202. /* Static functions (internal). */
  203. static ffelexHandler ffeexpr_cb_close_paren_ (ffelexToken ft, ffebld expr,
  204. ffelexToken t);
  205. static ffelexHandler ffeexpr_cb_close_paren_ambig_ (ffelexToken ft,
  206. ffebld expr,
  207. ffelexToken t);
  208. static ffelexHandler ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t);
  209. static ffelexHandler ffeexpr_cb_close_paren_c_ (ffelexToken ft,
  210. ffebld expr, ffelexToken t);
  211. static ffelexHandler ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr,
  212. ffelexToken t);
  213. static ffelexHandler ffeexpr_cb_close_paren_ci_ (ffelexToken ft,
  214. ffebld expr, ffelexToken t);
  215. static ffelexHandler ffeexpr_cb_comma_ci_ (ffelexToken ft, ffebld expr,
  216. ffelexToken t);
  217. static ffelexHandler ffeexpr_cb_comma_i_ (ffelexToken ft, ffebld expr,
  218. ffelexToken t);
  219. static ffelexHandler ffeexpr_cb_comma_i_1_ (ffelexToken ft, ffebld expr,
  220. ffelexToken t);
  221. static ffelexHandler ffeexpr_cb_comma_i_2_ (ffelexToken ft, ffebld expr,
  222. ffelexToken t);
  223. static ffelexHandler ffeexpr_cb_comma_i_3_ (ffelexToken ft, ffebld expr,
  224. ffelexToken t);
  225. static ffelexHandler ffeexpr_cb_comma_i_4_ (ffelexToken ft, ffebld expr,
  226. ffelexToken t);
  227. static ffelexHandler ffeexpr_cb_comma_i_5_ (ffelexToken t);
  228. static ffelexHandler ffeexpr_cb_end_loc_ (ffelexToken ft, ffebld expr,
  229. ffelexToken t);
  230. static ffelexHandler ffeexpr_cb_end_notloc_ (ffelexToken ft, ffebld expr,
  231. ffelexToken t);
  232. static ffelexHandler ffeexpr_cb_end_notloc_1_ (ffelexToken t);
  233. static ffesymbol ffeexpr_check_impctrl_ (ffesymbol s);
  234. static void ffeexpr_check_impdo_ (ffebld list, ffelexToken list_t,
  235. ffebld dovar, ffelexToken dovar_t);
  236. static void ffeexpr_update_impdo_ (ffebld expr, ffebld dovar);
  237. static void ffeexpr_update_impdo_sym_ (ffebld expr, ffesymbol dovar);
  238. static ffeexprContext ffeexpr_context_outer_ (ffeexprStack_ s);
  239. static ffeexprExpr_ ffeexpr_expr_new_ (void);
  240. static void ffeexpr_fulfill_call_ (ffebld *expr, ffelexToken t);
  241. static bool ffeexpr_isdigits_ (const char *p);
  242. static ffelexHandler ffeexpr_token_first_lhs_ (ffelexToken t);
  243. static ffelexHandler ffeexpr_token_first_lhs_1_ (ffelexToken t);
  244. static ffelexHandler ffeexpr_token_first_rhs_ (ffelexToken t);
  245. static ffelexHandler ffeexpr_token_first_rhs_1_ (ffelexToken t);
  246. static ffelexHandler ffeexpr_token_first_rhs_2_ (ffelexToken t);
  247. static ffelexHandler ffeexpr_token_first_rhs_3_ (ffelexToken t);
  248. static ffelexHandler ffeexpr_token_first_rhs_4_ (ffelexToken t);
  249. static ffelexHandler ffeexpr_token_first_rhs_5_ (ffelexToken t);
  250. static ffelexHandler ffeexpr_token_first_rhs_6_ (ffelexToken t);
  251. static ffelexHandler ffeexpr_token_namelist_ (ffelexToken t);
  252. static void ffeexpr_expr_kill_ (ffeexprExpr_ e);
  253. static void ffeexpr_exprstack_push_ (ffeexprExpr_ e);
  254. static void ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e);
  255. static void ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e);
  256. static void ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e);
  257. static void ffeexpr_reduce_ (void);
  258. static ffebld ffeexpr_reduced_bool1_ (ffebld reduced, ffeexprExpr_ op,
  259. ffeexprExpr_ r);
  260. static ffebld ffeexpr_reduced_bool2_ (ffebld reduced, ffeexprExpr_ l,
  261. ffeexprExpr_ op, ffeexprExpr_ r);
  262. static ffebld ffeexpr_reduced_concatenate_ (ffebld reduced, ffeexprExpr_ l,
  263. ffeexprExpr_ op, ffeexprExpr_ r);
  264. static ffebld ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l,
  265. ffeexprExpr_ op, ffeexprExpr_ r);
  266. static ffebld ffeexpr_reduced_math1_ (ffebld reduced, ffeexprExpr_ op,
  267. ffeexprExpr_ r);
  268. static ffebld ffeexpr_reduced_math2_ (ffebld reduced, ffeexprExpr_ l,
  269. ffeexprExpr_ op, ffeexprExpr_ r);
  270. static ffebld ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l,
  271. ffeexprExpr_ op, ffeexprExpr_ r);
  272. static ffebld ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l,
  273. ffeexprExpr_ op, ffeexprExpr_ r);
  274. static ffebld ffeexpr_reduced_ugly1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);
  275. static ffebld ffeexpr_reduced_ugly1log_ (ffebld reduced, ffeexprExpr_ op,
  276. ffeexprExpr_ r);
  277. static ffebld ffeexpr_reduced_ugly2_ (ffebld reduced, ffeexprExpr_ l,
  278. ffeexprExpr_ op, ffeexprExpr_ r);
  279. static ffebld ffeexpr_reduced_ugly2log_ (ffebld reduced, ffeexprExpr_ l,
  280. ffeexprExpr_ op, ffeexprExpr_ r);
  281. static ffelexHandler ffeexpr_find_close_paren_ (ffelexToken t,
  282. ffelexHandler after);
  283. static ffelexHandler ffeexpr_nil_finished_ (ffelexToken t);
  284. static ffelexHandler ffeexpr_nil_rhs_ (ffelexToken t);
  285. static ffelexHandler ffeexpr_nil_period_ (ffelexToken t);
  286. static ffelexHandler ffeexpr_nil_end_period_ (ffelexToken t);
  287. static ffelexHandler ffeexpr_nil_swallow_period_ (ffelexToken t);
  288. static ffelexHandler ffeexpr_nil_real_ (ffelexToken t);
  289. static ffelexHandler ffeexpr_nil_real_exponent_ (ffelexToken t);
  290. static ffelexHandler ffeexpr_nil_real_exp_sign_ (ffelexToken t);
  291. static ffelexHandler ffeexpr_nil_number_ (ffelexToken t);
  292. static ffelexHandler ffeexpr_nil_number_exponent_ (ffelexToken t);
  293. static ffelexHandler ffeexpr_nil_number_exp_sign_ (ffelexToken t);
  294. static ffelexHandler ffeexpr_nil_number_period_ (ffelexToken t);
  295. static ffelexHandler ffeexpr_nil_number_per_exp_ (ffelexToken t);
  296. static ffelexHandler ffeexpr_nil_number_real_ (ffelexToken t);
  297. static ffelexHandler ffeexpr_nil_num_per_exp_sign_ (ffelexToken t);
  298. static ffelexHandler ffeexpr_nil_number_real_exp_ (ffelexToken t);
  299. static ffelexHandler ffeexpr_nil_num_real_exp_sn_ (ffelexToken t);
  300. static ffelexHandler ffeexpr_nil_binary_ (ffelexToken t);
  301. static ffelexHandler ffeexpr_nil_binary_period_ (ffelexToken t);
  302. static ffelexHandler ffeexpr_nil_binary_end_per_ (ffelexToken t);
  303. static ffelexHandler ffeexpr_nil_binary_sw_per_ (ffelexToken t);
  304. static ffelexHandler ffeexpr_nil_quote_ (ffelexToken t);
  305. static ffelexHandler ffeexpr_nil_apostrophe_ (ffelexToken t);
  306. static ffelexHandler ffeexpr_nil_apos_char_ (ffelexToken t);
  307. static ffelexHandler ffeexpr_nil_name_rhs_ (ffelexToken t);
  308. static ffelexHandler ffeexpr_nil_name_apos_ (ffelexToken t);
  309. static ffelexHandler ffeexpr_nil_name_apos_name_ (ffelexToken t);
  310. static ffelexHandler ffeexpr_nil_percent_ (ffelexToken t);
  311. static ffelexHandler ffeexpr_nil_percent_name_ (ffelexToken t);
  312. static ffelexHandler ffeexpr_nil_substrp_ (ffelexToken t);
  313. static ffelexHandler ffeexpr_finished_ (ffelexToken t);
  314. static ffebld ffeexpr_finished_ambig_ (ffelexToken t, ffebld expr);
  315. static ffelexHandler ffeexpr_token_lhs_ (ffelexToken t);
  316. static ffelexHandler ffeexpr_token_rhs_ (ffelexToken t);
  317. static ffelexHandler ffeexpr_token_binary_ (ffelexToken t);
  318. static ffelexHandler ffeexpr_token_period_ (ffelexToken t);
  319. static ffelexHandler ffeexpr_token_end_period_ (ffelexToken t);
  320. static ffelexHandler ffeexpr_token_swallow_period_ (ffelexToken t);
  321. static ffelexHandler ffeexpr_token_real_ (ffelexToken t);
  322. static ffelexHandler ffeexpr_token_real_exponent_ (ffelexToken t);
  323. static ffelexHandler ffeexpr_token_real_exp_sign_ (ffelexToken t);
  324. static ffelexHandler ffeexpr_token_number_ (ffelexToken t);
  325. static ffelexHandler ffeexpr_token_number_exponent_ (ffelexToken t);
  326. static ffelexHandler ffeexpr_token_number_exp_sign_ (ffelexToken t);
  327. static ffelexHandler ffeexpr_token_number_period_ (ffelexToken t);
  328. static ffelexHandler ffeexpr_token_number_per_exp_ (ffelexToken t);
  329. static ffelexHandler ffeexpr_token_number_real_ (ffelexToken t);
  330. static ffelexHandler ffeexpr_token_num_per_exp_sign_ (ffelexToken t);
  331. static ffelexHandler ffeexpr_token_number_real_exp_ (ffelexToken t);
  332. static ffelexHandler ffeexpr_token_num_real_exp_sn_ (ffelexToken t);
  333. static ffelexHandler ffeexpr_token_binary_period_ (ffelexToken t);
  334. static ffelexHandler ffeexpr_token_binary_end_per_ (ffelexToken t);
  335. static ffelexHandler ffeexpr_token_binary_sw_per_ (ffelexToken t);
  336. static ffelexHandler ffeexpr_token_quote_ (ffelexToken t);
  337. static ffelexHandler ffeexpr_token_apostrophe_ (ffelexToken t);
  338. static ffelexHandler ffeexpr_token_apos_char_ (ffelexToken t);
  339. static ffelexHandler ffeexpr_token_name_lhs_ (ffelexToken t);
  340. static ffelexHandler ffeexpr_token_name_arg_ (ffelexToken t);
  341. static ffelexHandler ffeexpr_token_name_rhs_ (ffelexToken t);
  342. static ffelexHandler ffeexpr_token_name_apos_ (ffelexToken t);
  343. static ffelexHandler ffeexpr_token_name_apos_name_ (ffelexToken t);
  344. static ffelexHandler ffeexpr_token_percent_ (ffelexToken t);
  345. static ffelexHandler ffeexpr_token_percent_name_ (ffelexToken t);
  346. static ffelexHandler ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr,
  347. ffelexToken t);
  348. static ffelexHandler ffeexpr_token_elements_ (ffelexToken ft, ffebld expr,
  349. ffelexToken t);
  350. static ffelexHandler ffeexpr_token_equivalence_ (ffelexToken ft, ffebld expr,
  351. ffelexToken t);
  352. static ffelexHandler ffeexpr_token_substring_ (ffelexToken ft, ffebld expr,
  353. ffelexToken t);
  354. static ffelexHandler ffeexpr_token_substring_1_ (ffelexToken ft, ffebld expr,
  355. ffelexToken t);
  356. static ffelexHandler ffeexpr_token_substrp_ (ffelexToken t);
  357. static ffelexHandler ffeexpr_token_intrincheck_ (ffelexToken t);
  358. static ffelexHandler ffeexpr_token_funsubstr_ (ffelexToken ft, ffebld expr,
  359. ffelexToken t);
  360. static ffelexHandler ffeexpr_token_anything_ (ffelexToken ft, ffebld expr,
  361. ffelexToken t);
  362. static void ffeexpr_make_float_const_ (char exp_letter, ffelexToken integer,
  363. ffelexToken decimal, ffelexToken fraction, ffelexToken exponent,
  364. ffelexToken exponent_sign, ffelexToken exponent_digits);
  365. static ffesymbol ffeexpr_declare_unadorned_ (ffelexToken t, bool maybe_intrin);
  366. static ffesymbol ffeexpr_sym_impdoitem_ (ffesymbol s, ffelexToken t);
  367. static ffesymbol ffeexpr_sym_lhs_call_ (ffesymbol s, ffelexToken t);
  368. static ffesymbol ffeexpr_sym_lhs_data_ (ffesymbol s, ffelexToken t);
  369. static ffesymbol ffeexpr_sym_lhs_equivalence_ (ffesymbol s, ffelexToken t);
  370. static ffesymbol ffeexpr_sym_lhs_extfunc_ (ffesymbol s, ffelexToken t);
  371. static ffesymbol ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s, ffelexToken t);
  372. static ffesymbol ffeexpr_sym_lhs_parameter_ (ffesymbol s, ffelexToken t);
  373. static ffesymbol ffeexpr_sym_rhs_actualarg_ (ffesymbol s, ffelexToken t);
  374. static ffesymbol ffeexpr_sym_rhs_dimlist_ (ffesymbol s, ffelexToken t);
  375. static ffesymbol ffeexpr_sym_rhs_let_ (ffesymbol s, ffelexToken t);
  376. static ffesymbol ffeexpr_declare_parenthesized_ (ffelexToken t,
  377. bool maybe_intrin,
  378. ffeexprParenType_ *paren_type);
  379. static ffesymbol ffeexpr_paren_rhs_let_ (ffesymbol s, ffelexToken t);
  380. /* Internal macros. */
  381. #define ffeexpr_paren_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
  382. #define ffeexpr_sym_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
  383. /* ffeexpr_collapse_convert -- Collapse convert expr
  384. ffebld expr;
  385. ffelexToken token;
  386. expr = ffeexpr_collapse_convert(expr,token);
  387. If the result of the expr is a constant, replaces the expr with the
  388. computed constant. */
  389. ffebld
  390. ffeexpr_collapse_convert (ffebld expr, ffelexToken t)
  391. {
  392. ffebad error = FFEBAD;
  393. ffebld l;
  394. ffebldConstantUnion u;
  395. ffeinfoBasictype bt;
  396. ffeinfoKindtype kt;
  397. ffetargetCharacterSize sz;
  398. ffetargetCharacterSize sz2;
  399. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  400. return expr;
  401. l = ffebld_left (expr);
  402. if (ffebld_op (l) != FFEBLD_opCONTER)
  403. return expr;
  404. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  405. {
  406. case FFEINFO_basictypeANY:
  407. return expr;
  408. case FFEINFO_basictypeINTEGER:
  409. sz = FFETARGET_charactersizeNONE;
  410. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  411. {
  412. #if FFETARGET_okINTEGER1
  413. case FFEINFO_kindtypeINTEGER1:
  414. switch (ffeinfo_basictype (ffebld_info (l)))
  415. {
  416. case FFEINFO_basictypeINTEGER:
  417. switch (ffeinfo_kindtype (ffebld_info (l)))
  418. {
  419. #if FFETARGET_okINTEGER2
  420. case FFEINFO_kindtypeINTEGER2:
  421. error = ffetarget_convert_integer1_integer2
  422. (ffebld_cu_ptr_integer1 (u),
  423. ffebld_constant_integer2 (ffebld_conter (l)));
  424. break;
  425. #endif
  426. #if FFETARGET_okINTEGER3
  427. case FFEINFO_kindtypeINTEGER3:
  428. error = ffetarget_convert_integer1_integer3
  429. (ffebld_cu_ptr_integer1 (u),
  430. ffebld_constant_integer3 (ffebld_conter (l)));
  431. break;
  432. #endif
  433. #if FFETARGET_okINTEGER4
  434. case FFEINFO_kindtypeINTEGER4:
  435. error = ffetarget_convert_integer1_integer4
  436. (ffebld_cu_ptr_integer1 (u),
  437. ffebld_constant_integer4 (ffebld_conter (l)));
  438. break;
  439. #endif
  440. default:
  441. assert ("INTEGER1/INTEGER bad source kind type" == NULL);
  442. break;
  443. }
  444. break;
  445. case FFEINFO_basictypeREAL:
  446. switch (ffeinfo_kindtype (ffebld_info (l)))
  447. {
  448. #if FFETARGET_okREAL1
  449. case FFEINFO_kindtypeREAL1:
  450. error = ffetarget_convert_integer1_real1
  451. (ffebld_cu_ptr_integer1 (u),
  452. ffebld_constant_real1 (ffebld_conter (l)));
  453. break;
  454. #endif
  455. #if FFETARGET_okREAL2
  456. case FFEINFO_kindtypeREAL2:
  457. error = ffetarget_convert_integer1_real2
  458. (ffebld_cu_ptr_integer1 (u),
  459. ffebld_constant_real2 (ffebld_conter (l)));
  460. break;
  461. #endif
  462. #if FFETARGET_okREAL3
  463. case FFEINFO_kindtypeREAL3:
  464. error = ffetarget_convert_integer1_real3
  465. (ffebld_cu_ptr_integer1 (u),
  466. ffebld_constant_real3 (ffebld_conter (l)));
  467. break;
  468. #endif
  469. #if FFETARGET_okREAL4
  470. case FFEINFO_kindtypeREAL4:
  471. error = ffetarget_convert_integer1_real4
  472. (ffebld_cu_ptr_integer1 (u),
  473. ffebld_constant_real4 (ffebld_conter (l)));
  474. break;
  475. #endif
  476. default:
  477. assert ("INTEGER1/REAL bad source kind type" == NULL);
  478. break;
  479. }
  480. break;
  481. case FFEINFO_basictypeCOMPLEX:
  482. switch (ffeinfo_kindtype (ffebld_info (l)))
  483. {
  484. #if FFETARGET_okCOMPLEX1
  485. case FFEINFO_kindtypeREAL1:
  486. error = ffetarget_convert_integer1_complex1
  487. (ffebld_cu_ptr_integer1 (u),
  488. ffebld_constant_complex1 (ffebld_conter (l)));
  489. break;
  490. #endif
  491. #if FFETARGET_okCOMPLEX2
  492. case FFEINFO_kindtypeREAL2:
  493. error = ffetarget_convert_integer1_complex2
  494. (ffebld_cu_ptr_integer1 (u),
  495. ffebld_constant_complex2 (ffebld_conter (l)));
  496. break;
  497. #endif
  498. #if FFETARGET_okCOMPLEX3
  499. case FFEINFO_kindtypeREAL3:
  500. error = ffetarget_convert_integer1_complex3
  501. (ffebld_cu_ptr_integer1 (u),
  502. ffebld_constant_complex3 (ffebld_conter (l)));
  503. break;
  504. #endif
  505. #if FFETARGET_okCOMPLEX4
  506. case FFEINFO_kindtypeREAL4:
  507. error = ffetarget_convert_integer1_complex4
  508. (ffebld_cu_ptr_integer1 (u),
  509. ffebld_constant_complex4 (ffebld_conter (l)));
  510. break;
  511. #endif
  512. default:
  513. assert ("INTEGER1/COMPLEX bad source kind type" == NULL);
  514. break;
  515. }
  516. break;
  517. case FFEINFO_basictypeLOGICAL:
  518. switch (ffeinfo_kindtype (ffebld_info (l)))
  519. {
  520. #if FFETARGET_okLOGICAL1
  521. case FFEINFO_kindtypeLOGICAL1:
  522. error = ffetarget_convert_integer1_logical1
  523. (ffebld_cu_ptr_integer1 (u),
  524. ffebld_constant_logical1 (ffebld_conter (l)));
  525. break;
  526. #endif
  527. #if FFETARGET_okLOGICAL2
  528. case FFEINFO_kindtypeLOGICAL2:
  529. error = ffetarget_convert_integer1_logical2
  530. (ffebld_cu_ptr_integer1 (u),
  531. ffebld_constant_logical2 (ffebld_conter (l)));
  532. break;
  533. #endif
  534. #if FFETARGET_okLOGICAL3
  535. case FFEINFO_kindtypeLOGICAL3:
  536. error = ffetarget_convert_integer1_logical3
  537. (ffebld_cu_ptr_integer1 (u),
  538. ffebld_constant_logical3 (ffebld_conter (l)));
  539. break;
  540. #endif
  541. #if FFETARGET_okLOGICAL4
  542. case FFEINFO_kindtypeLOGICAL4:
  543. error = ffetarget_convert_integer1_logical4
  544. (ffebld_cu_ptr_integer1 (u),
  545. ffebld_constant_logical4 (ffebld_conter (l)));
  546. break;
  547. #endif
  548. default:
  549. assert ("INTEGER1/LOGICAL bad source kind type" == NULL);
  550. break;
  551. }
  552. break;
  553. case FFEINFO_basictypeCHARACTER:
  554. error = ffetarget_convert_integer1_character1
  555. (ffebld_cu_ptr_integer1 (u),
  556. ffebld_constant_character1 (ffebld_conter (l)));
  557. break;
  558. case FFEINFO_basictypeHOLLERITH:
  559. error = ffetarget_convert_integer1_hollerith
  560. (ffebld_cu_ptr_integer1 (u),
  561. ffebld_constant_hollerith (ffebld_conter (l)));
  562. break;
  563. case FFEINFO_basictypeTYPELESS:
  564. error = ffetarget_convert_integer1_typeless
  565. (ffebld_cu_ptr_integer1 (u),
  566. ffebld_constant_typeless (ffebld_conter (l)));
  567. break;
  568. default:
  569. assert ("INTEGER1 bad type" == NULL);
  570. break;
  571. }
  572. /* If conversion operation is not implemented, return original expr. */
  573. if (error == FFEBAD_NOCANDO)
  574. return expr;
  575. expr = ffebld_new_conter_with_orig
  576. (ffebld_constant_new_integer1_val
  577. (ffebld_cu_val_integer1 (u)), expr);
  578. break;
  579. #endif
  580. #if FFETARGET_okINTEGER2
  581. case FFEINFO_kindtypeINTEGER2:
  582. switch (ffeinfo_basictype (ffebld_info (l)))
  583. {
  584. case FFEINFO_basictypeINTEGER:
  585. switch (ffeinfo_kindtype (ffebld_info (l)))
  586. {
  587. #if FFETARGET_okINTEGER1
  588. case FFEINFO_kindtypeINTEGER1:
  589. error = ffetarget_convert_integer2_integer1
  590. (ffebld_cu_ptr_integer2 (u),
  591. ffebld_constant_integer1 (ffebld_conter (l)));
  592. break;
  593. #endif
  594. #if FFETARGET_okINTEGER3
  595. case FFEINFO_kindtypeINTEGER3:
  596. error = ffetarget_convert_integer2_integer3
  597. (ffebld_cu_ptr_integer2 (u),
  598. ffebld_constant_integer3 (ffebld_conter (l)));
  599. break;
  600. #endif
  601. #if FFETARGET_okINTEGER4
  602. case FFEINFO_kindtypeINTEGER4:
  603. error = ffetarget_convert_integer2_integer4
  604. (ffebld_cu_ptr_integer2 (u),
  605. ffebld_constant_integer4 (ffebld_conter (l)));
  606. break;
  607. #endif
  608. default:
  609. assert ("INTEGER2/INTEGER bad source kind type" == NULL);
  610. break;
  611. }
  612. break;
  613. case FFEINFO_basictypeREAL:
  614. switch (ffeinfo_kindtype (ffebld_info (l)))
  615. {
  616. #if FFETARGET_okREAL1
  617. case FFEINFO_kindtypeREAL1:
  618. error = ffetarget_convert_integer2_real1
  619. (ffebld_cu_ptr_integer2 (u),
  620. ffebld_constant_real1 (ffebld_conter (l)));
  621. break;
  622. #endif
  623. #if FFETARGET_okREAL2
  624. case FFEINFO_kindtypeREAL2:
  625. error = ffetarget_convert_integer2_real2
  626. (ffebld_cu_ptr_integer2 (u),
  627. ffebld_constant_real2 (ffebld_conter (l)));
  628. break;
  629. #endif
  630. #if FFETARGET_okREAL3
  631. case FFEINFO_kindtypeREAL3:
  632. error = ffetarget_convert_integer2_real3
  633. (ffebld_cu_ptr_integer2 (u),
  634. ffebld_constant_real3 (ffebld_conter (l)));
  635. break;
  636. #endif
  637. #if FFETARGET_okREAL4
  638. case FFEINFO_kindtypeREAL4:
  639. error = ffetarget_convert_integer2_real4
  640. (ffebld_cu_ptr_integer2 (u),
  641. ffebld_constant_real4 (ffebld_conter (l)));
  642. break;
  643. #endif
  644. default:
  645. assert ("INTEGER2/REAL bad source kind type" == NULL);
  646. break;
  647. }
  648. break;
  649. case FFEINFO_basictypeCOMPLEX:
  650. switch (ffeinfo_kindtype (ffebld_info (l)))
  651. {
  652. #if FFETARGET_okCOMPLEX1
  653. case FFEINFO_kindtypeREAL1:
  654. error = ffetarget_convert_integer2_complex1
  655. (ffebld_cu_ptr_integer2 (u),
  656. ffebld_constant_complex1 (ffebld_conter (l)));
  657. break;
  658. #endif
  659. #if FFETARGET_okCOMPLEX2
  660. case FFEINFO_kindtypeREAL2:
  661. error = ffetarget_convert_integer2_complex2
  662. (ffebld_cu_ptr_integer2 (u),
  663. ffebld_constant_complex2 (ffebld_conter (l)));
  664. break;
  665. #endif
  666. #if FFETARGET_okCOMPLEX3
  667. case FFEINFO_kindtypeREAL3:
  668. error = ffetarget_convert_integer2_complex3
  669. (ffebld_cu_ptr_integer2 (u),
  670. ffebld_constant_complex3 (ffebld_conter (l)));
  671. break;
  672. #endif
  673. #if FFETARGET_okCOMPLEX4
  674. case FFEINFO_kindtypeREAL4:
  675. error = ffetarget_convert_integer2_complex4
  676. (ffebld_cu_ptr_integer2 (u),
  677. ffebld_constant_complex4 (ffebld_conter (l)));
  678. break;
  679. #endif
  680. default:
  681. assert ("INTEGER2/COMPLEX bad source kind type" == NULL);
  682. break;
  683. }
  684. break;
  685. case FFEINFO_basictypeLOGICAL:
  686. switch (ffeinfo_kindtype (ffebld_info (l)))
  687. {
  688. #if FFETARGET_okLOGICAL1
  689. case FFEINFO_kindtypeLOGICAL1:
  690. error = ffetarget_convert_integer2_logical1
  691. (ffebld_cu_ptr_integer2 (u),
  692. ffebld_constant_logical1 (ffebld_conter (l)));
  693. break;
  694. #endif
  695. #if FFETARGET_okLOGICAL2
  696. case FFEINFO_kindtypeLOGICAL2:
  697. error = ffetarget_convert_integer2_logical2
  698. (ffebld_cu_ptr_integer2 (u),
  699. ffebld_constant_logical2 (ffebld_conter (l)));
  700. break;
  701. #endif
  702. #if FFETARGET_okLOGICAL3
  703. case FFEINFO_kindtypeLOGICAL3:
  704. error = ffetarget_convert_integer2_logical3
  705. (ffebld_cu_ptr_integer2 (u),
  706. ffebld_constant_logical3 (ffebld_conter (l)));
  707. break;
  708. #endif
  709. #if FFETARGET_okLOGICAL4
  710. case FFEINFO_kindtypeLOGICAL4:
  711. error = ffetarget_convert_integer2_logical4
  712. (ffebld_cu_ptr_integer2 (u),
  713. ffebld_constant_logical4 (ffebld_conter (l)));
  714. break;
  715. #endif
  716. default:
  717. assert ("INTEGER2/LOGICAL bad source kind type" == NULL);
  718. break;
  719. }
  720. break;
  721. case FFEINFO_basictypeCHARACTER:
  722. error = ffetarget_convert_integer2_character1
  723. (ffebld_cu_ptr_integer2 (u),
  724. ffebld_constant_character1 (ffebld_conter (l)));
  725. break;
  726. case FFEINFO_basictypeHOLLERITH:
  727. error = ffetarget_convert_integer2_hollerith
  728. (ffebld_cu_ptr_integer2 (u),
  729. ffebld_constant_hollerith (ffebld_conter (l)));
  730. break;
  731. case FFEINFO_basictypeTYPELESS:
  732. error = ffetarget_convert_integer2_typeless
  733. (ffebld_cu_ptr_integer2 (u),
  734. ffebld_constant_typeless (ffebld_conter (l)));
  735. break;
  736. default:
  737. assert ("INTEGER2 bad type" == NULL);
  738. break;
  739. }
  740. /* If conversion operation is not implemented, return original expr. */
  741. if (error == FFEBAD_NOCANDO)
  742. return expr;
  743. expr = ffebld_new_conter_with_orig
  744. (ffebld_constant_new_integer2_val
  745. (ffebld_cu_val_integer2 (u)), expr);
  746. break;
  747. #endif
  748. #if FFETARGET_okINTEGER3
  749. case FFEINFO_kindtypeINTEGER3:
  750. switch (ffeinfo_basictype (ffebld_info (l)))
  751. {
  752. case FFEINFO_basictypeINTEGER:
  753. switch (ffeinfo_kindtype (ffebld_info (l)))
  754. {
  755. #if FFETARGET_okINTEGER1
  756. case FFEINFO_kindtypeINTEGER1:
  757. error = ffetarget_convert_integer3_integer1
  758. (ffebld_cu_ptr_integer3 (u),
  759. ffebld_constant_integer1 (ffebld_conter (l)));
  760. break;
  761. #endif
  762. #if FFETARGET_okINTEGER2
  763. case FFEINFO_kindtypeINTEGER2:
  764. error = ffetarget_convert_integer3_integer2
  765. (ffebld_cu_ptr_integer3 (u),
  766. ffebld_constant_integer2 (ffebld_conter (l)));
  767. break;
  768. #endif
  769. #if FFETARGET_okINTEGER4
  770. case FFEINFO_kindtypeINTEGER4:
  771. error = ffetarget_convert_integer3_integer4
  772. (ffebld_cu_ptr_integer3 (u),
  773. ffebld_constant_integer4 (ffebld_conter (l)));
  774. break;
  775. #endif
  776. default:
  777. assert ("INTEGER3/INTEGER bad source kind type" == NULL);
  778. break;
  779. }
  780. break;
  781. case FFEINFO_basictypeREAL:
  782. switch (ffeinfo_kindtype (ffebld_info (l)))
  783. {
  784. #if FFETARGET_okREAL1
  785. case FFEINFO_kindtypeREAL1:
  786. error = ffetarget_convert_integer3_real1
  787. (ffebld_cu_ptr_integer3 (u),
  788. ffebld_constant_real1 (ffebld_conter (l)));
  789. break;
  790. #endif
  791. #if FFETARGET_okREAL2
  792. case FFEINFO_kindtypeREAL2:
  793. error = ffetarget_convert_integer3_real2
  794. (ffebld_cu_ptr_integer3 (u),
  795. ffebld_constant_real2 (ffebld_conter (l)));
  796. break;
  797. #endif
  798. #if FFETARGET_okREAL3
  799. case FFEINFO_kindtypeREAL3:
  800. error = ffetarget_convert_integer3_real3
  801. (ffebld_cu_ptr_integer3 (u),
  802. ffebld_constant_real3 (ffebld_conter (l)));
  803. break;
  804. #endif
  805. #if FFETARGET_okREAL4
  806. case FFEINFO_kindtypeREAL4:
  807. error = ffetarget_convert_integer3_real4
  808. (ffebld_cu_ptr_integer3 (u),
  809. ffebld_constant_real4 (ffebld_conter (l)));
  810. break;
  811. #endif
  812. default:
  813. assert ("INTEGER3/REAL bad source kind type" == NULL);
  814. break;
  815. }
  816. break;
  817. case FFEINFO_basictypeCOMPLEX:
  818. switch (ffeinfo_kindtype (ffebld_info (l)))
  819. {
  820. #if FFETARGET_okCOMPLEX1
  821. case FFEINFO_kindtypeREAL1:
  822. error = ffetarget_convert_integer3_complex1
  823. (ffebld_cu_ptr_integer3 (u),
  824. ffebld_constant_complex1 (ffebld_conter (l)));
  825. break;
  826. #endif
  827. #if FFETARGET_okCOMPLEX2
  828. case FFEINFO_kindtypeREAL2:
  829. error = ffetarget_convert_integer3_complex2
  830. (ffebld_cu_ptr_integer3 (u),
  831. ffebld_constant_complex2 (ffebld_conter (l)));
  832. break;
  833. #endif
  834. #if FFETARGET_okCOMPLEX3
  835. case FFEINFO_kindtypeREAL3:
  836. error = ffetarget_convert_integer3_complex3
  837. (ffebld_cu_ptr_integer3 (u),
  838. ffebld_constant_complex3 (ffebld_conter (l)));
  839. break;
  840. #endif
  841. #if FFETARGET_okCOMPLEX4
  842. case FFEINFO_kindtypeREAL4:
  843. error = ffetarget_convert_integer3_complex4
  844. (ffebld_cu_ptr_integer3 (u),
  845. ffebld_constant_complex4 (ffebld_conter (l)));
  846. break;
  847. #endif
  848. default:
  849. assert ("INTEGER3/COMPLEX bad source kind type" == NULL);
  850. break;
  851. }
  852. break;
  853. case FFEINFO_basictypeLOGICAL:
  854. switch (ffeinfo_kindtype (ffebld_info (l)))
  855. {
  856. #if FFETARGET_okLOGICAL1
  857. case FFEINFO_kindtypeLOGICAL1:
  858. error = ffetarget_convert_integer3_logical1
  859. (ffebld_cu_ptr_integer3 (u),
  860. ffebld_constant_logical1 (ffebld_conter (l)));
  861. break;
  862. #endif
  863. #if FFETARGET_okLOGICAL2
  864. case FFEINFO_kindtypeLOGICAL2:
  865. error = ffetarget_convert_integer3_logical2
  866. (ffebld_cu_ptr_integer3 (u),
  867. ffebld_constant_logical2 (ffebld_conter (l)));
  868. break;
  869. #endif
  870. #if FFETARGET_okLOGICAL3
  871. case FFEINFO_kindtypeLOGICAL3:
  872. error = ffetarget_convert_integer3_logical3
  873. (ffebld_cu_ptr_integer3 (u),
  874. ffebld_constant_logical3 (ffebld_conter (l)));
  875. break;
  876. #endif
  877. #if FFETARGET_okLOGICAL4
  878. case FFEINFO_kindtypeLOGICAL4:
  879. error = ffetarget_convert_integer3_logical4
  880. (ffebld_cu_ptr_integer3 (u),
  881. ffebld_constant_logical4 (ffebld_conter (l)));
  882. break;
  883. #endif
  884. default:
  885. assert ("INTEGER3/LOGICAL bad source kind type" == NULL);
  886. break;
  887. }
  888. break;
  889. case FFEINFO_basictypeCHARACTER:
  890. error = ffetarget_convert_integer3_character1
  891. (ffebld_cu_ptr_integer3 (u),
  892. ffebld_constant_character1 (ffebld_conter (l)));
  893. break;
  894. case FFEINFO_basictypeHOLLERITH:
  895. error = ffetarget_convert_integer3_hollerith
  896. (ffebld_cu_ptr_integer3 (u),
  897. ffebld_constant_hollerith (ffebld_conter (l)));
  898. break;
  899. case FFEINFO_basictypeTYPELESS:
  900. error = ffetarget_convert_integer3_typeless
  901. (ffebld_cu_ptr_integer3 (u),
  902. ffebld_constant_typeless (ffebld_conter (l)));
  903. break;
  904. default:
  905. assert ("INTEGER3 bad type" == NULL);
  906. break;
  907. }
  908. /* If conversion operation is not implemented, return original expr. */
  909. if (error == FFEBAD_NOCANDO)
  910. return expr;
  911. expr = ffebld_new_conter_with_orig
  912. (ffebld_constant_new_integer3_val
  913. (ffebld_cu_val_integer3 (u)), expr);
  914. break;
  915. #endif
  916. #if FFETARGET_okINTEGER4
  917. case FFEINFO_kindtypeINTEGER4:
  918. switch (ffeinfo_basictype (ffebld_info (l)))
  919. {
  920. case FFEINFO_basictypeINTEGER:
  921. switch (ffeinfo_kindtype (ffebld_info (l)))
  922. {
  923. #if FFETARGET_okINTEGER1
  924. case FFEINFO_kindtypeINTEGER1:
  925. error = ffetarget_convert_integer4_integer1
  926. (ffebld_cu_ptr_integer4 (u),
  927. ffebld_constant_integer1 (ffebld_conter (l)));
  928. break;
  929. #endif
  930. #if FFETARGET_okINTEGER2
  931. case FFEINFO_kindtypeINTEGER2:
  932. error = ffetarget_convert_integer4_integer2
  933. (ffebld_cu_ptr_integer4 (u),
  934. ffebld_constant_integer2 (ffebld_conter (l)));
  935. break;
  936. #endif
  937. #if FFETARGET_okINTEGER3
  938. case FFEINFO_kindtypeINTEGER3:
  939. error = ffetarget_convert_integer4_integer3
  940. (ffebld_cu_ptr_integer4 (u),
  941. ffebld_constant_integer3 (ffebld_conter (l)));
  942. break;
  943. #endif
  944. default:
  945. assert ("INTEGER4/INTEGER bad source kind type" == NULL);
  946. break;
  947. }
  948. break;
  949. case FFEINFO_basictypeREAL:
  950. switch (ffeinfo_kindtype (ffebld_info (l)))
  951. {
  952. #if FFETARGET_okREAL1
  953. case FFEINFO_kindtypeREAL1:
  954. error = ffetarget_convert_integer4_real1
  955. (ffebld_cu_ptr_integer4 (u),
  956. ffebld_constant_real1 (ffebld_conter (l)));
  957. break;
  958. #endif
  959. #if FFETARGET_okREAL2
  960. case FFEINFO_kindtypeREAL2:
  961. error = ffetarget_convert_integer4_real2
  962. (ffebld_cu_ptr_integer4 (u),
  963. ffebld_constant_real2 (ffebld_conter (l)));
  964. break;
  965. #endif
  966. #if FFETARGET_okREAL3
  967. case FFEINFO_kindtypeREAL3:
  968. error = ffetarget_convert_integer4_real3
  969. (ffebld_cu_ptr_integer4 (u),
  970. ffebld_constant_real3 (ffebld_conter (l)));
  971. break;
  972. #endif
  973. #if FFETARGET_okREAL4
  974. case FFEINFO_kindtypeREAL4:
  975. error = ffetarget_convert_integer4_real4
  976. (ffebld_cu_ptr_integer4 (u),
  977. ffebld_constant_real4 (ffebld_conter (l)));
  978. break;
  979. #endif
  980. default:
  981. assert ("INTEGER4/REAL bad source kind type" == NULL);
  982. break;
  983. }
  984. break;
  985. case FFEINFO_basictypeCOMPLEX:
  986. switch (ffeinfo_kindtype (ffebld_info (l)))
  987. {
  988. #if FFETARGET_okCOMPLEX1
  989. case FFEINFO_kindtypeREAL1:
  990. error = ffetarget_convert_integer4_complex1
  991. (ffebld_cu_ptr_integer4 (u),
  992. ffebld_constant_complex1 (ffebld_conter (l)));
  993. break;
  994. #endif
  995. #if FFETARGET_okCOMPLEX2
  996. case FFEINFO_kindtypeREAL2:
  997. error = ffetarget_convert_integer4_complex2
  998. (ffebld_cu_ptr_integer4 (u),
  999. ffebld_constant_complex2 (ffebld_conter (l)));
  1000. break;
  1001. #endif
  1002. #if FFETARGET_okCOMPLEX3
  1003. case FFEINFO_kindtypeREAL3:
  1004. error = ffetarget_convert_integer4_complex3
  1005. (ffebld_cu_ptr_integer4 (u),
  1006. ffebld_constant_complex3 (ffebld_conter (l)));
  1007. break;
  1008. #endif
  1009. #if FFETARGET_okCOMPLEX4
  1010. case FFEINFO_kindtypeREAL4:
  1011. error = ffetarget_convert_integer4_complex4
  1012. (ffebld_cu_ptr_integer4 (u),
  1013. ffebld_constant_complex4 (ffebld_conter (l)));
  1014. break;
  1015. #endif
  1016. default:
  1017. assert ("INTEGER3/COMPLEX bad source kind type" == NULL);
  1018. break;
  1019. }
  1020. break;
  1021. case FFEINFO_basictypeLOGICAL:
  1022. switch (ffeinfo_kindtype (ffebld_info (l)))
  1023. {
  1024. #if FFETARGET_okLOGICAL1
  1025. case FFEINFO_kindtypeLOGICAL1:
  1026. error = ffetarget_convert_integer4_logical1
  1027. (ffebld_cu_ptr_integer4 (u),
  1028. ffebld_constant_logical1 (ffebld_conter (l)));
  1029. break;
  1030. #endif
  1031. #if FFETARGET_okLOGICAL2
  1032. case FFEINFO_kindtypeLOGICAL2:
  1033. error = ffetarget_convert_integer4_logical2
  1034. (ffebld_cu_ptr_integer4 (u),
  1035. ffebld_constant_logical2 (ffebld_conter (l)));
  1036. break;
  1037. #endif
  1038. #if FFETARGET_okLOGICAL3
  1039. case FFEINFO_kindtypeLOGICAL3:
  1040. error = ffetarget_convert_integer4_logical3
  1041. (ffebld_cu_ptr_integer4 (u),
  1042. ffebld_constant_logical3 (ffebld_conter (l)));
  1043. break;
  1044. #endif
  1045. #if FFETARGET_okLOGICAL4
  1046. case FFEINFO_kindtypeLOGICAL4:
  1047. error = ffetarget_convert_integer4_logical4
  1048. (ffebld_cu_ptr_integer4 (u),
  1049. ffebld_constant_logical4 (ffebld_conter (l)));
  1050. break;
  1051. #endif
  1052. default:
  1053. assert ("INTEGER4/LOGICAL bad source kind type" == NULL);
  1054. break;
  1055. }
  1056. break;
  1057. case FFEINFO_basictypeCHARACTER:
  1058. error = ffetarget_convert_integer4_character1
  1059. (ffebld_cu_ptr_integer4 (u),
  1060. ffebld_constant_character1 (ffebld_conter (l)));
  1061. break;
  1062. case FFEINFO_basictypeHOLLERITH:
  1063. error = ffetarget_convert_integer4_hollerith
  1064. (ffebld_cu_ptr_integer4 (u),
  1065. ffebld_constant_hollerith (ffebld_conter (l)));
  1066. break;
  1067. case FFEINFO_basictypeTYPELESS:
  1068. error = ffetarget_convert_integer4_typeless
  1069. (ffebld_cu_ptr_integer4 (u),
  1070. ffebld_constant_typeless (ffebld_conter (l)));
  1071. break;
  1072. default:
  1073. assert ("INTEGER4 bad type" == NULL);
  1074. break;
  1075. }
  1076. /* If conversion operation is not implemented, return original expr. */
  1077. if (error == FFEBAD_NOCANDO)
  1078. return expr;
  1079. expr = ffebld_new_conter_with_orig
  1080. (ffebld_constant_new_integer4_val
  1081. (ffebld_cu_val_integer4 (u)), expr);
  1082. break;
  1083. #endif
  1084. default:
  1085. assert ("bad integer kind type" == NULL);
  1086. break;
  1087. }
  1088. break;
  1089. case FFEINFO_basictypeLOGICAL:
  1090. sz = FFETARGET_charactersizeNONE;
  1091. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  1092. {
  1093. #if FFETARGET_okLOGICAL1
  1094. case FFEINFO_kindtypeLOGICAL1:
  1095. switch (ffeinfo_basictype (ffebld_info (l)))
  1096. {
  1097. case FFEINFO_basictypeLOGICAL:
  1098. switch (ffeinfo_kindtype (ffebld_info (l)))
  1099. {
  1100. #if FFETARGET_okLOGICAL2
  1101. case FFEINFO_kindtypeLOGICAL2:
  1102. error = ffetarget_convert_logical1_logical2
  1103. (ffebld_cu_ptr_logical1 (u),
  1104. ffebld_constant_logical2 (ffebld_conter (l)));
  1105. break;
  1106. #endif
  1107. #if FFETARGET_okLOGICAL3
  1108. case FFEINFO_kindtypeLOGICAL3:
  1109. error = ffetarget_convert_logical1_logical3
  1110. (ffebld_cu_ptr_logical1 (u),
  1111. ffebld_constant_logical3 (ffebld_conter (l)));
  1112. break;
  1113. #endif
  1114. #if FFETARGET_okLOGICAL4
  1115. case FFEINFO_kindtypeLOGICAL4:
  1116. error = ffetarget_convert_logical1_logical4
  1117. (ffebld_cu_ptr_logical1 (u),
  1118. ffebld_constant_logical4 (ffebld_conter (l)));
  1119. break;
  1120. #endif
  1121. default:
  1122. assert ("LOGICAL1/LOGICAL bad source kind type" == NULL);
  1123. break;
  1124. }
  1125. break;
  1126. case FFEINFO_basictypeINTEGER:
  1127. switch (ffeinfo_kindtype (ffebld_info (l)))
  1128. {
  1129. #if FFETARGET_okINTEGER1
  1130. case FFEINFO_kindtypeINTEGER1:
  1131. error = ffetarget_convert_logical1_integer1
  1132. (ffebld_cu_ptr_logical1 (u),
  1133. ffebld_constant_integer1 (ffebld_conter (l)));
  1134. break;
  1135. #endif
  1136. #if FFETARGET_okINTEGER2
  1137. case FFEINFO_kindtypeINTEGER2:
  1138. error = ffetarget_convert_logical1_integer2
  1139. (ffebld_cu_ptr_logical1 (u),
  1140. ffebld_constant_integer2 (ffebld_conter (l)));
  1141. break;
  1142. #endif
  1143. #if FFETARGET_okINTEGER3
  1144. case FFEINFO_kindtypeINTEGER3:
  1145. error = ffetarget_convert_logical1_integer3
  1146. (ffebld_cu_ptr_logical1 (u),
  1147. ffebld_constant_integer3 (ffebld_conter (l)));
  1148. break;
  1149. #endif
  1150. #if FFETARGET_okINTEGER4
  1151. case FFEINFO_kindtypeINTEGER4:
  1152. error = ffetarget_convert_logical1_integer4
  1153. (ffebld_cu_ptr_logical1 (u),
  1154. ffebld_constant_integer4 (ffebld_conter (l)));
  1155. break;
  1156. #endif
  1157. default:
  1158. assert ("LOGICAL1/INTEGER bad source kind type" == NULL);
  1159. break;
  1160. }
  1161. break;
  1162. case FFEINFO_basictypeCHARACTER:
  1163. error = ffetarget_convert_logical1_character1
  1164. (ffebld_cu_ptr_logical1 (u),
  1165. ffebld_constant_character1 (ffebld_conter (l)));
  1166. break;
  1167. case FFEINFO_basictypeHOLLERITH:
  1168. error = ffetarget_convert_logical1_hollerith
  1169. (ffebld_cu_ptr_logical1 (u),
  1170. ffebld_constant_hollerith (ffebld_conter (l)));
  1171. break;
  1172. case FFEINFO_basictypeTYPELESS:
  1173. error = ffetarget_convert_logical1_typeless
  1174. (ffebld_cu_ptr_logical1 (u),
  1175. ffebld_constant_typeless (ffebld_conter (l)));
  1176. break;
  1177. default:
  1178. assert ("LOGICAL1 bad type" == NULL);
  1179. break;
  1180. }
  1181. /* If conversion operation is not implemented, return original expr. */
  1182. if (error == FFEBAD_NOCANDO)
  1183. return expr;
  1184. expr = ffebld_new_conter_with_orig
  1185. (ffebld_constant_new_logical1_val
  1186. (ffebld_cu_val_logical1 (u)), expr);
  1187. break;
  1188. #endif
  1189. #if FFETARGET_okLOGICAL2
  1190. case FFEINFO_kindtypeLOGICAL2:
  1191. switch (ffeinfo_basictype (ffebld_info (l)))
  1192. {
  1193. case FFEINFO_basictypeLOGICAL:
  1194. switch (ffeinfo_kindtype (ffebld_info (l)))
  1195. {
  1196. #if FFETARGET_okLOGICAL1
  1197. case FFEINFO_kindtypeLOGICAL1:
  1198. error = ffetarget_convert_logical2_logical1
  1199. (ffebld_cu_ptr_logical2 (u),
  1200. ffebld_constant_logical1 (ffebld_conter (l)));
  1201. break;
  1202. #endif
  1203. #if FFETARGET_okLOGICAL3
  1204. case FFEINFO_kindtypeLOGICAL3:
  1205. error = ffetarget_convert_logical2_logical3
  1206. (ffebld_cu_ptr_logical2 (u),
  1207. ffebld_constant_logical3 (ffebld_conter (l)));
  1208. break;
  1209. #endif
  1210. #if FFETARGET_okLOGICAL4
  1211. case FFEINFO_kindtypeLOGICAL4:
  1212. error = ffetarget_convert_logical2_logical4
  1213. (ffebld_cu_ptr_logical2 (u),
  1214. ffebld_constant_logical4 (ffebld_conter (l)));
  1215. break;
  1216. #endif
  1217. default:
  1218. assert ("LOGICAL2/LOGICAL bad source kind type" == NULL);
  1219. break;
  1220. }
  1221. break;
  1222. case FFEINFO_basictypeINTEGER:
  1223. switch (ffeinfo_kindtype (ffebld_info (l)))
  1224. {
  1225. #if FFETARGET_okINTEGER1
  1226. case FFEINFO_kindtypeINTEGER1:
  1227. error = ffetarget_convert_logical2_integer1
  1228. (ffebld_cu_ptr_logical2 (u),
  1229. ffebld_constant_integer1 (ffebld_conter (l)));
  1230. break;
  1231. #endif
  1232. #if FFETARGET_okINTEGER2
  1233. case FFEINFO_kindtypeINTEGER2:
  1234. error = ffetarget_convert_logical2_integer2
  1235. (ffebld_cu_ptr_logical2 (u),
  1236. ffebld_constant_integer2 (ffebld_conter (l)));
  1237. break;
  1238. #endif
  1239. #if FFETARGET_okINTEGER3
  1240. case FFEINFO_kindtypeINTEGER3:
  1241. error = ffetarget_convert_logical2_integer3
  1242. (ffebld_cu_ptr_logical2 (u),
  1243. ffebld_constant_integer3 (ffebld_conter (l)));
  1244. break;
  1245. #endif
  1246. #if FFETARGET_okINTEGER4
  1247. case FFEINFO_kindtypeINTEGER4:
  1248. error = ffetarget_convert_logical2_integer4
  1249. (ffebld_cu_ptr_logical2 (u),
  1250. ffebld_constant_integer4 (ffebld_conter (l)));
  1251. break;
  1252. #endif
  1253. default:
  1254. assert ("LOGICAL2/INTEGER bad source kind type" == NULL);
  1255. break;
  1256. }
  1257. break;
  1258. case FFEINFO_basictypeCHARACTER:
  1259. error = ffetarget_convert_logical2_character1
  1260. (ffebld_cu_ptr_logical2 (u),
  1261. ffebld_constant_character1 (ffebld_conter (l)));
  1262. break;
  1263. case FFEINFO_basictypeHOLLERITH:
  1264. error = ffetarget_convert_logical2_hollerith
  1265. (ffebld_cu_ptr_logical2 (u),
  1266. ffebld_constant_hollerith (ffebld_conter (l)));
  1267. break;
  1268. case FFEINFO_basictypeTYPELESS:
  1269. error = ffetarget_convert_logical2_typeless
  1270. (ffebld_cu_ptr_logical2 (u),
  1271. ffebld_constant_typeless (ffebld_conter (l)));
  1272. break;
  1273. default:
  1274. assert ("LOGICAL2 bad type" == NULL);
  1275. break;
  1276. }
  1277. /* If conversion operation is not implemented, return original expr. */
  1278. if (error == FFEBAD_NOCANDO)
  1279. return expr;
  1280. expr = ffebld_new_conter_with_orig
  1281. (ffebld_constant_new_logical2_val
  1282. (ffebld_cu_val_logical2 (u)), expr);
  1283. break;
  1284. #endif
  1285. #if FFETARGET_okLOGICAL3
  1286. case FFEINFO_kindtypeLOGICAL3:
  1287. switch (ffeinfo_basictype (ffebld_info (l)))
  1288. {
  1289. case FFEINFO_basictypeLOGICAL:
  1290. switch (ffeinfo_kindtype (ffebld_info (l)))
  1291. {
  1292. #if FFETARGET_okLOGICAL1
  1293. case FFEINFO_kindtypeLOGICAL1:
  1294. error = ffetarget_convert_logical3_logical1
  1295. (ffebld_cu_ptr_logical3 (u),
  1296. ffebld_constant_logical1 (ffebld_conter (l)));
  1297. break;
  1298. #endif
  1299. #if FFETARGET_okLOGICAL2
  1300. case FFEINFO_kindtypeLOGICAL2:
  1301. error = ffetarget_convert_logical3_logical2
  1302. (ffebld_cu_ptr_logical3 (u),
  1303. ffebld_constant_logical2 (ffebld_conter (l)));
  1304. break;
  1305. #endif
  1306. #if FFETARGET_okLOGICAL4
  1307. case FFEINFO_kindtypeLOGICAL4:
  1308. error = ffetarget_convert_logical3_logical4
  1309. (ffebld_cu_ptr_logical3 (u),
  1310. ffebld_constant_logical4 (ffebld_conter (l)));
  1311. break;
  1312. #endif
  1313. default:
  1314. assert ("LOGICAL3/LOGICAL bad source kind type" == NULL);
  1315. break;
  1316. }
  1317. break;
  1318. case FFEINFO_basictypeINTEGER:
  1319. switch (ffeinfo_kindtype (ffebld_info (l)))
  1320. {
  1321. #if FFETARGET_okINTEGER1
  1322. case FFEINFO_kindtypeINTEGER1:
  1323. error = ffetarget_convert_logical3_integer1
  1324. (ffebld_cu_ptr_logical3 (u),
  1325. ffebld_constant_integer1 (ffebld_conter (l)));
  1326. break;
  1327. #endif
  1328. #if FFETARGET_okINTEGER2
  1329. case FFEINFO_kindtypeINTEGER2:
  1330. error = ffetarget_convert_logical3_integer2
  1331. (ffebld_cu_ptr_logical3 (u),
  1332. ffebld_constant_integer2 (ffebld_conter (l)));
  1333. break;
  1334. #endif
  1335. #if FFETARGET_okINTEGER3
  1336. case FFEINFO_kindtypeINTEGER3:
  1337. error = ffetarget_convert_logical3_integer3
  1338. (ffebld_cu_ptr_logical3 (u),
  1339. ffebld_constant_integer3 (ffebld_conter (l)));
  1340. break;
  1341. #endif
  1342. #if FFETARGET_okINTEGER4
  1343. case FFEINFO_kindtypeINTEGER4:
  1344. error = ffetarget_convert_logical3_integer4
  1345. (ffebld_cu_ptr_logical3 (u),
  1346. ffebld_constant_integer4 (ffebld_conter (l)));
  1347. break;
  1348. #endif
  1349. default:
  1350. assert ("LOGICAL3/INTEGER bad source kind type" == NULL);
  1351. break;
  1352. }
  1353. break;
  1354. case FFEINFO_basictypeCHARACTER:
  1355. error = ffetarget_convert_logical3_character1
  1356. (ffebld_cu_ptr_logical3 (u),
  1357. ffebld_constant_character1 (ffebld_conter (l)));
  1358. break;
  1359. case FFEINFO_basictypeHOLLERITH:
  1360. error = ffetarget_convert_logical3_hollerith
  1361. (ffebld_cu_ptr_logical3 (u),
  1362. ffebld_constant_hollerith (ffebld_conter (l)));
  1363. break;
  1364. case FFEINFO_basictypeTYPELESS:
  1365. error = ffetarget_convert_logical3_typeless
  1366. (ffebld_cu_ptr_logical3 (u),
  1367. ffebld_constant_typeless (ffebld_conter (l)));
  1368. break;
  1369. default:
  1370. assert ("LOGICAL3 bad type" == NULL);
  1371. break;
  1372. }
  1373. /* If conversion operation is not implemented, return original expr. */
  1374. if (error == FFEBAD_NOCANDO)
  1375. return expr;
  1376. expr = ffebld_new_conter_with_orig
  1377. (ffebld_constant_new_logical3_val
  1378. (ffebld_cu_val_logical3 (u)), expr);
  1379. break;
  1380. #endif
  1381. #if FFETARGET_okLOGICAL4
  1382. case FFEINFO_kindtypeLOGICAL4:
  1383. switch (ffeinfo_basictype (ffebld_info (l)))
  1384. {
  1385. case FFEINFO_basictypeLOGICAL:
  1386. switch (ffeinfo_kindtype (ffebld_info (l)))
  1387. {
  1388. #if FFETARGET_okLOGICAL1
  1389. case FFEINFO_kindtypeLOGICAL1:
  1390. error = ffetarget_convert_logical4_logical1
  1391. (ffebld_cu_ptr_logical4 (u),
  1392. ffebld_constant_logical1 (ffebld_conter (l)));
  1393. break;
  1394. #endif
  1395. #if FFETARGET_okLOGICAL2
  1396. case FFEINFO_kindtypeLOGICAL2:
  1397. error = ffetarget_convert_logical4_logical2
  1398. (ffebld_cu_ptr_logical4 (u),
  1399. ffebld_constant_logical2 (ffebld_conter (l)));
  1400. break;
  1401. #endif
  1402. #if FFETARGET_okLOGICAL3
  1403. case FFEINFO_kindtypeLOGICAL3:
  1404. error = ffetarget_convert_logical4_logical3
  1405. (ffebld_cu_ptr_logical4 (u),
  1406. ffebld_constant_logical3 (ffebld_conter (l)));
  1407. break;
  1408. #endif
  1409. default:
  1410. assert ("LOGICAL4/LOGICAL bad source kind type" == NULL);
  1411. break;
  1412. }
  1413. break;
  1414. case FFEINFO_basictypeINTEGER:
  1415. switch (ffeinfo_kindtype (ffebld_info (l)))
  1416. {
  1417. #if FFETARGET_okINTEGER1
  1418. case FFEINFO_kindtypeINTEGER1:
  1419. error = ffetarget_convert_logical4_integer1
  1420. (ffebld_cu_ptr_logical4 (u),
  1421. ffebld_constant_integer1 (ffebld_conter (l)));
  1422. break;
  1423. #endif
  1424. #if FFETARGET_okINTEGER2
  1425. case FFEINFO_kindtypeINTEGER2:
  1426. error = ffetarget_convert_logical4_integer2
  1427. (ffebld_cu_ptr_logical4 (u),
  1428. ffebld_constant_integer2 (ffebld_conter (l)));
  1429. break;
  1430. #endif
  1431. #if FFETARGET_okINTEGER3
  1432. case FFEINFO_kindtypeINTEGER3:
  1433. error = ffetarget_convert_logical4_integer3
  1434. (ffebld_cu_ptr_logical4 (u),
  1435. ffebld_constant_integer3 (ffebld_conter (l)));
  1436. break;
  1437. #endif
  1438. #if FFETARGET_okINTEGER4
  1439. case FFEINFO_kindtypeINTEGER4:
  1440. error = ffetarget_convert_logical4_integer4
  1441. (ffebld_cu_ptr_logical4 (u),
  1442. ffebld_constant_integer4 (ffebld_conter (l)));
  1443. break;
  1444. #endif
  1445. default:
  1446. assert ("LOGICAL4/INTEGER bad source kind type" == NULL);
  1447. break;
  1448. }
  1449. break;
  1450. case FFEINFO_basictypeCHARACTER:
  1451. error = ffetarget_convert_logical4_character1
  1452. (ffebld_cu_ptr_logical4 (u),
  1453. ffebld_constant_character1 (ffebld_conter (l)));
  1454. break;
  1455. case FFEINFO_basictypeHOLLERITH:
  1456. error = ffetarget_convert_logical4_hollerith
  1457. (ffebld_cu_ptr_logical4 (u),
  1458. ffebld_constant_hollerith (ffebld_conter (l)));
  1459. break;
  1460. case FFEINFO_basictypeTYPELESS:
  1461. error = ffetarget_convert_logical4_typeless
  1462. (ffebld_cu_ptr_logical4 (u),
  1463. ffebld_constant_typeless (ffebld_conter (l)));
  1464. break;
  1465. default:
  1466. assert ("LOGICAL4 bad type" == NULL);
  1467. break;
  1468. }
  1469. /* If conversion operation is not implemented, return original expr. */
  1470. if (error == FFEBAD_NOCANDO)
  1471. return expr;
  1472. expr = ffebld_new_conter_with_orig
  1473. (ffebld_constant_new_logical4_val
  1474. (ffebld_cu_val_logical4 (u)), expr);
  1475. break;
  1476. #endif
  1477. default:
  1478. assert ("bad logical kind type" == NULL);
  1479. break;
  1480. }
  1481. break;
  1482. case FFEINFO_basictypeREAL:
  1483. sz = FFETARGET_charactersizeNONE;
  1484. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  1485. {
  1486. #if FFETARGET_okREAL1
  1487. case FFEINFO_kindtypeREAL1:
  1488. switch (ffeinfo_basictype (ffebld_info (l)))
  1489. {
  1490. case FFEINFO_basictypeINTEGER:
  1491. switch (ffeinfo_kindtype (ffebld_info (l)))
  1492. {
  1493. #if FFETARGET_okINTEGER1
  1494. case FFEINFO_kindtypeINTEGER1:
  1495. error = ffetarget_convert_real1_integer1
  1496. (ffebld_cu_ptr_real1 (u),
  1497. ffebld_constant_integer1 (ffebld_conter (l)));
  1498. break;
  1499. #endif
  1500. #if FFETARGET_okINTEGER2
  1501. case FFEINFO_kindtypeINTEGER2:
  1502. error = ffetarget_convert_real1_integer2
  1503. (ffebld_cu_ptr_real1 (u),
  1504. ffebld_constant_integer2 (ffebld_conter (l)));
  1505. break;
  1506. #endif
  1507. #if FFETARGET_okINTEGER3
  1508. case FFEINFO_kindtypeINTEGER3:
  1509. error = ffetarget_convert_real1_integer3
  1510. (ffebld_cu_ptr_real1 (u),
  1511. ffebld_constant_integer3 (ffebld_conter (l)));
  1512. break;
  1513. #endif
  1514. #if FFETARGET_okINTEGER4
  1515. case FFEINFO_kindtypeINTEGER4:
  1516. error = ffetarget_convert_real1_integer4
  1517. (ffebld_cu_ptr_real1 (u),
  1518. ffebld_constant_integer4 (ffebld_conter (l)));
  1519. break;
  1520. #endif
  1521. default:
  1522. assert ("REAL1/INTEGER bad source kind type" == NULL);
  1523. break;
  1524. }
  1525. break;
  1526. case FFEINFO_basictypeREAL:
  1527. switch (ffeinfo_kindtype (ffebld_info (l)))
  1528. {
  1529. #if FFETARGET_okREAL2
  1530. case FFEINFO_kindtypeREAL2:
  1531. error = ffetarget_convert_real1_real2
  1532. (ffebld_cu_ptr_real1 (u),
  1533. ffebld_constant_real2 (ffebld_conter (l)));
  1534. break;
  1535. #endif
  1536. #if FFETARGET_okREAL3
  1537. case FFEINFO_kindtypeREAL3:
  1538. error = ffetarget_convert_real1_real3
  1539. (ffebld_cu_ptr_real1 (u),
  1540. ffebld_constant_real3 (ffebld_conter (l)));
  1541. break;
  1542. #endif
  1543. #if FFETARGET_okREAL4
  1544. case FFEINFO_kindtypeREAL4:
  1545. error = ffetarget_convert_real1_real4
  1546. (ffebld_cu_ptr_real1 (u),
  1547. ffebld_constant_real4 (ffebld_conter (l)));
  1548. break;
  1549. #endif
  1550. default:
  1551. assert ("REAL1/REAL bad source kind type" == NULL);
  1552. break;
  1553. }
  1554. break;
  1555. case FFEINFO_basictypeCOMPLEX:
  1556. switch (ffeinfo_kindtype (ffebld_info (l)))
  1557. {
  1558. #if FFETARGET_okCOMPLEX1
  1559. case FFEINFO_kindtypeREAL1:
  1560. error = ffetarget_convert_real1_complex1
  1561. (ffebld_cu_ptr_real1 (u),
  1562. ffebld_constant_complex1 (ffebld_conter (l)));
  1563. break;
  1564. #endif
  1565. #if FFETARGET_okCOMPLEX2
  1566. case FFEINFO_kindtypeREAL2:
  1567. error = ffetarget_convert_real1_complex2
  1568. (ffebld_cu_ptr_real1 (u),
  1569. ffebld_constant_complex2 (ffebld_conter (l)));
  1570. break;
  1571. #endif
  1572. #if FFETARGET_okCOMPLEX3
  1573. case FFEINFO_kindtypeREAL3:
  1574. error = ffetarget_convert_real1_complex3
  1575. (ffebld_cu_ptr_real1 (u),
  1576. ffebld_constant_complex3 (ffebld_conter (l)));
  1577. break;
  1578. #endif
  1579. #if FFETARGET_okCOMPLEX4
  1580. case FFEINFO_kindtypeREAL4:
  1581. error = ffetarget_convert_real1_complex4
  1582. (ffebld_cu_ptr_real1 (u),
  1583. ffebld_constant_complex4 (ffebld_conter (l)));
  1584. break;
  1585. #endif
  1586. default:
  1587. assert ("REAL1/COMPLEX bad source kind type" == NULL);
  1588. break;
  1589. }
  1590. break;
  1591. case FFEINFO_basictypeCHARACTER:
  1592. error = ffetarget_convert_real1_character1
  1593. (ffebld_cu_ptr_real1 (u),
  1594. ffebld_constant_character1 (ffebld_conter (l)));
  1595. break;
  1596. case FFEINFO_basictypeHOLLERITH:
  1597. error = ffetarget_convert_real1_hollerith
  1598. (ffebld_cu_ptr_real1 (u),
  1599. ffebld_constant_hollerith (ffebld_conter (l)));
  1600. break;
  1601. case FFEINFO_basictypeTYPELESS:
  1602. error = ffetarget_convert_real1_typeless
  1603. (ffebld_cu_ptr_real1 (u),
  1604. ffebld_constant_typeless (ffebld_conter (l)));
  1605. break;
  1606. default:
  1607. assert ("REAL1 bad type" == NULL);
  1608. break;
  1609. }
  1610. /* If conversion operation is not implemented, return original expr. */
  1611. if (error == FFEBAD_NOCANDO)
  1612. return expr;
  1613. expr = ffebld_new_conter_with_orig
  1614. (ffebld_constant_new_real1_val
  1615. (ffebld_cu_val_real1 (u)), expr);
  1616. break;
  1617. #endif
  1618. #if FFETARGET_okREAL2
  1619. case FFEINFO_kindtypeREAL2:
  1620. switch (ffeinfo_basictype (ffebld_info (l)))
  1621. {
  1622. case FFEINFO_basictypeINTEGER:
  1623. switch (ffeinfo_kindtype (ffebld_info (l)))
  1624. {
  1625. #if FFETARGET_okINTEGER1
  1626. case FFEINFO_kindtypeINTEGER1:
  1627. error = ffetarget_convert_real2_integer1
  1628. (ffebld_cu_ptr_real2 (u),
  1629. ffebld_constant_integer1 (ffebld_conter (l)));
  1630. break;
  1631. #endif
  1632. #if FFETARGET_okINTEGER2
  1633. case FFEINFO_kindtypeINTEGER2:
  1634. error = ffetarget_convert_real2_integer2
  1635. (ffebld_cu_ptr_real2 (u),
  1636. ffebld_constant_integer2 (ffebld_conter (l)));
  1637. break;
  1638. #endif
  1639. #if FFETARGET_okINTEGER3
  1640. case FFEINFO_kindtypeINTEGER3:
  1641. error = ffetarget_convert_real2_integer3
  1642. (ffebld_cu_ptr_real2 (u),
  1643. ffebld_constant_integer3 (ffebld_conter (l)));
  1644. break;
  1645. #endif
  1646. #if FFETARGET_okINTEGER4
  1647. case FFEINFO_kindtypeINTEGER4:
  1648. error = ffetarget_convert_real2_integer4
  1649. (ffebld_cu_ptr_real2 (u),
  1650. ffebld_constant_integer4 (ffebld_conter (l)));
  1651. break;
  1652. #endif
  1653. default:
  1654. assert ("REAL2/INTEGER bad source kind type" == NULL);
  1655. break;
  1656. }
  1657. break;
  1658. case FFEINFO_basictypeREAL:
  1659. switch (ffeinfo_kindtype (ffebld_info (l)))
  1660. {
  1661. #if FFETARGET_okREAL1
  1662. case FFEINFO_kindtypeREAL1:
  1663. error = ffetarget_convert_real2_real1
  1664. (ffebld_cu_ptr_real2 (u),
  1665. ffebld_constant_real1 (ffebld_conter (l)));
  1666. break;
  1667. #endif
  1668. #if FFETARGET_okREAL3
  1669. case FFEINFO_kindtypeREAL3:
  1670. error = ffetarget_convert_real2_real3
  1671. (ffebld_cu_ptr_real2 (u),
  1672. ffebld_constant_real3 (ffebld_conter (l)));
  1673. break;
  1674. #endif
  1675. #if FFETARGET_okREAL4
  1676. case FFEINFO_kindtypeREAL4:
  1677. error = ffetarget_convert_real2_real4
  1678. (ffebld_cu_ptr_real2 (u),
  1679. ffebld_constant_real4 (ffebld_conter (l)));
  1680. break;
  1681. #endif
  1682. default:
  1683. assert ("REAL2/REAL bad source kind type" == NULL);
  1684. break;
  1685. }
  1686. break;
  1687. case FFEINFO_basictypeCOMPLEX:
  1688. switch (ffeinfo_kindtype (ffebld_info (l)))
  1689. {
  1690. #if FFETARGET_okCOMPLEX1
  1691. case FFEINFO_kindtypeREAL1:
  1692. error = ffetarget_convert_real2_complex1
  1693. (ffebld_cu_ptr_real2 (u),
  1694. ffebld_constant_complex1 (ffebld_conter (l)));
  1695. break;
  1696. #endif
  1697. #if FFETARGET_okCOMPLEX2
  1698. case FFEINFO_kindtypeREAL2:
  1699. error = ffetarget_convert_real2_complex2
  1700. (ffebld_cu_ptr_real2 (u),
  1701. ffebld_constant_complex2 (ffebld_conter (l)));
  1702. break;
  1703. #endif
  1704. #if FFETARGET_okCOMPLEX3
  1705. case FFEINFO_kindtypeREAL3:
  1706. error = ffetarget_convert_real2_complex3
  1707. (ffebld_cu_ptr_real2 (u),
  1708. ffebld_constant_complex3 (ffebld_conter (l)));
  1709. break;
  1710. #endif
  1711. #if FFETARGET_okCOMPLEX4
  1712. case FFEINFO_kindtypeREAL4:
  1713. error = ffetarget_convert_real2_complex4
  1714. (ffebld_cu_ptr_real2 (u),
  1715. ffebld_constant_complex4 (ffebld_conter (l)));
  1716. break;
  1717. #endif
  1718. default:
  1719. assert ("REAL2/COMPLEX bad source kind type" == NULL);
  1720. break;
  1721. }
  1722. break;
  1723. case FFEINFO_basictypeCHARACTER:
  1724. error = ffetarget_convert_real2_character1
  1725. (ffebld_cu_ptr_real2 (u),
  1726. ffebld_constant_character1 (ffebld_conter (l)));
  1727. break;
  1728. case FFEINFO_basictypeHOLLERITH:
  1729. error = ffetarget_convert_real2_hollerith
  1730. (ffebld_cu_ptr_real2 (u),
  1731. ffebld_constant_hollerith (ffebld_conter (l)));
  1732. break;
  1733. case FFEINFO_basictypeTYPELESS:
  1734. error = ffetarget_convert_real2_typeless
  1735. (ffebld_cu_ptr_real2 (u),
  1736. ffebld_constant_typeless (ffebld_conter (l)));
  1737. break;
  1738. default:
  1739. assert ("REAL2 bad type" == NULL);
  1740. break;
  1741. }
  1742. /* If conversion operation is not implemented, return original expr. */
  1743. if (error == FFEBAD_NOCANDO)
  1744. return expr;
  1745. expr = ffebld_new_conter_with_orig
  1746. (ffebld_constant_new_real2_val
  1747. (ffebld_cu_val_real2 (u)), expr);
  1748. break;
  1749. #endif
  1750. #if FFETARGET_okREAL3
  1751. case FFEINFO_kindtypeREAL3:
  1752. switch (ffeinfo_basictype (ffebld_info (l)))
  1753. {
  1754. case FFEINFO_basictypeINTEGER:
  1755. switch (ffeinfo_kindtype (ffebld_info (l)))
  1756. {
  1757. #if FFETARGET_okINTEGER1
  1758. case FFEINFO_kindtypeINTEGER1:
  1759. error = ffetarget_convert_real3_integer1
  1760. (ffebld_cu_ptr_real3 (u),
  1761. ffebld_constant_integer1 (ffebld_conter (l)));
  1762. break;
  1763. #endif
  1764. #if FFETARGET_okINTEGER2
  1765. case FFEINFO_kindtypeINTEGER2:
  1766. error = ffetarget_convert_real3_integer2
  1767. (ffebld_cu_ptr_real3 (u),
  1768. ffebld_constant_integer2 (ffebld_conter (l)));
  1769. break;
  1770. #endif
  1771. #if FFETARGET_okINTEGER3
  1772. case FFEINFO_kindtypeINTEGER3:
  1773. error = ffetarget_convert_real3_integer3
  1774. (ffebld_cu_ptr_real3 (u),
  1775. ffebld_constant_integer3 (ffebld_conter (l)));
  1776. break;
  1777. #endif
  1778. #if FFETARGET_okINTEGER4
  1779. case FFEINFO_kindtypeINTEGER4:
  1780. error = ffetarget_convert_real3_integer4
  1781. (ffebld_cu_ptr_real3 (u),
  1782. ffebld_constant_integer4 (ffebld_conter (l)));
  1783. break;
  1784. #endif
  1785. default:
  1786. assert ("REAL3/INTEGER bad source kind type" == NULL);
  1787. break;
  1788. }
  1789. break;
  1790. case FFEINFO_basictypeREAL:
  1791. switch (ffeinfo_kindtype (ffebld_info (l)))
  1792. {
  1793. #if FFETARGET_okREAL1
  1794. case FFEINFO_kindtypeREAL1:
  1795. error = ffetarget_convert_real3_real1
  1796. (ffebld_cu_ptr_real3 (u),
  1797. ffebld_constant_real1 (ffebld_conter (l)));
  1798. break;
  1799. #endif
  1800. #if FFETARGET_okREAL2
  1801. case FFEINFO_kindtypeREAL2:
  1802. error = ffetarget_convert_real3_real2
  1803. (ffebld_cu_ptr_real3 (u),
  1804. ffebld_constant_real2 (ffebld_conter (l)));
  1805. break;
  1806. #endif
  1807. #if FFETARGET_okREAL4
  1808. case FFEINFO_kindtypeREAL4:
  1809. error = ffetarget_convert_real3_real4
  1810. (ffebld_cu_ptr_real3 (u),
  1811. ffebld_constant_real4 (ffebld_conter (l)));
  1812. break;
  1813. #endif
  1814. default:
  1815. assert ("REAL3/REAL bad source kind type" == NULL);
  1816. break;
  1817. }
  1818. break;
  1819. case FFEINFO_basictypeCOMPLEX:
  1820. switch (ffeinfo_kindtype (ffebld_info (l)))
  1821. {
  1822. #if FFETARGET_okCOMPLEX1
  1823. case FFEINFO_kindtypeREAL1:
  1824. error = ffetarget_convert_real3_complex1
  1825. (ffebld_cu_ptr_real3 (u),
  1826. ffebld_constant_complex1 (ffebld_conter (l)));
  1827. break;
  1828. #endif
  1829. #if FFETARGET_okCOMPLEX2
  1830. case FFEINFO_kindtypeREAL2:
  1831. error = ffetarget_convert_real3_complex2
  1832. (ffebld_cu_ptr_real3 (u),
  1833. ffebld_constant_complex2 (ffebld_conter (l)));
  1834. break;
  1835. #endif
  1836. #if FFETARGET_okCOMPLEX3
  1837. case FFEINFO_kindtypeREAL3:
  1838. error = ffetarget_convert_real3_complex3
  1839. (ffebld_cu_ptr_real3 (u),
  1840. ffebld_constant_complex3 (ffebld_conter (l)));
  1841. break;
  1842. #endif
  1843. #if FFETARGET_okCOMPLEX4
  1844. case FFEINFO_kindtypeREAL4:
  1845. error = ffetarget_convert_real3_complex4
  1846. (ffebld_cu_ptr_real3 (u),
  1847. ffebld_constant_complex4 (ffebld_conter (l)));
  1848. break;
  1849. #endif
  1850. default:
  1851. assert ("REAL3/COMPLEX bad source kind type" == NULL);
  1852. break;
  1853. }
  1854. break;
  1855. case FFEINFO_basictypeCHARACTER:
  1856. error = ffetarget_convert_real3_character1
  1857. (ffebld_cu_ptr_real3 (u),
  1858. ffebld_constant_character1 (ffebld_conter (l)));
  1859. break;
  1860. case FFEINFO_basictypeHOLLERITH:
  1861. error = ffetarget_convert_real3_hollerith
  1862. (ffebld_cu_ptr_real3 (u),
  1863. ffebld_constant_hollerith (ffebld_conter (l)));
  1864. break;
  1865. case FFEINFO_basictypeTYPELESS:
  1866. error = ffetarget_convert_real3_typeless
  1867. (ffebld_cu_ptr_real3 (u),
  1868. ffebld_constant_typeless (ffebld_conter (l)));
  1869. break;
  1870. default:
  1871. assert ("REAL3 bad type" == NULL);
  1872. break;
  1873. }
  1874. /* If conversion operation is not implemented, return original expr. */
  1875. if (error == FFEBAD_NOCANDO)
  1876. return expr;
  1877. expr = ffebld_new_conter_with_orig
  1878. (ffebld_constant_new_real3_val
  1879. (ffebld_cu_val_real3 (u)), expr);
  1880. break;
  1881. #endif
  1882. #if FFETARGET_okREAL4
  1883. case FFEINFO_kindtypeREAL4:
  1884. switch (ffeinfo_basictype (ffebld_info (l)))
  1885. {
  1886. case FFEINFO_basictypeINTEGER:
  1887. switch (ffeinfo_kindtype (ffebld_info (l)))
  1888. {
  1889. #if FFETARGET_okINTEGER1
  1890. case FFEINFO_kindtypeINTEGER1:
  1891. error = ffetarget_convert_real4_integer1
  1892. (ffebld_cu_ptr_real4 (u),
  1893. ffebld_constant_integer1 (ffebld_conter (l)));
  1894. break;
  1895. #endif
  1896. #if FFETARGET_okINTEGER2
  1897. case FFEINFO_kindtypeINTEGER2:
  1898. error = ffetarget_convert_real4_integer2
  1899. (ffebld_cu_ptr_real4 (u),
  1900. ffebld_constant_integer2 (ffebld_conter (l)));
  1901. break;
  1902. #endif
  1903. #if FFETARGET_okINTEGER3
  1904. case FFEINFO_kindtypeINTEGER3:
  1905. error = ffetarget_convert_real4_integer3
  1906. (ffebld_cu_ptr_real4 (u),
  1907. ffebld_constant_integer3 (ffebld_conter (l)));
  1908. break;
  1909. #endif
  1910. #if FFETARGET_okINTEGER4
  1911. case FFEINFO_kindtypeINTEGER4:
  1912. error = ffetarget_convert_real4_integer4
  1913. (ffebld_cu_ptr_real4 (u),
  1914. ffebld_constant_integer4 (ffebld_conter (l)));
  1915. break;
  1916. #endif
  1917. default:
  1918. assert ("REAL4/INTEGER bad source kind type" == NULL);
  1919. break;
  1920. }
  1921. break;
  1922. case FFEINFO_basictypeREAL:
  1923. switch (ffeinfo_kindtype (ffebld_info (l)))
  1924. {
  1925. #if FFETARGET_okREAL1
  1926. case FFEINFO_kindtypeREAL1:
  1927. error = ffetarget_convert_real4_real1
  1928. (ffebld_cu_ptr_real4 (u),
  1929. ffebld_constant_real1 (ffebld_conter (l)));
  1930. break;
  1931. #endif
  1932. #if FFETARGET_okREAL2
  1933. case FFEINFO_kindtypeREAL2:
  1934. error = ffetarget_convert_real4_real2
  1935. (ffebld_cu_ptr_real4 (u),
  1936. ffebld_constant_real2 (ffebld_conter (l)));
  1937. break;
  1938. #endif
  1939. #if FFETARGET_okREAL3
  1940. case FFEINFO_kindtypeREAL3:
  1941. error = ffetarget_convert_real4_real3
  1942. (ffebld_cu_ptr_real4 (u),
  1943. ffebld_constant_real3 (ffebld_conter (l)));
  1944. break;
  1945. #endif
  1946. default:
  1947. assert ("REAL4/REAL bad source kind type" == NULL);
  1948. break;
  1949. }
  1950. break;
  1951. case FFEINFO_basictypeCOMPLEX:
  1952. switch (ffeinfo_kindtype (ffebld_info (l)))
  1953. {
  1954. #if FFETARGET_okCOMPLEX1
  1955. case FFEINFO_kindtypeREAL1:
  1956. error = ffetarget_convert_real4_complex1
  1957. (ffebld_cu_ptr_real4 (u),
  1958. ffebld_constant_complex1 (ffebld_conter (l)));
  1959. break;
  1960. #endif
  1961. #if FFETARGET_okCOMPLEX2
  1962. case FFEINFO_kindtypeREAL2:
  1963. error = ffetarget_convert_real4_complex2
  1964. (ffebld_cu_ptr_real4 (u),
  1965. ffebld_constant_complex2 (ffebld_conter (l)));
  1966. break;
  1967. #endif
  1968. #if FFETARGET_okCOMPLEX3
  1969. case FFEINFO_kindtypeREAL3:
  1970. error = ffetarget_convert_real4_complex3
  1971. (ffebld_cu_ptr_real4 (u),
  1972. ffebld_constant_complex3 (ffebld_conter (l)));
  1973. break;
  1974. #endif
  1975. #if FFETARGET_okCOMPLEX4
  1976. case FFEINFO_kindtypeREAL4:
  1977. error = ffetarget_convert_real4_complex4
  1978. (ffebld_cu_ptr_real4 (u),
  1979. ffebld_constant_complex4 (ffebld_conter (l)));
  1980. break;
  1981. #endif
  1982. default:
  1983. assert ("REAL4/COMPLEX bad source kind type" == NULL);
  1984. break;
  1985. }
  1986. break;
  1987. case FFEINFO_basictypeCHARACTER:
  1988. error = ffetarget_convert_real4_character1
  1989. (ffebld_cu_ptr_real4 (u),
  1990. ffebld_constant_character1 (ffebld_conter (l)));
  1991. break;
  1992. case FFEINFO_basictypeHOLLERITH:
  1993. error = ffetarget_convert_real4_hollerith
  1994. (ffebld_cu_ptr_real4 (u),
  1995. ffebld_constant_hollerith (ffebld_conter (l)));
  1996. break;
  1997. case FFEINFO_basictypeTYPELESS:
  1998. error = ffetarget_convert_real4_typeless
  1999. (ffebld_cu_ptr_real4 (u),
  2000. ffebld_constant_typeless (ffebld_conter (l)));
  2001. break;
  2002. default:
  2003. assert ("REAL4 bad type" == NULL);
  2004. break;
  2005. }
  2006. /* If conversion operation is not implemented, return original expr. */
  2007. if (error == FFEBAD_NOCANDO)
  2008. return expr;
  2009. expr = ffebld_new_conter_with_orig
  2010. (ffebld_constant_new_real4_val
  2011. (ffebld_cu_val_real4 (u)), expr);
  2012. break;
  2013. #endif
  2014. default:
  2015. assert ("bad real kind type" == NULL);
  2016. break;
  2017. }
  2018. break;
  2019. case FFEINFO_basictypeCOMPLEX:
  2020. sz = FFETARGET_charactersizeNONE;
  2021. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  2022. {
  2023. #if FFETARGET_okCOMPLEX1
  2024. case FFEINFO_kindtypeREAL1:
  2025. switch (ffeinfo_basictype (ffebld_info (l)))
  2026. {
  2027. case FFEINFO_basictypeINTEGER:
  2028. switch (ffeinfo_kindtype (ffebld_info (l)))
  2029. {
  2030. #if FFETARGET_okINTEGER1
  2031. case FFEINFO_kindtypeINTEGER1:
  2032. error = ffetarget_convert_complex1_integer1
  2033. (ffebld_cu_ptr_complex1 (u),
  2034. ffebld_constant_integer1 (ffebld_conter (l)));
  2035. break;
  2036. #endif
  2037. #if FFETARGET_okINTEGER2
  2038. case FFEINFO_kindtypeINTEGER2:
  2039. error = ffetarget_convert_complex1_integer2
  2040. (ffebld_cu_ptr_complex1 (u),
  2041. ffebld_constant_integer2 (ffebld_conter (l)));
  2042. break;
  2043. #endif
  2044. #if FFETARGET_okINTEGER3
  2045. case FFEINFO_kindtypeINTEGER3:
  2046. error = ffetarget_convert_complex1_integer3
  2047. (ffebld_cu_ptr_complex1 (u),
  2048. ffebld_constant_integer3 (ffebld_conter (l)));
  2049. break;
  2050. #endif
  2051. #if FFETARGET_okINTEGER4
  2052. case FFEINFO_kindtypeINTEGER4:
  2053. error = ffetarget_convert_complex1_integer4
  2054. (ffebld_cu_ptr_complex1 (u),
  2055. ffebld_constant_integer4 (ffebld_conter (l)));
  2056. break;
  2057. #endif
  2058. default:
  2059. assert ("COMPLEX1/INTEGER bad source kind type" == NULL);
  2060. break;
  2061. }
  2062. break;
  2063. case FFEINFO_basictypeREAL:
  2064. switch (ffeinfo_kindtype (ffebld_info (l)))
  2065. {
  2066. #if FFETARGET_okREAL1
  2067. case FFEINFO_kindtypeREAL1:
  2068. error = ffetarget_convert_complex1_real1
  2069. (ffebld_cu_ptr_complex1 (u),
  2070. ffebld_constant_real1 (ffebld_conter (l)));
  2071. break;
  2072. #endif
  2073. #if FFETARGET_okREAL2
  2074. case FFEINFO_kindtypeREAL2:
  2075. error = ffetarget_convert_complex1_real2
  2076. (ffebld_cu_ptr_complex1 (u),
  2077. ffebld_constant_real2 (ffebld_conter (l)));
  2078. break;
  2079. #endif
  2080. #if FFETARGET_okREAL3
  2081. case FFEINFO_kindtypeREAL3:
  2082. error = ffetarget_convert_complex1_real3
  2083. (ffebld_cu_ptr_complex1 (u),
  2084. ffebld_constant_real3 (ffebld_conter (l)));
  2085. break;
  2086. #endif
  2087. #if FFETARGET_okREAL4
  2088. case FFEINFO_kindtypeREAL4:
  2089. error = ffetarget_convert_complex1_real4
  2090. (ffebld_cu_ptr_complex1 (u),
  2091. ffebld_constant_real4 (ffebld_conter (l)));
  2092. break;
  2093. #endif
  2094. default:
  2095. assert ("COMPLEX1/REAL bad source kind type" == NULL);
  2096. break;
  2097. }
  2098. break;
  2099. case FFEINFO_basictypeCOMPLEX:
  2100. switch (ffeinfo_kindtype (ffebld_info (l)))
  2101. {
  2102. #if FFETARGET_okCOMPLEX2
  2103. case FFEINFO_kindtypeREAL2:
  2104. error = ffetarget_convert_complex1_complex2
  2105. (ffebld_cu_ptr_complex1 (u),
  2106. ffebld_constant_complex2 (ffebld_conter (l)));
  2107. break;
  2108. #endif
  2109. #if FFETARGET_okCOMPLEX3
  2110. case FFEINFO_kindtypeREAL3:
  2111. error = ffetarget_convert_complex1_complex3
  2112. (ffebld_cu_ptr_complex1 (u),
  2113. ffebld_constant_complex3 (ffebld_conter (l)));
  2114. break;
  2115. #endif
  2116. #if FFETARGET_okCOMPLEX4
  2117. case FFEINFO_kindtypeREAL4:
  2118. error = ffetarget_convert_complex1_complex4
  2119. (ffebld_cu_ptr_complex1 (u),
  2120. ffebld_constant_complex4 (ffebld_conter (l)));
  2121. break;
  2122. #endif
  2123. default:
  2124. assert ("COMPLEX1/COMPLEX bad source kind type" == NULL);
  2125. break;
  2126. }
  2127. break;
  2128. case FFEINFO_basictypeCHARACTER:
  2129. error = ffetarget_convert_complex1_character1
  2130. (ffebld_cu_ptr_complex1 (u),
  2131. ffebld_constant_character1 (ffebld_conter (l)));
  2132. break;
  2133. case FFEINFO_basictypeHOLLERITH:
  2134. error = ffetarget_convert_complex1_hollerith
  2135. (ffebld_cu_ptr_complex1 (u),
  2136. ffebld_constant_hollerith (ffebld_conter (l)));
  2137. break;
  2138. case FFEINFO_basictypeTYPELESS:
  2139. error = ffetarget_convert_complex1_typeless
  2140. (ffebld_cu_ptr_complex1 (u),
  2141. ffebld_constant_typeless (ffebld_conter (l)));
  2142. break;
  2143. default:
  2144. assert ("COMPLEX1 bad type" == NULL);
  2145. break;
  2146. }
  2147. /* If conversion operation is not implemented, return original expr. */
  2148. if (error == FFEBAD_NOCANDO)
  2149. return expr;
  2150. expr = ffebld_new_conter_with_orig
  2151. (ffebld_constant_new_complex1_val
  2152. (ffebld_cu_val_complex1 (u)), expr);
  2153. break;
  2154. #endif
  2155. #if FFETARGET_okCOMPLEX2
  2156. case FFEINFO_kindtypeREAL2:
  2157. switch (ffeinfo_basictype (ffebld_info (l)))
  2158. {
  2159. case FFEINFO_basictypeINTEGER:
  2160. switch (ffeinfo_kindtype (ffebld_info (l)))
  2161. {
  2162. #if FFETARGET_okINTEGER1
  2163. case FFEINFO_kindtypeINTEGER1:
  2164. error = ffetarget_convert_complex2_integer1
  2165. (ffebld_cu_ptr_complex2 (u),
  2166. ffebld_constant_integer1 (ffebld_conter (l)));
  2167. break;
  2168. #endif
  2169. #if FFETARGET_okINTEGER2
  2170. case FFEINFO_kindtypeINTEGER2:
  2171. error = ffetarget_convert_complex2_integer2
  2172. (ffebld_cu_ptr_complex2 (u),
  2173. ffebld_constant_integer2 (ffebld_conter (l)));
  2174. break;
  2175. #endif
  2176. #if FFETARGET_okINTEGER3
  2177. case FFEINFO_kindtypeINTEGER3:
  2178. error = ffetarget_convert_complex2_integer3
  2179. (ffebld_cu_ptr_complex2 (u),
  2180. ffebld_constant_integer3 (ffebld_conter (l)));
  2181. break;
  2182. #endif
  2183. #if FFETARGET_okINTEGER4
  2184. case FFEINFO_kindtypeINTEGER4:
  2185. error = ffetarget_convert_complex2_integer4
  2186. (ffebld_cu_ptr_complex2 (u),
  2187. ffebld_constant_integer4 (ffebld_conter (l)));
  2188. break;
  2189. #endif
  2190. default:
  2191. assert ("COMPLEX2/INTEGER bad source kind type" == NULL);
  2192. break;
  2193. }
  2194. break;
  2195. case FFEINFO_basictypeREAL:
  2196. switch (ffeinfo_kindtype (ffebld_info (l)))
  2197. {
  2198. #if FFETARGET_okREAL1
  2199. case FFEINFO_kindtypeREAL1:
  2200. error = ffetarget_convert_complex2_real1
  2201. (ffebld_cu_ptr_complex2 (u),
  2202. ffebld_constant_real1 (ffebld_conter (l)));
  2203. break;
  2204. #endif
  2205. #if FFETARGET_okREAL2
  2206. case FFEINFO_kindtypeREAL2:
  2207. error = ffetarget_convert_complex2_real2
  2208. (ffebld_cu_ptr_complex2 (u),
  2209. ffebld_constant_real2 (ffebld_conter (l)));
  2210. break;
  2211. #endif
  2212. #if FFETARGET_okREAL3
  2213. case FFEINFO_kindtypeREAL3:
  2214. error = ffetarget_convert_complex2_real3
  2215. (ffebld_cu_ptr_complex2 (u),
  2216. ffebld_constant_real3 (ffebld_conter (l)));
  2217. break;
  2218. #endif
  2219. #if FFETARGET_okREAL4
  2220. case FFEINFO_kindtypeREAL4:
  2221. error = ffetarget_convert_complex2_real4
  2222. (ffebld_cu_ptr_complex2 (u),
  2223. ffebld_constant_real4 (ffebld_conter (l)));
  2224. break;
  2225. #endif
  2226. default:
  2227. assert ("COMPLEX2/REAL bad source kind type" == NULL);
  2228. break;
  2229. }
  2230. break;
  2231. case FFEINFO_basictypeCOMPLEX:
  2232. switch (ffeinfo_kindtype (ffebld_info (l)))
  2233. {
  2234. #if FFETARGET_okCOMPLEX1
  2235. case FFEINFO_kindtypeREAL1:
  2236. error = ffetarget_convert_complex2_complex1
  2237. (ffebld_cu_ptr_complex2 (u),
  2238. ffebld_constant_complex1 (ffebld_conter (l)));
  2239. break;
  2240. #endif
  2241. #if FFETARGET_okCOMPLEX3
  2242. case FFEINFO_kindtypeREAL3:
  2243. error = ffetarget_convert_complex2_complex3
  2244. (ffebld_cu_ptr_complex2 (u),
  2245. ffebld_constant_complex3 (ffebld_conter (l)));
  2246. break;
  2247. #endif
  2248. #if FFETARGET_okCOMPLEX4
  2249. case FFEINFO_kindtypeREAL4:
  2250. error = ffetarget_convert_complex2_complex4
  2251. (ffebld_cu_ptr_complex2 (u),
  2252. ffebld_constant_complex4 (ffebld_conter (l)));
  2253. break;
  2254. #endif
  2255. default:
  2256. assert ("COMPLEX2/COMPLEX bad source kind type" == NULL);
  2257. break;
  2258. }
  2259. break;
  2260. case FFEINFO_basictypeCHARACTER:
  2261. error = ffetarget_convert_complex2_character1
  2262. (ffebld_cu_ptr_complex2 (u),
  2263. ffebld_constant_character1 (ffebld_conter (l)));
  2264. break;
  2265. case FFEINFO_basictypeHOLLERITH:
  2266. error = ffetarget_convert_complex2_hollerith
  2267. (ffebld_cu_ptr_complex2 (u),
  2268. ffebld_constant_hollerith (ffebld_conter (l)));
  2269. break;
  2270. case FFEINFO_basictypeTYPELESS:
  2271. error = ffetarget_convert_complex2_typeless
  2272. (ffebld_cu_ptr_complex2 (u),
  2273. ffebld_constant_typeless (ffebld_conter (l)));
  2274. break;
  2275. default:
  2276. assert ("COMPLEX2 bad type" == NULL);
  2277. break;
  2278. }
  2279. /* If conversion operation is not implemented, return original expr. */
  2280. if (error == FFEBAD_NOCANDO)
  2281. return expr;
  2282. expr = ffebld_new_conter_with_orig
  2283. (ffebld_constant_new_complex2_val
  2284. (ffebld_cu_val_complex2 (u)), expr);
  2285. break;
  2286. #endif
  2287. #if FFETARGET_okCOMPLEX3
  2288. case FFEINFO_kindtypeREAL3:
  2289. switch (ffeinfo_basictype (ffebld_info (l)))
  2290. {
  2291. case FFEINFO_basictypeINTEGER:
  2292. switch (ffeinfo_kindtype (ffebld_info (l)))
  2293. {
  2294. #if FFETARGET_okINTEGER1
  2295. case FFEINFO_kindtypeINTEGER1:
  2296. error = ffetarget_convert_complex3_integer1
  2297. (ffebld_cu_ptr_complex3 (u),
  2298. ffebld_constant_integer1 (ffebld_conter (l)));
  2299. break;
  2300. #endif
  2301. #if FFETARGET_okINTEGER2
  2302. case FFEINFO_kindtypeINTEGER2:
  2303. error = ffetarget_convert_complex3_integer2
  2304. (ffebld_cu_ptr_complex3 (u),
  2305. ffebld_constant_integer2 (ffebld_conter (l)));
  2306. break;
  2307. #endif
  2308. #if FFETARGET_okINTEGER3
  2309. case FFEINFO_kindtypeINTEGER3:
  2310. error = ffetarget_convert_complex3_integer3
  2311. (ffebld_cu_ptr_complex3 (u),
  2312. ffebld_constant_integer3 (ffebld_conter (l)));
  2313. break;
  2314. #endif
  2315. #if FFETARGET_okINTEGER4
  2316. case FFEINFO_kindtypeINTEGER4:
  2317. error = ffetarget_convert_complex3_integer4
  2318. (ffebld_cu_ptr_complex3 (u),
  2319. ffebld_constant_integer4 (ffebld_conter (l)));
  2320. break;
  2321. #endif
  2322. default:
  2323. assert ("COMPLEX3/INTEGER bad source kind type" == NULL);
  2324. break;
  2325. }
  2326. break;
  2327. case FFEINFO_basictypeREAL:
  2328. switch (ffeinfo_kindtype (ffebld_info (l)))
  2329. {
  2330. #if FFETARGET_okREAL1
  2331. case FFEINFO_kindtypeREAL1:
  2332. error = ffetarget_convert_complex3_real1
  2333. (ffebld_cu_ptr_complex3 (u),
  2334. ffebld_constant_real1 (ffebld_conter (l)));
  2335. break;
  2336. #endif
  2337. #if FFETARGET_okREAL2
  2338. case FFEINFO_kindtypeREAL2:
  2339. error = ffetarget_convert_complex3_real2
  2340. (ffebld_cu_ptr_complex3 (u),
  2341. ffebld_constant_real2 (ffebld_conter (l)));
  2342. break;
  2343. #endif
  2344. #if FFETARGET_okREAL3
  2345. case FFEINFO_kindtypeREAL3:
  2346. error = ffetarget_convert_complex3_real3
  2347. (ffebld_cu_ptr_complex3 (u),
  2348. ffebld_constant_real3 (ffebld_conter (l)));
  2349. break;
  2350. #endif
  2351. #if FFETARGET_okREAL4
  2352. case FFEINFO_kindtypeREAL4:
  2353. error = ffetarget_convert_complex3_real4
  2354. (ffebld_cu_ptr_complex3 (u),
  2355. ffebld_constant_real4 (ffebld_conter (l)));
  2356. break;
  2357. #endif
  2358. default:
  2359. assert ("COMPLEX3/REAL bad source kind type" == NULL);
  2360. break;
  2361. }
  2362. break;
  2363. case FFEINFO_basictypeCOMPLEX:
  2364. switch (ffeinfo_kindtype (ffebld_info (l)))
  2365. {
  2366. #if FFETARGET_okCOMPLEX1
  2367. case FFEINFO_kindtypeREAL1:
  2368. error = ffetarget_convert_complex3_complex1
  2369. (ffebld_cu_ptr_complex3 (u),
  2370. ffebld_constant_complex1 (ffebld_conter (l)));
  2371. break;
  2372. #endif
  2373. #if FFETARGET_okCOMPLEX2
  2374. case FFEINFO_kindtypeREAL2:
  2375. error = ffetarget_convert_complex3_complex2
  2376. (ffebld_cu_ptr_complex3 (u),
  2377. ffebld_constant_complex2 (ffebld_conter (l)));
  2378. break;
  2379. #endif
  2380. #if FFETARGET_okCOMPLEX4
  2381. case FFEINFO_kindtypeREAL4:
  2382. error = ffetarget_convert_complex3_complex4
  2383. (ffebld_cu_ptr_complex3 (u),
  2384. ffebld_constant_complex4 (ffebld_conter (l)));
  2385. break;
  2386. #endif
  2387. default:
  2388. assert ("COMPLEX3/COMPLEX bad source kind type" == NULL);
  2389. break;
  2390. }
  2391. break;
  2392. case FFEINFO_basictypeCHARACTER:
  2393. error = ffetarget_convert_complex3_character1
  2394. (ffebld_cu_ptr_complex3 (u),
  2395. ffebld_constant_character1 (ffebld_conter (l)));
  2396. break;
  2397. case FFEINFO_basictypeHOLLERITH:
  2398. error = ffetarget_convert_complex3_hollerith
  2399. (ffebld_cu_ptr_complex3 (u),
  2400. ffebld_constant_hollerith (ffebld_conter (l)));
  2401. break;
  2402. case FFEINFO_basictypeTYPELESS:
  2403. error = ffetarget_convert_complex3_typeless
  2404. (ffebld_cu_ptr_complex3 (u),
  2405. ffebld_constant_typeless (ffebld_conter (l)));
  2406. break;
  2407. default:
  2408. assert ("COMPLEX3 bad type" == NULL);
  2409. break;
  2410. }
  2411. /* If conversion operation is not implemented, return original expr. */
  2412. if (error == FFEBAD_NOCANDO)
  2413. return expr;
  2414. expr = ffebld_new_conter_with_orig
  2415. (ffebld_constant_new_complex3_val
  2416. (ffebld_cu_val_complex3 (u)), expr);
  2417. break;
  2418. #endif
  2419. #if FFETARGET_okCOMPLEX4
  2420. case FFEINFO_kindtypeREAL4:
  2421. switch (ffeinfo_basictype (ffebld_info (l)))
  2422. {
  2423. case FFEINFO_basictypeINTEGER:
  2424. switch (ffeinfo_kindtype (ffebld_info (l)))
  2425. {
  2426. #if FFETARGET_okINTEGER1
  2427. case FFEINFO_kindtypeINTEGER1:
  2428. error = ffetarget_convert_complex4_integer1
  2429. (ffebld_cu_ptr_complex4 (u),
  2430. ffebld_constant_integer1 (ffebld_conter (l)));
  2431. break;
  2432. #endif
  2433. #if FFETARGET_okINTEGER2
  2434. case FFEINFO_kindtypeINTEGER2:
  2435. error = ffetarget_convert_complex4_integer2
  2436. (ffebld_cu_ptr_complex4 (u),
  2437. ffebld_constant_integer2 (ffebld_conter (l)));
  2438. break;
  2439. #endif
  2440. #if FFETARGET_okINTEGER3
  2441. case FFEINFO_kindtypeINTEGER3:
  2442. error = ffetarget_convert_complex4_integer3
  2443. (ffebld_cu_ptr_complex4 (u),
  2444. ffebld_constant_integer3 (ffebld_conter (l)));
  2445. break;
  2446. #endif
  2447. #if FFETARGET_okINTEGER4
  2448. case FFEINFO_kindtypeINTEGER4:
  2449. error = ffetarget_convert_complex4_integer4
  2450. (ffebld_cu_ptr_complex4 (u),
  2451. ffebld_constant_integer4 (ffebld_conter (l)));
  2452. break;
  2453. #endif
  2454. default:
  2455. assert ("COMPLEX4/INTEGER bad source kind type" == NULL);
  2456. break;
  2457. }
  2458. break;
  2459. case FFEINFO_basictypeREAL:
  2460. switch (ffeinfo_kindtype (ffebld_info (l)))
  2461. {
  2462. #if FFETARGET_okREAL1
  2463. case FFEINFO_kindtypeREAL1:
  2464. error = ffetarget_convert_complex4_real1
  2465. (ffebld_cu_ptr_complex4 (u),
  2466. ffebld_constant_real1 (ffebld_conter (l)));
  2467. break;
  2468. #endif
  2469. #if FFETARGET_okREAL2
  2470. case FFEINFO_kindtypeREAL2:
  2471. error = ffetarget_convert_complex4_real2
  2472. (ffebld_cu_ptr_complex4 (u),
  2473. ffebld_constant_real2 (ffebld_conter (l)));
  2474. break;
  2475. #endif
  2476. #if FFETARGET_okREAL3
  2477. case FFEINFO_kindtypeREAL3:
  2478. error = ffetarget_convert_complex4_real3
  2479. (ffebld_cu_ptr_complex4 (u),
  2480. ffebld_constant_real3 (ffebld_conter (l)));
  2481. break;
  2482. #endif
  2483. #if FFETARGET_okREAL4
  2484. case FFEINFO_kindtypeREAL4:
  2485. error = ffetarget_convert_complex4_real4
  2486. (ffebld_cu_ptr_complex4 (u),
  2487. ffebld_constant_real4 (ffebld_conter (l)));
  2488. break;
  2489. #endif
  2490. default:
  2491. assert ("COMPLEX4/REAL bad source kind type" == NULL);
  2492. break;
  2493. }
  2494. break;
  2495. case FFEINFO_basictypeCOMPLEX:
  2496. switch (ffeinfo_kindtype (ffebld_info (l)))
  2497. {
  2498. #if FFETARGET_okCOMPLEX1
  2499. case FFEINFO_kindtypeREAL1:
  2500. error = ffetarget_convert_complex4_complex1
  2501. (ffebld_cu_ptr_complex4 (u),
  2502. ffebld_constant_complex1 (ffebld_conter (l)));
  2503. break;
  2504. #endif
  2505. #if FFETARGET_okCOMPLEX2
  2506. case FFEINFO_kindtypeREAL2:
  2507. error = ffetarget_convert_complex4_complex2
  2508. (ffebld_cu_ptr_complex4 (u),
  2509. ffebld_constant_complex2 (ffebld_conter (l)));
  2510. break;
  2511. #endif
  2512. #if FFETARGET_okCOMPLEX3
  2513. case FFEINFO_kindtypeREAL3:
  2514. error = ffetarget_convert_complex4_complex3
  2515. (ffebld_cu_ptr_complex4 (u),
  2516. ffebld_constant_complex3 (ffebld_conter (l)));
  2517. break;
  2518. #endif
  2519. default:
  2520. assert ("COMPLEX4/COMPLEX bad source kind type" == NULL);
  2521. break;
  2522. }
  2523. break;
  2524. case FFEINFO_basictypeCHARACTER:
  2525. error = ffetarget_convert_complex4_character1
  2526. (ffebld_cu_ptr_complex4 (u),
  2527. ffebld_constant_character1 (ffebld_conter (l)));
  2528. break;
  2529. case FFEINFO_basictypeHOLLERITH:
  2530. error = ffetarget_convert_complex4_hollerith
  2531. (ffebld_cu_ptr_complex4 (u),
  2532. ffebld_constant_hollerith (ffebld_conter (l)));
  2533. break;
  2534. case FFEINFO_basictypeTYPELESS:
  2535. error = ffetarget_convert_complex4_typeless
  2536. (ffebld_cu_ptr_complex4 (u),
  2537. ffebld_constant_typeless (ffebld_conter (l)));
  2538. break;
  2539. default:
  2540. assert ("COMPLEX4 bad type" == NULL);
  2541. break;
  2542. }
  2543. /* If conversion operation is not implemented, return original expr. */
  2544. if (error == FFEBAD_NOCANDO)
  2545. return expr;
  2546. expr = ffebld_new_conter_with_orig
  2547. (ffebld_constant_new_complex4_val
  2548. (ffebld_cu_val_complex4 (u)), expr);
  2549. break;
  2550. #endif
  2551. default:
  2552. assert ("bad complex kind type" == NULL);
  2553. break;
  2554. }
  2555. break;
  2556. case FFEINFO_basictypeCHARACTER:
  2557. if ((sz = ffebld_size (expr)) == FFETARGET_charactersizeNONE)
  2558. return expr;
  2559. kt = ffeinfo_kindtype (ffebld_info (expr));
  2560. switch (kt)
  2561. {
  2562. #if FFETARGET_okCHARACTER1
  2563. case FFEINFO_kindtypeCHARACTER1:
  2564. switch (ffeinfo_basictype (ffebld_info (l)))
  2565. {
  2566. case FFEINFO_basictypeCHARACTER:
  2567. if ((sz2 = ffebld_size (l)) == FFETARGET_charactersizeNONE)
  2568. return expr;
  2569. assert (kt == ffeinfo_kindtype (ffebld_info (l)));
  2570. assert (sz2 == ffetarget_length_character1
  2571. (ffebld_constant_character1
  2572. (ffebld_conter (l))));
  2573. error
  2574. = ffetarget_convert_character1_character1
  2575. (ffebld_cu_ptr_character1 (u), sz,
  2576. ffebld_constant_character1 (ffebld_conter (l)),
  2577. ffebld_constant_pool ());
  2578. break;
  2579. case FFEINFO_basictypeINTEGER:
  2580. switch (ffeinfo_kindtype (ffebld_info (l)))
  2581. {
  2582. #if FFETARGET_okINTEGER1
  2583. case FFEINFO_kindtypeINTEGER1:
  2584. error
  2585. = ffetarget_convert_character1_integer1
  2586. (ffebld_cu_ptr_character1 (u),
  2587. sz,
  2588. ffebld_constant_integer1 (ffebld_conter (l)),
  2589. ffebld_constant_pool ());
  2590. break;
  2591. #endif
  2592. #if FFETARGET_okINTEGER2
  2593. case FFEINFO_kindtypeINTEGER2:
  2594. error
  2595. = ffetarget_convert_character1_integer2
  2596. (ffebld_cu_ptr_character1 (u),
  2597. sz,
  2598. ffebld_constant_integer2 (ffebld_conter (l)),
  2599. ffebld_constant_pool ());
  2600. break;
  2601. #endif
  2602. #if FFETARGET_okINTEGER3
  2603. case FFEINFO_kindtypeINTEGER3:
  2604. error
  2605. = ffetarget_convert_character1_integer3
  2606. (ffebld_cu_ptr_character1 (u),
  2607. sz,
  2608. ffebld_constant_integer3 (ffebld_conter (l)),
  2609. ffebld_constant_pool ());
  2610. break;
  2611. #endif
  2612. #if FFETARGET_okINTEGER4
  2613. case FFEINFO_kindtypeINTEGER4:
  2614. error
  2615. = ffetarget_convert_character1_integer4
  2616. (ffebld_cu_ptr_character1 (u),
  2617. sz,
  2618. ffebld_constant_integer4 (ffebld_conter (l)),
  2619. ffebld_constant_pool ());
  2620. break;
  2621. #endif
  2622. default:
  2623. assert ("CHARACTER1/INTEGER bad source kind type" == NULL);
  2624. break;
  2625. }
  2626. break;
  2627. case FFEINFO_basictypeLOGICAL:
  2628. switch (ffeinfo_kindtype (ffebld_info (l)))
  2629. {
  2630. #if FFETARGET_okLOGICAL1
  2631. case FFEINFO_kindtypeLOGICAL1:
  2632. error
  2633. = ffetarget_convert_character1_logical1
  2634. (ffebld_cu_ptr_character1 (u),
  2635. sz,
  2636. ffebld_constant_logical1 (ffebld_conter (l)),
  2637. ffebld_constant_pool ());
  2638. break;
  2639. #endif
  2640. #if FFETARGET_okLOGICAL2
  2641. case FFEINFO_kindtypeLOGICAL2:
  2642. error
  2643. = ffetarget_convert_character1_logical2
  2644. (ffebld_cu_ptr_character1 (u),
  2645. sz,
  2646. ffebld_constant_logical2 (ffebld_conter (l)),
  2647. ffebld_constant_pool ());
  2648. break;
  2649. #endif
  2650. #if FFETARGET_okLOGICAL3
  2651. case FFEINFO_kindtypeLOGICAL3:
  2652. error
  2653. = ffetarget_convert_character1_logical3
  2654. (ffebld_cu_ptr_character1 (u),
  2655. sz,
  2656. ffebld_constant_logical3 (ffebld_conter (l)),
  2657. ffebld_constant_pool ());
  2658. break;
  2659. #endif
  2660. #if FFETARGET_okLOGICAL4
  2661. case FFEINFO_kindtypeLOGICAL4:
  2662. error
  2663. = ffetarget_convert_character1_logical4
  2664. (ffebld_cu_ptr_character1 (u),
  2665. sz,
  2666. ffebld_constant_logical4 (ffebld_conter (l)),
  2667. ffebld_constant_pool ());
  2668. break;
  2669. #endif
  2670. default:
  2671. assert ("CHARACTER1/LOGICAL bad source kind type" == NULL);
  2672. break;
  2673. }
  2674. break;
  2675. case FFEINFO_basictypeHOLLERITH:
  2676. error
  2677. = ffetarget_convert_character1_hollerith
  2678. (ffebld_cu_ptr_character1 (u),
  2679. sz,
  2680. ffebld_constant_hollerith (ffebld_conter (l)),
  2681. ffebld_constant_pool ());
  2682. break;
  2683. case FFEINFO_basictypeTYPELESS:
  2684. error
  2685. = ffetarget_convert_character1_typeless
  2686. (ffebld_cu_ptr_character1 (u),
  2687. sz,
  2688. ffebld_constant_typeless (ffebld_conter (l)),
  2689. ffebld_constant_pool ());
  2690. break;
  2691. default:
  2692. assert ("CHARACTER1 bad type" == NULL);
  2693. }
  2694. expr
  2695. = ffebld_new_conter_with_orig
  2696. (ffebld_constant_new_character1_val
  2697. (ffebld_cu_val_character1 (u)),
  2698. expr);
  2699. break;
  2700. #endif
  2701. default:
  2702. assert ("bad character kind type" == NULL);
  2703. break;
  2704. }
  2705. break;
  2706. default:
  2707. assert ("bad type" == NULL);
  2708. return expr;
  2709. }
  2710. ffebld_set_info (expr, ffeinfo_new
  2711. (bt,
  2712. kt,
  2713. 0,
  2714. FFEINFO_kindENTITY,
  2715. FFEINFO_whereCONSTANT,
  2716. sz));
  2717. if ((error != FFEBAD)
  2718. && ffebad_start (error))
  2719. {
  2720. assert (t != NULL);
  2721. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  2722. ffebad_finish ();
  2723. }
  2724. return expr;
  2725. }
  2726. /* ffeexpr_collapse_paren -- Collapse paren expr
  2727. ffebld expr;
  2728. ffelexToken token;
  2729. expr = ffeexpr_collapse_paren(expr,token);
  2730. If the result of the expr is a constant, replaces the expr with the
  2731. computed constant. */
  2732. ffebld
  2733. ffeexpr_collapse_paren (ffebld expr, ffelexToken t UNUSED)
  2734. {
  2735. ffebld r;
  2736. ffeinfoBasictype bt;
  2737. ffeinfoKindtype kt;
  2738. ffetargetCharacterSize len;
  2739. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  2740. return expr;
  2741. r = ffebld_left (expr);
  2742. if (ffebld_op (r) != FFEBLD_opCONTER)
  2743. return expr;
  2744. bt = ffeinfo_basictype (ffebld_info (r));
  2745. kt = ffeinfo_kindtype (ffebld_info (r));
  2746. len = ffebld_size (r);
  2747. expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
  2748. expr);
  2749. ffebld_set_info (expr, ffeinfo_new
  2750. (bt,
  2751. kt,
  2752. 0,
  2753. FFEINFO_kindENTITY,
  2754. FFEINFO_whereCONSTANT,
  2755. len));
  2756. return expr;
  2757. }
  2758. /* ffeexpr_collapse_uplus -- Collapse uplus expr
  2759. ffebld expr;
  2760. ffelexToken token;
  2761. expr = ffeexpr_collapse_uplus(expr,token);
  2762. If the result of the expr is a constant, replaces the expr with the
  2763. computed constant. */
  2764. ffebld
  2765. ffeexpr_collapse_uplus (ffebld expr, ffelexToken t UNUSED)
  2766. {
  2767. ffebld r;
  2768. ffeinfoBasictype bt;
  2769. ffeinfoKindtype kt;
  2770. ffetargetCharacterSize len;
  2771. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  2772. return expr;
  2773. r = ffebld_left (expr);
  2774. if (ffebld_op (r) != FFEBLD_opCONTER)
  2775. return expr;
  2776. bt = ffeinfo_basictype (ffebld_info (r));
  2777. kt = ffeinfo_kindtype (ffebld_info (r));
  2778. len = ffebld_size (r);
  2779. expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
  2780. expr);
  2781. ffebld_set_info (expr, ffeinfo_new
  2782. (bt,
  2783. kt,
  2784. 0,
  2785. FFEINFO_kindENTITY,
  2786. FFEINFO_whereCONSTANT,
  2787. len));
  2788. return expr;
  2789. }
  2790. /* ffeexpr_collapse_uminus -- Collapse uminus expr
  2791. ffebld expr;
  2792. ffelexToken token;
  2793. expr = ffeexpr_collapse_uminus(expr,token);
  2794. If the result of the expr is a constant, replaces the expr with the
  2795. computed constant. */
  2796. ffebld
  2797. ffeexpr_collapse_uminus (ffebld expr, ffelexToken t)
  2798. {
  2799. ffebad error = FFEBAD;
  2800. ffebld r;
  2801. ffebldConstantUnion u;
  2802. ffeinfoBasictype bt;
  2803. ffeinfoKindtype kt;
  2804. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  2805. return expr;
  2806. r = ffebld_left (expr);
  2807. if (ffebld_op (r) != FFEBLD_opCONTER)
  2808. return expr;
  2809. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  2810. {
  2811. case FFEINFO_basictypeANY:
  2812. return expr;
  2813. case FFEINFO_basictypeINTEGER:
  2814. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  2815. {
  2816. #if FFETARGET_okINTEGER1
  2817. case FFEINFO_kindtypeINTEGER1:
  2818. error = ffetarget_uminus_integer1 (ffebld_cu_ptr_integer1 (u),
  2819. ffebld_constant_integer1 (ffebld_conter (r)));
  2820. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  2821. (ffebld_cu_val_integer1 (u)), expr);
  2822. break;
  2823. #endif
  2824. #if FFETARGET_okINTEGER2
  2825. case FFEINFO_kindtypeINTEGER2:
  2826. error = ffetarget_uminus_integer2 (ffebld_cu_ptr_integer2 (u),
  2827. ffebld_constant_integer2 (ffebld_conter (r)));
  2828. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  2829. (ffebld_cu_val_integer2 (u)), expr);
  2830. break;
  2831. #endif
  2832. #if FFETARGET_okINTEGER3
  2833. case FFEINFO_kindtypeINTEGER3:
  2834. error = ffetarget_uminus_integer3 (ffebld_cu_ptr_integer3 (u),
  2835. ffebld_constant_integer3 (ffebld_conter (r)));
  2836. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  2837. (ffebld_cu_val_integer3 (u)), expr);
  2838. break;
  2839. #endif
  2840. #if FFETARGET_okINTEGER4
  2841. case FFEINFO_kindtypeINTEGER4:
  2842. error = ffetarget_uminus_integer4 (ffebld_cu_ptr_integer4 (u),
  2843. ffebld_constant_integer4 (ffebld_conter (r)));
  2844. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  2845. (ffebld_cu_val_integer4 (u)), expr);
  2846. break;
  2847. #endif
  2848. default:
  2849. assert ("bad integer kind type" == NULL);
  2850. break;
  2851. }
  2852. break;
  2853. case FFEINFO_basictypeREAL:
  2854. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  2855. {
  2856. #if FFETARGET_okREAL1
  2857. case FFEINFO_kindtypeREAL1:
  2858. error = ffetarget_uminus_real1 (ffebld_cu_ptr_real1 (u),
  2859. ffebld_constant_real1 (ffebld_conter (r)));
  2860. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
  2861. (ffebld_cu_val_real1 (u)), expr);
  2862. break;
  2863. #endif
  2864. #if FFETARGET_okREAL2
  2865. case FFEINFO_kindtypeREAL2:
  2866. error = ffetarget_uminus_real2 (ffebld_cu_ptr_real2 (u),
  2867. ffebld_constant_real2 (ffebld_conter (r)));
  2868. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
  2869. (ffebld_cu_val_real2 (u)), expr);
  2870. break;
  2871. #endif
  2872. #if FFETARGET_okREAL3
  2873. case FFEINFO_kindtypeREAL3:
  2874. error = ffetarget_uminus_real3 (ffebld_cu_ptr_real3 (u),
  2875. ffebld_constant_real3 (ffebld_conter (r)));
  2876. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
  2877. (ffebld_cu_val_real3 (u)), expr);
  2878. break;
  2879. #endif
  2880. #if FFETARGET_okREAL4
  2881. case FFEINFO_kindtypeREAL4:
  2882. error = ffetarget_uminus_real4 (ffebld_cu_ptr_real4 (u),
  2883. ffebld_constant_real4 (ffebld_conter (r)));
  2884. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
  2885. (ffebld_cu_val_real4 (u)), expr);
  2886. break;
  2887. #endif
  2888. default:
  2889. assert ("bad real kind type" == NULL);
  2890. break;
  2891. }
  2892. break;
  2893. case FFEINFO_basictypeCOMPLEX:
  2894. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  2895. {
  2896. #if FFETARGET_okCOMPLEX1
  2897. case FFEINFO_kindtypeREAL1:
  2898. error = ffetarget_uminus_complex1 (ffebld_cu_ptr_complex1 (u),
  2899. ffebld_constant_complex1 (ffebld_conter (r)));
  2900. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
  2901. (ffebld_cu_val_complex1 (u)), expr);
  2902. break;
  2903. #endif
  2904. #if FFETARGET_okCOMPLEX2
  2905. case FFEINFO_kindtypeREAL2:
  2906. error = ffetarget_uminus_complex2 (ffebld_cu_ptr_complex2 (u),
  2907. ffebld_constant_complex2 (ffebld_conter (r)));
  2908. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
  2909. (ffebld_cu_val_complex2 (u)), expr);
  2910. break;
  2911. #endif
  2912. #if FFETARGET_okCOMPLEX3
  2913. case FFEINFO_kindtypeREAL3:
  2914. error = ffetarget_uminus_complex3 (ffebld_cu_ptr_complex3 (u),
  2915. ffebld_constant_complex3 (ffebld_conter (r)));
  2916. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
  2917. (ffebld_cu_val_complex3 (u)), expr);
  2918. break;
  2919. #endif
  2920. #if FFETARGET_okCOMPLEX4
  2921. case FFEINFO_kindtypeREAL4:
  2922. error = ffetarget_uminus_complex4 (ffebld_cu_ptr_complex4 (u),
  2923. ffebld_constant_complex4 (ffebld_conter (r)));
  2924. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
  2925. (ffebld_cu_val_complex4 (u)), expr);
  2926. break;
  2927. #endif
  2928. default:
  2929. assert ("bad complex kind type" == NULL);
  2930. break;
  2931. }
  2932. break;
  2933. default:
  2934. assert ("bad type" == NULL);
  2935. return expr;
  2936. }
  2937. ffebld_set_info (expr, ffeinfo_new
  2938. (bt,
  2939. kt,
  2940. 0,
  2941. FFEINFO_kindENTITY,
  2942. FFEINFO_whereCONSTANT,
  2943. FFETARGET_charactersizeNONE));
  2944. if ((error != FFEBAD)
  2945. && ffebad_start (error))
  2946. {
  2947. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  2948. ffebad_finish ();
  2949. }
  2950. return expr;
  2951. }
  2952. /* ffeexpr_collapse_not -- Collapse not expr
  2953. ffebld expr;
  2954. ffelexToken token;
  2955. expr = ffeexpr_collapse_not(expr,token);
  2956. If the result of the expr is a constant, replaces the expr with the
  2957. computed constant. */
  2958. ffebld
  2959. ffeexpr_collapse_not (ffebld expr, ffelexToken t)
  2960. {
  2961. ffebad error = FFEBAD;
  2962. ffebld r;
  2963. ffebldConstantUnion u;
  2964. ffeinfoBasictype bt;
  2965. ffeinfoKindtype kt;
  2966. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  2967. return expr;
  2968. r = ffebld_left (expr);
  2969. if (ffebld_op (r) != FFEBLD_opCONTER)
  2970. return expr;
  2971. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  2972. {
  2973. case FFEINFO_basictypeANY:
  2974. return expr;
  2975. case FFEINFO_basictypeINTEGER:
  2976. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  2977. {
  2978. #if FFETARGET_okINTEGER1
  2979. case FFEINFO_kindtypeINTEGER1:
  2980. error = ffetarget_not_integer1 (ffebld_cu_ptr_integer1 (u),
  2981. ffebld_constant_integer1 (ffebld_conter (r)));
  2982. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  2983. (ffebld_cu_val_integer1 (u)), expr);
  2984. break;
  2985. #endif
  2986. #if FFETARGET_okINTEGER2
  2987. case FFEINFO_kindtypeINTEGER2:
  2988. error = ffetarget_not_integer2 (ffebld_cu_ptr_integer2 (u),
  2989. ffebld_constant_integer2 (ffebld_conter (r)));
  2990. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  2991. (ffebld_cu_val_integer2 (u)), expr);
  2992. break;
  2993. #endif
  2994. #if FFETARGET_okINTEGER3
  2995. case FFEINFO_kindtypeINTEGER3:
  2996. error = ffetarget_not_integer3 (ffebld_cu_ptr_integer3 (u),
  2997. ffebld_constant_integer3 (ffebld_conter (r)));
  2998. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  2999. (ffebld_cu_val_integer3 (u)), expr);
  3000. break;
  3001. #endif
  3002. #if FFETARGET_okINTEGER4
  3003. case FFEINFO_kindtypeINTEGER4:
  3004. error = ffetarget_not_integer4 (ffebld_cu_ptr_integer4 (u),
  3005. ffebld_constant_integer4 (ffebld_conter (r)));
  3006. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  3007. (ffebld_cu_val_integer4 (u)), expr);
  3008. break;
  3009. #endif
  3010. default:
  3011. assert ("bad integer kind type" == NULL);
  3012. break;
  3013. }
  3014. break;
  3015. case FFEINFO_basictypeLOGICAL:
  3016. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3017. {
  3018. #if FFETARGET_okLOGICAL1
  3019. case FFEINFO_kindtypeLOGICAL1:
  3020. error = ffetarget_not_logical1 (ffebld_cu_ptr_logical1 (u),
  3021. ffebld_constant_logical1 (ffebld_conter (r)));
  3022. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  3023. (ffebld_cu_val_logical1 (u)), expr);
  3024. break;
  3025. #endif
  3026. #if FFETARGET_okLOGICAL2
  3027. case FFEINFO_kindtypeLOGICAL2:
  3028. error = ffetarget_not_logical2 (ffebld_cu_ptr_logical2 (u),
  3029. ffebld_constant_logical2 (ffebld_conter (r)));
  3030. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  3031. (ffebld_cu_val_logical2 (u)), expr);
  3032. break;
  3033. #endif
  3034. #if FFETARGET_okLOGICAL3
  3035. case FFEINFO_kindtypeLOGICAL3:
  3036. error = ffetarget_not_logical3 (ffebld_cu_ptr_logical3 (u),
  3037. ffebld_constant_logical3 (ffebld_conter (r)));
  3038. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  3039. (ffebld_cu_val_logical3 (u)), expr);
  3040. break;
  3041. #endif
  3042. #if FFETARGET_okLOGICAL4
  3043. case FFEINFO_kindtypeLOGICAL4:
  3044. error = ffetarget_not_logical4 (ffebld_cu_ptr_logical4 (u),
  3045. ffebld_constant_logical4 (ffebld_conter (r)));
  3046. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  3047. (ffebld_cu_val_logical4 (u)), expr);
  3048. break;
  3049. #endif
  3050. default:
  3051. assert ("bad logical kind type" == NULL);
  3052. break;
  3053. }
  3054. break;
  3055. default:
  3056. assert ("bad type" == NULL);
  3057. return expr;
  3058. }
  3059. ffebld_set_info (expr, ffeinfo_new
  3060. (bt,
  3061. kt,
  3062. 0,
  3063. FFEINFO_kindENTITY,
  3064. FFEINFO_whereCONSTANT,
  3065. FFETARGET_charactersizeNONE));
  3066. if ((error != FFEBAD)
  3067. && ffebad_start (error))
  3068. {
  3069. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  3070. ffebad_finish ();
  3071. }
  3072. return expr;
  3073. }
  3074. /* ffeexpr_collapse_add -- Collapse add expr
  3075. ffebld expr;
  3076. ffelexToken token;
  3077. expr = ffeexpr_collapse_add(expr,token);
  3078. If the result of the expr is a constant, replaces the expr with the
  3079. computed constant. */
  3080. ffebld
  3081. ffeexpr_collapse_add (ffebld expr, ffelexToken t)
  3082. {
  3083. ffebad error = FFEBAD;
  3084. ffebld l;
  3085. ffebld r;
  3086. ffebldConstantUnion u;
  3087. ffeinfoBasictype bt;
  3088. ffeinfoKindtype kt;
  3089. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3090. return expr;
  3091. l = ffebld_left (expr);
  3092. r = ffebld_right (expr);
  3093. if (ffebld_op (l) != FFEBLD_opCONTER)
  3094. return expr;
  3095. if (ffebld_op (r) != FFEBLD_opCONTER)
  3096. return expr;
  3097. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  3098. {
  3099. case FFEINFO_basictypeANY:
  3100. return expr;
  3101. case FFEINFO_basictypeINTEGER:
  3102. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3103. {
  3104. #if FFETARGET_okINTEGER1
  3105. case FFEINFO_kindtypeINTEGER1:
  3106. error = ffetarget_add_integer1 (ffebld_cu_ptr_integer1 (u),
  3107. ffebld_constant_integer1 (ffebld_conter (l)),
  3108. ffebld_constant_integer1 (ffebld_conter (r)));
  3109. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  3110. (ffebld_cu_val_integer1 (u)), expr);
  3111. break;
  3112. #endif
  3113. #if FFETARGET_okINTEGER2
  3114. case FFEINFO_kindtypeINTEGER2:
  3115. error = ffetarget_add_integer2 (ffebld_cu_ptr_integer2 (u),
  3116. ffebld_constant_integer2 (ffebld_conter (l)),
  3117. ffebld_constant_integer2 (ffebld_conter (r)));
  3118. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  3119. (ffebld_cu_val_integer2 (u)), expr);
  3120. break;
  3121. #endif
  3122. #if FFETARGET_okINTEGER3
  3123. case FFEINFO_kindtypeINTEGER3:
  3124. error = ffetarget_add_integer3 (ffebld_cu_ptr_integer3 (u),
  3125. ffebld_constant_integer3 (ffebld_conter (l)),
  3126. ffebld_constant_integer3 (ffebld_conter (r)));
  3127. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  3128. (ffebld_cu_val_integer3 (u)), expr);
  3129. break;
  3130. #endif
  3131. #if FFETARGET_okINTEGER4
  3132. case FFEINFO_kindtypeINTEGER4:
  3133. error = ffetarget_add_integer4 (ffebld_cu_ptr_integer4 (u),
  3134. ffebld_constant_integer4 (ffebld_conter (l)),
  3135. ffebld_constant_integer4 (ffebld_conter (r)));
  3136. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  3137. (ffebld_cu_val_integer4 (u)), expr);
  3138. break;
  3139. #endif
  3140. default:
  3141. assert ("bad integer kind type" == NULL);
  3142. break;
  3143. }
  3144. break;
  3145. case FFEINFO_basictypeREAL:
  3146. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3147. {
  3148. #if FFETARGET_okREAL1
  3149. case FFEINFO_kindtypeREAL1:
  3150. error = ffetarget_add_real1 (ffebld_cu_ptr_real1 (u),
  3151. ffebld_constant_real1 (ffebld_conter (l)),
  3152. ffebld_constant_real1 (ffebld_conter (r)));
  3153. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
  3154. (ffebld_cu_val_real1 (u)), expr);
  3155. break;
  3156. #endif
  3157. #if FFETARGET_okREAL2
  3158. case FFEINFO_kindtypeREAL2:
  3159. error = ffetarget_add_real2 (ffebld_cu_ptr_real2 (u),
  3160. ffebld_constant_real2 (ffebld_conter (l)),
  3161. ffebld_constant_real2 (ffebld_conter (r)));
  3162. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
  3163. (ffebld_cu_val_real2 (u)), expr);
  3164. break;
  3165. #endif
  3166. #if FFETARGET_okREAL3
  3167. case FFEINFO_kindtypeREAL3:
  3168. error = ffetarget_add_real3 (ffebld_cu_ptr_real3 (u),
  3169. ffebld_constant_real3 (ffebld_conter (l)),
  3170. ffebld_constant_real3 (ffebld_conter (r)));
  3171. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
  3172. (ffebld_cu_val_real3 (u)), expr);
  3173. break;
  3174. #endif
  3175. #if FFETARGET_okREAL4
  3176. case FFEINFO_kindtypeREAL4:
  3177. error = ffetarget_add_real4 (ffebld_cu_ptr_real4 (u),
  3178. ffebld_constant_real4 (ffebld_conter (l)),
  3179. ffebld_constant_real4 (ffebld_conter (r)));
  3180. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
  3181. (ffebld_cu_val_real4 (u)), expr);
  3182. break;
  3183. #endif
  3184. default:
  3185. assert ("bad real kind type" == NULL);
  3186. break;
  3187. }
  3188. break;
  3189. case FFEINFO_basictypeCOMPLEX:
  3190. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3191. {
  3192. #if FFETARGET_okCOMPLEX1
  3193. case FFEINFO_kindtypeREAL1:
  3194. error = ffetarget_add_complex1 (ffebld_cu_ptr_complex1 (u),
  3195. ffebld_constant_complex1 (ffebld_conter (l)),
  3196. ffebld_constant_complex1 (ffebld_conter (r)));
  3197. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
  3198. (ffebld_cu_val_complex1 (u)), expr);
  3199. break;
  3200. #endif
  3201. #if FFETARGET_okCOMPLEX2
  3202. case FFEINFO_kindtypeREAL2:
  3203. error = ffetarget_add_complex2 (ffebld_cu_ptr_complex2 (u),
  3204. ffebld_constant_complex2 (ffebld_conter (l)),
  3205. ffebld_constant_complex2 (ffebld_conter (r)));
  3206. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
  3207. (ffebld_cu_val_complex2 (u)), expr);
  3208. break;
  3209. #endif
  3210. #if FFETARGET_okCOMPLEX3
  3211. case FFEINFO_kindtypeREAL3:
  3212. error = ffetarget_add_complex3 (ffebld_cu_ptr_complex3 (u),
  3213. ffebld_constant_complex3 (ffebld_conter (l)),
  3214. ffebld_constant_complex3 (ffebld_conter (r)));
  3215. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
  3216. (ffebld_cu_val_complex3 (u)), expr);
  3217. break;
  3218. #endif
  3219. #if FFETARGET_okCOMPLEX4
  3220. case FFEINFO_kindtypeREAL4:
  3221. error = ffetarget_add_complex4 (ffebld_cu_ptr_complex4 (u),
  3222. ffebld_constant_complex4 (ffebld_conter (l)),
  3223. ffebld_constant_complex4 (ffebld_conter (r)));
  3224. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
  3225. (ffebld_cu_val_complex4 (u)), expr);
  3226. break;
  3227. #endif
  3228. default:
  3229. assert ("bad complex kind type" == NULL);
  3230. break;
  3231. }
  3232. break;
  3233. default:
  3234. assert ("bad type" == NULL);
  3235. return expr;
  3236. }
  3237. ffebld_set_info (expr, ffeinfo_new
  3238. (bt,
  3239. kt,
  3240. 0,
  3241. FFEINFO_kindENTITY,
  3242. FFEINFO_whereCONSTANT,
  3243. FFETARGET_charactersizeNONE));
  3244. if ((error != FFEBAD)
  3245. && ffebad_start (error))
  3246. {
  3247. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  3248. ffebad_finish ();
  3249. }
  3250. return expr;
  3251. }
  3252. /* ffeexpr_collapse_subtract -- Collapse subtract expr
  3253. ffebld expr;
  3254. ffelexToken token;
  3255. expr = ffeexpr_collapse_subtract(expr,token);
  3256. If the result of the expr is a constant, replaces the expr with the
  3257. computed constant. */
  3258. ffebld
  3259. ffeexpr_collapse_subtract (ffebld expr, ffelexToken t)
  3260. {
  3261. ffebad error = FFEBAD;
  3262. ffebld l;
  3263. ffebld r;
  3264. ffebldConstantUnion u;
  3265. ffeinfoBasictype bt;
  3266. ffeinfoKindtype kt;
  3267. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3268. return expr;
  3269. l = ffebld_left (expr);
  3270. r = ffebld_right (expr);
  3271. if (ffebld_op (l) != FFEBLD_opCONTER)
  3272. return expr;
  3273. if (ffebld_op (r) != FFEBLD_opCONTER)
  3274. return expr;
  3275. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  3276. {
  3277. case FFEINFO_basictypeANY:
  3278. return expr;
  3279. case FFEINFO_basictypeINTEGER:
  3280. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3281. {
  3282. #if FFETARGET_okINTEGER1
  3283. case FFEINFO_kindtypeINTEGER1:
  3284. error = ffetarget_subtract_integer1 (ffebld_cu_ptr_integer1 (u),
  3285. ffebld_constant_integer1 (ffebld_conter (l)),
  3286. ffebld_constant_integer1 (ffebld_conter (r)));
  3287. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  3288. (ffebld_cu_val_integer1 (u)), expr);
  3289. break;
  3290. #endif
  3291. #if FFETARGET_okINTEGER2
  3292. case FFEINFO_kindtypeINTEGER2:
  3293. error = ffetarget_subtract_integer2 (ffebld_cu_ptr_integer2 (u),
  3294. ffebld_constant_integer2 (ffebld_conter (l)),
  3295. ffebld_constant_integer2 (ffebld_conter (r)));
  3296. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  3297. (ffebld_cu_val_integer2 (u)), expr);
  3298. break;
  3299. #endif
  3300. #if FFETARGET_okINTEGER3
  3301. case FFEINFO_kindtypeINTEGER3:
  3302. error = ffetarget_subtract_integer3 (ffebld_cu_ptr_integer3 (u),
  3303. ffebld_constant_integer3 (ffebld_conter (l)),
  3304. ffebld_constant_integer3 (ffebld_conter (r)));
  3305. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  3306. (ffebld_cu_val_integer3 (u)), expr);
  3307. break;
  3308. #endif
  3309. #if FFETARGET_okINTEGER4
  3310. case FFEINFO_kindtypeINTEGER4:
  3311. error = ffetarget_subtract_integer4 (ffebld_cu_ptr_integer4 (u),
  3312. ffebld_constant_integer4 (ffebld_conter (l)),
  3313. ffebld_constant_integer4 (ffebld_conter (r)));
  3314. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  3315. (ffebld_cu_val_integer4 (u)), expr);
  3316. break;
  3317. #endif
  3318. default:
  3319. assert ("bad integer kind type" == NULL);
  3320. break;
  3321. }
  3322. break;
  3323. case FFEINFO_basictypeREAL:
  3324. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3325. {
  3326. #if FFETARGET_okREAL1
  3327. case FFEINFO_kindtypeREAL1:
  3328. error = ffetarget_subtract_real1 (ffebld_cu_ptr_real1 (u),
  3329. ffebld_constant_real1 (ffebld_conter (l)),
  3330. ffebld_constant_real1 (ffebld_conter (r)));
  3331. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
  3332. (ffebld_cu_val_real1 (u)), expr);
  3333. break;
  3334. #endif
  3335. #if FFETARGET_okREAL2
  3336. case FFEINFO_kindtypeREAL2:
  3337. error = ffetarget_subtract_real2 (ffebld_cu_ptr_real2 (u),
  3338. ffebld_constant_real2 (ffebld_conter (l)),
  3339. ffebld_constant_real2 (ffebld_conter (r)));
  3340. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
  3341. (ffebld_cu_val_real2 (u)), expr);
  3342. break;
  3343. #endif
  3344. #if FFETARGET_okREAL3
  3345. case FFEINFO_kindtypeREAL3:
  3346. error = ffetarget_subtract_real3 (ffebld_cu_ptr_real3 (u),
  3347. ffebld_constant_real3 (ffebld_conter (l)),
  3348. ffebld_constant_real3 (ffebld_conter (r)));
  3349. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
  3350. (ffebld_cu_val_real3 (u)), expr);
  3351. break;
  3352. #endif
  3353. #if FFETARGET_okREAL4
  3354. case FFEINFO_kindtypeREAL4:
  3355. error = ffetarget_subtract_real4 (ffebld_cu_ptr_real4 (u),
  3356. ffebld_constant_real4 (ffebld_conter (l)),
  3357. ffebld_constant_real4 (ffebld_conter (r)));
  3358. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
  3359. (ffebld_cu_val_real4 (u)), expr);
  3360. break;
  3361. #endif
  3362. default:
  3363. assert ("bad real kind type" == NULL);
  3364. break;
  3365. }
  3366. break;
  3367. case FFEINFO_basictypeCOMPLEX:
  3368. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3369. {
  3370. #if FFETARGET_okCOMPLEX1
  3371. case FFEINFO_kindtypeREAL1:
  3372. error = ffetarget_subtract_complex1 (ffebld_cu_ptr_complex1 (u),
  3373. ffebld_constant_complex1 (ffebld_conter (l)),
  3374. ffebld_constant_complex1 (ffebld_conter (r)));
  3375. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
  3376. (ffebld_cu_val_complex1 (u)), expr);
  3377. break;
  3378. #endif
  3379. #if FFETARGET_okCOMPLEX2
  3380. case FFEINFO_kindtypeREAL2:
  3381. error = ffetarget_subtract_complex2 (ffebld_cu_ptr_complex2 (u),
  3382. ffebld_constant_complex2 (ffebld_conter (l)),
  3383. ffebld_constant_complex2 (ffebld_conter (r)));
  3384. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
  3385. (ffebld_cu_val_complex2 (u)), expr);
  3386. break;
  3387. #endif
  3388. #if FFETARGET_okCOMPLEX3
  3389. case FFEINFO_kindtypeREAL3:
  3390. error = ffetarget_subtract_complex3 (ffebld_cu_ptr_complex3 (u),
  3391. ffebld_constant_complex3 (ffebld_conter (l)),
  3392. ffebld_constant_complex3 (ffebld_conter (r)));
  3393. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
  3394. (ffebld_cu_val_complex3 (u)), expr);
  3395. break;
  3396. #endif
  3397. #if FFETARGET_okCOMPLEX4
  3398. case FFEINFO_kindtypeREAL4:
  3399. error = ffetarget_subtract_complex4 (ffebld_cu_ptr_complex4 (u),
  3400. ffebld_constant_complex4 (ffebld_conter (l)),
  3401. ffebld_constant_complex4 (ffebld_conter (r)));
  3402. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
  3403. (ffebld_cu_val_complex4 (u)), expr);
  3404. break;
  3405. #endif
  3406. default:
  3407. assert ("bad complex kind type" == NULL);
  3408. break;
  3409. }
  3410. break;
  3411. default:
  3412. assert ("bad type" == NULL);
  3413. return expr;
  3414. }
  3415. ffebld_set_info (expr, ffeinfo_new
  3416. (bt,
  3417. kt,
  3418. 0,
  3419. FFEINFO_kindENTITY,
  3420. FFEINFO_whereCONSTANT,
  3421. FFETARGET_charactersizeNONE));
  3422. if ((error != FFEBAD)
  3423. && ffebad_start (error))
  3424. {
  3425. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  3426. ffebad_finish ();
  3427. }
  3428. return expr;
  3429. }
  3430. /* ffeexpr_collapse_multiply -- Collapse multiply expr
  3431. ffebld expr;
  3432. ffelexToken token;
  3433. expr = ffeexpr_collapse_multiply(expr,token);
  3434. If the result of the expr is a constant, replaces the expr with the
  3435. computed constant. */
  3436. ffebld
  3437. ffeexpr_collapse_multiply (ffebld expr, ffelexToken t)
  3438. {
  3439. ffebad error = FFEBAD;
  3440. ffebld l;
  3441. ffebld r;
  3442. ffebldConstantUnion u;
  3443. ffeinfoBasictype bt;
  3444. ffeinfoKindtype kt;
  3445. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3446. return expr;
  3447. l = ffebld_left (expr);
  3448. r = ffebld_right (expr);
  3449. if (ffebld_op (l) != FFEBLD_opCONTER)
  3450. return expr;
  3451. if (ffebld_op (r) != FFEBLD_opCONTER)
  3452. return expr;
  3453. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  3454. {
  3455. case FFEINFO_basictypeANY:
  3456. return expr;
  3457. case FFEINFO_basictypeINTEGER:
  3458. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3459. {
  3460. #if FFETARGET_okINTEGER1
  3461. case FFEINFO_kindtypeINTEGER1:
  3462. error = ffetarget_multiply_integer1 (ffebld_cu_ptr_integer1 (u),
  3463. ffebld_constant_integer1 (ffebld_conter (l)),
  3464. ffebld_constant_integer1 (ffebld_conter (r)));
  3465. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  3466. (ffebld_cu_val_integer1 (u)), expr);
  3467. break;
  3468. #endif
  3469. #if FFETARGET_okINTEGER2
  3470. case FFEINFO_kindtypeINTEGER2:
  3471. error = ffetarget_multiply_integer2 (ffebld_cu_ptr_integer2 (u),
  3472. ffebld_constant_integer2 (ffebld_conter (l)),
  3473. ffebld_constant_integer2 (ffebld_conter (r)));
  3474. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  3475. (ffebld_cu_val_integer2 (u)), expr);
  3476. break;
  3477. #endif
  3478. #if FFETARGET_okINTEGER3
  3479. case FFEINFO_kindtypeINTEGER3:
  3480. error = ffetarget_multiply_integer3 (ffebld_cu_ptr_integer3 (u),
  3481. ffebld_constant_integer3 (ffebld_conter (l)),
  3482. ffebld_constant_integer3 (ffebld_conter (r)));
  3483. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  3484. (ffebld_cu_val_integer3 (u)), expr);
  3485. break;
  3486. #endif
  3487. #if FFETARGET_okINTEGER4
  3488. case FFEINFO_kindtypeINTEGER4:
  3489. error = ffetarget_multiply_integer4 (ffebld_cu_ptr_integer4 (u),
  3490. ffebld_constant_integer4 (ffebld_conter (l)),
  3491. ffebld_constant_integer4 (ffebld_conter (r)));
  3492. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  3493. (ffebld_cu_val_integer4 (u)), expr);
  3494. break;
  3495. #endif
  3496. default:
  3497. assert ("bad integer kind type" == NULL);
  3498. break;
  3499. }
  3500. break;
  3501. case FFEINFO_basictypeREAL:
  3502. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3503. {
  3504. #if FFETARGET_okREAL1
  3505. case FFEINFO_kindtypeREAL1:
  3506. error = ffetarget_multiply_real1 (ffebld_cu_ptr_real1 (u),
  3507. ffebld_constant_real1 (ffebld_conter (l)),
  3508. ffebld_constant_real1 (ffebld_conter (r)));
  3509. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
  3510. (ffebld_cu_val_real1 (u)), expr);
  3511. break;
  3512. #endif
  3513. #if FFETARGET_okREAL2
  3514. case FFEINFO_kindtypeREAL2:
  3515. error = ffetarget_multiply_real2 (ffebld_cu_ptr_real2 (u),
  3516. ffebld_constant_real2 (ffebld_conter (l)),
  3517. ffebld_constant_real2 (ffebld_conter (r)));
  3518. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
  3519. (ffebld_cu_val_real2 (u)), expr);
  3520. break;
  3521. #endif
  3522. #if FFETARGET_okREAL3
  3523. case FFEINFO_kindtypeREAL3:
  3524. error = ffetarget_multiply_real3 (ffebld_cu_ptr_real3 (u),
  3525. ffebld_constant_real3 (ffebld_conter (l)),
  3526. ffebld_constant_real3 (ffebld_conter (r)));
  3527. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
  3528. (ffebld_cu_val_real3 (u)), expr);
  3529. break;
  3530. #endif
  3531. #if FFETARGET_okREAL4
  3532. case FFEINFO_kindtypeREAL4:
  3533. error = ffetarget_multiply_real4 (ffebld_cu_ptr_real4 (u),
  3534. ffebld_constant_real4 (ffebld_conter (l)),
  3535. ffebld_constant_real4 (ffebld_conter (r)));
  3536. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
  3537. (ffebld_cu_val_real4 (u)), expr);
  3538. break;
  3539. #endif
  3540. default:
  3541. assert ("bad real kind type" == NULL);
  3542. break;
  3543. }
  3544. break;
  3545. case FFEINFO_basictypeCOMPLEX:
  3546. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3547. {
  3548. #if FFETARGET_okCOMPLEX1
  3549. case FFEINFO_kindtypeREAL1:
  3550. error = ffetarget_multiply_complex1 (ffebld_cu_ptr_complex1 (u),
  3551. ffebld_constant_complex1 (ffebld_conter (l)),
  3552. ffebld_constant_complex1 (ffebld_conter (r)));
  3553. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
  3554. (ffebld_cu_val_complex1 (u)), expr);
  3555. break;
  3556. #endif
  3557. #if FFETARGET_okCOMPLEX2
  3558. case FFEINFO_kindtypeREAL2:
  3559. error = ffetarget_multiply_complex2 (ffebld_cu_ptr_complex2 (u),
  3560. ffebld_constant_complex2 (ffebld_conter (l)),
  3561. ffebld_constant_complex2 (ffebld_conter (r)));
  3562. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
  3563. (ffebld_cu_val_complex2 (u)), expr);
  3564. break;
  3565. #endif
  3566. #if FFETARGET_okCOMPLEX3
  3567. case FFEINFO_kindtypeREAL3:
  3568. error = ffetarget_multiply_complex3 (ffebld_cu_ptr_complex3 (u),
  3569. ffebld_constant_complex3 (ffebld_conter (l)),
  3570. ffebld_constant_complex3 (ffebld_conter (r)));
  3571. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
  3572. (ffebld_cu_val_complex3 (u)), expr);
  3573. break;
  3574. #endif
  3575. #if FFETARGET_okCOMPLEX4
  3576. case FFEINFO_kindtypeREAL4:
  3577. error = ffetarget_multiply_complex4 (ffebld_cu_ptr_complex4 (u),
  3578. ffebld_constant_complex4 (ffebld_conter (l)),
  3579. ffebld_constant_complex4 (ffebld_conter (r)));
  3580. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
  3581. (ffebld_cu_val_complex4 (u)), expr);
  3582. break;
  3583. #endif
  3584. default:
  3585. assert ("bad complex kind type" == NULL);
  3586. break;
  3587. }
  3588. break;
  3589. default:
  3590. assert ("bad type" == NULL);
  3591. return expr;
  3592. }
  3593. ffebld_set_info (expr, ffeinfo_new
  3594. (bt,
  3595. kt,
  3596. 0,
  3597. FFEINFO_kindENTITY,
  3598. FFEINFO_whereCONSTANT,
  3599. FFETARGET_charactersizeNONE));
  3600. if ((error != FFEBAD)
  3601. && ffebad_start (error))
  3602. {
  3603. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  3604. ffebad_finish ();
  3605. }
  3606. return expr;
  3607. }
  3608. /* ffeexpr_collapse_divide -- Collapse divide expr
  3609. ffebld expr;
  3610. ffelexToken token;
  3611. expr = ffeexpr_collapse_divide(expr,token);
  3612. If the result of the expr is a constant, replaces the expr with the
  3613. computed constant. */
  3614. ffebld
  3615. ffeexpr_collapse_divide (ffebld expr, ffelexToken t)
  3616. {
  3617. ffebad error = FFEBAD;
  3618. ffebld l;
  3619. ffebld r;
  3620. ffebldConstantUnion u;
  3621. ffeinfoBasictype bt;
  3622. ffeinfoKindtype kt;
  3623. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3624. return expr;
  3625. l = ffebld_left (expr);
  3626. r = ffebld_right (expr);
  3627. if (ffebld_op (l) != FFEBLD_opCONTER)
  3628. return expr;
  3629. if (ffebld_op (r) != FFEBLD_opCONTER)
  3630. return expr;
  3631. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  3632. {
  3633. case FFEINFO_basictypeANY:
  3634. return expr;
  3635. case FFEINFO_basictypeINTEGER:
  3636. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3637. {
  3638. #if FFETARGET_okINTEGER1
  3639. case FFEINFO_kindtypeINTEGER1:
  3640. error = ffetarget_divide_integer1 (ffebld_cu_ptr_integer1 (u),
  3641. ffebld_constant_integer1 (ffebld_conter (l)),
  3642. ffebld_constant_integer1 (ffebld_conter (r)));
  3643. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  3644. (ffebld_cu_val_integer1 (u)), expr);
  3645. break;
  3646. #endif
  3647. #if FFETARGET_okINTEGER2
  3648. case FFEINFO_kindtypeINTEGER2:
  3649. error = ffetarget_divide_integer2 (ffebld_cu_ptr_integer2 (u),
  3650. ffebld_constant_integer2 (ffebld_conter (l)),
  3651. ffebld_constant_integer2 (ffebld_conter (r)));
  3652. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  3653. (ffebld_cu_val_integer2 (u)), expr);
  3654. break;
  3655. #endif
  3656. #if FFETARGET_okINTEGER3
  3657. case FFEINFO_kindtypeINTEGER3:
  3658. error = ffetarget_divide_integer3 (ffebld_cu_ptr_integer3 (u),
  3659. ffebld_constant_integer3 (ffebld_conter (l)),
  3660. ffebld_constant_integer3 (ffebld_conter (r)));
  3661. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  3662. (ffebld_cu_val_integer3 (u)), expr);
  3663. break;
  3664. #endif
  3665. #if FFETARGET_okINTEGER4
  3666. case FFEINFO_kindtypeINTEGER4:
  3667. error = ffetarget_divide_integer4 (ffebld_cu_ptr_integer4 (u),
  3668. ffebld_constant_integer4 (ffebld_conter (l)),
  3669. ffebld_constant_integer4 (ffebld_conter (r)));
  3670. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  3671. (ffebld_cu_val_integer4 (u)), expr);
  3672. break;
  3673. #endif
  3674. default:
  3675. assert ("bad integer kind type" == NULL);
  3676. break;
  3677. }
  3678. break;
  3679. case FFEINFO_basictypeREAL:
  3680. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3681. {
  3682. #if FFETARGET_okREAL1
  3683. case FFEINFO_kindtypeREAL1:
  3684. error = ffetarget_divide_real1 (ffebld_cu_ptr_real1 (u),
  3685. ffebld_constant_real1 (ffebld_conter (l)),
  3686. ffebld_constant_real1 (ffebld_conter (r)));
  3687. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
  3688. (ffebld_cu_val_real1 (u)), expr);
  3689. break;
  3690. #endif
  3691. #if FFETARGET_okREAL2
  3692. case FFEINFO_kindtypeREAL2:
  3693. error = ffetarget_divide_real2 (ffebld_cu_ptr_real2 (u),
  3694. ffebld_constant_real2 (ffebld_conter (l)),
  3695. ffebld_constant_real2 (ffebld_conter (r)));
  3696. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
  3697. (ffebld_cu_val_real2 (u)), expr);
  3698. break;
  3699. #endif
  3700. #if FFETARGET_okREAL3
  3701. case FFEINFO_kindtypeREAL3:
  3702. error = ffetarget_divide_real3 (ffebld_cu_ptr_real3 (u),
  3703. ffebld_constant_real3 (ffebld_conter (l)),
  3704. ffebld_constant_real3 (ffebld_conter (r)));
  3705. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
  3706. (ffebld_cu_val_real3 (u)), expr);
  3707. break;
  3708. #endif
  3709. #if FFETARGET_okREAL4
  3710. case FFEINFO_kindtypeREAL4:
  3711. error = ffetarget_divide_real4 (ffebld_cu_ptr_real4 (u),
  3712. ffebld_constant_real4 (ffebld_conter (l)),
  3713. ffebld_constant_real4 (ffebld_conter (r)));
  3714. expr = ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
  3715. (ffebld_cu_val_real4 (u)), expr);
  3716. break;
  3717. #endif
  3718. default:
  3719. assert ("bad real kind type" == NULL);
  3720. break;
  3721. }
  3722. break;
  3723. case FFEINFO_basictypeCOMPLEX:
  3724. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3725. {
  3726. #if FFETARGET_okCOMPLEX1
  3727. case FFEINFO_kindtypeREAL1:
  3728. error = ffetarget_divide_complex1 (ffebld_cu_ptr_complex1 (u),
  3729. ffebld_constant_complex1 (ffebld_conter (l)),
  3730. ffebld_constant_complex1 (ffebld_conter (r)));
  3731. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
  3732. (ffebld_cu_val_complex1 (u)), expr);
  3733. break;
  3734. #endif
  3735. #if FFETARGET_okCOMPLEX2
  3736. case FFEINFO_kindtypeREAL2:
  3737. error = ffetarget_divide_complex2 (ffebld_cu_ptr_complex2 (u),
  3738. ffebld_constant_complex2 (ffebld_conter (l)),
  3739. ffebld_constant_complex2 (ffebld_conter (r)));
  3740. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
  3741. (ffebld_cu_val_complex2 (u)), expr);
  3742. break;
  3743. #endif
  3744. #if FFETARGET_okCOMPLEX3
  3745. case FFEINFO_kindtypeREAL3:
  3746. error = ffetarget_divide_complex3 (ffebld_cu_ptr_complex3 (u),
  3747. ffebld_constant_complex3 (ffebld_conter (l)),
  3748. ffebld_constant_complex3 (ffebld_conter (r)));
  3749. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
  3750. (ffebld_cu_val_complex3 (u)), expr);
  3751. break;
  3752. #endif
  3753. #if FFETARGET_okCOMPLEX4
  3754. case FFEINFO_kindtypeREAL4:
  3755. error = ffetarget_divide_complex4 (ffebld_cu_ptr_complex4 (u),
  3756. ffebld_constant_complex4 (ffebld_conter (l)),
  3757. ffebld_constant_complex4 (ffebld_conter (r)));
  3758. expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
  3759. (ffebld_cu_val_complex4 (u)), expr);
  3760. break;
  3761. #endif
  3762. default:
  3763. assert ("bad complex kind type" == NULL);
  3764. break;
  3765. }
  3766. break;
  3767. default:
  3768. assert ("bad type" == NULL);
  3769. return expr;
  3770. }
  3771. ffebld_set_info (expr, ffeinfo_new
  3772. (bt,
  3773. kt,
  3774. 0,
  3775. FFEINFO_kindENTITY,
  3776. FFEINFO_whereCONSTANT,
  3777. FFETARGET_charactersizeNONE));
  3778. if ((error != FFEBAD)
  3779. && ffebad_start (error))
  3780. {
  3781. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  3782. ffebad_finish ();
  3783. }
  3784. return expr;
  3785. }
  3786. /* ffeexpr_collapse_power -- Collapse power expr
  3787. ffebld expr;
  3788. ffelexToken token;
  3789. expr = ffeexpr_collapse_power(expr,token);
  3790. If the result of the expr is a constant, replaces the expr with the
  3791. computed constant. */
  3792. ffebld
  3793. ffeexpr_collapse_power (ffebld expr, ffelexToken t)
  3794. {
  3795. ffebad error = FFEBAD;
  3796. ffebld l;
  3797. ffebld r;
  3798. ffebldConstantUnion u;
  3799. ffeinfoBasictype bt;
  3800. ffeinfoKindtype kt;
  3801. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3802. return expr;
  3803. l = ffebld_left (expr);
  3804. r = ffebld_right (expr);
  3805. if (ffebld_op (l) != FFEBLD_opCONTER)
  3806. return expr;
  3807. if (ffebld_op (r) != FFEBLD_opCONTER)
  3808. return expr;
  3809. if ((ffeinfo_basictype (ffebld_info (r)) != FFEINFO_basictypeINTEGER)
  3810. || (ffeinfo_kindtype (ffebld_info (r)) != FFEINFO_kindtypeINTEGERDEFAULT))
  3811. return expr;
  3812. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  3813. {
  3814. case FFEINFO_basictypeANY:
  3815. return expr;
  3816. case FFEINFO_basictypeINTEGER:
  3817. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3818. {
  3819. case FFEINFO_kindtypeINTEGERDEFAULT:
  3820. error = ffetarget_power_integerdefault_integerdefault
  3821. (ffebld_cu_ptr_integerdefault (u),
  3822. ffebld_constant_integerdefault (ffebld_conter (l)),
  3823. ffebld_constant_integerdefault (ffebld_conter (r)));
  3824. expr = ffebld_new_conter_with_orig
  3825. (ffebld_constant_new_integerdefault_val
  3826. (ffebld_cu_val_integerdefault (u)), expr);
  3827. break;
  3828. default:
  3829. assert ("bad integer kind type" == NULL);
  3830. break;
  3831. }
  3832. break;
  3833. case FFEINFO_basictypeREAL:
  3834. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3835. {
  3836. case FFEINFO_kindtypeREALDEFAULT:
  3837. error = ffetarget_power_realdefault_integerdefault
  3838. (ffebld_cu_ptr_realdefault (u),
  3839. ffebld_constant_realdefault (ffebld_conter (l)),
  3840. ffebld_constant_integerdefault (ffebld_conter (r)));
  3841. expr = ffebld_new_conter_with_orig
  3842. (ffebld_constant_new_realdefault_val
  3843. (ffebld_cu_val_realdefault (u)), expr);
  3844. break;
  3845. case FFEINFO_kindtypeREALDOUBLE:
  3846. error = ffetarget_power_realdouble_integerdefault
  3847. (ffebld_cu_ptr_realdouble (u),
  3848. ffebld_constant_realdouble (ffebld_conter (l)),
  3849. ffebld_constant_integerdefault (ffebld_conter (r)));
  3850. expr = ffebld_new_conter_with_orig
  3851. (ffebld_constant_new_realdouble_val
  3852. (ffebld_cu_val_realdouble (u)), expr);
  3853. break;
  3854. #if FFETARGET_okREALQUAD
  3855. case FFEINFO_kindtypeREALQUAD:
  3856. error = ffetarget_power_realquad_integerdefault
  3857. (ffebld_cu_ptr_realquad (u),
  3858. ffebld_constant_realquad (ffebld_conter (l)),
  3859. ffebld_constant_integerdefault (ffebld_conter (r)));
  3860. expr = ffebld_new_conter_with_orig
  3861. (ffebld_constant_new_realquad_val
  3862. (ffebld_cu_val_realquad (u)), expr);
  3863. break;
  3864. #endif
  3865. default:
  3866. assert ("bad real kind type" == NULL);
  3867. break;
  3868. }
  3869. break;
  3870. case FFEINFO_basictypeCOMPLEX:
  3871. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3872. {
  3873. case FFEINFO_kindtypeREALDEFAULT:
  3874. error = ffetarget_power_complexdefault_integerdefault
  3875. (ffebld_cu_ptr_complexdefault (u),
  3876. ffebld_constant_complexdefault (ffebld_conter (l)),
  3877. ffebld_constant_integerdefault (ffebld_conter (r)));
  3878. expr = ffebld_new_conter_with_orig
  3879. (ffebld_constant_new_complexdefault_val
  3880. (ffebld_cu_val_complexdefault (u)), expr);
  3881. break;
  3882. #if FFETARGET_okCOMPLEXDOUBLE
  3883. case FFEINFO_kindtypeREALDOUBLE:
  3884. error = ffetarget_power_complexdouble_integerdefault
  3885. (ffebld_cu_ptr_complexdouble (u),
  3886. ffebld_constant_complexdouble (ffebld_conter (l)),
  3887. ffebld_constant_integerdefault (ffebld_conter (r)));
  3888. expr = ffebld_new_conter_with_orig
  3889. (ffebld_constant_new_complexdouble_val
  3890. (ffebld_cu_val_complexdouble (u)), expr);
  3891. break;
  3892. #endif
  3893. #if FFETARGET_okCOMPLEXQUAD
  3894. case FFEINFO_kindtypeREALQUAD:
  3895. error = ffetarget_power_complexquad_integerdefault
  3896. (ffebld_cu_ptr_complexquad (u),
  3897. ffebld_constant_complexquad (ffebld_conter (l)),
  3898. ffebld_constant_integerdefault (ffebld_conter (r)));
  3899. expr = ffebld_new_conter_with_orig
  3900. (ffebld_constant_new_complexquad_val
  3901. (ffebld_cu_val_complexquad (u)), expr);
  3902. break;
  3903. #endif
  3904. default:
  3905. assert ("bad complex kind type" == NULL);
  3906. break;
  3907. }
  3908. break;
  3909. default:
  3910. assert ("bad type" == NULL);
  3911. return expr;
  3912. }
  3913. ffebld_set_info (expr, ffeinfo_new
  3914. (bt,
  3915. kt,
  3916. 0,
  3917. FFEINFO_kindENTITY,
  3918. FFEINFO_whereCONSTANT,
  3919. FFETARGET_charactersizeNONE));
  3920. if ((error != FFEBAD)
  3921. && ffebad_start (error))
  3922. {
  3923. ffebad_here (0, ffelex_token_where_line (t),
  3924. ffelex_token_where_column (t));
  3925. ffebad_finish ();
  3926. }
  3927. return expr;
  3928. }
  3929. /* ffeexpr_collapse_concatenate -- Collapse concatenate expr
  3930. ffebld expr;
  3931. ffelexToken token;
  3932. expr = ffeexpr_collapse_concatenate(expr,token);
  3933. If the result of the expr is a constant, replaces the expr with the
  3934. computed constant. */
  3935. ffebld
  3936. ffeexpr_collapse_concatenate (ffebld expr, ffelexToken t)
  3937. {
  3938. ffebad error = FFEBAD;
  3939. ffebld l;
  3940. ffebld r;
  3941. ffebldConstantUnion u;
  3942. ffeinfoKindtype kt;
  3943. ffetargetCharacterSize len;
  3944. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  3945. return expr;
  3946. l = ffebld_left (expr);
  3947. r = ffebld_right (expr);
  3948. if (ffebld_op (l) != FFEBLD_opCONTER)
  3949. return expr;
  3950. if (ffebld_op (r) != FFEBLD_opCONTER)
  3951. return expr;
  3952. switch (ffeinfo_basictype (ffebld_info (expr)))
  3953. {
  3954. case FFEINFO_basictypeANY:
  3955. return expr;
  3956. case FFEINFO_basictypeCHARACTER:
  3957. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  3958. {
  3959. #if FFETARGET_okCHARACTER1
  3960. case FFEINFO_kindtypeCHARACTER1:
  3961. error = ffetarget_concatenate_character1 (ffebld_cu_ptr_character1 (u),
  3962. ffebld_constant_character1 (ffebld_conter (l)),
  3963. ffebld_constant_character1 (ffebld_conter (r)),
  3964. ffebld_constant_pool (), &len);
  3965. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
  3966. (ffebld_cu_val_character1 (u)), expr);
  3967. break;
  3968. #endif
  3969. #if FFETARGET_okCHARACTER2
  3970. case FFEINFO_kindtypeCHARACTER2:
  3971. error = ffetarget_concatenate_character2 (ffebld_cu_ptr_character2 (u),
  3972. ffebld_constant_character2 (ffebld_conter (l)),
  3973. ffebld_constant_character2 (ffebld_conter (r)),
  3974. ffebld_constant_pool (), &len);
  3975. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character2_val
  3976. (ffebld_cu_val_character2 (u)), expr);
  3977. break;
  3978. #endif
  3979. #if FFETARGET_okCHARACTER3
  3980. case FFEINFO_kindtypeCHARACTER3:
  3981. error = ffetarget_concatenate_character3 (ffebld_cu_ptr_character3 (u),
  3982. ffebld_constant_character3 (ffebld_conter (l)),
  3983. ffebld_constant_character3 (ffebld_conter (r)),
  3984. ffebld_constant_pool (), &len);
  3985. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character3_val
  3986. (ffebld_cu_val_character3 (u)), expr);
  3987. break;
  3988. #endif
  3989. #if FFETARGET_okCHARACTER4
  3990. case FFEINFO_kindtypeCHARACTER4:
  3991. error = ffetarget_concatenate_character4 (ffebld_cu_ptr_character4 (u),
  3992. ffebld_constant_character4 (ffebld_conter (l)),
  3993. ffebld_constant_character4 (ffebld_conter (r)),
  3994. ffebld_constant_pool (), &len);
  3995. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character4_val
  3996. (ffebld_cu_val_character4 (u)), expr);
  3997. break;
  3998. #endif
  3999. default:
  4000. assert ("bad character kind type" == NULL);
  4001. break;
  4002. }
  4003. break;
  4004. default:
  4005. assert ("bad type" == NULL);
  4006. return expr;
  4007. }
  4008. ffebld_set_info (expr, ffeinfo_new
  4009. (FFEINFO_basictypeCHARACTER,
  4010. kt,
  4011. 0,
  4012. FFEINFO_kindENTITY,
  4013. FFEINFO_whereCONSTANT,
  4014. len));
  4015. if ((error != FFEBAD)
  4016. && ffebad_start (error))
  4017. {
  4018. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4019. ffebad_finish ();
  4020. }
  4021. return expr;
  4022. }
  4023. /* ffeexpr_collapse_eq -- Collapse eq expr
  4024. ffebld expr;
  4025. ffelexToken token;
  4026. expr = ffeexpr_collapse_eq(expr,token);
  4027. If the result of the expr is a constant, replaces the expr with the
  4028. computed constant. */
  4029. ffebld
  4030. ffeexpr_collapse_eq (ffebld expr, ffelexToken t)
  4031. {
  4032. ffebad error = FFEBAD;
  4033. ffebld l;
  4034. ffebld r;
  4035. bool val;
  4036. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  4037. return expr;
  4038. l = ffebld_left (expr);
  4039. r = ffebld_right (expr);
  4040. if (ffebld_op (l) != FFEBLD_opCONTER)
  4041. return expr;
  4042. if (ffebld_op (r) != FFEBLD_opCONTER)
  4043. return expr;
  4044. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  4045. {
  4046. case FFEINFO_basictypeANY:
  4047. return expr;
  4048. case FFEINFO_basictypeINTEGER:
  4049. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4050. {
  4051. #if FFETARGET_okINTEGER1
  4052. case FFEINFO_kindtypeINTEGER1:
  4053. error = ffetarget_eq_integer1 (&val,
  4054. ffebld_constant_integer1 (ffebld_conter (l)),
  4055. ffebld_constant_integer1 (ffebld_conter (r)));
  4056. expr = ffebld_new_conter_with_orig
  4057. (ffebld_constant_new_logicaldefault (val), expr);
  4058. break;
  4059. #endif
  4060. #if FFETARGET_okINTEGER2
  4061. case FFEINFO_kindtypeINTEGER2:
  4062. error = ffetarget_eq_integer2 (&val,
  4063. ffebld_constant_integer2 (ffebld_conter (l)),
  4064. ffebld_constant_integer2 (ffebld_conter (r)));
  4065. expr = ffebld_new_conter_with_orig
  4066. (ffebld_constant_new_logicaldefault (val), expr);
  4067. break;
  4068. #endif
  4069. #if FFETARGET_okINTEGER3
  4070. case FFEINFO_kindtypeINTEGER3:
  4071. error = ffetarget_eq_integer3 (&val,
  4072. ffebld_constant_integer3 (ffebld_conter (l)),
  4073. ffebld_constant_integer3 (ffebld_conter (r)));
  4074. expr = ffebld_new_conter_with_orig
  4075. (ffebld_constant_new_logicaldefault (val), expr);
  4076. break;
  4077. #endif
  4078. #if FFETARGET_okINTEGER4
  4079. case FFEINFO_kindtypeINTEGER4:
  4080. error = ffetarget_eq_integer4 (&val,
  4081. ffebld_constant_integer4 (ffebld_conter (l)),
  4082. ffebld_constant_integer4 (ffebld_conter (r)));
  4083. expr = ffebld_new_conter_with_orig
  4084. (ffebld_constant_new_logicaldefault (val), expr);
  4085. break;
  4086. #endif
  4087. default:
  4088. assert ("bad integer kind type" == NULL);
  4089. break;
  4090. }
  4091. break;
  4092. case FFEINFO_basictypeREAL:
  4093. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4094. {
  4095. #if FFETARGET_okREAL1
  4096. case FFEINFO_kindtypeREAL1:
  4097. error = ffetarget_eq_real1 (&val,
  4098. ffebld_constant_real1 (ffebld_conter (l)),
  4099. ffebld_constant_real1 (ffebld_conter (r)));
  4100. expr = ffebld_new_conter_with_orig
  4101. (ffebld_constant_new_logicaldefault (val), expr);
  4102. break;
  4103. #endif
  4104. #if FFETARGET_okREAL2
  4105. case FFEINFO_kindtypeREAL2:
  4106. error = ffetarget_eq_real2 (&val,
  4107. ffebld_constant_real2 (ffebld_conter (l)),
  4108. ffebld_constant_real2 (ffebld_conter (r)));
  4109. expr = ffebld_new_conter_with_orig
  4110. (ffebld_constant_new_logicaldefault (val), expr);
  4111. break;
  4112. #endif
  4113. #if FFETARGET_okREAL3
  4114. case FFEINFO_kindtypeREAL3:
  4115. error = ffetarget_eq_real3 (&val,
  4116. ffebld_constant_real3 (ffebld_conter (l)),
  4117. ffebld_constant_real3 (ffebld_conter (r)));
  4118. expr = ffebld_new_conter_with_orig
  4119. (ffebld_constant_new_logicaldefault (val), expr);
  4120. break;
  4121. #endif
  4122. #if FFETARGET_okREAL4
  4123. case FFEINFO_kindtypeREAL4:
  4124. error = ffetarget_eq_real4 (&val,
  4125. ffebld_constant_real4 (ffebld_conter (l)),
  4126. ffebld_constant_real4 (ffebld_conter (r)));
  4127. expr = ffebld_new_conter_with_orig
  4128. (ffebld_constant_new_logicaldefault (val), expr);
  4129. break;
  4130. #endif
  4131. default:
  4132. assert ("bad real kind type" == NULL);
  4133. break;
  4134. }
  4135. break;
  4136. case FFEINFO_basictypeCOMPLEX:
  4137. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4138. {
  4139. #if FFETARGET_okCOMPLEX1
  4140. case FFEINFO_kindtypeREAL1:
  4141. error = ffetarget_eq_complex1 (&val,
  4142. ffebld_constant_complex1 (ffebld_conter (l)),
  4143. ffebld_constant_complex1 (ffebld_conter (r)));
  4144. expr = ffebld_new_conter_with_orig
  4145. (ffebld_constant_new_logicaldefault (val), expr);
  4146. break;
  4147. #endif
  4148. #if FFETARGET_okCOMPLEX2
  4149. case FFEINFO_kindtypeREAL2:
  4150. error = ffetarget_eq_complex2 (&val,
  4151. ffebld_constant_complex2 (ffebld_conter (l)),
  4152. ffebld_constant_complex2 (ffebld_conter (r)));
  4153. expr = ffebld_new_conter_with_orig
  4154. (ffebld_constant_new_logicaldefault (val), expr);
  4155. break;
  4156. #endif
  4157. #if FFETARGET_okCOMPLEX3
  4158. case FFEINFO_kindtypeREAL3:
  4159. error = ffetarget_eq_complex3 (&val,
  4160. ffebld_constant_complex3 (ffebld_conter (l)),
  4161. ffebld_constant_complex3 (ffebld_conter (r)));
  4162. expr = ffebld_new_conter_with_orig
  4163. (ffebld_constant_new_logicaldefault (val), expr);
  4164. break;
  4165. #endif
  4166. #if FFETARGET_okCOMPLEX4
  4167. case FFEINFO_kindtypeREAL4:
  4168. error = ffetarget_eq_complex4 (&val,
  4169. ffebld_constant_complex4 (ffebld_conter (l)),
  4170. ffebld_constant_complex4 (ffebld_conter (r)));
  4171. expr = ffebld_new_conter_with_orig
  4172. (ffebld_constant_new_logicaldefault (val), expr);
  4173. break;
  4174. #endif
  4175. default:
  4176. assert ("bad complex kind type" == NULL);
  4177. break;
  4178. }
  4179. break;
  4180. case FFEINFO_basictypeCHARACTER:
  4181. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4182. {
  4183. #if FFETARGET_okCHARACTER1
  4184. case FFEINFO_kindtypeCHARACTER1:
  4185. error = ffetarget_eq_character1 (&val,
  4186. ffebld_constant_character1 (ffebld_conter (l)),
  4187. ffebld_constant_character1 (ffebld_conter (r)));
  4188. expr = ffebld_new_conter_with_orig
  4189. (ffebld_constant_new_logicaldefault (val), expr);
  4190. break;
  4191. #endif
  4192. #if FFETARGET_okCHARACTER2
  4193. case FFEINFO_kindtypeCHARACTER2:
  4194. error = ffetarget_eq_character2 (&val,
  4195. ffebld_constant_character2 (ffebld_conter (l)),
  4196. ffebld_constant_character2 (ffebld_conter (r)));
  4197. expr = ffebld_new_conter_with_orig
  4198. (ffebld_constant_new_logicaldefault (val), expr);
  4199. break;
  4200. #endif
  4201. #if FFETARGET_okCHARACTER3
  4202. case FFEINFO_kindtypeCHARACTER3:
  4203. error = ffetarget_eq_character3 (&val,
  4204. ffebld_constant_character3 (ffebld_conter (l)),
  4205. ffebld_constant_character3 (ffebld_conter (r)));
  4206. expr = ffebld_new_conter_with_orig
  4207. (ffebld_constant_new_logicaldefault (val), expr);
  4208. break;
  4209. #endif
  4210. #if FFETARGET_okCHARACTER4
  4211. case FFEINFO_kindtypeCHARACTER4:
  4212. error = ffetarget_eq_character4 (&val,
  4213. ffebld_constant_character4 (ffebld_conter (l)),
  4214. ffebld_constant_character4 (ffebld_conter (r)));
  4215. expr = ffebld_new_conter_with_orig
  4216. (ffebld_constant_new_logicaldefault (val), expr);
  4217. break;
  4218. #endif
  4219. default:
  4220. assert ("bad character kind type" == NULL);
  4221. break;
  4222. }
  4223. break;
  4224. default:
  4225. assert ("bad type" == NULL);
  4226. return expr;
  4227. }
  4228. ffebld_set_info (expr, ffeinfo_new
  4229. (FFEINFO_basictypeLOGICAL,
  4230. FFEINFO_kindtypeLOGICALDEFAULT,
  4231. 0,
  4232. FFEINFO_kindENTITY,
  4233. FFEINFO_whereCONSTANT,
  4234. FFETARGET_charactersizeNONE));
  4235. if ((error != FFEBAD)
  4236. && ffebad_start (error))
  4237. {
  4238. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4239. ffebad_finish ();
  4240. }
  4241. return expr;
  4242. }
  4243. /* ffeexpr_collapse_ne -- Collapse ne expr
  4244. ffebld expr;
  4245. ffelexToken token;
  4246. expr = ffeexpr_collapse_ne(expr,token);
  4247. If the result of the expr is a constant, replaces the expr with the
  4248. computed constant. */
  4249. ffebld
  4250. ffeexpr_collapse_ne (ffebld expr, ffelexToken t)
  4251. {
  4252. ffebad error = FFEBAD;
  4253. ffebld l;
  4254. ffebld r;
  4255. bool val;
  4256. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  4257. return expr;
  4258. l = ffebld_left (expr);
  4259. r = ffebld_right (expr);
  4260. if (ffebld_op (l) != FFEBLD_opCONTER)
  4261. return expr;
  4262. if (ffebld_op (r) != FFEBLD_opCONTER)
  4263. return expr;
  4264. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  4265. {
  4266. case FFEINFO_basictypeANY:
  4267. return expr;
  4268. case FFEINFO_basictypeINTEGER:
  4269. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4270. {
  4271. #if FFETARGET_okINTEGER1
  4272. case FFEINFO_kindtypeINTEGER1:
  4273. error = ffetarget_ne_integer1 (&val,
  4274. ffebld_constant_integer1 (ffebld_conter (l)),
  4275. ffebld_constant_integer1 (ffebld_conter (r)));
  4276. expr = ffebld_new_conter_with_orig
  4277. (ffebld_constant_new_logicaldefault (val), expr);
  4278. break;
  4279. #endif
  4280. #if FFETARGET_okINTEGER2
  4281. case FFEINFO_kindtypeINTEGER2:
  4282. error = ffetarget_ne_integer2 (&val,
  4283. ffebld_constant_integer2 (ffebld_conter (l)),
  4284. ffebld_constant_integer2 (ffebld_conter (r)));
  4285. expr = ffebld_new_conter_with_orig
  4286. (ffebld_constant_new_logicaldefault (val), expr);
  4287. break;
  4288. #endif
  4289. #if FFETARGET_okINTEGER3
  4290. case FFEINFO_kindtypeINTEGER3:
  4291. error = ffetarget_ne_integer3 (&val,
  4292. ffebld_constant_integer3 (ffebld_conter (l)),
  4293. ffebld_constant_integer3 (ffebld_conter (r)));
  4294. expr = ffebld_new_conter_with_orig
  4295. (ffebld_constant_new_logicaldefault (val), expr);
  4296. break;
  4297. #endif
  4298. #if FFETARGET_okINTEGER4
  4299. case FFEINFO_kindtypeINTEGER4:
  4300. error = ffetarget_ne_integer4 (&val,
  4301. ffebld_constant_integer4 (ffebld_conter (l)),
  4302. ffebld_constant_integer4 (ffebld_conter (r)));
  4303. expr = ffebld_new_conter_with_orig
  4304. (ffebld_constant_new_logicaldefault (val), expr);
  4305. break;
  4306. #endif
  4307. default:
  4308. assert ("bad integer kind type" == NULL);
  4309. break;
  4310. }
  4311. break;
  4312. case FFEINFO_basictypeREAL:
  4313. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4314. {
  4315. #if FFETARGET_okREAL1
  4316. case FFEINFO_kindtypeREAL1:
  4317. error = ffetarget_ne_real1 (&val,
  4318. ffebld_constant_real1 (ffebld_conter (l)),
  4319. ffebld_constant_real1 (ffebld_conter (r)));
  4320. expr = ffebld_new_conter_with_orig
  4321. (ffebld_constant_new_logicaldefault (val), expr);
  4322. break;
  4323. #endif
  4324. #if FFETARGET_okREAL2
  4325. case FFEINFO_kindtypeREAL2:
  4326. error = ffetarget_ne_real2 (&val,
  4327. ffebld_constant_real2 (ffebld_conter (l)),
  4328. ffebld_constant_real2 (ffebld_conter (r)));
  4329. expr = ffebld_new_conter_with_orig
  4330. (ffebld_constant_new_logicaldefault (val), expr);
  4331. break;
  4332. #endif
  4333. #if FFETARGET_okREAL3
  4334. case FFEINFO_kindtypeREAL3:
  4335. error = ffetarget_ne_real3 (&val,
  4336. ffebld_constant_real3 (ffebld_conter (l)),
  4337. ffebld_constant_real3 (ffebld_conter (r)));
  4338. expr = ffebld_new_conter_with_orig
  4339. (ffebld_constant_new_logicaldefault (val), expr);
  4340. break;
  4341. #endif
  4342. #if FFETARGET_okREAL4
  4343. case FFEINFO_kindtypeREAL4:
  4344. error = ffetarget_ne_real4 (&val,
  4345. ffebld_constant_real4 (ffebld_conter (l)),
  4346. ffebld_constant_real4 (ffebld_conter (r)));
  4347. expr = ffebld_new_conter_with_orig
  4348. (ffebld_constant_new_logicaldefault (val), expr);
  4349. break;
  4350. #endif
  4351. default:
  4352. assert ("bad real kind type" == NULL);
  4353. break;
  4354. }
  4355. break;
  4356. case FFEINFO_basictypeCOMPLEX:
  4357. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4358. {
  4359. #if FFETARGET_okCOMPLEX1
  4360. case FFEINFO_kindtypeREAL1:
  4361. error = ffetarget_ne_complex1 (&val,
  4362. ffebld_constant_complex1 (ffebld_conter (l)),
  4363. ffebld_constant_complex1 (ffebld_conter (r)));
  4364. expr = ffebld_new_conter_with_orig
  4365. (ffebld_constant_new_logicaldefault (val), expr);
  4366. break;
  4367. #endif
  4368. #if FFETARGET_okCOMPLEX2
  4369. case FFEINFO_kindtypeREAL2:
  4370. error = ffetarget_ne_complex2 (&val,
  4371. ffebld_constant_complex2 (ffebld_conter (l)),
  4372. ffebld_constant_complex2 (ffebld_conter (r)));
  4373. expr = ffebld_new_conter_with_orig
  4374. (ffebld_constant_new_logicaldefault (val), expr);
  4375. break;
  4376. #endif
  4377. #if FFETARGET_okCOMPLEX3
  4378. case FFEINFO_kindtypeREAL3:
  4379. error = ffetarget_ne_complex3 (&val,
  4380. ffebld_constant_complex3 (ffebld_conter (l)),
  4381. ffebld_constant_complex3 (ffebld_conter (r)));
  4382. expr = ffebld_new_conter_with_orig
  4383. (ffebld_constant_new_logicaldefault (val), expr);
  4384. break;
  4385. #endif
  4386. #if FFETARGET_okCOMPLEX4
  4387. case FFEINFO_kindtypeREAL4:
  4388. error = ffetarget_ne_complex4 (&val,
  4389. ffebld_constant_complex4 (ffebld_conter (l)),
  4390. ffebld_constant_complex4 (ffebld_conter (r)));
  4391. expr = ffebld_new_conter_with_orig
  4392. (ffebld_constant_new_logicaldefault (val), expr);
  4393. break;
  4394. #endif
  4395. default:
  4396. assert ("bad complex kind type" == NULL);
  4397. break;
  4398. }
  4399. break;
  4400. case FFEINFO_basictypeCHARACTER:
  4401. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4402. {
  4403. #if FFETARGET_okCHARACTER1
  4404. case FFEINFO_kindtypeCHARACTER1:
  4405. error = ffetarget_ne_character1 (&val,
  4406. ffebld_constant_character1 (ffebld_conter (l)),
  4407. ffebld_constant_character1 (ffebld_conter (r)));
  4408. expr = ffebld_new_conter_with_orig
  4409. (ffebld_constant_new_logicaldefault (val), expr);
  4410. break;
  4411. #endif
  4412. #if FFETARGET_okCHARACTER2
  4413. case FFEINFO_kindtypeCHARACTER2:
  4414. error = ffetarget_ne_character2 (&val,
  4415. ffebld_constant_character2 (ffebld_conter (l)),
  4416. ffebld_constant_character2 (ffebld_conter (r)));
  4417. expr = ffebld_new_conter_with_orig
  4418. (ffebld_constant_new_logicaldefault (val), expr);
  4419. break;
  4420. #endif
  4421. #if FFETARGET_okCHARACTER3
  4422. case FFEINFO_kindtypeCHARACTER3:
  4423. error = ffetarget_ne_character3 (&val,
  4424. ffebld_constant_character3 (ffebld_conter (l)),
  4425. ffebld_constant_character3 (ffebld_conter (r)));
  4426. expr = ffebld_new_conter_with_orig
  4427. (ffebld_constant_new_logicaldefault (val), expr);
  4428. break;
  4429. #endif
  4430. #if FFETARGET_okCHARACTER4
  4431. case FFEINFO_kindtypeCHARACTER4:
  4432. error = ffetarget_ne_character4 (&val,
  4433. ffebld_constant_character4 (ffebld_conter (l)),
  4434. ffebld_constant_character4 (ffebld_conter (r)));
  4435. expr = ffebld_new_conter_with_orig
  4436. (ffebld_constant_new_logicaldefault (val), expr);
  4437. break;
  4438. #endif
  4439. default:
  4440. assert ("bad character kind type" == NULL);
  4441. break;
  4442. }
  4443. break;
  4444. default:
  4445. assert ("bad type" == NULL);
  4446. return expr;
  4447. }
  4448. ffebld_set_info (expr, ffeinfo_new
  4449. (FFEINFO_basictypeLOGICAL,
  4450. FFEINFO_kindtypeLOGICALDEFAULT,
  4451. 0,
  4452. FFEINFO_kindENTITY,
  4453. FFEINFO_whereCONSTANT,
  4454. FFETARGET_charactersizeNONE));
  4455. if ((error != FFEBAD)
  4456. && ffebad_start (error))
  4457. {
  4458. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4459. ffebad_finish ();
  4460. }
  4461. return expr;
  4462. }
  4463. /* ffeexpr_collapse_ge -- Collapse ge expr
  4464. ffebld expr;
  4465. ffelexToken token;
  4466. expr = ffeexpr_collapse_ge(expr,token);
  4467. If the result of the expr is a constant, replaces the expr with the
  4468. computed constant. */
  4469. ffebld
  4470. ffeexpr_collapse_ge (ffebld expr, ffelexToken t)
  4471. {
  4472. ffebad error = FFEBAD;
  4473. ffebld l;
  4474. ffebld r;
  4475. bool val;
  4476. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  4477. return expr;
  4478. l = ffebld_left (expr);
  4479. r = ffebld_right (expr);
  4480. if (ffebld_op (l) != FFEBLD_opCONTER)
  4481. return expr;
  4482. if (ffebld_op (r) != FFEBLD_opCONTER)
  4483. return expr;
  4484. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  4485. {
  4486. case FFEINFO_basictypeANY:
  4487. return expr;
  4488. case FFEINFO_basictypeINTEGER:
  4489. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4490. {
  4491. #if FFETARGET_okINTEGER1
  4492. case FFEINFO_kindtypeINTEGER1:
  4493. error = ffetarget_ge_integer1 (&val,
  4494. ffebld_constant_integer1 (ffebld_conter (l)),
  4495. ffebld_constant_integer1 (ffebld_conter (r)));
  4496. expr = ffebld_new_conter_with_orig
  4497. (ffebld_constant_new_logicaldefault (val), expr);
  4498. break;
  4499. #endif
  4500. #if FFETARGET_okINTEGER2
  4501. case FFEINFO_kindtypeINTEGER2:
  4502. error = ffetarget_ge_integer2 (&val,
  4503. ffebld_constant_integer2 (ffebld_conter (l)),
  4504. ffebld_constant_integer2 (ffebld_conter (r)));
  4505. expr = ffebld_new_conter_with_orig
  4506. (ffebld_constant_new_logicaldefault (val), expr);
  4507. break;
  4508. #endif
  4509. #if FFETARGET_okINTEGER3
  4510. case FFEINFO_kindtypeINTEGER3:
  4511. error = ffetarget_ge_integer3 (&val,
  4512. ffebld_constant_integer3 (ffebld_conter (l)),
  4513. ffebld_constant_integer3 (ffebld_conter (r)));
  4514. expr = ffebld_new_conter_with_orig
  4515. (ffebld_constant_new_logicaldefault (val), expr);
  4516. break;
  4517. #endif
  4518. #if FFETARGET_okINTEGER4
  4519. case FFEINFO_kindtypeINTEGER4:
  4520. error = ffetarget_ge_integer4 (&val,
  4521. ffebld_constant_integer4 (ffebld_conter (l)),
  4522. ffebld_constant_integer4 (ffebld_conter (r)));
  4523. expr = ffebld_new_conter_with_orig
  4524. (ffebld_constant_new_logicaldefault (val), expr);
  4525. break;
  4526. #endif
  4527. default:
  4528. assert ("bad integer kind type" == NULL);
  4529. break;
  4530. }
  4531. break;
  4532. case FFEINFO_basictypeREAL:
  4533. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4534. {
  4535. #if FFETARGET_okREAL1
  4536. case FFEINFO_kindtypeREAL1:
  4537. error = ffetarget_ge_real1 (&val,
  4538. ffebld_constant_real1 (ffebld_conter (l)),
  4539. ffebld_constant_real1 (ffebld_conter (r)));
  4540. expr = ffebld_new_conter_with_orig
  4541. (ffebld_constant_new_logicaldefault (val), expr);
  4542. break;
  4543. #endif
  4544. #if FFETARGET_okREAL2
  4545. case FFEINFO_kindtypeREAL2:
  4546. error = ffetarget_ge_real2 (&val,
  4547. ffebld_constant_real2 (ffebld_conter (l)),
  4548. ffebld_constant_real2 (ffebld_conter (r)));
  4549. expr = ffebld_new_conter_with_orig
  4550. (ffebld_constant_new_logicaldefault (val), expr);
  4551. break;
  4552. #endif
  4553. #if FFETARGET_okREAL3
  4554. case FFEINFO_kindtypeREAL3:
  4555. error = ffetarget_ge_real3 (&val,
  4556. ffebld_constant_real3 (ffebld_conter (l)),
  4557. ffebld_constant_real3 (ffebld_conter (r)));
  4558. expr = ffebld_new_conter_with_orig
  4559. (ffebld_constant_new_logicaldefault (val), expr);
  4560. break;
  4561. #endif
  4562. #if FFETARGET_okREAL4
  4563. case FFEINFO_kindtypeREAL4:
  4564. error = ffetarget_ge_real4 (&val,
  4565. ffebld_constant_real4 (ffebld_conter (l)),
  4566. ffebld_constant_real4 (ffebld_conter (r)));
  4567. expr = ffebld_new_conter_with_orig
  4568. (ffebld_constant_new_logicaldefault (val), expr);
  4569. break;
  4570. #endif
  4571. default:
  4572. assert ("bad real kind type" == NULL);
  4573. break;
  4574. }
  4575. break;
  4576. case FFEINFO_basictypeCHARACTER:
  4577. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4578. {
  4579. #if FFETARGET_okCHARACTER1
  4580. case FFEINFO_kindtypeCHARACTER1:
  4581. error = ffetarget_ge_character1 (&val,
  4582. ffebld_constant_character1 (ffebld_conter (l)),
  4583. ffebld_constant_character1 (ffebld_conter (r)));
  4584. expr = ffebld_new_conter_with_orig
  4585. (ffebld_constant_new_logicaldefault (val), expr);
  4586. break;
  4587. #endif
  4588. #if FFETARGET_okCHARACTER2
  4589. case FFEINFO_kindtypeCHARACTER2:
  4590. error = ffetarget_ge_character2 (&val,
  4591. ffebld_constant_character2 (ffebld_conter (l)),
  4592. ffebld_constant_character2 (ffebld_conter (r)));
  4593. expr = ffebld_new_conter_with_orig
  4594. (ffebld_constant_new_logicaldefault (val), expr);
  4595. break;
  4596. #endif
  4597. #if FFETARGET_okCHARACTER3
  4598. case FFEINFO_kindtypeCHARACTER3:
  4599. error = ffetarget_ge_character3 (&val,
  4600. ffebld_constant_character3 (ffebld_conter (l)),
  4601. ffebld_constant_character3 (ffebld_conter (r)));
  4602. expr = ffebld_new_conter_with_orig
  4603. (ffebld_constant_new_logicaldefault (val), expr);
  4604. break;
  4605. #endif
  4606. #if FFETARGET_okCHARACTER4
  4607. case FFEINFO_kindtypeCHARACTER4:
  4608. error = ffetarget_ge_character4 (&val,
  4609. ffebld_constant_character4 (ffebld_conter (l)),
  4610. ffebld_constant_character4 (ffebld_conter (r)));
  4611. expr = ffebld_new_conter_with_orig
  4612. (ffebld_constant_new_logicaldefault (val), expr);
  4613. break;
  4614. #endif
  4615. default:
  4616. assert ("bad character kind type" == NULL);
  4617. break;
  4618. }
  4619. break;
  4620. default:
  4621. assert ("bad type" == NULL);
  4622. return expr;
  4623. }
  4624. ffebld_set_info (expr, ffeinfo_new
  4625. (FFEINFO_basictypeLOGICAL,
  4626. FFEINFO_kindtypeLOGICALDEFAULT,
  4627. 0,
  4628. FFEINFO_kindENTITY,
  4629. FFEINFO_whereCONSTANT,
  4630. FFETARGET_charactersizeNONE));
  4631. if ((error != FFEBAD)
  4632. && ffebad_start (error))
  4633. {
  4634. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4635. ffebad_finish ();
  4636. }
  4637. return expr;
  4638. }
  4639. /* ffeexpr_collapse_gt -- Collapse gt expr
  4640. ffebld expr;
  4641. ffelexToken token;
  4642. expr = ffeexpr_collapse_gt(expr,token);
  4643. If the result of the expr is a constant, replaces the expr with the
  4644. computed constant. */
  4645. ffebld
  4646. ffeexpr_collapse_gt (ffebld expr, ffelexToken t)
  4647. {
  4648. ffebad error = FFEBAD;
  4649. ffebld l;
  4650. ffebld r;
  4651. bool val;
  4652. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  4653. return expr;
  4654. l = ffebld_left (expr);
  4655. r = ffebld_right (expr);
  4656. if (ffebld_op (l) != FFEBLD_opCONTER)
  4657. return expr;
  4658. if (ffebld_op (r) != FFEBLD_opCONTER)
  4659. return expr;
  4660. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  4661. {
  4662. case FFEINFO_basictypeANY:
  4663. return expr;
  4664. case FFEINFO_basictypeINTEGER:
  4665. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4666. {
  4667. #if FFETARGET_okINTEGER1
  4668. case FFEINFO_kindtypeINTEGER1:
  4669. error = ffetarget_gt_integer1 (&val,
  4670. ffebld_constant_integer1 (ffebld_conter (l)),
  4671. ffebld_constant_integer1 (ffebld_conter (r)));
  4672. expr = ffebld_new_conter_with_orig
  4673. (ffebld_constant_new_logicaldefault (val), expr);
  4674. break;
  4675. #endif
  4676. #if FFETARGET_okINTEGER2
  4677. case FFEINFO_kindtypeINTEGER2:
  4678. error = ffetarget_gt_integer2 (&val,
  4679. ffebld_constant_integer2 (ffebld_conter (l)),
  4680. ffebld_constant_integer2 (ffebld_conter (r)));
  4681. expr = ffebld_new_conter_with_orig
  4682. (ffebld_constant_new_logicaldefault (val), expr);
  4683. break;
  4684. #endif
  4685. #if FFETARGET_okINTEGER3
  4686. case FFEINFO_kindtypeINTEGER3:
  4687. error = ffetarget_gt_integer3 (&val,
  4688. ffebld_constant_integer3 (ffebld_conter (l)),
  4689. ffebld_constant_integer3 (ffebld_conter (r)));
  4690. expr = ffebld_new_conter_with_orig
  4691. (ffebld_constant_new_logicaldefault (val), expr);
  4692. break;
  4693. #endif
  4694. #if FFETARGET_okINTEGER4
  4695. case FFEINFO_kindtypeINTEGER4:
  4696. error = ffetarget_gt_integer4 (&val,
  4697. ffebld_constant_integer4 (ffebld_conter (l)),
  4698. ffebld_constant_integer4 (ffebld_conter (r)));
  4699. expr = ffebld_new_conter_with_orig
  4700. (ffebld_constant_new_logicaldefault (val), expr);
  4701. break;
  4702. #endif
  4703. default:
  4704. assert ("bad integer kind type" == NULL);
  4705. break;
  4706. }
  4707. break;
  4708. case FFEINFO_basictypeREAL:
  4709. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4710. {
  4711. #if FFETARGET_okREAL1
  4712. case FFEINFO_kindtypeREAL1:
  4713. error = ffetarget_gt_real1 (&val,
  4714. ffebld_constant_real1 (ffebld_conter (l)),
  4715. ffebld_constant_real1 (ffebld_conter (r)));
  4716. expr = ffebld_new_conter_with_orig
  4717. (ffebld_constant_new_logicaldefault (val), expr);
  4718. break;
  4719. #endif
  4720. #if FFETARGET_okREAL2
  4721. case FFEINFO_kindtypeREAL2:
  4722. error = ffetarget_gt_real2 (&val,
  4723. ffebld_constant_real2 (ffebld_conter (l)),
  4724. ffebld_constant_real2 (ffebld_conter (r)));
  4725. expr = ffebld_new_conter_with_orig
  4726. (ffebld_constant_new_logicaldefault (val), expr);
  4727. break;
  4728. #endif
  4729. #if FFETARGET_okREAL3
  4730. case FFEINFO_kindtypeREAL3:
  4731. error = ffetarget_gt_real3 (&val,
  4732. ffebld_constant_real3 (ffebld_conter (l)),
  4733. ffebld_constant_real3 (ffebld_conter (r)));
  4734. expr = ffebld_new_conter_with_orig
  4735. (ffebld_constant_new_logicaldefault (val), expr);
  4736. break;
  4737. #endif
  4738. #if FFETARGET_okREAL4
  4739. case FFEINFO_kindtypeREAL4:
  4740. error = ffetarget_gt_real4 (&val,
  4741. ffebld_constant_real4 (ffebld_conter (l)),
  4742. ffebld_constant_real4 (ffebld_conter (r)));
  4743. expr = ffebld_new_conter_with_orig
  4744. (ffebld_constant_new_logicaldefault (val), expr);
  4745. break;
  4746. #endif
  4747. default:
  4748. assert ("bad real kind type" == NULL);
  4749. break;
  4750. }
  4751. break;
  4752. case FFEINFO_basictypeCHARACTER:
  4753. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4754. {
  4755. #if FFETARGET_okCHARACTER1
  4756. case FFEINFO_kindtypeCHARACTER1:
  4757. error = ffetarget_gt_character1 (&val,
  4758. ffebld_constant_character1 (ffebld_conter (l)),
  4759. ffebld_constant_character1 (ffebld_conter (r)));
  4760. expr = ffebld_new_conter_with_orig
  4761. (ffebld_constant_new_logicaldefault (val), expr);
  4762. break;
  4763. #endif
  4764. #if FFETARGET_okCHARACTER2
  4765. case FFEINFO_kindtypeCHARACTER2:
  4766. error = ffetarget_gt_character2 (&val,
  4767. ffebld_constant_character2 (ffebld_conter (l)),
  4768. ffebld_constant_character2 (ffebld_conter (r)));
  4769. expr = ffebld_new_conter_with_orig
  4770. (ffebld_constant_new_logicaldefault (val), expr);
  4771. break;
  4772. #endif
  4773. #if FFETARGET_okCHARACTER3
  4774. case FFEINFO_kindtypeCHARACTER3:
  4775. error = ffetarget_gt_character3 (&val,
  4776. ffebld_constant_character3 (ffebld_conter (l)),
  4777. ffebld_constant_character3 (ffebld_conter (r)));
  4778. expr = ffebld_new_conter_with_orig
  4779. (ffebld_constant_new_logicaldefault (val), expr);
  4780. break;
  4781. #endif
  4782. #if FFETARGET_okCHARACTER4
  4783. case FFEINFO_kindtypeCHARACTER4:
  4784. error = ffetarget_gt_character4 (&val,
  4785. ffebld_constant_character4 (ffebld_conter (l)),
  4786. ffebld_constant_character4 (ffebld_conter (r)));
  4787. expr = ffebld_new_conter_with_orig
  4788. (ffebld_constant_new_logicaldefault (val), expr);
  4789. break;
  4790. #endif
  4791. default:
  4792. assert ("bad character kind type" == NULL);
  4793. break;
  4794. }
  4795. break;
  4796. default:
  4797. assert ("bad type" == NULL);
  4798. return expr;
  4799. }
  4800. ffebld_set_info (expr, ffeinfo_new
  4801. (FFEINFO_basictypeLOGICAL,
  4802. FFEINFO_kindtypeLOGICALDEFAULT,
  4803. 0,
  4804. FFEINFO_kindENTITY,
  4805. FFEINFO_whereCONSTANT,
  4806. FFETARGET_charactersizeNONE));
  4807. if ((error != FFEBAD)
  4808. && ffebad_start (error))
  4809. {
  4810. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4811. ffebad_finish ();
  4812. }
  4813. return expr;
  4814. }
  4815. /* ffeexpr_collapse_le -- Collapse le expr
  4816. ffebld expr;
  4817. ffelexToken token;
  4818. expr = ffeexpr_collapse_le(expr,token);
  4819. If the result of the expr is a constant, replaces the expr with the
  4820. computed constant. */
  4821. ffebld
  4822. ffeexpr_collapse_le (ffebld expr, ffelexToken t)
  4823. {
  4824. ffebad error = FFEBAD;
  4825. ffebld l;
  4826. ffebld r;
  4827. bool val;
  4828. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  4829. return expr;
  4830. l = ffebld_left (expr);
  4831. r = ffebld_right (expr);
  4832. if (ffebld_op (l) != FFEBLD_opCONTER)
  4833. return expr;
  4834. if (ffebld_op (r) != FFEBLD_opCONTER)
  4835. return expr;
  4836. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  4837. {
  4838. case FFEINFO_basictypeANY:
  4839. return expr;
  4840. case FFEINFO_basictypeINTEGER:
  4841. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4842. {
  4843. #if FFETARGET_okINTEGER1
  4844. case FFEINFO_kindtypeINTEGER1:
  4845. error = ffetarget_le_integer1 (&val,
  4846. ffebld_constant_integer1 (ffebld_conter (l)),
  4847. ffebld_constant_integer1 (ffebld_conter (r)));
  4848. expr = ffebld_new_conter_with_orig
  4849. (ffebld_constant_new_logicaldefault (val), expr);
  4850. break;
  4851. #endif
  4852. #if FFETARGET_okINTEGER2
  4853. case FFEINFO_kindtypeINTEGER2:
  4854. error = ffetarget_le_integer2 (&val,
  4855. ffebld_constant_integer2 (ffebld_conter (l)),
  4856. ffebld_constant_integer2 (ffebld_conter (r)));
  4857. expr = ffebld_new_conter_with_orig
  4858. (ffebld_constant_new_logicaldefault (val), expr);
  4859. break;
  4860. #endif
  4861. #if FFETARGET_okINTEGER3
  4862. case FFEINFO_kindtypeINTEGER3:
  4863. error = ffetarget_le_integer3 (&val,
  4864. ffebld_constant_integer3 (ffebld_conter (l)),
  4865. ffebld_constant_integer3 (ffebld_conter (r)));
  4866. expr = ffebld_new_conter_with_orig
  4867. (ffebld_constant_new_logicaldefault (val), expr);
  4868. break;
  4869. #endif
  4870. #if FFETARGET_okINTEGER4
  4871. case FFEINFO_kindtypeINTEGER4:
  4872. error = ffetarget_le_integer4 (&val,
  4873. ffebld_constant_integer4 (ffebld_conter (l)),
  4874. ffebld_constant_integer4 (ffebld_conter (r)));
  4875. expr = ffebld_new_conter_with_orig
  4876. (ffebld_constant_new_logicaldefault (val), expr);
  4877. break;
  4878. #endif
  4879. default:
  4880. assert ("bad integer kind type" == NULL);
  4881. break;
  4882. }
  4883. break;
  4884. case FFEINFO_basictypeREAL:
  4885. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4886. {
  4887. #if FFETARGET_okREAL1
  4888. case FFEINFO_kindtypeREAL1:
  4889. error = ffetarget_le_real1 (&val,
  4890. ffebld_constant_real1 (ffebld_conter (l)),
  4891. ffebld_constant_real1 (ffebld_conter (r)));
  4892. expr = ffebld_new_conter_with_orig
  4893. (ffebld_constant_new_logicaldefault (val), expr);
  4894. break;
  4895. #endif
  4896. #if FFETARGET_okREAL2
  4897. case FFEINFO_kindtypeREAL2:
  4898. error = ffetarget_le_real2 (&val,
  4899. ffebld_constant_real2 (ffebld_conter (l)),
  4900. ffebld_constant_real2 (ffebld_conter (r)));
  4901. expr = ffebld_new_conter_with_orig
  4902. (ffebld_constant_new_logicaldefault (val), expr);
  4903. break;
  4904. #endif
  4905. #if FFETARGET_okREAL3
  4906. case FFEINFO_kindtypeREAL3:
  4907. error = ffetarget_le_real3 (&val,
  4908. ffebld_constant_real3 (ffebld_conter (l)),
  4909. ffebld_constant_real3 (ffebld_conter (r)));
  4910. expr = ffebld_new_conter_with_orig
  4911. (ffebld_constant_new_logicaldefault (val), expr);
  4912. break;
  4913. #endif
  4914. #if FFETARGET_okREAL4
  4915. case FFEINFO_kindtypeREAL4:
  4916. error = ffetarget_le_real4 (&val,
  4917. ffebld_constant_real4 (ffebld_conter (l)),
  4918. ffebld_constant_real4 (ffebld_conter (r)));
  4919. expr = ffebld_new_conter_with_orig
  4920. (ffebld_constant_new_logicaldefault (val), expr);
  4921. break;
  4922. #endif
  4923. default:
  4924. assert ("bad real kind type" == NULL);
  4925. break;
  4926. }
  4927. break;
  4928. case FFEINFO_basictypeCHARACTER:
  4929. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  4930. {
  4931. #if FFETARGET_okCHARACTER1
  4932. case FFEINFO_kindtypeCHARACTER1:
  4933. error = ffetarget_le_character1 (&val,
  4934. ffebld_constant_character1 (ffebld_conter (l)),
  4935. ffebld_constant_character1 (ffebld_conter (r)));
  4936. expr = ffebld_new_conter_with_orig
  4937. (ffebld_constant_new_logicaldefault (val), expr);
  4938. break;
  4939. #endif
  4940. #if FFETARGET_okCHARACTER2
  4941. case FFEINFO_kindtypeCHARACTER2:
  4942. error = ffetarget_le_character2 (&val,
  4943. ffebld_constant_character2 (ffebld_conter (l)),
  4944. ffebld_constant_character2 (ffebld_conter (r)));
  4945. expr = ffebld_new_conter_with_orig
  4946. (ffebld_constant_new_logicaldefault (val), expr);
  4947. break;
  4948. #endif
  4949. #if FFETARGET_okCHARACTER3
  4950. case FFEINFO_kindtypeCHARACTER3:
  4951. error = ffetarget_le_character3 (&val,
  4952. ffebld_constant_character3 (ffebld_conter (l)),
  4953. ffebld_constant_character3 (ffebld_conter (r)));
  4954. expr = ffebld_new_conter_with_orig
  4955. (ffebld_constant_new_logicaldefault (val), expr);
  4956. break;
  4957. #endif
  4958. #if FFETARGET_okCHARACTER4
  4959. case FFEINFO_kindtypeCHARACTER4:
  4960. error = ffetarget_le_character4 (&val,
  4961. ffebld_constant_character4 (ffebld_conter (l)),
  4962. ffebld_constant_character4 (ffebld_conter (r)));
  4963. expr = ffebld_new_conter_with_orig
  4964. (ffebld_constant_new_logicaldefault (val), expr);
  4965. break;
  4966. #endif
  4967. default:
  4968. assert ("bad character kind type" == NULL);
  4969. break;
  4970. }
  4971. break;
  4972. default:
  4973. assert ("bad type" == NULL);
  4974. return expr;
  4975. }
  4976. ffebld_set_info (expr, ffeinfo_new
  4977. (FFEINFO_basictypeLOGICAL,
  4978. FFEINFO_kindtypeLOGICALDEFAULT,
  4979. 0,
  4980. FFEINFO_kindENTITY,
  4981. FFEINFO_whereCONSTANT,
  4982. FFETARGET_charactersizeNONE));
  4983. if ((error != FFEBAD)
  4984. && ffebad_start (error))
  4985. {
  4986. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  4987. ffebad_finish ();
  4988. }
  4989. return expr;
  4990. }
  4991. /* ffeexpr_collapse_lt -- Collapse lt expr
  4992. ffebld expr;
  4993. ffelexToken token;
  4994. expr = ffeexpr_collapse_lt(expr,token);
  4995. If the result of the expr is a constant, replaces the expr with the
  4996. computed constant. */
  4997. ffebld
  4998. ffeexpr_collapse_lt (ffebld expr, ffelexToken t)
  4999. {
  5000. ffebad error = FFEBAD;
  5001. ffebld l;
  5002. ffebld r;
  5003. bool val;
  5004. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5005. return expr;
  5006. l = ffebld_left (expr);
  5007. r = ffebld_right (expr);
  5008. if (ffebld_op (l) != FFEBLD_opCONTER)
  5009. return expr;
  5010. if (ffebld_op (r) != FFEBLD_opCONTER)
  5011. return expr;
  5012. switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
  5013. {
  5014. case FFEINFO_basictypeANY:
  5015. return expr;
  5016. case FFEINFO_basictypeINTEGER:
  5017. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  5018. {
  5019. #if FFETARGET_okINTEGER1
  5020. case FFEINFO_kindtypeINTEGER1:
  5021. error = ffetarget_lt_integer1 (&val,
  5022. ffebld_constant_integer1 (ffebld_conter (l)),
  5023. ffebld_constant_integer1 (ffebld_conter (r)));
  5024. expr = ffebld_new_conter_with_orig
  5025. (ffebld_constant_new_logicaldefault (val), expr);
  5026. break;
  5027. #endif
  5028. #if FFETARGET_okINTEGER2
  5029. case FFEINFO_kindtypeINTEGER2:
  5030. error = ffetarget_lt_integer2 (&val,
  5031. ffebld_constant_integer2 (ffebld_conter (l)),
  5032. ffebld_constant_integer2 (ffebld_conter (r)));
  5033. expr = ffebld_new_conter_with_orig
  5034. (ffebld_constant_new_logicaldefault (val), expr);
  5035. break;
  5036. #endif
  5037. #if FFETARGET_okINTEGER3
  5038. case FFEINFO_kindtypeINTEGER3:
  5039. error = ffetarget_lt_integer3 (&val,
  5040. ffebld_constant_integer3 (ffebld_conter (l)),
  5041. ffebld_constant_integer3 (ffebld_conter (r)));
  5042. expr = ffebld_new_conter_with_orig
  5043. (ffebld_constant_new_logicaldefault (val), expr);
  5044. break;
  5045. #endif
  5046. #if FFETARGET_okINTEGER4
  5047. case FFEINFO_kindtypeINTEGER4:
  5048. error = ffetarget_lt_integer4 (&val,
  5049. ffebld_constant_integer4 (ffebld_conter (l)),
  5050. ffebld_constant_integer4 (ffebld_conter (r)));
  5051. expr = ffebld_new_conter_with_orig
  5052. (ffebld_constant_new_logicaldefault (val), expr);
  5053. break;
  5054. #endif
  5055. default:
  5056. assert ("bad integer kind type" == NULL);
  5057. break;
  5058. }
  5059. break;
  5060. case FFEINFO_basictypeREAL:
  5061. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  5062. {
  5063. #if FFETARGET_okREAL1
  5064. case FFEINFO_kindtypeREAL1:
  5065. error = ffetarget_lt_real1 (&val,
  5066. ffebld_constant_real1 (ffebld_conter (l)),
  5067. ffebld_constant_real1 (ffebld_conter (r)));
  5068. expr = ffebld_new_conter_with_orig
  5069. (ffebld_constant_new_logicaldefault (val), expr);
  5070. break;
  5071. #endif
  5072. #if FFETARGET_okREAL2
  5073. case FFEINFO_kindtypeREAL2:
  5074. error = ffetarget_lt_real2 (&val,
  5075. ffebld_constant_real2 (ffebld_conter (l)),
  5076. ffebld_constant_real2 (ffebld_conter (r)));
  5077. expr = ffebld_new_conter_with_orig
  5078. (ffebld_constant_new_logicaldefault (val), expr);
  5079. break;
  5080. #endif
  5081. #if FFETARGET_okREAL3
  5082. case FFEINFO_kindtypeREAL3:
  5083. error = ffetarget_lt_real3 (&val,
  5084. ffebld_constant_real3 (ffebld_conter (l)),
  5085. ffebld_constant_real3 (ffebld_conter (r)));
  5086. expr = ffebld_new_conter_with_orig
  5087. (ffebld_constant_new_logicaldefault (val), expr);
  5088. break;
  5089. #endif
  5090. #if FFETARGET_okREAL4
  5091. case FFEINFO_kindtypeREAL4:
  5092. error = ffetarget_lt_real4 (&val,
  5093. ffebld_constant_real4 (ffebld_conter (l)),
  5094. ffebld_constant_real4 (ffebld_conter (r)));
  5095. expr = ffebld_new_conter_with_orig
  5096. (ffebld_constant_new_logicaldefault (val), expr);
  5097. break;
  5098. #endif
  5099. default:
  5100. assert ("bad real kind type" == NULL);
  5101. break;
  5102. }
  5103. break;
  5104. case FFEINFO_basictypeCHARACTER:
  5105. switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
  5106. {
  5107. #if FFETARGET_okCHARACTER1
  5108. case FFEINFO_kindtypeCHARACTER1:
  5109. error = ffetarget_lt_character1 (&val,
  5110. ffebld_constant_character1 (ffebld_conter (l)),
  5111. ffebld_constant_character1 (ffebld_conter (r)));
  5112. expr = ffebld_new_conter_with_orig
  5113. (ffebld_constant_new_logicaldefault (val), expr);
  5114. break;
  5115. #endif
  5116. #if FFETARGET_okCHARACTER2
  5117. case FFEINFO_kindtypeCHARACTER2:
  5118. error = ffetarget_lt_character2 (&val,
  5119. ffebld_constant_character2 (ffebld_conter (l)),
  5120. ffebld_constant_character2 (ffebld_conter (r)));
  5121. expr = ffebld_new_conter_with_orig
  5122. (ffebld_constant_new_logicaldefault (val), expr);
  5123. break;
  5124. #endif
  5125. #if FFETARGET_okCHARACTER3
  5126. case FFEINFO_kindtypeCHARACTER3:
  5127. error = ffetarget_lt_character3 (&val,
  5128. ffebld_constant_character3 (ffebld_conter (l)),
  5129. ffebld_constant_character3 (ffebld_conter (r)));
  5130. expr = ffebld_new_conter_with_orig
  5131. (ffebld_constant_new_logicaldefault (val), expr);
  5132. break;
  5133. #endif
  5134. #if FFETARGET_okCHARACTER4
  5135. case FFEINFO_kindtypeCHARACTER4:
  5136. error = ffetarget_lt_character4 (&val,
  5137. ffebld_constant_character4 (ffebld_conter (l)),
  5138. ffebld_constant_character4 (ffebld_conter (r)));
  5139. expr = ffebld_new_conter_with_orig
  5140. (ffebld_constant_new_logicaldefault (val), expr);
  5141. break;
  5142. #endif
  5143. default:
  5144. assert ("bad character kind type" == NULL);
  5145. break;
  5146. }
  5147. break;
  5148. default:
  5149. assert ("bad type" == NULL);
  5150. return expr;
  5151. }
  5152. ffebld_set_info (expr, ffeinfo_new
  5153. (FFEINFO_basictypeLOGICAL,
  5154. FFEINFO_kindtypeLOGICALDEFAULT,
  5155. 0,
  5156. FFEINFO_kindENTITY,
  5157. FFEINFO_whereCONSTANT,
  5158. FFETARGET_charactersizeNONE));
  5159. if ((error != FFEBAD)
  5160. && ffebad_start (error))
  5161. {
  5162. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5163. ffebad_finish ();
  5164. }
  5165. return expr;
  5166. }
  5167. /* ffeexpr_collapse_and -- Collapse and expr
  5168. ffebld expr;
  5169. ffelexToken token;
  5170. expr = ffeexpr_collapse_and(expr,token);
  5171. If the result of the expr is a constant, replaces the expr with the
  5172. computed constant. */
  5173. ffebld
  5174. ffeexpr_collapse_and (ffebld expr, ffelexToken t)
  5175. {
  5176. ffebad error = FFEBAD;
  5177. ffebld l;
  5178. ffebld r;
  5179. ffebldConstantUnion u;
  5180. ffeinfoBasictype bt;
  5181. ffeinfoKindtype kt;
  5182. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5183. return expr;
  5184. l = ffebld_left (expr);
  5185. r = ffebld_right (expr);
  5186. if (ffebld_op (l) != FFEBLD_opCONTER)
  5187. return expr;
  5188. if (ffebld_op (r) != FFEBLD_opCONTER)
  5189. return expr;
  5190. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  5191. {
  5192. case FFEINFO_basictypeANY:
  5193. return expr;
  5194. case FFEINFO_basictypeINTEGER:
  5195. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5196. {
  5197. #if FFETARGET_okINTEGER1
  5198. case FFEINFO_kindtypeINTEGER1:
  5199. error = ffetarget_and_integer1 (ffebld_cu_ptr_integer1 (u),
  5200. ffebld_constant_integer1 (ffebld_conter (l)),
  5201. ffebld_constant_integer1 (ffebld_conter (r)));
  5202. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  5203. (ffebld_cu_val_integer1 (u)), expr);
  5204. break;
  5205. #endif
  5206. #if FFETARGET_okINTEGER2
  5207. case FFEINFO_kindtypeINTEGER2:
  5208. error = ffetarget_and_integer2 (ffebld_cu_ptr_integer2 (u),
  5209. ffebld_constant_integer2 (ffebld_conter (l)),
  5210. ffebld_constant_integer2 (ffebld_conter (r)));
  5211. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  5212. (ffebld_cu_val_integer2 (u)), expr);
  5213. break;
  5214. #endif
  5215. #if FFETARGET_okINTEGER3
  5216. case FFEINFO_kindtypeINTEGER3:
  5217. error = ffetarget_and_integer3 (ffebld_cu_ptr_integer3 (u),
  5218. ffebld_constant_integer3 (ffebld_conter (l)),
  5219. ffebld_constant_integer3 (ffebld_conter (r)));
  5220. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  5221. (ffebld_cu_val_integer3 (u)), expr);
  5222. break;
  5223. #endif
  5224. #if FFETARGET_okINTEGER4
  5225. case FFEINFO_kindtypeINTEGER4:
  5226. error = ffetarget_and_integer4 (ffebld_cu_ptr_integer4 (u),
  5227. ffebld_constant_integer4 (ffebld_conter (l)),
  5228. ffebld_constant_integer4 (ffebld_conter (r)));
  5229. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  5230. (ffebld_cu_val_integer4 (u)), expr);
  5231. break;
  5232. #endif
  5233. default:
  5234. assert ("bad integer kind type" == NULL);
  5235. break;
  5236. }
  5237. break;
  5238. case FFEINFO_basictypeLOGICAL:
  5239. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5240. {
  5241. #if FFETARGET_okLOGICAL1
  5242. case FFEINFO_kindtypeLOGICAL1:
  5243. error = ffetarget_and_logical1 (ffebld_cu_ptr_logical1 (u),
  5244. ffebld_constant_logical1 (ffebld_conter (l)),
  5245. ffebld_constant_logical1 (ffebld_conter (r)));
  5246. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  5247. (ffebld_cu_val_logical1 (u)), expr);
  5248. break;
  5249. #endif
  5250. #if FFETARGET_okLOGICAL2
  5251. case FFEINFO_kindtypeLOGICAL2:
  5252. error = ffetarget_and_logical2 (ffebld_cu_ptr_logical2 (u),
  5253. ffebld_constant_logical2 (ffebld_conter (l)),
  5254. ffebld_constant_logical2 (ffebld_conter (r)));
  5255. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  5256. (ffebld_cu_val_logical2 (u)), expr);
  5257. break;
  5258. #endif
  5259. #if FFETARGET_okLOGICAL3
  5260. case FFEINFO_kindtypeLOGICAL3:
  5261. error = ffetarget_and_logical3 (ffebld_cu_ptr_logical3 (u),
  5262. ffebld_constant_logical3 (ffebld_conter (l)),
  5263. ffebld_constant_logical3 (ffebld_conter (r)));
  5264. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  5265. (ffebld_cu_val_logical3 (u)), expr);
  5266. break;
  5267. #endif
  5268. #if FFETARGET_okLOGICAL4
  5269. case FFEINFO_kindtypeLOGICAL4:
  5270. error = ffetarget_and_logical4 (ffebld_cu_ptr_logical4 (u),
  5271. ffebld_constant_logical4 (ffebld_conter (l)),
  5272. ffebld_constant_logical4 (ffebld_conter (r)));
  5273. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  5274. (ffebld_cu_val_logical4 (u)), expr);
  5275. break;
  5276. #endif
  5277. default:
  5278. assert ("bad logical kind type" == NULL);
  5279. break;
  5280. }
  5281. break;
  5282. default:
  5283. assert ("bad type" == NULL);
  5284. return expr;
  5285. }
  5286. ffebld_set_info (expr, ffeinfo_new
  5287. (bt,
  5288. kt,
  5289. 0,
  5290. FFEINFO_kindENTITY,
  5291. FFEINFO_whereCONSTANT,
  5292. FFETARGET_charactersizeNONE));
  5293. if ((error != FFEBAD)
  5294. && ffebad_start (error))
  5295. {
  5296. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5297. ffebad_finish ();
  5298. }
  5299. return expr;
  5300. }
  5301. /* ffeexpr_collapse_or -- Collapse or expr
  5302. ffebld expr;
  5303. ffelexToken token;
  5304. expr = ffeexpr_collapse_or(expr,token);
  5305. If the result of the expr is a constant, replaces the expr with the
  5306. computed constant. */
  5307. ffebld
  5308. ffeexpr_collapse_or (ffebld expr, ffelexToken t)
  5309. {
  5310. ffebad error = FFEBAD;
  5311. ffebld l;
  5312. ffebld r;
  5313. ffebldConstantUnion u;
  5314. ffeinfoBasictype bt;
  5315. ffeinfoKindtype kt;
  5316. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5317. return expr;
  5318. l = ffebld_left (expr);
  5319. r = ffebld_right (expr);
  5320. if (ffebld_op (l) != FFEBLD_opCONTER)
  5321. return expr;
  5322. if (ffebld_op (r) != FFEBLD_opCONTER)
  5323. return expr;
  5324. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  5325. {
  5326. case FFEINFO_basictypeANY:
  5327. return expr;
  5328. case FFEINFO_basictypeINTEGER:
  5329. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5330. {
  5331. #if FFETARGET_okINTEGER1
  5332. case FFEINFO_kindtypeINTEGER1:
  5333. error = ffetarget_or_integer1 (ffebld_cu_ptr_integer1 (u),
  5334. ffebld_constant_integer1 (ffebld_conter (l)),
  5335. ffebld_constant_integer1 (ffebld_conter (r)));
  5336. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  5337. (ffebld_cu_val_integer1 (u)), expr);
  5338. break;
  5339. #endif
  5340. #if FFETARGET_okINTEGER2
  5341. case FFEINFO_kindtypeINTEGER2:
  5342. error = ffetarget_or_integer2 (ffebld_cu_ptr_integer2 (u),
  5343. ffebld_constant_integer2 (ffebld_conter (l)),
  5344. ffebld_constant_integer2 (ffebld_conter (r)));
  5345. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  5346. (ffebld_cu_val_integer2 (u)), expr);
  5347. break;
  5348. #endif
  5349. #if FFETARGET_okINTEGER3
  5350. case FFEINFO_kindtypeINTEGER3:
  5351. error = ffetarget_or_integer3 (ffebld_cu_ptr_integer3 (u),
  5352. ffebld_constant_integer3 (ffebld_conter (l)),
  5353. ffebld_constant_integer3 (ffebld_conter (r)));
  5354. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  5355. (ffebld_cu_val_integer3 (u)), expr);
  5356. break;
  5357. #endif
  5358. #if FFETARGET_okINTEGER4
  5359. case FFEINFO_kindtypeINTEGER4:
  5360. error = ffetarget_or_integer4 (ffebld_cu_ptr_integer4 (u),
  5361. ffebld_constant_integer4 (ffebld_conter (l)),
  5362. ffebld_constant_integer4 (ffebld_conter (r)));
  5363. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  5364. (ffebld_cu_val_integer4 (u)), expr);
  5365. break;
  5366. #endif
  5367. default:
  5368. assert ("bad integer kind type" == NULL);
  5369. break;
  5370. }
  5371. break;
  5372. case FFEINFO_basictypeLOGICAL:
  5373. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5374. {
  5375. #if FFETARGET_okLOGICAL1
  5376. case FFEINFO_kindtypeLOGICAL1:
  5377. error = ffetarget_or_logical1 (ffebld_cu_ptr_logical1 (u),
  5378. ffebld_constant_logical1 (ffebld_conter (l)),
  5379. ffebld_constant_logical1 (ffebld_conter (r)));
  5380. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  5381. (ffebld_cu_val_logical1 (u)), expr);
  5382. break;
  5383. #endif
  5384. #if FFETARGET_okLOGICAL2
  5385. case FFEINFO_kindtypeLOGICAL2:
  5386. error = ffetarget_or_logical2 (ffebld_cu_ptr_logical2 (u),
  5387. ffebld_constant_logical2 (ffebld_conter (l)),
  5388. ffebld_constant_logical2 (ffebld_conter (r)));
  5389. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  5390. (ffebld_cu_val_logical2 (u)), expr);
  5391. break;
  5392. #endif
  5393. #if FFETARGET_okLOGICAL3
  5394. case FFEINFO_kindtypeLOGICAL3:
  5395. error = ffetarget_or_logical3 (ffebld_cu_ptr_logical3 (u),
  5396. ffebld_constant_logical3 (ffebld_conter (l)),
  5397. ffebld_constant_logical3 (ffebld_conter (r)));
  5398. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  5399. (ffebld_cu_val_logical3 (u)), expr);
  5400. break;
  5401. #endif
  5402. #if FFETARGET_okLOGICAL4
  5403. case FFEINFO_kindtypeLOGICAL4:
  5404. error = ffetarget_or_logical4 (ffebld_cu_ptr_logical4 (u),
  5405. ffebld_constant_logical4 (ffebld_conter (l)),
  5406. ffebld_constant_logical4 (ffebld_conter (r)));
  5407. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  5408. (ffebld_cu_val_logical4 (u)), expr);
  5409. break;
  5410. #endif
  5411. default:
  5412. assert ("bad logical kind type" == NULL);
  5413. break;
  5414. }
  5415. break;
  5416. default:
  5417. assert ("bad type" == NULL);
  5418. return expr;
  5419. }
  5420. ffebld_set_info (expr, ffeinfo_new
  5421. (bt,
  5422. kt,
  5423. 0,
  5424. FFEINFO_kindENTITY,
  5425. FFEINFO_whereCONSTANT,
  5426. FFETARGET_charactersizeNONE));
  5427. if ((error != FFEBAD)
  5428. && ffebad_start (error))
  5429. {
  5430. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5431. ffebad_finish ();
  5432. }
  5433. return expr;
  5434. }
  5435. /* ffeexpr_collapse_xor -- Collapse xor expr
  5436. ffebld expr;
  5437. ffelexToken token;
  5438. expr = ffeexpr_collapse_xor(expr,token);
  5439. If the result of the expr is a constant, replaces the expr with the
  5440. computed constant. */
  5441. ffebld
  5442. ffeexpr_collapse_xor (ffebld expr, ffelexToken t)
  5443. {
  5444. ffebad error = FFEBAD;
  5445. ffebld l;
  5446. ffebld r;
  5447. ffebldConstantUnion u;
  5448. ffeinfoBasictype bt;
  5449. ffeinfoKindtype kt;
  5450. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5451. return expr;
  5452. l = ffebld_left (expr);
  5453. r = ffebld_right (expr);
  5454. if (ffebld_op (l) != FFEBLD_opCONTER)
  5455. return expr;
  5456. if (ffebld_op (r) != FFEBLD_opCONTER)
  5457. return expr;
  5458. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  5459. {
  5460. case FFEINFO_basictypeANY:
  5461. return expr;
  5462. case FFEINFO_basictypeINTEGER:
  5463. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5464. {
  5465. #if FFETARGET_okINTEGER1
  5466. case FFEINFO_kindtypeINTEGER1:
  5467. error = ffetarget_xor_integer1 (ffebld_cu_ptr_integer1 (u),
  5468. ffebld_constant_integer1 (ffebld_conter (l)),
  5469. ffebld_constant_integer1 (ffebld_conter (r)));
  5470. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  5471. (ffebld_cu_val_integer1 (u)), expr);
  5472. break;
  5473. #endif
  5474. #if FFETARGET_okINTEGER2
  5475. case FFEINFO_kindtypeINTEGER2:
  5476. error = ffetarget_xor_integer2 (ffebld_cu_ptr_integer2 (u),
  5477. ffebld_constant_integer2 (ffebld_conter (l)),
  5478. ffebld_constant_integer2 (ffebld_conter (r)));
  5479. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  5480. (ffebld_cu_val_integer2 (u)), expr);
  5481. break;
  5482. #endif
  5483. #if FFETARGET_okINTEGER3
  5484. case FFEINFO_kindtypeINTEGER3:
  5485. error = ffetarget_xor_integer3 (ffebld_cu_ptr_integer3 (u),
  5486. ffebld_constant_integer3 (ffebld_conter (l)),
  5487. ffebld_constant_integer3 (ffebld_conter (r)));
  5488. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  5489. (ffebld_cu_val_integer3 (u)), expr);
  5490. break;
  5491. #endif
  5492. #if FFETARGET_okINTEGER4
  5493. case FFEINFO_kindtypeINTEGER4:
  5494. error = ffetarget_xor_integer4 (ffebld_cu_ptr_integer4 (u),
  5495. ffebld_constant_integer4 (ffebld_conter (l)),
  5496. ffebld_constant_integer4 (ffebld_conter (r)));
  5497. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  5498. (ffebld_cu_val_integer4 (u)), expr);
  5499. break;
  5500. #endif
  5501. default:
  5502. assert ("bad integer kind type" == NULL);
  5503. break;
  5504. }
  5505. break;
  5506. case FFEINFO_basictypeLOGICAL:
  5507. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5508. {
  5509. #if FFETARGET_okLOGICAL1
  5510. case FFEINFO_kindtypeLOGICAL1:
  5511. error = ffetarget_xor_logical1 (ffebld_cu_ptr_logical1 (u),
  5512. ffebld_constant_logical1 (ffebld_conter (l)),
  5513. ffebld_constant_logical1 (ffebld_conter (r)));
  5514. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  5515. (ffebld_cu_val_logical1 (u)), expr);
  5516. break;
  5517. #endif
  5518. #if FFETARGET_okLOGICAL2
  5519. case FFEINFO_kindtypeLOGICAL2:
  5520. error = ffetarget_xor_logical2 (ffebld_cu_ptr_logical2 (u),
  5521. ffebld_constant_logical2 (ffebld_conter (l)),
  5522. ffebld_constant_logical2 (ffebld_conter (r)));
  5523. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  5524. (ffebld_cu_val_logical2 (u)), expr);
  5525. break;
  5526. #endif
  5527. #if FFETARGET_okLOGICAL3
  5528. case FFEINFO_kindtypeLOGICAL3:
  5529. error = ffetarget_xor_logical3 (ffebld_cu_ptr_logical3 (u),
  5530. ffebld_constant_logical3 (ffebld_conter (l)),
  5531. ffebld_constant_logical3 (ffebld_conter (r)));
  5532. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  5533. (ffebld_cu_val_logical3 (u)), expr);
  5534. break;
  5535. #endif
  5536. #if FFETARGET_okLOGICAL4
  5537. case FFEINFO_kindtypeLOGICAL4:
  5538. error = ffetarget_xor_logical4 (ffebld_cu_ptr_logical4 (u),
  5539. ffebld_constant_logical4 (ffebld_conter (l)),
  5540. ffebld_constant_logical4 (ffebld_conter (r)));
  5541. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  5542. (ffebld_cu_val_logical4 (u)), expr);
  5543. break;
  5544. #endif
  5545. default:
  5546. assert ("bad logical kind type" == NULL);
  5547. break;
  5548. }
  5549. break;
  5550. default:
  5551. assert ("bad type" == NULL);
  5552. return expr;
  5553. }
  5554. ffebld_set_info (expr, ffeinfo_new
  5555. (bt,
  5556. kt,
  5557. 0,
  5558. FFEINFO_kindENTITY,
  5559. FFEINFO_whereCONSTANT,
  5560. FFETARGET_charactersizeNONE));
  5561. if ((error != FFEBAD)
  5562. && ffebad_start (error))
  5563. {
  5564. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5565. ffebad_finish ();
  5566. }
  5567. return expr;
  5568. }
  5569. /* ffeexpr_collapse_eqv -- Collapse eqv expr
  5570. ffebld expr;
  5571. ffelexToken token;
  5572. expr = ffeexpr_collapse_eqv(expr,token);
  5573. If the result of the expr is a constant, replaces the expr with the
  5574. computed constant. */
  5575. ffebld
  5576. ffeexpr_collapse_eqv (ffebld expr, ffelexToken t)
  5577. {
  5578. ffebad error = FFEBAD;
  5579. ffebld l;
  5580. ffebld r;
  5581. ffebldConstantUnion u;
  5582. ffeinfoBasictype bt;
  5583. ffeinfoKindtype kt;
  5584. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5585. return expr;
  5586. l = ffebld_left (expr);
  5587. r = ffebld_right (expr);
  5588. if (ffebld_op (l) != FFEBLD_opCONTER)
  5589. return expr;
  5590. if (ffebld_op (r) != FFEBLD_opCONTER)
  5591. return expr;
  5592. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  5593. {
  5594. case FFEINFO_basictypeANY:
  5595. return expr;
  5596. case FFEINFO_basictypeINTEGER:
  5597. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5598. {
  5599. #if FFETARGET_okINTEGER1
  5600. case FFEINFO_kindtypeINTEGER1:
  5601. error = ffetarget_eqv_integer1 (ffebld_cu_ptr_integer1 (u),
  5602. ffebld_constant_integer1 (ffebld_conter (l)),
  5603. ffebld_constant_integer1 (ffebld_conter (r)));
  5604. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  5605. (ffebld_cu_val_integer1 (u)), expr);
  5606. break;
  5607. #endif
  5608. #if FFETARGET_okINTEGER2
  5609. case FFEINFO_kindtypeINTEGER2:
  5610. error = ffetarget_eqv_integer2 (ffebld_cu_ptr_integer2 (u),
  5611. ffebld_constant_integer2 (ffebld_conter (l)),
  5612. ffebld_constant_integer2 (ffebld_conter (r)));
  5613. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  5614. (ffebld_cu_val_integer2 (u)), expr);
  5615. break;
  5616. #endif
  5617. #if FFETARGET_okINTEGER3
  5618. case FFEINFO_kindtypeINTEGER3:
  5619. error = ffetarget_eqv_integer3 (ffebld_cu_ptr_integer3 (u),
  5620. ffebld_constant_integer3 (ffebld_conter (l)),
  5621. ffebld_constant_integer3 (ffebld_conter (r)));
  5622. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  5623. (ffebld_cu_val_integer3 (u)), expr);
  5624. break;
  5625. #endif
  5626. #if FFETARGET_okINTEGER4
  5627. case FFEINFO_kindtypeINTEGER4:
  5628. error = ffetarget_eqv_integer4 (ffebld_cu_ptr_integer4 (u),
  5629. ffebld_constant_integer4 (ffebld_conter (l)),
  5630. ffebld_constant_integer4 (ffebld_conter (r)));
  5631. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  5632. (ffebld_cu_val_integer4 (u)), expr);
  5633. break;
  5634. #endif
  5635. default:
  5636. assert ("bad integer kind type" == NULL);
  5637. break;
  5638. }
  5639. break;
  5640. case FFEINFO_basictypeLOGICAL:
  5641. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5642. {
  5643. #if FFETARGET_okLOGICAL1
  5644. case FFEINFO_kindtypeLOGICAL1:
  5645. error = ffetarget_eqv_logical1 (ffebld_cu_ptr_logical1 (u),
  5646. ffebld_constant_logical1 (ffebld_conter (l)),
  5647. ffebld_constant_logical1 (ffebld_conter (r)));
  5648. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  5649. (ffebld_cu_val_logical1 (u)), expr);
  5650. break;
  5651. #endif
  5652. #if FFETARGET_okLOGICAL2
  5653. case FFEINFO_kindtypeLOGICAL2:
  5654. error = ffetarget_eqv_logical2 (ffebld_cu_ptr_logical2 (u),
  5655. ffebld_constant_logical2 (ffebld_conter (l)),
  5656. ffebld_constant_logical2 (ffebld_conter (r)));
  5657. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  5658. (ffebld_cu_val_logical2 (u)), expr);
  5659. break;
  5660. #endif
  5661. #if FFETARGET_okLOGICAL3
  5662. case FFEINFO_kindtypeLOGICAL3:
  5663. error = ffetarget_eqv_logical3 (ffebld_cu_ptr_logical3 (u),
  5664. ffebld_constant_logical3 (ffebld_conter (l)),
  5665. ffebld_constant_logical3 (ffebld_conter (r)));
  5666. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  5667. (ffebld_cu_val_logical3 (u)), expr);
  5668. break;
  5669. #endif
  5670. #if FFETARGET_okLOGICAL4
  5671. case FFEINFO_kindtypeLOGICAL4:
  5672. error = ffetarget_eqv_logical4 (ffebld_cu_ptr_logical4 (u),
  5673. ffebld_constant_logical4 (ffebld_conter (l)),
  5674. ffebld_constant_logical4 (ffebld_conter (r)));
  5675. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  5676. (ffebld_cu_val_logical4 (u)), expr);
  5677. break;
  5678. #endif
  5679. default:
  5680. assert ("bad logical kind type" == NULL);
  5681. break;
  5682. }
  5683. break;
  5684. default:
  5685. assert ("bad type" == NULL);
  5686. return expr;
  5687. }
  5688. ffebld_set_info (expr, ffeinfo_new
  5689. (bt,
  5690. kt,
  5691. 0,
  5692. FFEINFO_kindENTITY,
  5693. FFEINFO_whereCONSTANT,
  5694. FFETARGET_charactersizeNONE));
  5695. if ((error != FFEBAD)
  5696. && ffebad_start (error))
  5697. {
  5698. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5699. ffebad_finish ();
  5700. }
  5701. return expr;
  5702. }
  5703. /* ffeexpr_collapse_neqv -- Collapse neqv expr
  5704. ffebld expr;
  5705. ffelexToken token;
  5706. expr = ffeexpr_collapse_neqv(expr,token);
  5707. If the result of the expr is a constant, replaces the expr with the
  5708. computed constant. */
  5709. ffebld
  5710. ffeexpr_collapse_neqv (ffebld expr, ffelexToken t)
  5711. {
  5712. ffebad error = FFEBAD;
  5713. ffebld l;
  5714. ffebld r;
  5715. ffebldConstantUnion u;
  5716. ffeinfoBasictype bt;
  5717. ffeinfoKindtype kt;
  5718. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5719. return expr;
  5720. l = ffebld_left (expr);
  5721. r = ffebld_right (expr);
  5722. if (ffebld_op (l) != FFEBLD_opCONTER)
  5723. return expr;
  5724. if (ffebld_op (r) != FFEBLD_opCONTER)
  5725. return expr;
  5726. switch (bt = ffeinfo_basictype (ffebld_info (expr)))
  5727. {
  5728. case FFEINFO_basictypeANY:
  5729. return expr;
  5730. case FFEINFO_basictypeINTEGER:
  5731. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5732. {
  5733. #if FFETARGET_okINTEGER1
  5734. case FFEINFO_kindtypeINTEGER1:
  5735. error = ffetarget_neqv_integer1 (ffebld_cu_ptr_integer1 (u),
  5736. ffebld_constant_integer1 (ffebld_conter (l)),
  5737. ffebld_constant_integer1 (ffebld_conter (r)));
  5738. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
  5739. (ffebld_cu_val_integer1 (u)), expr);
  5740. break;
  5741. #endif
  5742. #if FFETARGET_okINTEGER2
  5743. case FFEINFO_kindtypeINTEGER2:
  5744. error = ffetarget_neqv_integer2 (ffebld_cu_ptr_integer2 (u),
  5745. ffebld_constant_integer2 (ffebld_conter (l)),
  5746. ffebld_constant_integer2 (ffebld_conter (r)));
  5747. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
  5748. (ffebld_cu_val_integer2 (u)), expr);
  5749. break;
  5750. #endif
  5751. #if FFETARGET_okINTEGER3
  5752. case FFEINFO_kindtypeINTEGER3:
  5753. error = ffetarget_neqv_integer3 (ffebld_cu_ptr_integer3 (u),
  5754. ffebld_constant_integer3 (ffebld_conter (l)),
  5755. ffebld_constant_integer3 (ffebld_conter (r)));
  5756. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
  5757. (ffebld_cu_val_integer3 (u)), expr);
  5758. break;
  5759. #endif
  5760. #if FFETARGET_okINTEGER4
  5761. case FFEINFO_kindtypeINTEGER4:
  5762. error = ffetarget_neqv_integer4 (ffebld_cu_ptr_integer4 (u),
  5763. ffebld_constant_integer4 (ffebld_conter (l)),
  5764. ffebld_constant_integer4 (ffebld_conter (r)));
  5765. expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
  5766. (ffebld_cu_val_integer4 (u)), expr);
  5767. break;
  5768. #endif
  5769. default:
  5770. assert ("bad integer kind type" == NULL);
  5771. break;
  5772. }
  5773. break;
  5774. case FFEINFO_basictypeLOGICAL:
  5775. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5776. {
  5777. #if FFETARGET_okLOGICAL1
  5778. case FFEINFO_kindtypeLOGICAL1:
  5779. error = ffetarget_neqv_logical1 (ffebld_cu_ptr_logical1 (u),
  5780. ffebld_constant_logical1 (ffebld_conter (l)),
  5781. ffebld_constant_logical1 (ffebld_conter (r)));
  5782. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
  5783. (ffebld_cu_val_logical1 (u)), expr);
  5784. break;
  5785. #endif
  5786. #if FFETARGET_okLOGICAL2
  5787. case FFEINFO_kindtypeLOGICAL2:
  5788. error = ffetarget_neqv_logical2 (ffebld_cu_ptr_logical2 (u),
  5789. ffebld_constant_logical2 (ffebld_conter (l)),
  5790. ffebld_constant_logical2 (ffebld_conter (r)));
  5791. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
  5792. (ffebld_cu_val_logical2 (u)), expr);
  5793. break;
  5794. #endif
  5795. #if FFETARGET_okLOGICAL3
  5796. case FFEINFO_kindtypeLOGICAL3:
  5797. error = ffetarget_neqv_logical3 (ffebld_cu_ptr_logical3 (u),
  5798. ffebld_constant_logical3 (ffebld_conter (l)),
  5799. ffebld_constant_logical3 (ffebld_conter (r)));
  5800. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
  5801. (ffebld_cu_val_logical3 (u)), expr);
  5802. break;
  5803. #endif
  5804. #if FFETARGET_okLOGICAL4
  5805. case FFEINFO_kindtypeLOGICAL4:
  5806. error = ffetarget_neqv_logical4 (ffebld_cu_ptr_logical4 (u),
  5807. ffebld_constant_logical4 (ffebld_conter (l)),
  5808. ffebld_constant_logical4 (ffebld_conter (r)));
  5809. expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
  5810. (ffebld_cu_val_logical4 (u)), expr);
  5811. break;
  5812. #endif
  5813. default:
  5814. assert ("bad logical kind type" == NULL);
  5815. break;
  5816. }
  5817. break;
  5818. default:
  5819. assert ("bad type" == NULL);
  5820. return expr;
  5821. }
  5822. ffebld_set_info (expr, ffeinfo_new
  5823. (bt,
  5824. kt,
  5825. 0,
  5826. FFEINFO_kindENTITY,
  5827. FFEINFO_whereCONSTANT,
  5828. FFETARGET_charactersizeNONE));
  5829. if ((error != FFEBAD)
  5830. && ffebad_start (error))
  5831. {
  5832. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  5833. ffebad_finish ();
  5834. }
  5835. return expr;
  5836. }
  5837. /* ffeexpr_collapse_symter -- Collapse symter expr
  5838. ffebld expr;
  5839. ffelexToken token;
  5840. expr = ffeexpr_collapse_symter(expr,token);
  5841. If the result of the expr is a constant, replaces the expr with the
  5842. computed constant. */
  5843. ffebld
  5844. ffeexpr_collapse_symter (ffebld expr, ffelexToken t UNUSED)
  5845. {
  5846. ffebld r;
  5847. ffeinfoBasictype bt;
  5848. ffeinfoKindtype kt;
  5849. ffetargetCharacterSize len;
  5850. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5851. return expr;
  5852. if ((r = ffesymbol_init (ffebld_symter (expr))) == NULL)
  5853. return expr; /* A PARAMETER lhs in progress. */
  5854. switch (ffebld_op (r))
  5855. {
  5856. case FFEBLD_opCONTER:
  5857. break;
  5858. case FFEBLD_opANY:
  5859. return r;
  5860. default:
  5861. return expr;
  5862. }
  5863. bt = ffeinfo_basictype (ffebld_info (r));
  5864. kt = ffeinfo_kindtype (ffebld_info (r));
  5865. len = ffebld_size (r);
  5866. expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
  5867. expr);
  5868. ffebld_set_info (expr, ffeinfo_new
  5869. (bt,
  5870. kt,
  5871. 0,
  5872. FFEINFO_kindENTITY,
  5873. FFEINFO_whereCONSTANT,
  5874. len));
  5875. return expr;
  5876. }
  5877. /* ffeexpr_collapse_funcref -- Collapse funcref expr
  5878. ffebld expr;
  5879. ffelexToken token;
  5880. expr = ffeexpr_collapse_funcref(expr,token);
  5881. If the result of the expr is a constant, replaces the expr with the
  5882. computed constant. */
  5883. ffebld
  5884. ffeexpr_collapse_funcref (ffebld expr, ffelexToken t UNUSED)
  5885. {
  5886. return expr; /* ~~someday go ahead and collapse these,
  5887. though not required */
  5888. }
  5889. /* ffeexpr_collapse_arrayref -- Collapse arrayref expr
  5890. ffebld expr;
  5891. ffelexToken token;
  5892. expr = ffeexpr_collapse_arrayref(expr,token);
  5893. If the result of the expr is a constant, replaces the expr with the
  5894. computed constant. */
  5895. ffebld
  5896. ffeexpr_collapse_arrayref (ffebld expr, ffelexToken t UNUSED)
  5897. {
  5898. return expr;
  5899. }
  5900. /* ffeexpr_collapse_substr -- Collapse substr expr
  5901. ffebld expr;
  5902. ffelexToken token;
  5903. expr = ffeexpr_collapse_substr(expr,token);
  5904. If the result of the expr is a constant, replaces the expr with the
  5905. computed constant. */
  5906. ffebld
  5907. ffeexpr_collapse_substr (ffebld expr, ffelexToken t)
  5908. {
  5909. ffebad error = FFEBAD;
  5910. ffebld l;
  5911. ffebld r;
  5912. ffebld start;
  5913. ffebld stop;
  5914. ffebldConstantUnion u;
  5915. ffeinfoKindtype kt;
  5916. ffetargetCharacterSize len;
  5917. ffetargetIntegerDefault first;
  5918. ffetargetIntegerDefault last;
  5919. if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
  5920. return expr;
  5921. l = ffebld_left (expr);
  5922. r = ffebld_right (expr); /* opITEM. */
  5923. if (ffebld_op (l) != FFEBLD_opCONTER)
  5924. return expr;
  5925. kt = ffeinfo_kindtype (ffebld_info (l));
  5926. len = ffebld_size (l);
  5927. start = ffebld_head (r);
  5928. stop = ffebld_head (ffebld_trail (r));
  5929. if (start == NULL)
  5930. first = 1;
  5931. else
  5932. {
  5933. if ((ffebld_op (start) != FFEBLD_opCONTER)
  5934. || (ffeinfo_basictype (ffebld_info (start)) != FFEINFO_basictypeINTEGER)
  5935. || (ffeinfo_kindtype (ffebld_info (start))
  5936. != FFEINFO_kindtypeINTEGERDEFAULT))
  5937. return expr;
  5938. first = ffebld_constant_integerdefault (ffebld_conter (start));
  5939. }
  5940. if (stop == NULL)
  5941. last = len;
  5942. else
  5943. {
  5944. if ((ffebld_op (stop) != FFEBLD_opCONTER)
  5945. || (ffeinfo_basictype (ffebld_info (stop)) != FFEINFO_basictypeINTEGER)
  5946. || (ffeinfo_kindtype (ffebld_info (stop))
  5947. != FFEINFO_kindtypeINTEGERDEFAULT))
  5948. return expr;
  5949. last = ffebld_constant_integerdefault (ffebld_conter (stop));
  5950. }
  5951. /* Handle problems that should have already been diagnosed, but
  5952. left in the expression tree. */
  5953. if (first <= 0)
  5954. first = 1;
  5955. if (last < first)
  5956. last = first + len - 1;
  5957. if ((first == 1) && (last == len))
  5958. { /* Same as original. */
  5959. expr = ffebld_new_conter_with_orig (ffebld_constant_copy
  5960. (ffebld_conter (l)), expr);
  5961. ffebld_set_info (expr, ffeinfo_new
  5962. (FFEINFO_basictypeCHARACTER,
  5963. kt,
  5964. 0,
  5965. FFEINFO_kindENTITY,
  5966. FFEINFO_whereCONSTANT,
  5967. len));
  5968. return expr;
  5969. }
  5970. switch (ffeinfo_basictype (ffebld_info (expr)))
  5971. {
  5972. case FFEINFO_basictypeANY:
  5973. return expr;
  5974. case FFEINFO_basictypeCHARACTER:
  5975. switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
  5976. {
  5977. #if FFETARGET_okCHARACTER1
  5978. case FFEINFO_kindtypeCHARACTER1:
  5979. error = ffetarget_substr_character1 (ffebld_cu_ptr_character1 (u),
  5980. ffebld_constant_character1 (ffebld_conter (l)), first, last,
  5981. ffebld_constant_pool (), &len);
  5982. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
  5983. (ffebld_cu_val_character1 (u)), expr);
  5984. break;
  5985. #endif
  5986. #if FFETARGET_okCHARACTER2
  5987. case FFEINFO_kindtypeCHARACTER2:
  5988. error = ffetarget_substr_character2 (ffebld_cu_ptr_character2 (u),
  5989. ffebld_constant_character2 (ffebld_conter (l)), first, last,
  5990. ffebld_constant_pool (), &len);
  5991. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character2_val
  5992. (ffebld_cu_val_character2 (u)), expr);
  5993. break;
  5994. #endif
  5995. #if FFETARGET_okCHARACTER3
  5996. case FFEINFO_kindtypeCHARACTER3:
  5997. error = ffetarget_substr_character3 (ffebld_cu_ptr_character3 (u),
  5998. ffebld_constant_character3 (ffebld_conter (l)), first, last,
  5999. ffebld_constant_pool (), &len);
  6000. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character3_val
  6001. (ffebld_cu_val_character3 (u)), expr);
  6002. break;
  6003. #endif
  6004. #if FFETARGET_okCHARACTER4
  6005. case FFEINFO_kindtypeCHARACTER4:
  6006. error = ffetarget_substr_character4 (ffebld_cu_ptr_character4 (u),
  6007. ffebld_constant_character4 (ffebld_conter (l)), first, last,
  6008. ffebld_constant_pool (), &len);
  6009. expr = ffebld_new_conter_with_orig (ffebld_constant_new_character4_val
  6010. (ffebld_cu_val_character4 (u)), expr);
  6011. break;
  6012. #endif
  6013. default:
  6014. assert ("bad character kind type" == NULL);
  6015. break;
  6016. }
  6017. break;
  6018. default:
  6019. assert ("bad type" == NULL);
  6020. return expr;
  6021. }
  6022. ffebld_set_info (expr, ffeinfo_new
  6023. (FFEINFO_basictypeCHARACTER,
  6024. kt,
  6025. 0,
  6026. FFEINFO_kindENTITY,
  6027. FFEINFO_whereCONSTANT,
  6028. len));
  6029. if ((error != FFEBAD)
  6030. && ffebad_start (error))
  6031. {
  6032. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6033. ffebad_finish ();
  6034. }
  6035. return expr;
  6036. }
  6037. /* ffeexpr_convert -- Convert source expression to given type
  6038. ffebld source;
  6039. ffelexToken source_token;
  6040. ffelexToken dest_token; // Any appropriate token for "destination".
  6041. ffeinfoBasictype bt;
  6042. ffeinfoKindtype kt;
  6043. ffetargetCharactersize sz;
  6044. ffeexprContext context; // Mainly LET or DATA.
  6045. source = ffeexpr_convert(source,source_token,dest_token,bt,kt,sz,context);
  6046. If the expression conforms, returns the source expression. Otherwise
  6047. returns source wrapped in a convert node doing the conversion, or
  6048. ANY wrapped in convert if there is a conversion error (and issues an
  6049. error message). Be sensitive to the context for certain aspects of
  6050. the conversion. */
  6051. ffebld
  6052. ffeexpr_convert (ffebld source, ffelexToken source_token, ffelexToken dest_token,
  6053. ffeinfoBasictype bt, ffeinfoKindtype kt, ffeinfoRank rk,
  6054. ffetargetCharacterSize sz, ffeexprContext context)
  6055. {
  6056. bool bad;
  6057. ffeinfo info;
  6058. ffeinfoWhere wh;
  6059. info = ffebld_info (source);
  6060. if ((bt != ffeinfo_basictype (info))
  6061. || (kt != ffeinfo_kindtype (info))
  6062. || (rk != 0) /* Can't convert from or to arrays yet. */
  6063. || (ffeinfo_rank (info) != 0)
  6064. || (sz != ffebld_size_known (source)))
  6065. #if 0 /* Nobody seems to need this spurious CONVERT node. */
  6066. || ((context != FFEEXPR_contextLET)
  6067. && (bt == FFEINFO_basictypeCHARACTER)
  6068. && (sz == FFETARGET_charactersizeNONE)))
  6069. #endif
  6070. {
  6071. switch (ffeinfo_basictype (info))
  6072. {
  6073. case FFEINFO_basictypeLOGICAL:
  6074. switch (bt)
  6075. {
  6076. case FFEINFO_basictypeLOGICAL:
  6077. bad = FALSE;
  6078. break;
  6079. case FFEINFO_basictypeINTEGER:
  6080. bad = !ffe_is_ugly_logint ();
  6081. break;
  6082. case FFEINFO_basictypeCHARACTER:
  6083. bad = ffe_is_pedantic ()
  6084. || !(ffe_is_ugly_init ()
  6085. && (context == FFEEXPR_contextDATA));
  6086. break;
  6087. default:
  6088. bad = TRUE;
  6089. break;
  6090. }
  6091. break;
  6092. case FFEINFO_basictypeINTEGER:
  6093. switch (bt)
  6094. {
  6095. case FFEINFO_basictypeINTEGER:
  6096. case FFEINFO_basictypeREAL:
  6097. case FFEINFO_basictypeCOMPLEX:
  6098. bad = FALSE;
  6099. break;
  6100. case FFEINFO_basictypeLOGICAL:
  6101. bad = !ffe_is_ugly_logint ();
  6102. break;
  6103. case FFEINFO_basictypeCHARACTER:
  6104. bad = ffe_is_pedantic ()
  6105. || !(ffe_is_ugly_init ()
  6106. && (context == FFEEXPR_contextDATA));
  6107. break;
  6108. default:
  6109. bad = TRUE;
  6110. break;
  6111. }
  6112. break;
  6113. case FFEINFO_basictypeREAL:
  6114. case FFEINFO_basictypeCOMPLEX:
  6115. switch (bt)
  6116. {
  6117. case FFEINFO_basictypeINTEGER:
  6118. case FFEINFO_basictypeREAL:
  6119. case FFEINFO_basictypeCOMPLEX:
  6120. bad = FALSE;
  6121. break;
  6122. case FFEINFO_basictypeCHARACTER:
  6123. bad = TRUE;
  6124. break;
  6125. default:
  6126. bad = TRUE;
  6127. break;
  6128. }
  6129. break;
  6130. case FFEINFO_basictypeCHARACTER:
  6131. bad = (bt != FFEINFO_basictypeCHARACTER)
  6132. && (ffe_is_pedantic ()
  6133. || (bt != FFEINFO_basictypeINTEGER)
  6134. || !(ffe_is_ugly_init ()
  6135. && (context == FFEEXPR_contextDATA)));
  6136. break;
  6137. case FFEINFO_basictypeTYPELESS:
  6138. case FFEINFO_basictypeHOLLERITH:
  6139. bad = ffe_is_pedantic ()
  6140. || !(ffe_is_ugly_init ()
  6141. && ((context == FFEEXPR_contextDATA)
  6142. || (context == FFEEXPR_contextLET)));
  6143. break;
  6144. default:
  6145. bad = TRUE;
  6146. break;
  6147. }
  6148. if (!bad && ((rk != 0) || (ffeinfo_rank (info) != 0)))
  6149. bad = TRUE;
  6150. if (bad && (bt != FFEINFO_basictypeANY) && (kt != FFEINFO_kindtypeANY)
  6151. && (ffeinfo_basictype (info) != FFEINFO_basictypeANY)
  6152. && (ffeinfo_kindtype (info) != FFEINFO_kindtypeANY)
  6153. && (ffeinfo_where (info) != FFEINFO_whereANY))
  6154. {
  6155. if (ffebad_start (FFEBAD_BAD_TYPES))
  6156. {
  6157. if (dest_token == NULL)
  6158. ffebad_here (0, ffewhere_line_unknown (),
  6159. ffewhere_column_unknown ());
  6160. else
  6161. ffebad_here (0, ffelex_token_where_line (dest_token),
  6162. ffelex_token_where_column (dest_token));
  6163. assert (source_token != NULL);
  6164. ffebad_here (1, ffelex_token_where_line (source_token),
  6165. ffelex_token_where_column (source_token));
  6166. ffebad_finish ();
  6167. }
  6168. source = ffebld_new_any ();
  6169. ffebld_set_info (source, ffeinfo_new_any ());
  6170. }
  6171. else
  6172. {
  6173. switch (ffeinfo_where (info))
  6174. {
  6175. case FFEINFO_whereCONSTANT:
  6176. wh = FFEINFO_whereCONSTANT;
  6177. break;
  6178. case FFEINFO_whereIMMEDIATE:
  6179. wh = FFEINFO_whereIMMEDIATE;
  6180. break;
  6181. default:
  6182. wh = FFEINFO_whereFLEETING;
  6183. break;
  6184. }
  6185. source = ffebld_new_convert (source);
  6186. ffebld_set_info (source, ffeinfo_new
  6187. (bt,
  6188. kt,
  6189. 0,
  6190. FFEINFO_kindENTITY,
  6191. wh,
  6192. sz));
  6193. source = ffeexpr_collapse_convert (source, source_token);
  6194. }
  6195. }
  6196. return source;
  6197. }
  6198. /* ffeexpr_convert_expr -- Convert source expr to conform to dest expr
  6199. ffebld source;
  6200. ffebld dest;
  6201. ffelexToken source_token;
  6202. ffelexToken dest_token;
  6203. ffeexprContext context;
  6204. source = ffeexpr_convert_expr(source,source_token,dest,dest_token,context);
  6205. If the expressions conform, returns the source expression. Otherwise
  6206. returns source wrapped in a convert node doing the conversion, or
  6207. ANY wrapped in convert if there is a conversion error (and issues an
  6208. error message). Be sensitive to the context, such as LET or DATA. */
  6209. ffebld
  6210. ffeexpr_convert_expr (ffebld source, ffelexToken source_token, ffebld dest,
  6211. ffelexToken dest_token, ffeexprContext context)
  6212. {
  6213. ffeinfo info;
  6214. info = ffebld_info (dest);
  6215. return ffeexpr_convert (source, source_token, dest_token,
  6216. ffeinfo_basictype (info),
  6217. ffeinfo_kindtype (info),
  6218. ffeinfo_rank (info),
  6219. ffebld_size_known (dest),
  6220. context);
  6221. }
  6222. /* ffeexpr_convert_to_sym -- Convert source expression to conform to symbol
  6223. ffebld source;
  6224. ffesymbol dest;
  6225. ffelexToken source_token;
  6226. ffelexToken dest_token;
  6227. source = ffeexpr_convert_to_sym(source,source_token,dest,dest_token);
  6228. If the expressions conform, returns the source expression. Otherwise
  6229. returns source wrapped in a convert node doing the conversion, or
  6230. ANY wrapped in convert if there is a conversion error (and issues an
  6231. error message). */
  6232. ffebld
  6233. ffeexpr_convert_to_sym (ffebld source, ffelexToken source_token,
  6234. ffesymbol dest, ffelexToken dest_token)
  6235. {
  6236. return ffeexpr_convert (source, source_token, dest_token, ffesymbol_basictype (dest),
  6237. ffesymbol_kindtype (dest), ffesymbol_rank (dest), ffesymbol_size (dest),
  6238. FFEEXPR_contextLET);
  6239. }
  6240. /* Initializes the module. */
  6241. void
  6242. ffeexpr_init_2 ()
  6243. {
  6244. ffeexpr_stack_ = NULL;
  6245. ffeexpr_level_ = 0;
  6246. }
  6247. /* ffeexpr_lhs -- Begin processing left-hand-side-context expression
  6248. Prepares cluster for delivery of lexer tokens representing an expression
  6249. in a left-hand-side context (A in A=B, for example). ffebld is used
  6250. to build expressions in the given pool. The appropriate lexer-token
  6251. handling routine within ffeexpr is returned. When the end of the
  6252. expression is detected, mycallbackroutine is called with the resulting
  6253. single ffebld object specifying the entire expression and the first
  6254. lexer token that is not considered part of the expression. This caller-
  6255. supplied routine itself returns a lexer-token handling routine. Thus,
  6256. if necessary, ffeexpr can return several tokens as end-of-expression
  6257. tokens if it needs to scan forward more than one in any instance. */
  6258. ffelexHandler
  6259. ffeexpr_lhs (mallocPool pool, ffeexprContext context, ffeexprCallback callback)
  6260. {
  6261. ffeexprStack_ s;
  6262. ffebld_pool_push (pool);
  6263. s = malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s));
  6264. s->previous = ffeexpr_stack_;
  6265. s->pool = pool;
  6266. s->context = context;
  6267. s->callback = callback;
  6268. s->first_token = NULL;
  6269. s->exprstack = NULL;
  6270. s->is_rhs = FALSE;
  6271. ffeexpr_stack_ = s;
  6272. return (ffelexHandler) ffeexpr_token_first_lhs_;
  6273. }
  6274. /* ffeexpr_rhs -- Begin processing right-hand-side-context expression
  6275. return ffeexpr_rhs(malloc_pool_image(),mycallbackroutine); // to lexer.
  6276. Prepares cluster for delivery of lexer tokens representing an expression
  6277. in a right-hand-side context (B in A=B, for example). ffebld is used
  6278. to build expressions in the given pool. The appropriate lexer-token
  6279. handling routine within ffeexpr is returned. When the end of the
  6280. expression is detected, mycallbackroutine is called with the resulting
  6281. single ffebld object specifying the entire expression and the first
  6282. lexer token that is not considered part of the expression. This caller-
  6283. supplied routine itself returns a lexer-token handling routine. Thus,
  6284. if necessary, ffeexpr can return several tokens as end-of-expression
  6285. tokens if it needs to scan forward more than one in any instance. */
  6286. ffelexHandler
  6287. ffeexpr_rhs (mallocPool pool, ffeexprContext context, ffeexprCallback callback)
  6288. {
  6289. ffeexprStack_ s;
  6290. ffebld_pool_push (pool);
  6291. s = malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s));
  6292. s->previous = ffeexpr_stack_;
  6293. s->pool = pool;
  6294. s->context = context;
  6295. s->callback = callback;
  6296. s->first_token = NULL;
  6297. s->exprstack = NULL;
  6298. s->is_rhs = TRUE;
  6299. ffeexpr_stack_ = s;
  6300. return (ffelexHandler) ffeexpr_token_first_rhs_;
  6301. }
  6302. /* ffeexpr_cb_close_paren_ -- OPEN_PAREN expr
  6303. Pass it to ffeexpr_rhs as the callback routine.
  6304. Makes sure the end token is close-paren and swallows it, else issues
  6305. an error message and doesn't swallow the token (passing it along instead).
  6306. In either case wraps up subexpression construction by enclosing the
  6307. ffebld expression in a paren. */
  6308. static ffelexHandler
  6309. ffeexpr_cb_close_paren_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6310. {
  6311. ffeexprExpr_ e;
  6312. if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
  6313. {
  6314. /* Oops, naughty user didn't specify the close paren! */
  6315. if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
  6316. {
  6317. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6318. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
  6319. ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
  6320. ffebad_finish ();
  6321. }
  6322. e = ffeexpr_expr_new_ ();
  6323. e->type = FFEEXPR_exprtypeOPERAND_;
  6324. e->u.operand = ffebld_new_any ();
  6325. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  6326. ffeexpr_exprstack_push_operand_ (e);
  6327. return
  6328. (ffelexHandler) ffeexpr_find_close_paren_ (t,
  6329. (ffelexHandler)
  6330. ffeexpr_token_binary_);
  6331. }
  6332. if (expr->op == FFEBLD_opIMPDO)
  6333. {
  6334. if (ffest_ffebad_start (FFEBAD_IMPDO_PAREN))
  6335. {
  6336. ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
  6337. ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
  6338. ffebad_finish ();
  6339. }
  6340. }
  6341. else
  6342. {
  6343. expr = ffebld_new_paren (expr);
  6344. ffebld_set_info (expr, ffeinfo_use (ffebld_info (ffebld_left (expr))));
  6345. }
  6346. /* Now push the (parenthesized) expression as an operand onto the
  6347. expression stack. */
  6348. e = ffeexpr_expr_new_ ();
  6349. e->type = FFEEXPR_exprtypeOPERAND_;
  6350. e->u.operand = expr;
  6351. e->u.operand = ffeexpr_collapse_paren (e->u.operand, ft);
  6352. e->token = ffeexpr_stack_->tokens[0];
  6353. ffeexpr_exprstack_push_operand_ (e);
  6354. return (ffelexHandler) ffeexpr_token_binary_;
  6355. }
  6356. /* ffeexpr_cb_close_paren_ambig_ -- OPEN_PAREN expr
  6357. Pass it to ffeexpr_rhs as the callback routine.
  6358. We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
  6359. with the next token in t. If the next token is possibly a binary
  6360. operator, continue processing the outer expression. If the next
  6361. token is COMMA, then the expression is a unit specifier, and
  6362. parentheses should not be added to it because it surrounds the
  6363. I/O control list that starts with the unit specifier (and continues
  6364. on from here -- we haven't seen the CLOSE_PAREN that matches the
  6365. OPEN_PAREN, it is up to the callback function to expect to see it
  6366. at some point). In this case, we notify the callback function that
  6367. the COMMA is inside, not outside, the parens by wrapping the expression
  6368. in an opITEM (with a NULL trail) -- the callback function presumably
  6369. unwraps it after seeing this kludgey indicator.
  6370. If the next token is CLOSE_PAREN, then we go to the _1_ state to
  6371. decide what to do with the token after that.
  6372. 15-Feb-91 JCB 1.1
  6373. Use an extra state for the CLOSE_PAREN case to make READ &co really
  6374. work right. */
  6375. static ffelexHandler
  6376. ffeexpr_cb_close_paren_ambig_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6377. {
  6378. ffeexprCallback callback;
  6379. ffeexprStack_ s;
  6380. if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
  6381. { /* Need to see the next token before we
  6382. decide anything. */
  6383. ffeexpr_stack_->expr = expr;
  6384. ffeexpr_tokens_[0] = ffelex_token_use (ft);
  6385. ffeexpr_tokens_[1] = ffelex_token_use (t);
  6386. return (ffelexHandler) ffeexpr_cb_close_paren_ambig_1_;
  6387. }
  6388. expr = ffeexpr_finished_ambig_ (ft, expr);
  6389. /* Let the callback function handle the case where t isn't COMMA. */
  6390. /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
  6391. that preceded the expression starts a list of expressions, and the expr
  6392. hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
  6393. node. The callback function should extract the real expr from the head
  6394. of this opITEM node after testing it. */
  6395. expr = ffebld_new_item (expr, NULL);
  6396. ffebld_pool_pop ();
  6397. callback = ffeexpr_stack_->callback;
  6398. ffelex_token_kill (ffeexpr_stack_->first_token);
  6399. s = ffeexpr_stack_->previous;
  6400. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
  6401. ffeexpr_stack_ = s;
  6402. return (ffelexHandler) (*callback) (ft, expr, t);
  6403. }
  6404. /* ffeexpr_cb_close_paren_ambig_1_ -- OPEN_PAREN expr CLOSE_PAREN
  6405. See ffeexpr_cb_close_paren_ambig_.
  6406. We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
  6407. with the next token in t. If the next token is possibly a binary
  6408. operator, continue processing the outer expression. If the next
  6409. token is COMMA, the expression is a parenthesized format specifier.
  6410. If the next token is not EOS or SEMICOLON, then because it is not a
  6411. binary operator (it is NAME, OPEN_PAREN, &c), the expression is
  6412. a unit specifier, and parentheses should not be added to it because
  6413. they surround the I/O control list that consists of only the unit
  6414. specifier. If the next token is EOS or SEMICOLON, the statement
  6415. must be disambiguated by looking at the type of the expression -- a
  6416. character expression is a parenthesized format specifier, while a
  6417. non-character expression is a unit specifier.
  6418. Another issue is how to do the callback so the recipient of the
  6419. next token knows how to handle it if it is a COMMA. In all other
  6420. cases, disambiguation is straightforward: the same approach as the
  6421. above is used.
  6422. EXTENSION: in COMMA case, if not pedantic, use same disambiguation
  6423. as for EOS/SEMICOLON case; f2c allows "READ (cilist) [[,]iolist]"
  6424. and apparently other compilers do, as well, and some code out there
  6425. uses this "feature".
  6426. 19-Feb-91 JCB 1.1
  6427. Extend to allow COMMA as nondisambiguating by itself. Remember
  6428. to not try and check info field for opSTAR, since that expr doesn't
  6429. have a valid info field. */
  6430. static ffelexHandler
  6431. ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t)
  6432. {
  6433. ffeexprCallback callback;
  6434. ffeexprStack_ s;
  6435. ffelexHandler next;
  6436. ffelexToken orig_ft = ffeexpr_tokens_[0]; /* In case callback clobbers
  6437. these. */
  6438. ffelexToken orig_t = ffeexpr_tokens_[1];
  6439. ffebld expr = ffeexpr_stack_->expr;
  6440. switch (ffelex_token_type (t))
  6441. {
  6442. case FFELEX_typeCOMMA: /* Subexpr is parenthesized format specifier. */
  6443. if (ffe_is_pedantic ())
  6444. goto pedantic_comma; /* :::::::::::::::::::: */
  6445. /* Fall through. */
  6446. case FFELEX_typeEOS: /* Ambiguous; use type of expr to
  6447. disambiguate. */
  6448. case FFELEX_typeSEMICOLON:
  6449. if ((expr == NULL) || (ffebld_op (expr) == FFEBLD_opANY)
  6450. || (ffebld_op (expr) == FFEBLD_opSTAR)
  6451. || (ffeinfo_basictype (ffebld_info (expr))
  6452. != FFEINFO_basictypeCHARACTER))
  6453. break; /* Not a valid CHARACTER entity, can't be a
  6454. format spec. */
  6455. /* Fall through. */
  6456. default: /* Binary op (we assume; error otherwise);
  6457. format specifier. */
  6458. pedantic_comma: /* :::::::::::::::::::: */
  6459. switch (ffeexpr_stack_->context)
  6460. {
  6461. case FFEEXPR_contextFILENUMAMBIG:
  6462. ffeexpr_stack_->context = FFEEXPR_contextFILENUM;
  6463. break;
  6464. case FFEEXPR_contextFILEUNITAMBIG:
  6465. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  6466. break;
  6467. default:
  6468. assert ("bad context" == NULL);
  6469. break;
  6470. }
  6471. ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
  6472. next = (ffelexHandler) ffeexpr_cb_close_paren_ (orig_ft, expr, orig_t);
  6473. ffelex_token_kill (orig_ft);
  6474. ffelex_token_kill (orig_t);
  6475. return (ffelexHandler) (*next) (t);
  6476. case FFELEX_typeOPEN_PAREN:/* Non-binary op; beginning of I/O list. */
  6477. case FFELEX_typeNAME:
  6478. break;
  6479. }
  6480. expr = ffeexpr_finished_ambig_ (orig_ft, expr);
  6481. /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
  6482. that preceded the expression starts a list of expressions, and the expr
  6483. hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
  6484. node. The callback function should extract the real expr from the head
  6485. of this opITEM node after testing it. */
  6486. expr = ffebld_new_item (expr, NULL);
  6487. ffebld_pool_pop ();
  6488. callback = ffeexpr_stack_->callback;
  6489. ffelex_token_kill (ffeexpr_stack_->first_token);
  6490. s = ffeexpr_stack_->previous;
  6491. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
  6492. ffeexpr_stack_ = s;
  6493. next = (ffelexHandler) (*callback) (orig_ft, expr, orig_t);
  6494. ffelex_token_kill (orig_ft);
  6495. ffelex_token_kill (orig_t);
  6496. return (ffelexHandler) (*next) (t);
  6497. }
  6498. /* ffeexpr_cb_close_paren_c_ -- OPEN_PAREN expr (possible complex)
  6499. Pass it to ffeexpr_rhs as the callback routine.
  6500. Makes sure the end token is close-paren and swallows it, or a comma
  6501. and handles complex/implied-do possibilities, else issues
  6502. an error message and doesn't swallow the token (passing it along instead). */
  6503. static ffelexHandler
  6504. ffeexpr_cb_close_paren_c_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6505. {
  6506. /* First check to see if this is a possible complex entity. It is if the
  6507. token is a comma. */
  6508. if (ffelex_token_type (t) == FFELEX_typeCOMMA)
  6509. {
  6510. ffeexpr_stack_->tokens[1] = ffelex_token_use (ft);
  6511. ffeexpr_stack_->expr = expr;
  6512. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6513. FFEEXPR_contextPAREN_, ffeexpr_cb_comma_c_);
  6514. }
  6515. return (ffelexHandler) ffeexpr_cb_close_paren_ (ft, expr, t);
  6516. }
  6517. /* ffeexpr_cb_comma_c_ -- OPEN_PAREN expr COMMA expr
  6518. Pass it to ffeexpr_rhs as the callback routine.
  6519. If this token is not a comma, we have a complex constant (or an attempt
  6520. at one), so handle it accordingly, displaying error messages if the token
  6521. is not a close-paren. */
  6522. static ffelexHandler
  6523. ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6524. {
  6525. ffeexprExpr_ e;
  6526. ffeinfoBasictype lty = (ffeexpr_stack_->expr == NULL)
  6527. ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (ffeexpr_stack_->expr));
  6528. ffeinfoBasictype rty = (expr == NULL)
  6529. ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (expr));
  6530. ffeinfoKindtype lkt;
  6531. ffeinfoKindtype rkt;
  6532. ffeinfoKindtype nkt;
  6533. bool ok = TRUE;
  6534. ffebld orig;
  6535. if ((ffeexpr_stack_->expr == NULL)
  6536. || (ffebld_op (ffeexpr_stack_->expr) != FFEBLD_opCONTER)
  6537. || (((orig = ffebld_conter_orig (ffeexpr_stack_->expr)) != NULL)
  6538. && (((ffebld_op (orig) != FFEBLD_opUMINUS)
  6539. && (ffebld_op (orig) != FFEBLD_opUPLUS))
  6540. || (ffebld_conter_orig (ffebld_left (orig)) != NULL)))
  6541. || ((lty != FFEINFO_basictypeINTEGER)
  6542. && (lty != FFEINFO_basictypeREAL)))
  6543. {
  6544. if ((lty != FFEINFO_basictypeANY)
  6545. && ffebad_start (FFEBAD_INVALID_COMPLEX_PART))
  6546. {
  6547. ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
  6548. ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
  6549. ffebad_string ("Real");
  6550. ffebad_finish ();
  6551. }
  6552. ok = FALSE;
  6553. }
  6554. if ((expr == NULL)
  6555. || (ffebld_op (expr) != FFEBLD_opCONTER)
  6556. || (((orig = ffebld_conter_orig (expr)) != NULL)
  6557. && (((ffebld_op (orig) != FFEBLD_opUMINUS)
  6558. && (ffebld_op (orig) != FFEBLD_opUPLUS))
  6559. || (ffebld_conter_orig (ffebld_left (orig)) != NULL)))
  6560. || ((rty != FFEINFO_basictypeINTEGER)
  6561. && (rty != FFEINFO_basictypeREAL)))
  6562. {
  6563. if ((rty != FFEINFO_basictypeANY)
  6564. && ffebad_start (FFEBAD_INVALID_COMPLEX_PART))
  6565. {
  6566. ffebad_here (0, ffelex_token_where_line (ft),
  6567. ffelex_token_where_column (ft));
  6568. ffebad_string ("Imaginary");
  6569. ffebad_finish ();
  6570. }
  6571. ok = FALSE;
  6572. }
  6573. ffelex_token_kill (ffeexpr_stack_->tokens[1]);
  6574. /* Push the (parenthesized) expression as an operand onto the expression
  6575. stack. */
  6576. e = ffeexpr_expr_new_ ();
  6577. e->type = FFEEXPR_exprtypeOPERAND_;
  6578. e->token = ffeexpr_stack_->tokens[0];
  6579. if (ok)
  6580. {
  6581. if (lty == FFEINFO_basictypeINTEGER)
  6582. lkt = FFEINFO_kindtypeREALDEFAULT;
  6583. else
  6584. lkt = ffeinfo_kindtype (ffebld_info (ffeexpr_stack_->expr));
  6585. if (rty == FFEINFO_basictypeINTEGER)
  6586. rkt = FFEINFO_kindtypeREALDEFAULT;
  6587. else
  6588. rkt = ffeinfo_kindtype (ffebld_info (expr));
  6589. nkt = ffeinfo_kindtype_max (FFEINFO_basictypeCOMPLEX, lkt, rkt);
  6590. ffeexpr_stack_->expr = ffeexpr_convert (ffeexpr_stack_->expr,
  6591. ffeexpr_stack_->tokens[1], ffeexpr_stack_->tokens[0],
  6592. FFEINFO_basictypeREAL, nkt, 0, FFETARGET_charactersizeNONE,
  6593. FFEEXPR_contextLET);
  6594. expr = ffeexpr_convert (expr,
  6595. ffeexpr_stack_->tokens[1], ffeexpr_stack_->tokens[0],
  6596. FFEINFO_basictypeREAL, nkt, 0, FFETARGET_charactersizeNONE,
  6597. FFEEXPR_contextLET);
  6598. }
  6599. else
  6600. nkt = FFEINFO_kindtypeANY;
  6601. switch (nkt)
  6602. {
  6603. #if FFETARGET_okCOMPLEX1
  6604. case FFEINFO_kindtypeREAL1:
  6605. e->u.operand = ffebld_new_conter (ffebld_constant_new_complex1
  6606. (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
  6607. ffebld_set_info (e->u.operand,
  6608. ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
  6609. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  6610. FFETARGET_charactersizeNONE));
  6611. break;
  6612. #endif
  6613. #if FFETARGET_okCOMPLEX2
  6614. case FFEINFO_kindtypeREAL2:
  6615. e->u.operand = ffebld_new_conter (ffebld_constant_new_complex2
  6616. (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
  6617. ffebld_set_info (e->u.operand,
  6618. ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
  6619. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  6620. FFETARGET_charactersizeNONE));
  6621. break;
  6622. #endif
  6623. #if FFETARGET_okCOMPLEX3
  6624. case FFEINFO_kindtypeREAL3:
  6625. e->u.operand = ffebld_new_conter (ffebld_constant_new_complex3
  6626. (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
  6627. ffebld_set_info (e->u.operand,
  6628. ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
  6629. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  6630. FFETARGET_charactersizeNONE));
  6631. break;
  6632. #endif
  6633. #if FFETARGET_okCOMPLEX4
  6634. case FFEINFO_kindtypeREAL4:
  6635. e->u.operand = ffebld_new_conter (ffebld_constant_new_complex4
  6636. (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
  6637. ffebld_set_info (e->u.operand,
  6638. ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
  6639. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  6640. FFETARGET_charactersizeNONE));
  6641. break;
  6642. #endif
  6643. default:
  6644. if (ffebad_start ((nkt == FFEINFO_kindtypeREALDOUBLE)
  6645. ? FFEBAD_BAD_DBLCMPLX : FFEBAD_BAD_COMPLEX))
  6646. {
  6647. ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
  6648. ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
  6649. ffebad_finish ();
  6650. }
  6651. /* Fall through. */
  6652. case FFEINFO_kindtypeANY:
  6653. e->u.operand = ffebld_new_any ();
  6654. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  6655. break;
  6656. }
  6657. ffeexpr_exprstack_push_operand_ (e);
  6658. /* Now, if the token is a close parenthese, we're in great shape so return
  6659. the next handler. */
  6660. if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
  6661. return (ffelexHandler) ffeexpr_token_binary_;
  6662. /* Oops, naughty user didn't specify the close paren! */
  6663. if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
  6664. {
  6665. ffebad_here (0, ffelex_token_where_line (t),
  6666. ffelex_token_where_column (t));
  6667. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
  6668. ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
  6669. ffebad_finish ();
  6670. }
  6671. return
  6672. (ffelexHandler) ffeexpr_find_close_paren_ (t,
  6673. (ffelexHandler)
  6674. ffeexpr_token_binary_);
  6675. }
  6676. /* ffeexpr_cb_close_paren_ci_ -- OPEN_PAREN expr (possible complex or
  6677. implied-DO construct)
  6678. Pass it to ffeexpr_rhs as the callback routine.
  6679. Makes sure the end token is close-paren and swallows it, or a comma
  6680. and handles complex/implied-do possibilities, else issues
  6681. an error message and doesn't swallow the token (passing it along instead). */
  6682. static ffelexHandler
  6683. ffeexpr_cb_close_paren_ci_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6684. {
  6685. ffeexprContext ctx;
  6686. /* First check to see if this is a possible complex or implied-DO entity.
  6687. It is if the token is a comma. */
  6688. if (ffelex_token_type (t) == FFELEX_typeCOMMA)
  6689. {
  6690. switch (ffeexpr_stack_->context)
  6691. {
  6692. case FFEEXPR_contextIOLIST:
  6693. case FFEEXPR_contextIMPDOITEM_:
  6694. ctx = FFEEXPR_contextIMPDOITEM_;
  6695. break;
  6696. case FFEEXPR_contextIOLISTDF:
  6697. case FFEEXPR_contextIMPDOITEMDF_:
  6698. ctx = FFEEXPR_contextIMPDOITEMDF_;
  6699. break;
  6700. default:
  6701. assert ("bad context" == NULL);
  6702. ctx = FFEEXPR_contextIMPDOITEM_;
  6703. break;
  6704. }
  6705. ffeexpr_stack_->tokens[0] = ffelex_token_use (ft);
  6706. ffeexpr_stack_->expr = expr;
  6707. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6708. ctx, ffeexpr_cb_comma_ci_);
  6709. }
  6710. ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
  6711. return (ffelexHandler) ffeexpr_cb_close_paren_ (ft, expr, t);
  6712. }
  6713. /* ffeexpr_cb_comma_ci_ -- OPEN_PAREN expr COMMA expr
  6714. Pass it to ffeexpr_rhs as the callback routine.
  6715. If this token is not a comma, we have a complex constant (or an attempt
  6716. at one), so handle it accordingly, displaying error messages if the token
  6717. is not a close-paren. If we have a comma here, it is an attempt at an
  6718. implied-DO, so start making a list accordingly. Oh, it might be an
  6719. equal sign also, meaning an implied-DO with only one item in its list. */
  6720. static ffelexHandler
  6721. ffeexpr_cb_comma_ci_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6722. {
  6723. ffebld fexpr;
  6724. /* First check to see if this is a possible complex constant. It is if the
  6725. token is not a comma or an equals sign, in which case it should be a
  6726. close-paren. */
  6727. if ((ffelex_token_type (t) != FFELEX_typeCOMMA)
  6728. && (ffelex_token_type (t) != FFELEX_typeEQUALS))
  6729. {
  6730. ffeexpr_stack_->tokens[1] = ffeexpr_stack_->tokens[0];
  6731. ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
  6732. return (ffelexHandler) ffeexpr_cb_comma_c_ (ft, expr, t);
  6733. }
  6734. /* Here we have either EQUALS or COMMA, meaning we are in an implied-DO
  6735. construct. Make a list and handle accordingly. */
  6736. ffelex_token_kill (ffeexpr_stack_->tokens[0]);
  6737. fexpr = ffeexpr_stack_->expr;
  6738. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  6739. ffebld_append_item (&ffeexpr_stack_->bottom, fexpr);
  6740. return (ffelexHandler) ffeexpr_cb_comma_i_1_ (ft, expr, t);
  6741. }
  6742. /* ffeexpr_cb_comma_i_ -- OPEN_PAREN expr
  6743. Pass it to ffeexpr_rhs as the callback routine.
  6744. Handle first item in an implied-DO construct. */
  6745. static ffelexHandler
  6746. ffeexpr_cb_comma_i_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6747. {
  6748. if (ffelex_token_type (t) != FFELEX_typeCOMMA)
  6749. {
  6750. if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
  6751. {
  6752. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6753. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  6754. ffelex_token_where_column (ffeexpr_stack_->first_token));
  6755. ffebad_finish ();
  6756. }
  6757. ffebld_end_list (&ffeexpr_stack_->bottom);
  6758. ffeexpr_stack_->expr = ffebld_new_any ();
  6759. ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
  6760. if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
  6761. return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
  6762. return (ffelexHandler) ffeexpr_cb_comma_i_5_;
  6763. }
  6764. return (ffelexHandler) ffeexpr_cb_comma_i_1_ (ft, expr, t);
  6765. }
  6766. /* ffeexpr_cb_comma_i_1_ -- OPEN_PAREN expr
  6767. Pass it to ffeexpr_rhs as the callback routine.
  6768. Handle first item in an implied-DO construct. */
  6769. static ffelexHandler
  6770. ffeexpr_cb_comma_i_1_ (ffelexToken ft, ffebld expr, ffelexToken t)
  6771. {
  6772. ffeexprContext ctxi;
  6773. ffeexprContext ctxc;
  6774. switch (ffeexpr_stack_->context)
  6775. {
  6776. case FFEEXPR_contextDATA:
  6777. case FFEEXPR_contextDATAIMPDOITEM_:
  6778. ctxi = FFEEXPR_contextDATAIMPDOITEM_;
  6779. ctxc = FFEEXPR_contextDATAIMPDOCTRL_;
  6780. break;
  6781. case FFEEXPR_contextIOLIST:
  6782. case FFEEXPR_contextIMPDOITEM_:
  6783. ctxi = FFEEXPR_contextIMPDOITEM_;
  6784. ctxc = FFEEXPR_contextIMPDOCTRL_;
  6785. break;
  6786. case FFEEXPR_contextIOLISTDF:
  6787. case FFEEXPR_contextIMPDOITEMDF_:
  6788. ctxi = FFEEXPR_contextIMPDOITEMDF_;
  6789. ctxc = FFEEXPR_contextIMPDOCTRL_;
  6790. break;
  6791. default:
  6792. assert ("bad context" == NULL);
  6793. ctxi = FFEEXPR_context;
  6794. ctxc = FFEEXPR_context;
  6795. break;
  6796. }
  6797. switch (ffelex_token_type (t))
  6798. {
  6799. case FFELEX_typeCOMMA:
  6800. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6801. if (ffeexpr_stack_->is_rhs)
  6802. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6803. ctxi, ffeexpr_cb_comma_i_1_);
  6804. return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
  6805. ctxi, ffeexpr_cb_comma_i_1_);
  6806. case FFELEX_typeEQUALS:
  6807. ffebld_end_list (&ffeexpr_stack_->bottom);
  6808. /* Complain if implied-DO variable in list of items to be read. */
  6809. if ((ctxc == FFEEXPR_contextIMPDOCTRL_) && !ffeexpr_stack_->is_rhs)
  6810. ffeexpr_check_impdo_ (ffeexpr_stack_->expr,
  6811. ffeexpr_stack_->first_token, expr, ft);
  6812. /* Set doiter flag for all appropriate SYMTERs. */
  6813. ffeexpr_update_impdo_ (ffeexpr_stack_->expr, expr);
  6814. ffeexpr_stack_->expr = ffebld_new_impdo (ffeexpr_stack_->expr, NULL);
  6815. ffebld_set_info (ffeexpr_stack_->expr,
  6816. ffeinfo_new (FFEINFO_basictypeNONE,
  6817. FFEINFO_kindtypeNONE,
  6818. 0,
  6819. FFEINFO_kindNONE,
  6820. FFEINFO_whereNONE,
  6821. FFETARGET_charactersizeNONE));
  6822. ffebld_init_list (&(ffebld_right (ffeexpr_stack_->expr)),
  6823. &ffeexpr_stack_->bottom);
  6824. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6825. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6826. ctxc, ffeexpr_cb_comma_i_2_);
  6827. default:
  6828. if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
  6829. {
  6830. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6831. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  6832. ffelex_token_where_column (ffeexpr_stack_->first_token));
  6833. ffebad_finish ();
  6834. }
  6835. ffebld_end_list (&ffeexpr_stack_->bottom);
  6836. ffeexpr_stack_->expr = ffebld_new_any ();
  6837. ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
  6838. if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
  6839. return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
  6840. return (ffelexHandler) ffeexpr_cb_comma_i_5_;
  6841. }
  6842. }
  6843. /* ffeexpr_cb_comma_i_2_ -- OPEN_PAREN expr-list EQUALS expr
  6844. Pass it to ffeexpr_rhs as the callback routine.
  6845. Handle start-value in an implied-DO construct. */
  6846. static ffelexHandler
  6847. ffeexpr_cb_comma_i_2_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
  6848. {
  6849. ffeexprContext ctx;
  6850. switch (ffeexpr_stack_->context)
  6851. {
  6852. case FFEEXPR_contextDATA:
  6853. case FFEEXPR_contextDATAIMPDOITEM_:
  6854. ctx = FFEEXPR_contextDATAIMPDOCTRL_;
  6855. break;
  6856. case FFEEXPR_contextIOLIST:
  6857. case FFEEXPR_contextIOLISTDF:
  6858. case FFEEXPR_contextIMPDOITEM_:
  6859. case FFEEXPR_contextIMPDOITEMDF_:
  6860. ctx = FFEEXPR_contextIMPDOCTRL_;
  6861. break;
  6862. default:
  6863. assert ("bad context" == NULL);
  6864. ctx = FFEEXPR_context;
  6865. break;
  6866. }
  6867. switch (ffelex_token_type (t))
  6868. {
  6869. case FFELEX_typeCOMMA:
  6870. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6871. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6872. ctx, ffeexpr_cb_comma_i_3_);
  6873. break;
  6874. default:
  6875. if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
  6876. {
  6877. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6878. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  6879. ffelex_token_where_column (ffeexpr_stack_->first_token));
  6880. ffebad_finish ();
  6881. }
  6882. ffebld_end_list (&ffeexpr_stack_->bottom);
  6883. ffeexpr_stack_->expr = ffebld_new_any ();
  6884. ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
  6885. if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
  6886. return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
  6887. return (ffelexHandler) ffeexpr_cb_comma_i_5_;
  6888. }
  6889. }
  6890. /* ffeexpr_cb_comma_i_3_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
  6891. Pass it to ffeexpr_rhs as the callback routine.
  6892. Handle end-value in an implied-DO construct. */
  6893. static ffelexHandler
  6894. ffeexpr_cb_comma_i_3_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
  6895. {
  6896. ffeexprContext ctx;
  6897. switch (ffeexpr_stack_->context)
  6898. {
  6899. case FFEEXPR_contextDATA:
  6900. case FFEEXPR_contextDATAIMPDOITEM_:
  6901. ctx = FFEEXPR_contextDATAIMPDOCTRL_;
  6902. break;
  6903. case FFEEXPR_contextIOLIST:
  6904. case FFEEXPR_contextIOLISTDF:
  6905. case FFEEXPR_contextIMPDOITEM_:
  6906. case FFEEXPR_contextIMPDOITEMDF_:
  6907. ctx = FFEEXPR_contextIMPDOCTRL_;
  6908. break;
  6909. default:
  6910. assert ("bad context" == NULL);
  6911. ctx = FFEEXPR_context;
  6912. break;
  6913. }
  6914. switch (ffelex_token_type (t))
  6915. {
  6916. case FFELEX_typeCOMMA:
  6917. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6918. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  6919. ctx, ffeexpr_cb_comma_i_4_);
  6920. break;
  6921. case FFELEX_typeCLOSE_PAREN:
  6922. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6923. return (ffelexHandler) ffeexpr_cb_comma_i_4_ (NULL, NULL, t);
  6924. break;
  6925. default:
  6926. if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
  6927. {
  6928. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6929. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  6930. ffelex_token_where_column (ffeexpr_stack_->first_token));
  6931. ffebad_finish ();
  6932. }
  6933. ffebld_end_list (&ffeexpr_stack_->bottom);
  6934. ffeexpr_stack_->expr = ffebld_new_any ();
  6935. ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
  6936. if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
  6937. return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
  6938. return (ffelexHandler) ffeexpr_cb_comma_i_5_;
  6939. }
  6940. }
  6941. /* ffeexpr_cb_comma_i_4_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
  6942. [COMMA expr]
  6943. Pass it to ffeexpr_rhs as the callback routine.
  6944. Handle incr-value in an implied-DO construct. */
  6945. static ffelexHandler
  6946. ffeexpr_cb_comma_i_4_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
  6947. {
  6948. switch (ffelex_token_type (t))
  6949. {
  6950. case FFELEX_typeCLOSE_PAREN:
  6951. ffebld_append_item (&ffeexpr_stack_->bottom, expr);
  6952. ffebld_end_list (&ffeexpr_stack_->bottom);
  6953. {
  6954. ffebld item;
  6955. for (item = ffebld_left (ffeexpr_stack_->expr);
  6956. item != NULL;
  6957. item = ffebld_trail (item))
  6958. if (ffebld_op (ffebld_head (item)) == FFEBLD_opANY)
  6959. goto replace_with_any; /* :::::::::::::::::::: */
  6960. for (item = ffebld_right (ffeexpr_stack_->expr);
  6961. item != NULL;
  6962. item = ffebld_trail (item))
  6963. if ((ffebld_head (item) != NULL) /* Increment may be NULL. */
  6964. && (ffebld_op (ffebld_head (item)) == FFEBLD_opANY))
  6965. goto replace_with_any; /* :::::::::::::::::::: */
  6966. }
  6967. break;
  6968. default:
  6969. if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
  6970. {
  6971. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  6972. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  6973. ffelex_token_where_column (ffeexpr_stack_->first_token));
  6974. ffebad_finish ();
  6975. }
  6976. ffebld_end_list (&ffeexpr_stack_->bottom);
  6977. replace_with_any: /* :::::::::::::::::::: */
  6978. ffeexpr_stack_->expr = ffebld_new_any ();
  6979. ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
  6980. break;
  6981. }
  6982. if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
  6983. return (ffelexHandler) ffeexpr_cb_comma_i_5_;
  6984. return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
  6985. }
  6986. /* ffeexpr_cb_comma_i_5_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
  6987. [COMMA expr] CLOSE_PAREN
  6988. Pass it to ffeexpr_rhs as the callback routine.
  6989. Collects token following implied-DO construct for callback function. */
  6990. static ffelexHandler
  6991. ffeexpr_cb_comma_i_5_ (ffelexToken t)
  6992. {
  6993. ffeexprCallback callback;
  6994. ffeexprStack_ s;
  6995. ffelexHandler next;
  6996. ffelexToken ft;
  6997. ffebld expr;
  6998. bool terminate;
  6999. switch (ffeexpr_stack_->context)
  7000. {
  7001. case FFEEXPR_contextDATA:
  7002. case FFEEXPR_contextDATAIMPDOITEM_:
  7003. terminate = TRUE;
  7004. break;
  7005. case FFEEXPR_contextIOLIST:
  7006. case FFEEXPR_contextIOLISTDF:
  7007. case FFEEXPR_contextIMPDOITEM_:
  7008. case FFEEXPR_contextIMPDOITEMDF_:
  7009. terminate = FALSE;
  7010. break;
  7011. default:
  7012. assert ("bad context" == NULL);
  7013. terminate = FALSE;
  7014. break;
  7015. }
  7016. ffebld_pool_pop ();
  7017. callback = ffeexpr_stack_->callback;
  7018. ft = ffeexpr_stack_->first_token;
  7019. expr = ffeexpr_stack_->expr;
  7020. s = ffeexpr_stack_->previous;
  7021. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
  7022. sizeof (*ffeexpr_stack_));
  7023. ffeexpr_stack_ = s;
  7024. next = (ffelexHandler) (*callback) (ft, expr, t);
  7025. ffelex_token_kill (ft);
  7026. if (terminate)
  7027. {
  7028. ffesymbol_drive_sfnames (ffeexpr_check_impctrl_);
  7029. --ffeexpr_level_;
  7030. if (ffeexpr_level_ == 0)
  7031. ffe_terminate_4 ();
  7032. }
  7033. return (ffelexHandler) next;
  7034. }
  7035. /* ffeexpr_cb_end_loc_ -- Handle end of %LOC subexpression
  7036. Makes sure the end token is close-paren and swallows it, else issues
  7037. an error message and doesn't swallow the token (passing it along instead).
  7038. In either case wraps up subexpression construction by enclosing the
  7039. ffebld expression in a %LOC. */
  7040. static ffelexHandler
  7041. ffeexpr_cb_end_loc_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
  7042. {
  7043. ffeexprExpr_ e;
  7044. /* First push the (%LOC) expression as an operand onto the expression
  7045. stack. */
  7046. e = ffeexpr_expr_new_ ();
  7047. e->type = FFEEXPR_exprtypeOPERAND_;
  7048. e->token = ffeexpr_stack_->tokens[0];
  7049. e->u.operand = ffebld_new_percent_loc (expr);
  7050. ffebld_set_info (e->u.operand,
  7051. ffeinfo_new (FFEINFO_basictypeINTEGER,
  7052. ffecom_pointer_kind (),
  7053. 0,
  7054. FFEINFO_kindENTITY,
  7055. FFEINFO_whereFLEETING,
  7056. FFETARGET_charactersizeNONE));
  7057. #if 0 /* ~~ */
  7058. e->u.operand = ffeexpr_collapse_percent_loc (e->u.operand, ft);
  7059. #endif
  7060. ffeexpr_exprstack_push_operand_ (e);
  7061. /* Now, if the token is a close parenthese, we're in great shape so return
  7062. the next handler. */
  7063. if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
  7064. {
  7065. ffelex_token_kill (ffeexpr_stack_->tokens[1]);
  7066. return (ffelexHandler) ffeexpr_token_binary_;
  7067. }
  7068. /* Oops, naughty user didn't specify the close paren! */
  7069. if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
  7070. {
  7071. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  7072. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
  7073. ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
  7074. ffebad_finish ();
  7075. }
  7076. ffelex_token_kill (ffeexpr_stack_->tokens[1]);
  7077. return
  7078. (ffelexHandler) ffeexpr_find_close_paren_ (t,
  7079. (ffelexHandler)
  7080. ffeexpr_token_binary_);
  7081. }
  7082. /* ffeexpr_cb_end_notloc_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
  7083. Should be CLOSE_PAREN, and make sure expr isn't a %(VAL,REF,DESCR). */
  7084. static ffelexHandler
  7085. ffeexpr_cb_end_notloc_ (ffelexToken ft, ffebld expr, ffelexToken t)
  7086. {
  7087. ffeexprExpr_ e;
  7088. ffebldOp op;
  7089. /* If expression is itself a %(VAL,REF,DESCR), complain and strip off all
  7090. such things until the lowest-level expression is reached. */
  7091. op = ffebld_op (expr);
  7092. if ((op == FFEBLD_opPERCENT_VAL) || (op == FFEBLD_opPERCENT_REF)
  7093. || (op == FFEBLD_opPERCENT_DESCR))
  7094. {
  7095. if (ffebad_start (FFEBAD_NESTED_PERCENT))
  7096. {
  7097. ffebad_here (0, ffelex_token_where_line (ft),
  7098. ffelex_token_where_column (ft));
  7099. ffebad_finish ();
  7100. }
  7101. do
  7102. {
  7103. expr = ffebld_left (expr);
  7104. op = ffebld_op (expr);
  7105. }
  7106. while ((op == FFEBLD_opPERCENT_VAL) || (op == FFEBLD_opPERCENT_REF)
  7107. || (op == FFEBLD_opPERCENT_DESCR));
  7108. }
  7109. /* Push the expression as an operand onto the expression stack. */
  7110. e = ffeexpr_expr_new_ ();
  7111. e->type = FFEEXPR_exprtypeOPERAND_;
  7112. e->token = ffeexpr_stack_->tokens[0];
  7113. switch (ffeexpr_stack_->percent)
  7114. {
  7115. case FFEEXPR_percentVAL_:
  7116. e->u.operand = ffebld_new_percent_val (expr);
  7117. break;
  7118. case FFEEXPR_percentREF_:
  7119. e->u.operand = ffebld_new_percent_ref (expr);
  7120. break;
  7121. case FFEEXPR_percentDESCR_:
  7122. e->u.operand = ffebld_new_percent_descr (expr);
  7123. break;
  7124. default:
  7125. assert ("%lossage" == NULL);
  7126. e->u.operand = expr;
  7127. break;
  7128. }
  7129. ffebld_set_info (e->u.operand, ffebld_info (expr));
  7130. #if 0 /* ~~ */
  7131. e->u.operand = ffeexpr_collapse_percent_ ? ? ? (e->u.operand, ft);
  7132. #endif
  7133. ffeexpr_exprstack_push_operand_ (e);
  7134. /* Now, if the token is a close parenthese, we're in great shape so return
  7135. the next handler. */
  7136. if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
  7137. return (ffelexHandler) ffeexpr_cb_end_notloc_1_;
  7138. /* Oops, naughty user didn't specify the close paren! */
  7139. if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
  7140. {
  7141. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  7142. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
  7143. ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
  7144. ffebad_finish ();
  7145. }
  7146. ffebld_set_op (e->u.operand, FFEBLD_opPERCENT_LOC);
  7147. switch (ffeexpr_stack_->context)
  7148. {
  7149. case FFEEXPR_contextACTUALARG_:
  7150. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7151. break;
  7152. case FFEEXPR_contextINDEXORACTUALARG_:
  7153. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7154. break;
  7155. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7156. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7157. break;
  7158. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7159. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7160. break;
  7161. default:
  7162. assert ("bad context?!?!" == NULL);
  7163. break;
  7164. }
  7165. ffelex_token_kill (ffeexpr_stack_->tokens[1]);
  7166. return
  7167. (ffelexHandler) ffeexpr_find_close_paren_ (t,
  7168. (ffelexHandler)
  7169. ffeexpr_cb_end_notloc_1_);
  7170. }
  7171. /* ffeexpr_cb_end_notloc_1_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
  7172. CLOSE_PAREN
  7173. Should be COMMA or CLOSE_PAREN, else change back to %LOC. */
  7174. static ffelexHandler
  7175. ffeexpr_cb_end_notloc_1_ (ffelexToken t)
  7176. {
  7177. switch (ffelex_token_type (t))
  7178. {
  7179. case FFELEX_typeCOMMA:
  7180. case FFELEX_typeCLOSE_PAREN:
  7181. switch (ffeexpr_stack_->context)
  7182. {
  7183. case FFEEXPR_contextACTUALARG_:
  7184. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7185. break;
  7186. case FFEEXPR_contextINDEXORACTUALARG_:
  7187. ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
  7188. break;
  7189. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7190. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
  7191. break;
  7192. default:
  7193. assert ("bad context?!?!" == NULL);
  7194. break;
  7195. }
  7196. break;
  7197. default:
  7198. if (ffebad_start (FFEBAD_INVALID_PERCENT))
  7199. {
  7200. ffebad_here (0,
  7201. ffelex_token_where_line (ffeexpr_stack_->first_token),
  7202. ffelex_token_where_column (ffeexpr_stack_->first_token));
  7203. ffebad_string (ffelex_token_text (ffeexpr_stack_->tokens[1]));
  7204. ffebad_finish ();
  7205. }
  7206. ffebld_set_op (ffeexpr_stack_->exprstack->u.operand,
  7207. FFEBLD_opPERCENT_LOC);
  7208. switch (ffeexpr_stack_->context)
  7209. {
  7210. case FFEEXPR_contextACTUALARG_:
  7211. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7212. break;
  7213. case FFEEXPR_contextINDEXORACTUALARG_:
  7214. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7215. break;
  7216. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7217. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7218. break;
  7219. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7220. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7221. break;
  7222. default:
  7223. assert ("bad context?!?!" == NULL);
  7224. break;
  7225. }
  7226. }
  7227. ffelex_token_kill (ffeexpr_stack_->tokens[1]);
  7228. return
  7229. (ffelexHandler) ffeexpr_token_binary_ (t);
  7230. }
  7231. /* Process DATA implied-DO iterator variables as this implied-DO level
  7232. terminates. At this point, ffeexpr_level_ == 1 when we see the
  7233. last right-paren in "DATA (A(I),I=1,10)/.../". */
  7234. static ffesymbol
  7235. ffeexpr_check_impctrl_ (ffesymbol s)
  7236. {
  7237. assert (s != NULL);
  7238. assert (ffesymbol_sfdummyparent (s) != NULL);
  7239. switch (ffesymbol_state (s))
  7240. {
  7241. case FFESYMBOL_stateNONE: /* Used as iterator already. Now let symbol
  7242. be used as iterator at any level at or
  7243. innermore than the outermost of the
  7244. current level and the symbol's current
  7245. level. */
  7246. if (ffeexpr_level_ < ffesymbol_maxentrynum (s))
  7247. {
  7248. ffesymbol_signal_change (s);
  7249. ffesymbol_set_maxentrynum (s, ffeexpr_level_);
  7250. ffesymbol_signal_unreported (s);
  7251. }
  7252. break;
  7253. case FFESYMBOL_stateSEEN: /* Seen already in this or other implied-DO.
  7254. Error if at outermost level, else it can
  7255. still become an iterator. */
  7256. if ((ffeexpr_level_ == 1)
  7257. && ffebad_start (FFEBAD_BAD_IMPDCL))
  7258. {
  7259. ffebad_string (ffesymbol_text (s));
  7260. ffebad_here (0, ffesymbol_where_line (s), ffesymbol_where_column (s));
  7261. ffebad_finish ();
  7262. }
  7263. break;
  7264. case FFESYMBOL_stateUNCERTAIN: /* Iterator. */
  7265. assert (ffeexpr_level_ <= ffesymbol_maxentrynum (s));
  7266. ffesymbol_signal_change (s);
  7267. ffesymbol_set_state (s, FFESYMBOL_stateNONE);
  7268. ffesymbol_signal_unreported (s);
  7269. break;
  7270. case FFESYMBOL_stateUNDERSTOOD:
  7271. break; /* ANY. */
  7272. default:
  7273. assert ("Sasha Foo!!" == NULL);
  7274. break;
  7275. }
  7276. return s;
  7277. }
  7278. /* Issue diagnostic if implied-DO variable appears in list of lhs
  7279. expressions (as in "READ *, (I,I=1,10)"). */
  7280. static void
  7281. ffeexpr_check_impdo_ (ffebld list, ffelexToken list_t,
  7282. ffebld dovar, ffelexToken dovar_t)
  7283. {
  7284. ffebld item;
  7285. ffesymbol dovar_sym;
  7286. int itemnum;
  7287. if (ffebld_op (dovar) != FFEBLD_opSYMTER)
  7288. return; /* Presumably opANY. */
  7289. dovar_sym = ffebld_symter (dovar);
  7290. for (itemnum = 1; list != NULL; list = ffebld_trail (list), ++itemnum)
  7291. {
  7292. if (((item = ffebld_head (list)) != NULL)
  7293. && (ffebld_op (item) == FFEBLD_opSYMTER)
  7294. && (ffebld_symter (item) == dovar_sym))
  7295. {
  7296. char itemno[20];
  7297. sprintf (&itemno[0], "%d", itemnum);
  7298. if (ffebad_start (FFEBAD_DOITER_IMPDO))
  7299. {
  7300. ffebad_here (0, ffelex_token_where_line (list_t),
  7301. ffelex_token_where_column (list_t));
  7302. ffebad_here (1, ffelex_token_where_line (dovar_t),
  7303. ffelex_token_where_column (dovar_t));
  7304. ffebad_string (ffesymbol_text (dovar_sym));
  7305. ffebad_string (itemno);
  7306. ffebad_finish ();
  7307. }
  7308. }
  7309. }
  7310. }
  7311. /* Decorate any SYMTERs referencing the DO variable with the "doiter"
  7312. flag. */
  7313. static void
  7314. ffeexpr_update_impdo_ (ffebld list, ffebld dovar)
  7315. {
  7316. ffesymbol dovar_sym;
  7317. if (ffebld_op (dovar) != FFEBLD_opSYMTER)
  7318. return; /* Presumably opANY. */
  7319. dovar_sym = ffebld_symter (dovar);
  7320. ffeexpr_update_impdo_sym_ (list, dovar_sym); /* Recurse! */
  7321. }
  7322. /* Recursive function to update any expr so SYMTERs have "doiter" flag
  7323. if they refer to the given variable. */
  7324. static void
  7325. ffeexpr_update_impdo_sym_ (ffebld expr, ffesymbol dovar)
  7326. {
  7327. tail_recurse: /* :::::::::::::::::::: */
  7328. if (expr == NULL)
  7329. return;
  7330. switch (ffebld_op (expr))
  7331. {
  7332. case FFEBLD_opSYMTER:
  7333. if (ffebld_symter (expr) == dovar)
  7334. ffebld_symter_set_is_doiter (expr, TRUE);
  7335. break;
  7336. case FFEBLD_opITEM:
  7337. ffeexpr_update_impdo_sym_ (ffebld_head (expr), dovar);
  7338. expr = ffebld_trail (expr);
  7339. goto tail_recurse; /* :::::::::::::::::::: */
  7340. default:
  7341. break;
  7342. }
  7343. switch (ffebld_arity (expr))
  7344. {
  7345. case 2:
  7346. ffeexpr_update_impdo_sym_ (ffebld_left (expr), dovar);
  7347. expr = ffebld_right (expr);
  7348. goto tail_recurse; /* :::::::::::::::::::: */
  7349. case 1:
  7350. expr = ffebld_left (expr);
  7351. goto tail_recurse; /* :::::::::::::::::::: */
  7352. default:
  7353. break;
  7354. }
  7355. return;
  7356. }
  7357. /* ffeexpr_context_outer_ -- Determine context of stack entry, skipping PARENs
  7358. if (ffeexpr_context_outer_(ffeexpr_stack_) == FFEEXPR_contextIF)
  7359. // After zero or more PAREN_ contexts, an IF context exists */
  7360. static ffeexprContext
  7361. ffeexpr_context_outer_ (ffeexprStack_ s)
  7362. {
  7363. assert (s != NULL);
  7364. for (;;)
  7365. {
  7366. switch (s->context)
  7367. {
  7368. case FFEEXPR_contextPAREN_:
  7369. case FFEEXPR_contextPARENFILENUM_:
  7370. case FFEEXPR_contextPARENFILEUNIT_:
  7371. break;
  7372. default:
  7373. return s->context;
  7374. }
  7375. s = s->previous;
  7376. assert (s != NULL);
  7377. }
  7378. }
  7379. /* ffeexpr_percent_ -- Look up name in list of %FOO possibilities
  7380. ffeexprPercent_ p;
  7381. ffelexToken t;
  7382. p = ffeexpr_percent_(t);
  7383. Returns the identifier for the name, or the NONE identifier. */
  7384. static ffeexprPercent_
  7385. ffeexpr_percent_ (ffelexToken t)
  7386. {
  7387. const char *p;
  7388. switch (ffelex_token_length (t))
  7389. {
  7390. case 3:
  7391. switch (*(p = ffelex_token_text (t)))
  7392. {
  7393. case FFESRC_CASE_MATCH_INIT ('L', 'l', match_3l, no_match_3):
  7394. if ((ffesrc_char_match_noninit (*++p, 'O', 'o'))
  7395. && (ffesrc_char_match_noninit (*++p, 'C', 'c')))
  7396. return FFEEXPR_percentLOC_;
  7397. return FFEEXPR_percentNONE_;
  7398. case FFESRC_CASE_MATCH_INIT ('R', 'r', match_3r, no_match_3):
  7399. if ((ffesrc_char_match_noninit (*++p, 'E', 'e'))
  7400. && (ffesrc_char_match_noninit (*++p, 'F', 'f')))
  7401. return FFEEXPR_percentREF_;
  7402. return FFEEXPR_percentNONE_;
  7403. case FFESRC_CASE_MATCH_INIT ('V', 'v', match_3v, no_match_3):
  7404. if ((ffesrc_char_match_noninit (*++p, 'A', 'a'))
  7405. && (ffesrc_char_match_noninit (*++p, 'L', 'l')))
  7406. return FFEEXPR_percentVAL_;
  7407. return FFEEXPR_percentNONE_;
  7408. default:
  7409. no_match_3: /* :::::::::::::::::::: */
  7410. return FFEEXPR_percentNONE_;
  7411. }
  7412. case 5:
  7413. if (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "DESCR",
  7414. "descr", "Descr") == 0)
  7415. return FFEEXPR_percentDESCR_;
  7416. return FFEEXPR_percentNONE_;
  7417. default:
  7418. return FFEEXPR_percentNONE_;
  7419. }
  7420. }
  7421. /* ffeexpr_type_combine -- Binop combine types, check for mythical new COMPLEX
  7422. See prototype.
  7423. If combining the two basictype/kindtype pairs produces a COMPLEX with an
  7424. unsupported kind type, complain and use the default kind type for
  7425. COMPLEX. */
  7426. void
  7427. ffeexpr_type_combine (ffeinfoBasictype *xnbt, ffeinfoKindtype *xnkt,
  7428. ffeinfoBasictype lbt, ffeinfoKindtype lkt,
  7429. ffeinfoBasictype rbt, ffeinfoKindtype rkt,
  7430. ffelexToken t)
  7431. {
  7432. ffeinfoBasictype nbt;
  7433. ffeinfoKindtype nkt;
  7434. nbt = ffeinfo_basictype_combine (lbt, rbt);
  7435. if ((nbt == FFEINFO_basictypeCOMPLEX)
  7436. && ((lbt == nbt) || (lbt == FFEINFO_basictypeREAL))
  7437. && ((rbt == nbt) || (rbt == FFEINFO_basictypeREAL)))
  7438. {
  7439. nkt = ffeinfo_kindtype_max (nbt, lkt, rkt);
  7440. if (ffe_is_pedantic_not_90 () && (nkt == FFEINFO_kindtypeREALDOUBLE))
  7441. nkt = FFEINFO_kindtypeNONE; /* Force error. */
  7442. switch (nkt)
  7443. {
  7444. #if FFETARGET_okCOMPLEX1
  7445. case FFEINFO_kindtypeREAL1:
  7446. #endif
  7447. #if FFETARGET_okCOMPLEX2
  7448. case FFEINFO_kindtypeREAL2:
  7449. #endif
  7450. #if FFETARGET_okCOMPLEX3
  7451. case FFEINFO_kindtypeREAL3:
  7452. #endif
  7453. #if FFETARGET_okCOMPLEX4
  7454. case FFEINFO_kindtypeREAL4:
  7455. #endif
  7456. break; /* Fine and dandy. */
  7457. default:
  7458. if (t != NULL)
  7459. {
  7460. ffebad_start ((nkt == FFEINFO_kindtypeREALDOUBLE)
  7461. ? FFEBAD_BAD_DBLCMPLX : FFEBAD_BAD_COMPLEX);
  7462. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  7463. ffebad_finish ();
  7464. }
  7465. nbt = FFEINFO_basictypeNONE;
  7466. nkt = FFEINFO_kindtypeNONE;
  7467. break;
  7468. case FFEINFO_kindtypeANY:
  7469. nkt = FFEINFO_kindtypeREALDEFAULT;
  7470. break;
  7471. }
  7472. }
  7473. else
  7474. { /* The normal stuff. */
  7475. if (nbt == lbt)
  7476. {
  7477. if (nbt == rbt)
  7478. nkt = ffeinfo_kindtype_max (nbt, lkt, rkt);
  7479. else
  7480. nkt = lkt;
  7481. }
  7482. else if (nbt == rbt)
  7483. nkt = rkt;
  7484. else
  7485. { /* Let the caller do the complaining. */
  7486. nbt = FFEINFO_basictypeNONE;
  7487. nkt = FFEINFO_kindtypeNONE;
  7488. }
  7489. }
  7490. /* Always a good idea to avoid aliasing problems. */
  7491. *xnbt = nbt;
  7492. *xnkt = nkt;
  7493. }
  7494. /* ffeexpr_token_first_lhs_ -- First state for lhs expression
  7495. Return a pointer to this function to the lexer (ffelex), which will
  7496. invoke it for the next token.
  7497. Record line and column of first token in expression, then invoke the
  7498. initial-state lhs handler. */
  7499. static ffelexHandler
  7500. ffeexpr_token_first_lhs_ (ffelexToken t)
  7501. {
  7502. ffeexpr_stack_->first_token = ffelex_token_use (t);
  7503. /* When changing the list of valid initial lhs tokens, check whether to
  7504. update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
  7505. READ (expr) <token> case -- it assumes it knows which tokens <token> can
  7506. be to indicate an lhs (or implied DO), which right now is the set
  7507. {NAME,OPEN_PAREN}.
  7508. This comment also appears in ffeexpr_token_lhs_. */
  7509. switch (ffelex_token_type (t))
  7510. {
  7511. case FFELEX_typeOPEN_PAREN:
  7512. switch (ffeexpr_stack_->context)
  7513. {
  7514. case FFEEXPR_contextDATA:
  7515. ffe_init_4 ();
  7516. ffeexpr_level_ = 1; /* Level of DATA implied-DO construct. */
  7517. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  7518. return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
  7519. FFEEXPR_contextDATAIMPDOITEM_, ffeexpr_cb_comma_i_);
  7520. case FFEEXPR_contextDATAIMPDOITEM_:
  7521. ++ffeexpr_level_; /* Level of DATA implied-DO construct. */
  7522. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  7523. return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
  7524. FFEEXPR_contextDATAIMPDOITEM_, ffeexpr_cb_comma_i_);
  7525. case FFEEXPR_contextIOLIST:
  7526. case FFEEXPR_contextIMPDOITEM_:
  7527. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  7528. return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
  7529. FFEEXPR_contextIMPDOITEM_, ffeexpr_cb_comma_i_);
  7530. case FFEEXPR_contextIOLISTDF:
  7531. case FFEEXPR_contextIMPDOITEMDF_:
  7532. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  7533. return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
  7534. FFEEXPR_contextIMPDOITEMDF_, ffeexpr_cb_comma_i_);
  7535. case FFEEXPR_contextFILEEXTFUNC:
  7536. assert (ffeexpr_stack_->exprstack == NULL);
  7537. return (ffelexHandler) ffeexpr_token_first_lhs_1_;
  7538. default:
  7539. break;
  7540. }
  7541. break;
  7542. case FFELEX_typeNAME:
  7543. switch (ffeexpr_stack_->context)
  7544. {
  7545. case FFEEXPR_contextFILENAMELIST:
  7546. assert (ffeexpr_stack_->exprstack == NULL);
  7547. return (ffelexHandler) ffeexpr_token_namelist_;
  7548. case FFEEXPR_contextFILEEXTFUNC:
  7549. assert (ffeexpr_stack_->exprstack == NULL);
  7550. return (ffelexHandler) ffeexpr_token_first_lhs_1_;
  7551. default:
  7552. break;
  7553. }
  7554. break;
  7555. default:
  7556. switch (ffeexpr_stack_->context)
  7557. {
  7558. case FFEEXPR_contextFILEEXTFUNC:
  7559. assert (ffeexpr_stack_->exprstack == NULL);
  7560. return (ffelexHandler) ffeexpr_token_first_lhs_1_;
  7561. default:
  7562. break;
  7563. }
  7564. break;
  7565. }
  7566. return (ffelexHandler) ffeexpr_token_lhs_ (t);
  7567. }
  7568. /* ffeexpr_token_first_lhs_1_ -- NAME
  7569. return ffeexpr_token_first_lhs_1_; // to lexer
  7570. Handle NAME as an external function (USEROPEN= VXT extension to OPEN
  7571. statement). */
  7572. static ffelexHandler
  7573. ffeexpr_token_first_lhs_1_ (ffelexToken t)
  7574. {
  7575. ffeexprCallback callback;
  7576. ffeexprStack_ s;
  7577. ffelexHandler next;
  7578. ffelexToken ft;
  7579. ffesymbol sy = NULL;
  7580. ffebld expr;
  7581. ffebld_pool_pop ();
  7582. callback = ffeexpr_stack_->callback;
  7583. ft = ffeexpr_stack_->first_token;
  7584. s = ffeexpr_stack_->previous;
  7585. if ((ffelex_token_type (ft) != FFELEX_typeNAME)
  7586. || (ffesymbol_attrs (sy = ffeexpr_declare_unadorned_ (ft, FALSE))
  7587. & FFESYMBOL_attrANY))
  7588. {
  7589. if ((ffelex_token_type (ft) != FFELEX_typeNAME)
  7590. || !(ffesymbol_attrs (sy) & FFESYMBOL_attrsANY))
  7591. {
  7592. ffebad_start (FFEBAD_EXPR_WRONG);
  7593. ffebad_here (0, ffelex_token_where_line (ft),
  7594. ffelex_token_where_column (ft));
  7595. ffebad_finish ();
  7596. }
  7597. expr = ffebld_new_any ();
  7598. ffebld_set_info (expr, ffeinfo_new_any ());
  7599. }
  7600. else
  7601. {
  7602. expr = ffebld_new_symter (sy, FFEINTRIN_genNONE, FFEINTRIN_specNONE,
  7603. FFEINTRIN_impNONE);
  7604. ffebld_set_info (expr, ffesymbol_info (sy));
  7605. }
  7606. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
  7607. sizeof (*ffeexpr_stack_));
  7608. ffeexpr_stack_ = s;
  7609. next = (ffelexHandler) (*callback) (ft, expr, t);
  7610. ffelex_token_kill (ft);
  7611. return (ffelexHandler) next;
  7612. }
  7613. /* ffeexpr_token_first_rhs_ -- First state for rhs expression
  7614. Record line and column of first token in expression, then invoke the
  7615. initial-state rhs handler.
  7616. 19-Feb-91 JCB 1.1
  7617. Allow ASTERISK in PARENFILEUNIT_ case, but only on second level only
  7618. (i.e. only as in READ(*), not READ((*))). */
  7619. static ffelexHandler
  7620. ffeexpr_token_first_rhs_ (ffelexToken t)
  7621. {
  7622. ffesymbol s;
  7623. ffeexpr_stack_->first_token = ffelex_token_use (t);
  7624. switch (ffelex_token_type (t))
  7625. {
  7626. case FFELEX_typeASTERISK:
  7627. switch (ffeexpr_stack_->context)
  7628. {
  7629. case FFEEXPR_contextFILEFORMATNML:
  7630. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7631. /* Fall through. */
  7632. case FFEEXPR_contextFILEUNIT:
  7633. case FFEEXPR_contextDIMLIST:
  7634. case FFEEXPR_contextFILEFORMAT:
  7635. case FFEEXPR_contextCHARACTERSIZE:
  7636. if (ffeexpr_stack_->previous != NULL)
  7637. break; /* Valid only on first level. */
  7638. assert (ffeexpr_stack_->exprstack == NULL);
  7639. return (ffelexHandler) ffeexpr_token_first_rhs_1_;
  7640. case FFEEXPR_contextPARENFILEUNIT_:
  7641. if (ffeexpr_stack_->previous->previous != NULL)
  7642. break; /* Valid only on second level. */
  7643. assert (ffeexpr_stack_->exprstack == NULL);
  7644. return (ffelexHandler) ffeexpr_token_first_rhs_1_;
  7645. case FFEEXPR_contextACTUALARG_:
  7646. if (ffeexpr_stack_->previous->context
  7647. != FFEEXPR_contextSUBROUTINEREF)
  7648. {
  7649. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7650. break;
  7651. }
  7652. assert (ffeexpr_stack_->exprstack == NULL);
  7653. return (ffelexHandler) ffeexpr_token_first_rhs_3_;
  7654. case FFEEXPR_contextINDEXORACTUALARG_:
  7655. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7656. break;
  7657. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7658. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7659. break;
  7660. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7661. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7662. break;
  7663. default:
  7664. break;
  7665. }
  7666. break;
  7667. case FFELEX_typeOPEN_PAREN:
  7668. switch (ffeexpr_stack_->context)
  7669. {
  7670. case FFEEXPR_contextFILENUMAMBIG:
  7671. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  7672. FFEEXPR_contextPARENFILENUM_,
  7673. ffeexpr_cb_close_paren_ambig_);
  7674. case FFEEXPR_contextFILEUNITAMBIG:
  7675. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  7676. FFEEXPR_contextPARENFILEUNIT_,
  7677. ffeexpr_cb_close_paren_ambig_);
  7678. case FFEEXPR_contextIOLIST:
  7679. case FFEEXPR_contextIMPDOITEM_:
  7680. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  7681. FFEEXPR_contextIMPDOITEM_,
  7682. ffeexpr_cb_close_paren_ci_);
  7683. case FFEEXPR_contextIOLISTDF:
  7684. case FFEEXPR_contextIMPDOITEMDF_:
  7685. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  7686. FFEEXPR_contextIMPDOITEMDF_,
  7687. ffeexpr_cb_close_paren_ci_);
  7688. case FFEEXPR_contextFILEFORMATNML:
  7689. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7690. break;
  7691. case FFEEXPR_contextACTUALARG_:
  7692. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7693. break;
  7694. case FFEEXPR_contextINDEXORACTUALARG_:
  7695. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7696. break;
  7697. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7698. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7699. break;
  7700. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7701. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7702. break;
  7703. default:
  7704. break;
  7705. }
  7706. break;
  7707. case FFELEX_typeNUMBER:
  7708. switch (ffeexpr_stack_->context)
  7709. {
  7710. case FFEEXPR_contextFILEFORMATNML:
  7711. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7712. /* Fall through. */
  7713. case FFEEXPR_contextFILEFORMAT:
  7714. if (ffeexpr_stack_->previous != NULL)
  7715. break; /* Valid only on first level. */
  7716. assert (ffeexpr_stack_->exprstack == NULL);
  7717. return (ffelexHandler) ffeexpr_token_first_rhs_2_;
  7718. case FFEEXPR_contextACTUALARG_:
  7719. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7720. break;
  7721. case FFEEXPR_contextINDEXORACTUALARG_:
  7722. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7723. break;
  7724. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7725. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7726. break;
  7727. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7728. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7729. break;
  7730. default:
  7731. break;
  7732. }
  7733. break;
  7734. case FFELEX_typeNAME:
  7735. switch (ffeexpr_stack_->context)
  7736. {
  7737. case FFEEXPR_contextFILEFORMATNML:
  7738. assert (ffeexpr_stack_->exprstack == NULL);
  7739. s = ffesymbol_lookup_local (t);
  7740. if ((s != NULL) && (ffesymbol_kind (s) == FFEINFO_kindNAMELIST))
  7741. return (ffelexHandler) ffeexpr_token_namelist_;
  7742. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7743. break;
  7744. default:
  7745. break;
  7746. }
  7747. break;
  7748. case FFELEX_typePERCENT:
  7749. switch (ffeexpr_stack_->context)
  7750. {
  7751. case FFEEXPR_contextACTUALARG_:
  7752. case FFEEXPR_contextINDEXORACTUALARG_:
  7753. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7754. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7755. return (ffelexHandler) ffeexpr_token_first_rhs_5_;
  7756. case FFEEXPR_contextFILEFORMATNML:
  7757. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7758. break;
  7759. default:
  7760. break;
  7761. }
  7762. default:
  7763. switch (ffeexpr_stack_->context)
  7764. {
  7765. case FFEEXPR_contextACTUALARG_:
  7766. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7767. break;
  7768. case FFEEXPR_contextINDEXORACTUALARG_:
  7769. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7770. break;
  7771. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7772. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7773. break;
  7774. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7775. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7776. break;
  7777. case FFEEXPR_contextFILEFORMATNML:
  7778. ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
  7779. break;
  7780. default:
  7781. break;
  7782. }
  7783. break;
  7784. }
  7785. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  7786. }
  7787. /* ffeexpr_token_first_rhs_1_ -- ASTERISK
  7788. return ffeexpr_token_first_rhs_1_; // to lexer
  7789. Return STAR as expression. */
  7790. static ffelexHandler
  7791. ffeexpr_token_first_rhs_1_ (ffelexToken t)
  7792. {
  7793. ffebld expr;
  7794. ffeexprCallback callback;
  7795. ffeexprStack_ s;
  7796. ffelexHandler next;
  7797. ffelexToken ft;
  7798. expr = ffebld_new_star ();
  7799. ffebld_pool_pop ();
  7800. callback = ffeexpr_stack_->callback;
  7801. ft = ffeexpr_stack_->first_token;
  7802. s = ffeexpr_stack_->previous;
  7803. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
  7804. ffeexpr_stack_ = s;
  7805. next = (ffelexHandler) (*callback) (ft, expr, t);
  7806. ffelex_token_kill (ft);
  7807. return (ffelexHandler) next;
  7808. }
  7809. /* ffeexpr_token_first_rhs_2_ -- NUMBER
  7810. return ffeexpr_token_first_rhs_2_; // to lexer
  7811. Return NULL as expression; NUMBER as first (and only) token, unless the
  7812. current token is not a terminating token, in which case run normal
  7813. expression handling. */
  7814. static ffelexHandler
  7815. ffeexpr_token_first_rhs_2_ (ffelexToken t)
  7816. {
  7817. ffeexprCallback callback;
  7818. ffeexprStack_ s;
  7819. ffelexHandler next;
  7820. ffelexToken ft;
  7821. switch (ffelex_token_type (t))
  7822. {
  7823. case FFELEX_typeCLOSE_PAREN:
  7824. case FFELEX_typeCOMMA:
  7825. case FFELEX_typeEOS:
  7826. case FFELEX_typeSEMICOLON:
  7827. break;
  7828. default:
  7829. next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
  7830. return (ffelexHandler) (*next) (t);
  7831. }
  7832. ffebld_pool_pop ();
  7833. callback = ffeexpr_stack_->callback;
  7834. ft = ffeexpr_stack_->first_token;
  7835. s = ffeexpr_stack_->previous;
  7836. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
  7837. sizeof (*ffeexpr_stack_));
  7838. ffeexpr_stack_ = s;
  7839. next = (ffelexHandler) (*callback) (ft, NULL, t);
  7840. ffelex_token_kill (ft);
  7841. return (ffelexHandler) next;
  7842. }
  7843. /* ffeexpr_token_first_rhs_3_ -- ASTERISK
  7844. return ffeexpr_token_first_rhs_3_; // to lexer
  7845. Expect NUMBER, make LABTOK (with copy of token if not inhibited after
  7846. confirming, else NULL). */
  7847. static ffelexHandler
  7848. ffeexpr_token_first_rhs_3_ (ffelexToken t)
  7849. {
  7850. ffelexHandler next;
  7851. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  7852. { /* An error, but let normal processing handle
  7853. it. */
  7854. next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
  7855. return (ffelexHandler) (*next) (t);
  7856. }
  7857. /* Special case: when we see "*10" as an argument to a subroutine
  7858. reference, we confirm the current statement and, if not inhibited at
  7859. this point, put a copy of the token into a LABTOK node. We do this
  7860. instead of just resolving the label directly via ffelab and putting it
  7861. into a LABTER simply to improve error reporting and consistency in
  7862. ffestc. We put NULL in the LABTOK if we're still inhibited, so ffestb
  7863. doesn't have to worry about killing off any tokens when retracting. */
  7864. ffest_confirmed ();
  7865. if (ffest_is_inhibited ())
  7866. ffeexpr_stack_->expr = ffebld_new_labtok (NULL);
  7867. else
  7868. ffeexpr_stack_->expr = ffebld_new_labtok (ffelex_token_use (t));
  7869. ffebld_set_info (ffeexpr_stack_->expr,
  7870. ffeinfo_new (FFEINFO_basictypeNONE,
  7871. FFEINFO_kindtypeNONE,
  7872. 0,
  7873. FFEINFO_kindNONE,
  7874. FFEINFO_whereNONE,
  7875. FFETARGET_charactersizeNONE));
  7876. return (ffelexHandler) ffeexpr_token_first_rhs_4_;
  7877. }
  7878. /* ffeexpr_token_first_rhs_4_ -- ASTERISK NUMBER
  7879. return ffeexpr_token_first_rhs_4_; // to lexer
  7880. Collect/flush appropriate stuff, send token to callback function. */
  7881. static ffelexHandler
  7882. ffeexpr_token_first_rhs_4_ (ffelexToken t)
  7883. {
  7884. ffebld expr;
  7885. ffeexprCallback callback;
  7886. ffeexprStack_ s;
  7887. ffelexHandler next;
  7888. ffelexToken ft;
  7889. expr = ffeexpr_stack_->expr;
  7890. ffebld_pool_pop ();
  7891. callback = ffeexpr_stack_->callback;
  7892. ft = ffeexpr_stack_->first_token;
  7893. s = ffeexpr_stack_->previous;
  7894. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
  7895. ffeexpr_stack_ = s;
  7896. next = (ffelexHandler) (*callback) (ft, expr, t);
  7897. ffelex_token_kill (ft);
  7898. return (ffelexHandler) next;
  7899. }
  7900. /* ffeexpr_token_first_rhs_5_ -- PERCENT
  7901. Should be NAME, or pass through original mechanism. If NAME is LOC,
  7902. pass through original mechanism, otherwise must be VAL, REF, or DESCR,
  7903. in which case handle the argument (in parentheses), etc. */
  7904. static ffelexHandler
  7905. ffeexpr_token_first_rhs_5_ (ffelexToken t)
  7906. {
  7907. ffelexHandler next;
  7908. if (ffelex_token_type (t) == FFELEX_typeNAME)
  7909. {
  7910. ffeexprPercent_ p = ffeexpr_percent_ (t);
  7911. switch (p)
  7912. {
  7913. case FFEEXPR_percentNONE_:
  7914. case FFEEXPR_percentLOC_:
  7915. break; /* Treat %LOC as any other expression. */
  7916. case FFEEXPR_percentVAL_:
  7917. case FFEEXPR_percentREF_:
  7918. case FFEEXPR_percentDESCR_:
  7919. ffeexpr_stack_->percent = p;
  7920. ffeexpr_stack_->tokens[0] = ffelex_token_use (t);
  7921. return (ffelexHandler) ffeexpr_token_first_rhs_6_;
  7922. default:
  7923. assert ("bad percent?!?" == NULL);
  7924. break;
  7925. }
  7926. }
  7927. switch (ffeexpr_stack_->context)
  7928. {
  7929. case FFEEXPR_contextACTUALARG_:
  7930. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7931. break;
  7932. case FFEEXPR_contextINDEXORACTUALARG_:
  7933. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7934. break;
  7935. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7936. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7937. break;
  7938. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7939. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7940. break;
  7941. default:
  7942. assert ("bad context?!?!" == NULL);
  7943. break;
  7944. }
  7945. next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
  7946. return (ffelexHandler) (*next) (t);
  7947. }
  7948. /* ffeexpr_token_first_rhs_6_ -- PERCENT NAME(VAL,REF,DESCR)
  7949. Should be OPEN_PAREN, or pass through original mechanism. */
  7950. static ffelexHandler
  7951. ffeexpr_token_first_rhs_6_ (ffelexToken t)
  7952. {
  7953. ffelexHandler next;
  7954. ffelexToken ft;
  7955. if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
  7956. {
  7957. ffeexpr_stack_->tokens[1] = ffelex_token_use (t);
  7958. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  7959. ffeexpr_stack_->context,
  7960. ffeexpr_cb_end_notloc_);
  7961. }
  7962. switch (ffeexpr_stack_->context)
  7963. {
  7964. case FFEEXPR_contextACTUALARG_:
  7965. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  7966. break;
  7967. case FFEEXPR_contextINDEXORACTUALARG_:
  7968. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  7969. break;
  7970. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  7971. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  7972. break;
  7973. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  7974. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  7975. break;
  7976. default:
  7977. assert ("bad context?!?!" == NULL);
  7978. break;
  7979. }
  7980. ft = ffeexpr_stack_->tokens[0];
  7981. next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
  7982. next = (ffelexHandler) (*next) (ft);
  7983. ffelex_token_kill (ft);
  7984. return (ffelexHandler) (*next) (t);
  7985. }
  7986. /* ffeexpr_token_namelist_ -- NAME
  7987. return ffeexpr_token_namelist_; // to lexer
  7988. Make sure NAME was a valid namelist object, wrap it in a SYMTER and
  7989. return. */
  7990. static ffelexHandler
  7991. ffeexpr_token_namelist_ (ffelexToken t)
  7992. {
  7993. ffeexprCallback callback;
  7994. ffeexprStack_ s;
  7995. ffelexHandler next;
  7996. ffelexToken ft;
  7997. ffesymbol sy;
  7998. ffebld expr;
  7999. ffebld_pool_pop ();
  8000. callback = ffeexpr_stack_->callback;
  8001. ft = ffeexpr_stack_->first_token;
  8002. s = ffeexpr_stack_->previous;
  8003. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
  8004. ffeexpr_stack_ = s;
  8005. sy = ffesymbol_lookup_local (ft);
  8006. if ((sy == NULL) || (ffesymbol_kind (sy) != FFEINFO_kindNAMELIST))
  8007. {
  8008. ffebad_start (FFEBAD_EXPR_WRONG);
  8009. ffebad_here (0, ffelex_token_where_line (ft),
  8010. ffelex_token_where_column (ft));
  8011. ffebad_finish ();
  8012. expr = ffebld_new_any ();
  8013. ffebld_set_info (expr, ffeinfo_new_any ());
  8014. }
  8015. else
  8016. {
  8017. expr = ffebld_new_symter (sy, FFEINTRIN_genNONE, FFEINTRIN_specNONE,
  8018. FFEINTRIN_impNONE);
  8019. ffebld_set_info (expr, ffesymbol_info (sy));
  8020. }
  8021. next = (ffelexHandler) (*callback) (ft, expr, t);
  8022. ffelex_token_kill (ft);
  8023. return (ffelexHandler) next;
  8024. }
  8025. /* ffeexpr_expr_kill_ -- Kill an existing internal expression object
  8026. ffeexprExpr_ e;
  8027. ffeexpr_expr_kill_(e);
  8028. Kills the ffewhere info, if necessary, then kills the object. */
  8029. static void
  8030. ffeexpr_expr_kill_ (ffeexprExpr_ e)
  8031. {
  8032. if (e->token != NULL)
  8033. ffelex_token_kill (e->token);
  8034. malloc_kill_ks (ffe_pool_program_unit (), e, sizeof (*e));
  8035. }
  8036. /* ffeexpr_expr_new_ -- Make a new internal expression object
  8037. ffeexprExpr_ e;
  8038. e = ffeexpr_expr_new_();
  8039. Allocates and initializes a new expression object, returns it. */
  8040. static ffeexprExpr_
  8041. ffeexpr_expr_new_ ()
  8042. {
  8043. ffeexprExpr_ e;
  8044. e = (ffeexprExpr_) malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR expr",
  8045. sizeof (*e));
  8046. e->previous = NULL;
  8047. e->type = FFEEXPR_exprtypeUNKNOWN_;
  8048. e->token = NULL;
  8049. return e;
  8050. }
  8051. /* Verify that call to global is valid, and register whatever
  8052. new information about a global might be discoverable by looking
  8053. at the call. */
  8054. static void
  8055. ffeexpr_fulfill_call_ (ffebld *expr, ffelexToken t)
  8056. {
  8057. int n_args;
  8058. ffebld list;
  8059. ffebld item;
  8060. ffesymbol s;
  8061. assert ((ffebld_op (*expr) == FFEBLD_opSUBRREF)
  8062. || (ffebld_op (*expr) == FFEBLD_opFUNCREF));
  8063. if (ffebld_op (ffebld_left (*expr)) != FFEBLD_opSYMTER)
  8064. return;
  8065. if (ffesymbol_retractable ())
  8066. return;
  8067. s = ffebld_symter (ffebld_left (*expr));
  8068. if (ffesymbol_global (s) == NULL)
  8069. return;
  8070. for (n_args = 0, list = ffebld_right (*expr);
  8071. list != NULL;
  8072. list = ffebld_trail (list), ++n_args)
  8073. ;
  8074. if (ffeglobal_proc_ref_nargs (s, n_args, t))
  8075. {
  8076. ffeglobalArgSummary as;
  8077. ffeinfoBasictype bt;
  8078. ffeinfoKindtype kt;
  8079. bool array;
  8080. bool fail = FALSE;
  8081. for (n_args = 0, list = ffebld_right (*expr);
  8082. list != NULL;
  8083. list = ffebld_trail (list), ++n_args)
  8084. {
  8085. item = ffebld_head (list);
  8086. if (item != NULL)
  8087. {
  8088. bt = ffeinfo_basictype (ffebld_info (item));
  8089. kt = ffeinfo_kindtype (ffebld_info (item));
  8090. array = (ffeinfo_rank (ffebld_info (item)) > 0);
  8091. switch (ffebld_op (item))
  8092. {
  8093. case FFEBLD_opLABTOK:
  8094. case FFEBLD_opLABTER:
  8095. as = FFEGLOBAL_argsummaryALTRTN;
  8096. break;
  8097. #if 0
  8098. /* No, %LOC(foo) is just like any INTEGER(KIND=7)
  8099. expression, so don't treat it specially. */
  8100. case FFEBLD_opPERCENT_LOC:
  8101. as = FFEGLOBAL_argsummaryPTR;
  8102. break;
  8103. #endif
  8104. case FFEBLD_opPERCENT_VAL:
  8105. as = FFEGLOBAL_argsummaryVAL;
  8106. break;
  8107. case FFEBLD_opPERCENT_REF:
  8108. as = FFEGLOBAL_argsummaryREF;
  8109. break;
  8110. case FFEBLD_opPERCENT_DESCR:
  8111. as = FFEGLOBAL_argsummaryDESCR;
  8112. break;
  8113. case FFEBLD_opFUNCREF:
  8114. #if 0
  8115. /* No, LOC(foo) is just like any INTEGER(KIND=7)
  8116. expression, so don't treat it specially. */
  8117. if ((ffebld_op (ffebld_left (item)) == FFEBLD_opSYMTER)
  8118. && (ffesymbol_specific (ffebld_symter (ffebld_left (item)))
  8119. == FFEINTRIN_specLOC))
  8120. {
  8121. as = FFEGLOBAL_argsummaryPTR;
  8122. break;
  8123. }
  8124. #endif
  8125. /* Fall through. */
  8126. default:
  8127. if (ffebld_op (item) == FFEBLD_opSYMTER)
  8128. {
  8129. as = FFEGLOBAL_argsummaryNONE;
  8130. switch (ffeinfo_kind (ffebld_info (item)))
  8131. {
  8132. case FFEINFO_kindFUNCTION:
  8133. as = FFEGLOBAL_argsummaryFUNC;
  8134. break;
  8135. case FFEINFO_kindSUBROUTINE:
  8136. as = FFEGLOBAL_argsummarySUBR;
  8137. break;
  8138. case FFEINFO_kindNONE:
  8139. as = FFEGLOBAL_argsummaryPROC;
  8140. break;
  8141. default:
  8142. break;
  8143. }
  8144. if (as != FFEGLOBAL_argsummaryNONE)
  8145. break;
  8146. }
  8147. if (bt == FFEINFO_basictypeCHARACTER)
  8148. as = FFEGLOBAL_argsummaryDESCR;
  8149. else
  8150. as = FFEGLOBAL_argsummaryREF;
  8151. break;
  8152. }
  8153. }
  8154. else
  8155. {
  8156. array = FALSE;
  8157. as = FFEGLOBAL_argsummaryNONE;
  8158. bt = FFEINFO_basictypeNONE;
  8159. kt = FFEINFO_kindtypeNONE;
  8160. }
  8161. if (! ffeglobal_proc_ref_arg (s, n_args, as, bt, kt, array, t))
  8162. fail = TRUE;
  8163. }
  8164. if (! fail)
  8165. return;
  8166. }
  8167. *expr = ffebld_new_any ();
  8168. ffebld_set_info (*expr, ffeinfo_new_any ());
  8169. }
  8170. /* Check whether rest of string is all decimal digits. */
  8171. static bool
  8172. ffeexpr_isdigits_ (const char *p)
  8173. {
  8174. for (; *p != '\0'; ++p)
  8175. if (! ISDIGIT (*p))
  8176. return FALSE;
  8177. return TRUE;
  8178. }
  8179. /* ffeexpr_exprstack_push_ -- Push an arbitrary expression object onto the stack
  8180. ffeexprExpr_ e;
  8181. ffeexpr_exprstack_push_(e);
  8182. Pushes the expression onto the stack without any analysis of the existing
  8183. contents of the stack. */
  8184. static void
  8185. ffeexpr_exprstack_push_ (ffeexprExpr_ e)
  8186. {
  8187. e->previous = ffeexpr_stack_->exprstack;
  8188. ffeexpr_stack_->exprstack = e;
  8189. }
  8190. /* ffeexpr_exprstack_push_operand_ -- Push an operand onto the stack, reduce?
  8191. ffeexprExpr_ e;
  8192. ffeexpr_exprstack_push_operand_(e);
  8193. Pushes the expression already containing an operand (a constant, variable,
  8194. or more complicated expression that has already been fully resolved) after
  8195. analyzing the stack and checking for possible reduction (which will never
  8196. happen here since the highest precedence operator is ** and it has right-
  8197. to-left associativity). */
  8198. static void
  8199. ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e)
  8200. {
  8201. ffeexpr_exprstack_push_ (e);
  8202. #ifdef WEIRD_NONFORTRAN_RULES
  8203. if ((ffeexpr_stack_->exprstack != NULL)
  8204. && (ffeexpr_stack_->exprstack->expr->type == FFEEXPR_exprtypeBINARY_)
  8205. && (ffeexpr_stack_->exprstack->expr->u.operator.prec
  8206. == FFEEXPR_operatorprecedenceHIGHEST_)
  8207. && (ffeexpr_stack_->exprstack->expr->u.operator.as
  8208. == FFEEXPR_operatorassociativityL2R_))
  8209. ffeexpr_reduce_ ();
  8210. #endif
  8211. }
  8212. /* ffeexpr_exprstack_push_unary_ -- Push a unary operator onto the stack
  8213. ffeexprExpr_ e;
  8214. ffeexpr_exprstack_push_unary_(e);
  8215. Pushes the expression already containing a unary operator. Reduction can
  8216. never happen since unary operators are themselves always R-L; that is, the
  8217. top of the expression stack is not an operand, in that it is either empty,
  8218. has a binary operator at the top, or a unary operator at the top. In any
  8219. of these cases, reduction is impossible. */
  8220. static void
  8221. ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e)
  8222. {
  8223. if ((ffe_is_pedantic ()
  8224. || ffe_is_warn_surprising ())
  8225. && (ffeexpr_stack_->exprstack != NULL)
  8226. && (ffeexpr_stack_->exprstack->type != FFEEXPR_exprtypeOPERAND_)
  8227. && (ffeexpr_stack_->exprstack->u.operator.prec
  8228. <= FFEEXPR_operatorprecedenceLOWARITH_)
  8229. && (e->u.operator.prec <= FFEEXPR_operatorprecedenceLOWARITH_))
  8230. {
  8231. ffebad_start_msg ("Two arithmetic operators in a row at %0 and %1 -- use parentheses",
  8232. ffe_is_pedantic ()
  8233. ? FFEBAD_severityPEDANTIC
  8234. : FFEBAD_severityWARNING);
  8235. ffebad_here (0,
  8236. ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
  8237. ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
  8238. ffebad_here (1,
  8239. ffelex_token_where_line (e->token),
  8240. ffelex_token_where_column (e->token));
  8241. ffebad_finish ();
  8242. }
  8243. ffeexpr_exprstack_push_ (e);
  8244. }
  8245. /* ffeexpr_exprstack_push_binary_ -- Push a binary operator onto the stack, reduce?
  8246. ffeexprExpr_ e;
  8247. ffeexpr_exprstack_push_binary_(e);
  8248. Pushes the expression already containing a binary operator after checking
  8249. whether reduction is possible. If the stack is not empty, the top of the
  8250. stack must be an operand or syntactic analysis has failed somehow. If
  8251. the operand is preceded by a unary operator of higher (or equal and L-R
  8252. associativity) precedence than the new binary operator, then reduce that
  8253. preceding operator and its operand(s) before pushing the new binary
  8254. operator. */
  8255. static void
  8256. ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e)
  8257. {
  8258. ffeexprExpr_ ce;
  8259. if (ffe_is_warn_surprising ()
  8260. /* These next two are always true (see assertions below). */
  8261. && (ffeexpr_stack_->exprstack != NULL)
  8262. && (ffeexpr_stack_->exprstack->type == FFEEXPR_exprtypeOPERAND_)
  8263. /* If the previous operator is a unary minus, and the binary op
  8264. is of higher precedence, might not do what user expects,
  8265. e.g. "-2**2" is "-(2**2)", i.e. "-4", not "(-2)**2", which would
  8266. yield "4". */
  8267. && (ffeexpr_stack_->exprstack->previous != NULL)
  8268. && (ffeexpr_stack_->exprstack->previous->type == FFEEXPR_exprtypeUNARY_)
  8269. && (ffeexpr_stack_->exprstack->previous->u.operator.op
  8270. == FFEEXPR_operatorSUBTRACT_)
  8271. && (e->u.operator.prec
  8272. < ffeexpr_stack_->exprstack->previous->u.operator.prec))
  8273. {
  8274. ffebad_start_msg ("Operator at %0 has lower precedence than that at %1 -- use parentheses", FFEBAD_severityWARNING);
  8275. ffebad_here (0,
  8276. ffelex_token_where_line (ffeexpr_stack_->exprstack->previous->token),
  8277. ffelex_token_where_column (ffeexpr_stack_->exprstack->previous->token));
  8278. ffebad_here (1,
  8279. ffelex_token_where_line (e->token),
  8280. ffelex_token_where_column (e->token));
  8281. ffebad_finish ();
  8282. }
  8283. again:
  8284. assert (ffeexpr_stack_->exprstack != NULL);
  8285. assert (ffeexpr_stack_->exprstack->type == FFEEXPR_exprtypeOPERAND_);
  8286. if ((ce = ffeexpr_stack_->exprstack->previous) != NULL)
  8287. {
  8288. assert (ce->type != FFEEXPR_exprtypeOPERAND_);
  8289. if ((ce->u.operator.prec < e->u.operator.prec)
  8290. || ((ce->u.operator.prec == e->u.operator.prec)
  8291. && (e->u.operator.as == FFEEXPR_operatorassociativityL2R_)))
  8292. {
  8293. ffeexpr_reduce_ ();
  8294. goto again; /* :::::::::::::::::::: */
  8295. }
  8296. }
  8297. ffeexpr_exprstack_push_ (e);
  8298. }
  8299. /* ffeexpr_reduce_ -- Reduce highest operator w/operands on stack
  8300. ffeexpr_reduce_();
  8301. Converts operand binop operand or unop operand at top of stack to a
  8302. single operand having the appropriate ffebld expression, and makes
  8303. sure that the expression is proper (like not trying to add two character
  8304. variables, not trying to concatenate two numbers). Also does the
  8305. requisite type-assignment. */
  8306. static void
  8307. ffeexpr_reduce_ ()
  8308. {
  8309. ffeexprExpr_ operand; /* This is B in -B or A+B. */
  8310. ffeexprExpr_ left_operand; /* When operator is binary, this is A in A+B. */
  8311. ffeexprExpr_ operator; /* This is + in A+B. */
  8312. ffebld reduced; /* This is +(A,B) in A+B or u-(B) in -B. */
  8313. ffebldConstant constnode; /* For checking magical numbers (where mag ==
  8314. -mag). */
  8315. ffebld expr;
  8316. ffebld left_expr;
  8317. bool submag = FALSE;
  8318. operand = ffeexpr_stack_->exprstack;
  8319. assert (operand != NULL);
  8320. assert (operand->type == FFEEXPR_exprtypeOPERAND_);
  8321. operator = operand->previous;
  8322. assert (operator != NULL);
  8323. assert (operator->type != FFEEXPR_exprtypeOPERAND_);
  8324. if (operator->type == FFEEXPR_exprtypeUNARY_)
  8325. {
  8326. expr = operand->u.operand;
  8327. switch (operator->u.operator.op)
  8328. {
  8329. case FFEEXPR_operatorADD_:
  8330. reduced = ffebld_new_uplus (expr);
  8331. if (ffe_is_ugly_logint ())
  8332. reduced = ffeexpr_reduced_ugly1_ (reduced, operator, operand);
  8333. reduced = ffeexpr_reduced_math1_ (reduced, operator, operand);
  8334. reduced = ffeexpr_collapse_uplus (reduced, operator->token);
  8335. break;
  8336. case FFEEXPR_operatorSUBTRACT_:
  8337. submag = TRUE; /* Ok to negate a magic number. */
  8338. reduced = ffebld_new_uminus (expr);
  8339. if (ffe_is_ugly_logint ())
  8340. reduced = ffeexpr_reduced_ugly1_ (reduced, operator, operand);
  8341. reduced = ffeexpr_reduced_math1_ (reduced, operator, operand);
  8342. reduced = ffeexpr_collapse_uminus (reduced, operator->token);
  8343. break;
  8344. case FFEEXPR_operatorNOT_:
  8345. reduced = ffebld_new_not (expr);
  8346. if (ffe_is_ugly_logint ())
  8347. reduced = ffeexpr_reduced_ugly1log_ (reduced, operator, operand);
  8348. reduced = ffeexpr_reduced_bool1_ (reduced, operator, operand);
  8349. reduced = ffeexpr_collapse_not (reduced, operator->token);
  8350. break;
  8351. default:
  8352. assert ("unexpected unary op" != NULL);
  8353. reduced = NULL;
  8354. break;
  8355. }
  8356. if (!submag
  8357. && (ffebld_op (expr) == FFEBLD_opCONTER)
  8358. && (ffebld_conter_orig (expr) == NULL)
  8359. && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
  8360. {
  8361. ffetarget_integer_bad_magical (operand->token);
  8362. }
  8363. ffeexpr_stack_->exprstack = operator->previous; /* Pops unary-op operand
  8364. off stack. */
  8365. ffeexpr_expr_kill_ (operand);
  8366. operator->type = FFEEXPR_exprtypeOPERAND_; /* Convert operator, but
  8367. save */
  8368. operator->u.operand = reduced; /* the line/column ffewhere info. */
  8369. ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
  8370. stack. */
  8371. }
  8372. else
  8373. {
  8374. assert (operator->type == FFEEXPR_exprtypeBINARY_);
  8375. left_operand = operator->previous;
  8376. assert (left_operand != NULL);
  8377. assert (left_operand->type == FFEEXPR_exprtypeOPERAND_);
  8378. expr = operand->u.operand;
  8379. left_expr = left_operand->u.operand;
  8380. switch (operator->u.operator.op)
  8381. {
  8382. case FFEEXPR_operatorADD_:
  8383. reduced = ffebld_new_add (left_expr, expr);
  8384. if (ffe_is_ugly_logint ())
  8385. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8386. operand);
  8387. reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
  8388. operand);
  8389. reduced = ffeexpr_collapse_add (reduced, operator->token);
  8390. break;
  8391. case FFEEXPR_operatorSUBTRACT_:
  8392. submag = TRUE; /* Just to pick the right error if magic
  8393. number. */
  8394. reduced = ffebld_new_subtract (left_expr, expr);
  8395. if (ffe_is_ugly_logint ())
  8396. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8397. operand);
  8398. reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
  8399. operand);
  8400. reduced = ffeexpr_collapse_subtract (reduced, operator->token);
  8401. break;
  8402. case FFEEXPR_operatorMULTIPLY_:
  8403. reduced = ffebld_new_multiply (left_expr, expr);
  8404. if (ffe_is_ugly_logint ())
  8405. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8406. operand);
  8407. reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
  8408. operand);
  8409. reduced = ffeexpr_collapse_multiply (reduced, operator->token);
  8410. break;
  8411. case FFEEXPR_operatorDIVIDE_:
  8412. reduced = ffebld_new_divide (left_expr, expr);
  8413. if (ffe_is_ugly_logint ())
  8414. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8415. operand);
  8416. reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
  8417. operand);
  8418. reduced = ffeexpr_collapse_divide (reduced, operator->token);
  8419. break;
  8420. case FFEEXPR_operatorPOWER_:
  8421. reduced = ffebld_new_power (left_expr, expr);
  8422. if (ffe_is_ugly_logint ())
  8423. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8424. operand);
  8425. reduced = ffeexpr_reduced_power_ (reduced, left_operand, operator,
  8426. operand);
  8427. reduced = ffeexpr_collapse_power (reduced, operator->token);
  8428. break;
  8429. case FFEEXPR_operatorCONCATENATE_:
  8430. reduced = ffebld_new_concatenate (left_expr, expr);
  8431. reduced = ffeexpr_reduced_concatenate_ (reduced, left_operand, operator,
  8432. operand);
  8433. reduced = ffeexpr_collapse_concatenate (reduced, operator->token);
  8434. break;
  8435. case FFEEXPR_operatorLT_:
  8436. reduced = ffebld_new_lt (left_expr, expr);
  8437. if (ffe_is_ugly_logint ())
  8438. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8439. operand);
  8440. reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
  8441. operand);
  8442. reduced = ffeexpr_collapse_lt (reduced, operator->token);
  8443. break;
  8444. case FFEEXPR_operatorLE_:
  8445. reduced = ffebld_new_le (left_expr, expr);
  8446. if (ffe_is_ugly_logint ())
  8447. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8448. operand);
  8449. reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
  8450. operand);
  8451. reduced = ffeexpr_collapse_le (reduced, operator->token);
  8452. break;
  8453. case FFEEXPR_operatorEQ_:
  8454. reduced = ffebld_new_eq (left_expr, expr);
  8455. if (ffe_is_ugly_logint ())
  8456. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8457. operand);
  8458. reduced = ffeexpr_reduced_eqop2_ (reduced, left_operand, operator,
  8459. operand);
  8460. reduced = ffeexpr_collapse_eq (reduced, operator->token);
  8461. break;
  8462. case FFEEXPR_operatorNE_:
  8463. reduced = ffebld_new_ne (left_expr, expr);
  8464. if (ffe_is_ugly_logint ())
  8465. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8466. operand);
  8467. reduced = ffeexpr_reduced_eqop2_ (reduced, left_operand, operator,
  8468. operand);
  8469. reduced = ffeexpr_collapse_ne (reduced, operator->token);
  8470. break;
  8471. case FFEEXPR_operatorGT_:
  8472. reduced = ffebld_new_gt (left_expr, expr);
  8473. if (ffe_is_ugly_logint ())
  8474. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8475. operand);
  8476. reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
  8477. operand);
  8478. reduced = ffeexpr_collapse_gt (reduced, operator->token);
  8479. break;
  8480. case FFEEXPR_operatorGE_:
  8481. reduced = ffebld_new_ge (left_expr, expr);
  8482. if (ffe_is_ugly_logint ())
  8483. reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
  8484. operand);
  8485. reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
  8486. operand);
  8487. reduced = ffeexpr_collapse_ge (reduced, operator->token);
  8488. break;
  8489. case FFEEXPR_operatorAND_:
  8490. reduced = ffebld_new_and (left_expr, expr);
  8491. if (ffe_is_ugly_logint ())
  8492. reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
  8493. operand);
  8494. reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
  8495. operand);
  8496. reduced = ffeexpr_collapse_and (reduced, operator->token);
  8497. break;
  8498. case FFEEXPR_operatorOR_:
  8499. reduced = ffebld_new_or (left_expr, expr);
  8500. if (ffe_is_ugly_logint ())
  8501. reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
  8502. operand);
  8503. reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
  8504. operand);
  8505. reduced = ffeexpr_collapse_or (reduced, operator->token);
  8506. break;
  8507. case FFEEXPR_operatorXOR_:
  8508. reduced = ffebld_new_xor (left_expr, expr);
  8509. if (ffe_is_ugly_logint ())
  8510. reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
  8511. operand);
  8512. reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
  8513. operand);
  8514. reduced = ffeexpr_collapse_xor (reduced, operator->token);
  8515. break;
  8516. case FFEEXPR_operatorEQV_:
  8517. reduced = ffebld_new_eqv (left_expr, expr);
  8518. if (ffe_is_ugly_logint ())
  8519. reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
  8520. operand);
  8521. reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
  8522. operand);
  8523. reduced = ffeexpr_collapse_eqv (reduced, operator->token);
  8524. break;
  8525. case FFEEXPR_operatorNEQV_:
  8526. reduced = ffebld_new_neqv (left_expr, expr);
  8527. if (ffe_is_ugly_logint ())
  8528. reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
  8529. operand);
  8530. reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
  8531. operand);
  8532. reduced = ffeexpr_collapse_neqv (reduced, operator->token);
  8533. break;
  8534. default:
  8535. assert ("bad bin op" == NULL);
  8536. reduced = expr;
  8537. break;
  8538. }
  8539. if ((ffebld_op (left_expr) == FFEBLD_opCONTER)
  8540. && (ffebld_conter_orig (expr) == NULL)
  8541. && ffebld_constant_is_magical (constnode = ffebld_conter (left_expr)))
  8542. {
  8543. if ((left_operand->previous != NULL)
  8544. && (left_operand->previous->type != FFEEXPR_exprtypeOPERAND_)
  8545. && (left_operand->previous->u.operator.op
  8546. == FFEEXPR_operatorSUBTRACT_))
  8547. {
  8548. if (left_operand->previous->type == FFEEXPR_exprtypeUNARY_)
  8549. ffetarget_integer_bad_magical_precedence (left_operand->token,
  8550. left_operand->previous->token,
  8551. operator->token);
  8552. else
  8553. ffetarget_integer_bad_magical_precedence_binary
  8554. (left_operand->token,
  8555. left_operand->previous->token,
  8556. operator->token);
  8557. }
  8558. else
  8559. ffetarget_integer_bad_magical (left_operand->token);
  8560. }
  8561. if ((ffebld_op (expr) == FFEBLD_opCONTER)
  8562. && (ffebld_conter_orig (expr) == NULL)
  8563. && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
  8564. {
  8565. if (submag)
  8566. ffetarget_integer_bad_magical_binary (operand->token,
  8567. operator->token);
  8568. else
  8569. ffetarget_integer_bad_magical (operand->token);
  8570. }
  8571. ffeexpr_stack_->exprstack = left_operand->previous; /* Pops binary-op
  8572. operands off stack. */
  8573. ffeexpr_expr_kill_ (left_operand);
  8574. ffeexpr_expr_kill_ (operand);
  8575. operator->type = FFEEXPR_exprtypeOPERAND_; /* Convert operator, but
  8576. save */
  8577. operator->u.operand = reduced; /* the line/column ffewhere info. */
  8578. ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
  8579. stack. */
  8580. }
  8581. }
  8582. /* ffeexpr_reduced_bool1_ -- Wrap up reduction of NOT operator
  8583. reduced = ffeexpr_reduced_bool1_(reduced,op,r);
  8584. Makes sure the argument for reduced has basictype of
  8585. LOGICAL or (ugly) INTEGER. If
  8586. argument has where of CONSTANT, assign where CONSTANT to
  8587. reduced, else assign where FLEETING.
  8588. If these requirements cannot be met, generate error message. */
  8589. static ffebld
  8590. ffeexpr_reduced_bool1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
  8591. {
  8592. ffeinfo rinfo, ninfo;
  8593. ffeinfoBasictype rbt;
  8594. ffeinfoKindtype rkt;
  8595. ffeinfoRank rrk;
  8596. ffeinfoKind rkd;
  8597. ffeinfoWhere rwh, nwh;
  8598. rinfo = ffebld_info (ffebld_left (reduced));
  8599. rbt = ffeinfo_basictype (rinfo);
  8600. rkt = ffeinfo_kindtype (rinfo);
  8601. rrk = ffeinfo_rank (rinfo);
  8602. rkd = ffeinfo_kind (rinfo);
  8603. rwh = ffeinfo_where (rinfo);
  8604. if (((rbt == FFEINFO_basictypeLOGICAL)
  8605. || (ffe_is_ugly_logint () && (rbt == FFEINFO_basictypeINTEGER)))
  8606. && (rrk == 0))
  8607. {
  8608. switch (rwh)
  8609. {
  8610. case FFEINFO_whereCONSTANT:
  8611. nwh = FFEINFO_whereCONSTANT;
  8612. break;
  8613. case FFEINFO_whereIMMEDIATE:
  8614. nwh = FFEINFO_whereIMMEDIATE;
  8615. break;
  8616. default:
  8617. nwh = FFEINFO_whereFLEETING;
  8618. break;
  8619. }
  8620. ninfo = ffeinfo_new (rbt, rkt, 0, FFEINFO_kindENTITY, nwh,
  8621. FFETARGET_charactersizeNONE);
  8622. ffebld_set_info (reduced, ninfo);
  8623. return reduced;
  8624. }
  8625. if ((rbt != FFEINFO_basictypeLOGICAL)
  8626. && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
  8627. {
  8628. if ((rbt != FFEINFO_basictypeANY)
  8629. && ffebad_start (FFEBAD_NOT_ARG_TYPE))
  8630. {
  8631. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8632. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8633. ffebad_finish ();
  8634. }
  8635. }
  8636. else
  8637. {
  8638. if ((rkd != FFEINFO_kindANY)
  8639. && ffebad_start (FFEBAD_NOT_ARG_KIND))
  8640. {
  8641. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8642. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8643. ffebad_string ("an array");
  8644. ffebad_finish ();
  8645. }
  8646. }
  8647. reduced = ffebld_new_any ();
  8648. ffebld_set_info (reduced, ffeinfo_new_any ());
  8649. return reduced;
  8650. }
  8651. /* ffeexpr_reduced_bool2_ -- Wrap up reduction of boolean operators
  8652. reduced = ffeexpr_reduced_bool2_(reduced,l,op,r);
  8653. Makes sure the left and right arguments for reduced have basictype of
  8654. LOGICAL or (ugly) INTEGER. Determine common basictype and
  8655. size for reduction (flag expression for combined hollerith/typeless
  8656. situations for later determination of effective basictype). If both left
  8657. and right arguments have where of CONSTANT, assign where CONSTANT to
  8658. reduced, else assign where FLEETING. Create CONVERT ops for args where
  8659. needed. Convert typeless
  8660. constants to the desired type/size explicitly.
  8661. If these requirements cannot be met, generate error message. */
  8662. static ffebld
  8663. ffeexpr_reduced_bool2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  8664. ffeexprExpr_ r)
  8665. {
  8666. ffeinfo linfo, rinfo, ninfo;
  8667. ffeinfoBasictype lbt, rbt, nbt;
  8668. ffeinfoKindtype lkt, rkt, nkt;
  8669. ffeinfoRank lrk, rrk;
  8670. ffeinfoKind lkd, rkd;
  8671. ffeinfoWhere lwh, rwh, nwh;
  8672. linfo = ffebld_info (ffebld_left (reduced));
  8673. lbt = ffeinfo_basictype (linfo);
  8674. lkt = ffeinfo_kindtype (linfo);
  8675. lrk = ffeinfo_rank (linfo);
  8676. lkd = ffeinfo_kind (linfo);
  8677. lwh = ffeinfo_where (linfo);
  8678. rinfo = ffebld_info (ffebld_right (reduced));
  8679. rbt = ffeinfo_basictype (rinfo);
  8680. rkt = ffeinfo_kindtype (rinfo);
  8681. rrk = ffeinfo_rank (rinfo);
  8682. rkd = ffeinfo_kind (rinfo);
  8683. rwh = ffeinfo_where (rinfo);
  8684. ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
  8685. if (((nbt == FFEINFO_basictypeLOGICAL)
  8686. || (ffe_is_ugly_logint () && (nbt == FFEINFO_basictypeINTEGER)))
  8687. && (lrk == 0) && (rrk == 0))
  8688. {
  8689. switch (lwh)
  8690. {
  8691. case FFEINFO_whereCONSTANT:
  8692. switch (rwh)
  8693. {
  8694. case FFEINFO_whereCONSTANT:
  8695. nwh = FFEINFO_whereCONSTANT;
  8696. break;
  8697. case FFEINFO_whereIMMEDIATE:
  8698. nwh = FFEINFO_whereIMMEDIATE;
  8699. break;
  8700. default:
  8701. nwh = FFEINFO_whereFLEETING;
  8702. break;
  8703. }
  8704. break;
  8705. case FFEINFO_whereIMMEDIATE:
  8706. switch (rwh)
  8707. {
  8708. case FFEINFO_whereCONSTANT:
  8709. case FFEINFO_whereIMMEDIATE:
  8710. nwh = FFEINFO_whereIMMEDIATE;
  8711. break;
  8712. default:
  8713. nwh = FFEINFO_whereFLEETING;
  8714. break;
  8715. }
  8716. break;
  8717. default:
  8718. nwh = FFEINFO_whereFLEETING;
  8719. break;
  8720. }
  8721. ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
  8722. FFETARGET_charactersizeNONE);
  8723. ffebld_set_info (reduced, ninfo);
  8724. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  8725. l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  8726. FFEEXPR_contextLET));
  8727. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  8728. r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  8729. FFEEXPR_contextLET));
  8730. return reduced;
  8731. }
  8732. if ((lbt != FFEINFO_basictypeLOGICAL)
  8733. && (!ffe_is_ugly_logint () || (lbt != FFEINFO_basictypeINTEGER)))
  8734. {
  8735. if ((rbt != FFEINFO_basictypeLOGICAL)
  8736. && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
  8737. {
  8738. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  8739. && ffebad_start (FFEBAD_BOOL_ARGS_TYPE))
  8740. {
  8741. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8742. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8743. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8744. ffebad_finish ();
  8745. }
  8746. }
  8747. else
  8748. {
  8749. if ((lbt != FFEINFO_basictypeANY)
  8750. && ffebad_start (FFEBAD_BOOL_ARG_TYPE))
  8751. {
  8752. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8753. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8754. ffebad_finish ();
  8755. }
  8756. }
  8757. }
  8758. else if ((rbt != FFEINFO_basictypeLOGICAL)
  8759. && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
  8760. {
  8761. if ((rbt != FFEINFO_basictypeANY)
  8762. && ffebad_start (FFEBAD_BOOL_ARG_TYPE))
  8763. {
  8764. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8765. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8766. ffebad_finish ();
  8767. }
  8768. }
  8769. else if (lrk != 0)
  8770. {
  8771. if ((lkd != FFEINFO_kindANY)
  8772. && ffebad_start (FFEBAD_BOOL_ARG_KIND))
  8773. {
  8774. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8775. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8776. ffebad_string ("an array");
  8777. ffebad_finish ();
  8778. }
  8779. }
  8780. else
  8781. {
  8782. if ((rkd != FFEINFO_kindANY)
  8783. && ffebad_start (FFEBAD_BOOL_ARG_KIND))
  8784. {
  8785. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8786. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8787. ffebad_string ("an array");
  8788. ffebad_finish ();
  8789. }
  8790. }
  8791. reduced = ffebld_new_any ();
  8792. ffebld_set_info (reduced, ffeinfo_new_any ());
  8793. return reduced;
  8794. }
  8795. /* ffeexpr_reduced_concatenate_ -- Wrap up reduction of concatenate operator
  8796. reduced = ffeexpr_reduced_concatenate_(reduced,l,op,r);
  8797. Makes sure the left and right arguments for reduced have basictype of
  8798. CHARACTER and kind of SCALAR, FUNCTION, or STATEMENT FUNCTION. Assign
  8799. basictype of CHARACTER and kind of SCALAR to reduced. Calculate effective
  8800. size of concatenation and assign that size to reduced. If both left and
  8801. right arguments have where of CONSTANT, assign where CONSTANT to reduced,
  8802. else assign where FLEETING.
  8803. If these requirements cannot be met, generate error message using the
  8804. info in l, op, and r arguments and assign basictype, size, kind, and where
  8805. of ANY. */
  8806. static ffebld
  8807. ffeexpr_reduced_concatenate_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  8808. ffeexprExpr_ r)
  8809. {
  8810. ffeinfo linfo, rinfo, ninfo;
  8811. ffeinfoBasictype lbt, rbt, nbt;
  8812. ffeinfoKindtype lkt, rkt, nkt;
  8813. ffeinfoRank lrk, rrk;
  8814. ffeinfoKind lkd, rkd, nkd;
  8815. ffeinfoWhere lwh, rwh, nwh;
  8816. ffetargetCharacterSize lszm, lszk, rszm, rszk, nszk;
  8817. linfo = ffebld_info (ffebld_left (reduced));
  8818. lbt = ffeinfo_basictype (linfo);
  8819. lkt = ffeinfo_kindtype (linfo);
  8820. lrk = ffeinfo_rank (linfo);
  8821. lkd = ffeinfo_kind (linfo);
  8822. lwh = ffeinfo_where (linfo);
  8823. lszk = ffeinfo_size (linfo); /* Known size. */
  8824. lszm = ffebld_size_max (ffebld_left (reduced));
  8825. rinfo = ffebld_info (ffebld_right (reduced));
  8826. rbt = ffeinfo_basictype (rinfo);
  8827. rkt = ffeinfo_kindtype (rinfo);
  8828. rrk = ffeinfo_rank (rinfo);
  8829. rkd = ffeinfo_kind (rinfo);
  8830. rwh = ffeinfo_where (rinfo);
  8831. rszk = ffeinfo_size (rinfo); /* Known size. */
  8832. rszm = ffebld_size_max (ffebld_right (reduced));
  8833. if ((lbt == FFEINFO_basictypeCHARACTER) && (rbt == FFEINFO_basictypeCHARACTER)
  8834. && (lkt == rkt) && (lrk == 0) && (rrk == 0)
  8835. && (((lszm != FFETARGET_charactersizeNONE)
  8836. && (rszm != FFETARGET_charactersizeNONE))
  8837. || (ffeexpr_context_outer_ (ffeexpr_stack_)
  8838. == FFEEXPR_contextLET)
  8839. || (ffeexpr_context_outer_ (ffeexpr_stack_)
  8840. == FFEEXPR_contextSFUNCDEF)))
  8841. {
  8842. nbt = FFEINFO_basictypeCHARACTER;
  8843. nkd = FFEINFO_kindENTITY;
  8844. if ((lszk == FFETARGET_charactersizeNONE)
  8845. || (rszk == FFETARGET_charactersizeNONE))
  8846. nszk = FFETARGET_charactersizeNONE; /* Ok only in rhs of LET
  8847. stmt. */
  8848. else
  8849. nszk = lszk + rszk;
  8850. switch (lwh)
  8851. {
  8852. case FFEINFO_whereCONSTANT:
  8853. switch (rwh)
  8854. {
  8855. case FFEINFO_whereCONSTANT:
  8856. nwh = FFEINFO_whereCONSTANT;
  8857. break;
  8858. case FFEINFO_whereIMMEDIATE:
  8859. nwh = FFEINFO_whereIMMEDIATE;
  8860. break;
  8861. default:
  8862. nwh = FFEINFO_whereFLEETING;
  8863. break;
  8864. }
  8865. break;
  8866. case FFEINFO_whereIMMEDIATE:
  8867. switch (rwh)
  8868. {
  8869. case FFEINFO_whereCONSTANT:
  8870. case FFEINFO_whereIMMEDIATE:
  8871. nwh = FFEINFO_whereIMMEDIATE;
  8872. break;
  8873. default:
  8874. nwh = FFEINFO_whereFLEETING;
  8875. break;
  8876. }
  8877. break;
  8878. default:
  8879. nwh = FFEINFO_whereFLEETING;
  8880. break;
  8881. }
  8882. nkt = lkt;
  8883. ninfo = ffeinfo_new (nbt, nkt, 0, nkd, nwh, nszk);
  8884. ffebld_set_info (reduced, ninfo);
  8885. return reduced;
  8886. }
  8887. if ((lbt != FFEINFO_basictypeCHARACTER) && (rbt != FFEINFO_basictypeCHARACTER))
  8888. {
  8889. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  8890. && ffebad_start (FFEBAD_CONCAT_ARGS_TYPE))
  8891. {
  8892. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8893. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8894. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8895. ffebad_finish ();
  8896. }
  8897. }
  8898. else if (lbt != FFEINFO_basictypeCHARACTER)
  8899. {
  8900. if ((lbt != FFEINFO_basictypeANY)
  8901. && ffebad_start (FFEBAD_CONCAT_ARG_TYPE))
  8902. {
  8903. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8904. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8905. ffebad_finish ();
  8906. }
  8907. }
  8908. else if (rbt != FFEINFO_basictypeCHARACTER)
  8909. {
  8910. if ((rbt != FFEINFO_basictypeANY)
  8911. && ffebad_start (FFEBAD_CONCAT_ARG_TYPE))
  8912. {
  8913. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8914. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8915. ffebad_finish ();
  8916. }
  8917. }
  8918. else if ((lrk != 0) || (lszm == FFETARGET_charactersizeNONE))
  8919. {
  8920. if ((lkd != FFEINFO_kindANY)
  8921. && ffebad_start (FFEBAD_CONCAT_ARG_KIND))
  8922. {
  8923. const char *what;
  8924. if (lrk != 0)
  8925. what = "an array";
  8926. else
  8927. what = "of indeterminate length";
  8928. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8929. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  8930. ffebad_string (what);
  8931. ffebad_finish ();
  8932. }
  8933. }
  8934. else
  8935. {
  8936. if (ffebad_start (FFEBAD_CONCAT_ARG_KIND))
  8937. {
  8938. const char *what;
  8939. if (rrk != 0)
  8940. what = "an array";
  8941. else
  8942. what = "of indeterminate length";
  8943. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  8944. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  8945. ffebad_string (what);
  8946. ffebad_finish ();
  8947. }
  8948. }
  8949. reduced = ffebld_new_any ();
  8950. ffebld_set_info (reduced, ffeinfo_new_any ());
  8951. return reduced;
  8952. }
  8953. /* ffeexpr_reduced_eqop2_ -- Wrap up reduction of EQ and NE operators
  8954. reduced = ffeexpr_reduced_eqop2_(reduced,l,op,r);
  8955. Makes sure the left and right arguments for reduced have basictype of
  8956. INTEGER, REAL, COMPLEX, or CHARACTER. Determine common basictype and
  8957. size for reduction. If both left
  8958. and right arguments have where of CONSTANT, assign where CONSTANT to
  8959. reduced, else assign where FLEETING. Create CONVERT ops for args where
  8960. needed. Convert typeless
  8961. constants to the desired type/size explicitly.
  8962. If these requirements cannot be met, generate error message. */
  8963. static ffebld
  8964. ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  8965. ffeexprExpr_ r)
  8966. {
  8967. ffeinfo linfo, rinfo, ninfo;
  8968. ffeinfoBasictype lbt, rbt, nbt;
  8969. ffeinfoKindtype lkt, rkt, nkt;
  8970. ffeinfoRank lrk, rrk;
  8971. ffeinfoKind lkd, rkd;
  8972. ffeinfoWhere lwh, rwh, nwh;
  8973. ffetargetCharacterSize lsz, rsz;
  8974. linfo = ffebld_info (ffebld_left (reduced));
  8975. lbt = ffeinfo_basictype (linfo);
  8976. lkt = ffeinfo_kindtype (linfo);
  8977. lrk = ffeinfo_rank (linfo);
  8978. lkd = ffeinfo_kind (linfo);
  8979. lwh = ffeinfo_where (linfo);
  8980. lsz = ffebld_size_known (ffebld_left (reduced));
  8981. rinfo = ffebld_info (ffebld_right (reduced));
  8982. rbt = ffeinfo_basictype (rinfo);
  8983. rkt = ffeinfo_kindtype (rinfo);
  8984. rrk = ffeinfo_rank (rinfo);
  8985. rkd = ffeinfo_kind (rinfo);
  8986. rwh = ffeinfo_where (rinfo);
  8987. rsz = ffebld_size_known (ffebld_right (reduced));
  8988. ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
  8989. if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
  8990. || (nbt == FFEINFO_basictypeCOMPLEX) || (nbt == FFEINFO_basictypeCHARACTER))
  8991. && (lrk == 0) && (rrk == 0))
  8992. {
  8993. switch (lwh)
  8994. {
  8995. case FFEINFO_whereCONSTANT:
  8996. switch (rwh)
  8997. {
  8998. case FFEINFO_whereCONSTANT:
  8999. nwh = FFEINFO_whereCONSTANT;
  9000. break;
  9001. case FFEINFO_whereIMMEDIATE:
  9002. nwh = FFEINFO_whereIMMEDIATE;
  9003. break;
  9004. default:
  9005. nwh = FFEINFO_whereFLEETING;
  9006. break;
  9007. }
  9008. break;
  9009. case FFEINFO_whereIMMEDIATE:
  9010. switch (rwh)
  9011. {
  9012. case FFEINFO_whereCONSTANT:
  9013. case FFEINFO_whereIMMEDIATE:
  9014. nwh = FFEINFO_whereIMMEDIATE;
  9015. break;
  9016. default:
  9017. nwh = FFEINFO_whereFLEETING;
  9018. break;
  9019. }
  9020. break;
  9021. default:
  9022. nwh = FFEINFO_whereFLEETING;
  9023. break;
  9024. }
  9025. if ((lsz != FFETARGET_charactersizeNONE)
  9026. && (rsz != FFETARGET_charactersizeNONE))
  9027. lsz = rsz = (lsz > rsz) ? lsz : rsz;
  9028. ninfo = ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
  9029. 0, FFEINFO_kindENTITY, nwh, FFETARGET_charactersizeNONE);
  9030. ffebld_set_info (reduced, ninfo);
  9031. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9032. l->token, op->token, nbt, nkt, 0, lsz,
  9033. FFEEXPR_contextLET));
  9034. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9035. r->token, op->token, nbt, nkt, 0, rsz,
  9036. FFEEXPR_contextLET));
  9037. return reduced;
  9038. }
  9039. if ((lbt == FFEINFO_basictypeLOGICAL)
  9040. && (rbt == FFEINFO_basictypeLOGICAL))
  9041. {
  9042. if (ffebad_start_msg ("Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2",
  9043. FFEBAD_severityFATAL))
  9044. {
  9045. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9046. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9047. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9048. ffebad_finish ();
  9049. }
  9050. }
  9051. else if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
  9052. && (lbt != FFEINFO_basictypeCOMPLEX) && (lbt != FFEINFO_basictypeCHARACTER))
  9053. {
  9054. if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9055. && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER))
  9056. {
  9057. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  9058. && ffebad_start (FFEBAD_EQOP_ARGS_TYPE))
  9059. {
  9060. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9061. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9062. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9063. ffebad_finish ();
  9064. }
  9065. }
  9066. else
  9067. {
  9068. if ((lbt != FFEINFO_basictypeANY)
  9069. && ffebad_start (FFEBAD_EQOP_ARG_TYPE))
  9070. {
  9071. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9072. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9073. ffebad_finish ();
  9074. }
  9075. }
  9076. }
  9077. else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9078. && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER))
  9079. {
  9080. if ((rbt != FFEINFO_basictypeANY)
  9081. && ffebad_start (FFEBAD_EQOP_ARG_TYPE))
  9082. {
  9083. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9084. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9085. ffebad_finish ();
  9086. }
  9087. }
  9088. else if (lrk != 0)
  9089. {
  9090. if ((lkd != FFEINFO_kindANY)
  9091. && ffebad_start (FFEBAD_EQOP_ARG_KIND))
  9092. {
  9093. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9094. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9095. ffebad_string ("an array");
  9096. ffebad_finish ();
  9097. }
  9098. }
  9099. else
  9100. {
  9101. if ((rkd != FFEINFO_kindANY)
  9102. && ffebad_start (FFEBAD_EQOP_ARG_KIND))
  9103. {
  9104. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9105. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9106. ffebad_string ("an array");
  9107. ffebad_finish ();
  9108. }
  9109. }
  9110. reduced = ffebld_new_any ();
  9111. ffebld_set_info (reduced, ffeinfo_new_any ());
  9112. return reduced;
  9113. }
  9114. /* ffeexpr_reduced_math1_ -- Wrap up reduction of + - unary operators
  9115. reduced = ffeexpr_reduced_math1_(reduced,op,r);
  9116. Makes sure the argument for reduced has basictype of
  9117. INTEGER, REAL, or COMPLEX. If the argument has where of CONSTANT,
  9118. assign where CONSTANT to
  9119. reduced, else assign where FLEETING.
  9120. If these requirements cannot be met, generate error message. */
  9121. static ffebld
  9122. ffeexpr_reduced_math1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
  9123. {
  9124. ffeinfo rinfo, ninfo;
  9125. ffeinfoBasictype rbt;
  9126. ffeinfoKindtype rkt;
  9127. ffeinfoRank rrk;
  9128. ffeinfoKind rkd;
  9129. ffeinfoWhere rwh, nwh;
  9130. rinfo = ffebld_info (ffebld_left (reduced));
  9131. rbt = ffeinfo_basictype (rinfo);
  9132. rkt = ffeinfo_kindtype (rinfo);
  9133. rrk = ffeinfo_rank (rinfo);
  9134. rkd = ffeinfo_kind (rinfo);
  9135. rwh = ffeinfo_where (rinfo);
  9136. if (((rbt == FFEINFO_basictypeINTEGER) || (rbt == FFEINFO_basictypeREAL)
  9137. || (rbt == FFEINFO_basictypeCOMPLEX)) && (rrk == 0))
  9138. {
  9139. switch (rwh)
  9140. {
  9141. case FFEINFO_whereCONSTANT:
  9142. nwh = FFEINFO_whereCONSTANT;
  9143. break;
  9144. case FFEINFO_whereIMMEDIATE:
  9145. nwh = FFEINFO_whereIMMEDIATE;
  9146. break;
  9147. default:
  9148. nwh = FFEINFO_whereFLEETING;
  9149. break;
  9150. }
  9151. ninfo = ffeinfo_new (rbt, rkt, 0, FFEINFO_kindENTITY, nwh,
  9152. FFETARGET_charactersizeNONE);
  9153. ffebld_set_info (reduced, ninfo);
  9154. return reduced;
  9155. }
  9156. if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9157. && (rbt != FFEINFO_basictypeCOMPLEX))
  9158. {
  9159. if ((rbt != FFEINFO_basictypeANY)
  9160. && ffebad_start (FFEBAD_MATH_ARG_TYPE))
  9161. {
  9162. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9163. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9164. ffebad_finish ();
  9165. }
  9166. }
  9167. else
  9168. {
  9169. if ((rkd != FFEINFO_kindANY)
  9170. && ffebad_start (FFEBAD_MATH_ARG_KIND))
  9171. {
  9172. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9173. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9174. ffebad_string ("an array");
  9175. ffebad_finish ();
  9176. }
  9177. }
  9178. reduced = ffebld_new_any ();
  9179. ffebld_set_info (reduced, ffeinfo_new_any ());
  9180. return reduced;
  9181. }
  9182. /* ffeexpr_reduced_math2_ -- Wrap up reduction of + - * / operators
  9183. reduced = ffeexpr_reduced_math2_(reduced,l,op,r);
  9184. Makes sure the left and right arguments for reduced have basictype of
  9185. INTEGER, REAL, or COMPLEX. Determine common basictype and
  9186. size for reduction (flag expression for combined hollerith/typeless
  9187. situations for later determination of effective basictype). If both left
  9188. and right arguments have where of CONSTANT, assign where CONSTANT to
  9189. reduced, else assign where FLEETING. Create CONVERT ops for args where
  9190. needed. Convert typeless
  9191. constants to the desired type/size explicitly.
  9192. If these requirements cannot be met, generate error message. */
  9193. static ffebld
  9194. ffeexpr_reduced_math2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  9195. ffeexprExpr_ r)
  9196. {
  9197. ffeinfo linfo, rinfo, ninfo;
  9198. ffeinfoBasictype lbt, rbt, nbt;
  9199. ffeinfoKindtype lkt, rkt, nkt;
  9200. ffeinfoRank lrk, rrk;
  9201. ffeinfoKind lkd, rkd;
  9202. ffeinfoWhere lwh, rwh, nwh;
  9203. linfo = ffebld_info (ffebld_left (reduced));
  9204. lbt = ffeinfo_basictype (linfo);
  9205. lkt = ffeinfo_kindtype (linfo);
  9206. lrk = ffeinfo_rank (linfo);
  9207. lkd = ffeinfo_kind (linfo);
  9208. lwh = ffeinfo_where (linfo);
  9209. rinfo = ffebld_info (ffebld_right (reduced));
  9210. rbt = ffeinfo_basictype (rinfo);
  9211. rkt = ffeinfo_kindtype (rinfo);
  9212. rrk = ffeinfo_rank (rinfo);
  9213. rkd = ffeinfo_kind (rinfo);
  9214. rwh = ffeinfo_where (rinfo);
  9215. ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
  9216. if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
  9217. || (nbt == FFEINFO_basictypeCOMPLEX)) && (lrk == 0) && (rrk == 0))
  9218. {
  9219. switch (lwh)
  9220. {
  9221. case FFEINFO_whereCONSTANT:
  9222. switch (rwh)
  9223. {
  9224. case FFEINFO_whereCONSTANT:
  9225. nwh = FFEINFO_whereCONSTANT;
  9226. break;
  9227. case FFEINFO_whereIMMEDIATE:
  9228. nwh = FFEINFO_whereIMMEDIATE;
  9229. break;
  9230. default:
  9231. nwh = FFEINFO_whereFLEETING;
  9232. break;
  9233. }
  9234. break;
  9235. case FFEINFO_whereIMMEDIATE:
  9236. switch (rwh)
  9237. {
  9238. case FFEINFO_whereCONSTANT:
  9239. case FFEINFO_whereIMMEDIATE:
  9240. nwh = FFEINFO_whereIMMEDIATE;
  9241. break;
  9242. default:
  9243. nwh = FFEINFO_whereFLEETING;
  9244. break;
  9245. }
  9246. break;
  9247. default:
  9248. nwh = FFEINFO_whereFLEETING;
  9249. break;
  9250. }
  9251. ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
  9252. FFETARGET_charactersizeNONE);
  9253. ffebld_set_info (reduced, ninfo);
  9254. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9255. l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  9256. FFEEXPR_contextLET));
  9257. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9258. r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  9259. FFEEXPR_contextLET));
  9260. return reduced;
  9261. }
  9262. if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
  9263. && (lbt != FFEINFO_basictypeCOMPLEX))
  9264. {
  9265. if ((rbt != FFEINFO_basictypeINTEGER)
  9266. && (rbt != FFEINFO_basictypeREAL) && (rbt != FFEINFO_basictypeCOMPLEX))
  9267. {
  9268. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  9269. && ffebad_start (FFEBAD_MATH_ARGS_TYPE))
  9270. {
  9271. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9272. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9273. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9274. ffebad_finish ();
  9275. }
  9276. }
  9277. else
  9278. {
  9279. if ((lbt != FFEINFO_basictypeANY)
  9280. && ffebad_start (FFEBAD_MATH_ARG_TYPE))
  9281. {
  9282. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9283. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9284. ffebad_finish ();
  9285. }
  9286. }
  9287. }
  9288. else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9289. && (rbt != FFEINFO_basictypeCOMPLEX))
  9290. {
  9291. if ((rbt != FFEINFO_basictypeANY)
  9292. && ffebad_start (FFEBAD_MATH_ARG_TYPE))
  9293. {
  9294. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9295. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9296. ffebad_finish ();
  9297. }
  9298. }
  9299. else if (lrk != 0)
  9300. {
  9301. if ((lkd != FFEINFO_kindANY)
  9302. && ffebad_start (FFEBAD_MATH_ARG_KIND))
  9303. {
  9304. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9305. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9306. ffebad_string ("an array");
  9307. ffebad_finish ();
  9308. }
  9309. }
  9310. else
  9311. {
  9312. if ((rkd != FFEINFO_kindANY)
  9313. && ffebad_start (FFEBAD_MATH_ARG_KIND))
  9314. {
  9315. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9316. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9317. ffebad_string ("an array");
  9318. ffebad_finish ();
  9319. }
  9320. }
  9321. reduced = ffebld_new_any ();
  9322. ffebld_set_info (reduced, ffeinfo_new_any ());
  9323. return reduced;
  9324. }
  9325. /* ffeexpr_reduced_power_ -- Wrap up reduction of ** operator
  9326. reduced = ffeexpr_reduced_power_(reduced,l,op,r);
  9327. Makes sure the left and right arguments for reduced have basictype of
  9328. INTEGER, REAL, or COMPLEX. Determine common basictype and
  9329. size for reduction (flag expression for combined hollerith/typeless
  9330. situations for later determination of effective basictype). If both left
  9331. and right arguments have where of CONSTANT, assign where CONSTANT to
  9332. reduced, else assign where FLEETING. Create CONVERT ops for args where
  9333. needed. Note that real**int or complex**int
  9334. comes out as int = real**int etc with no conversions.
  9335. If these requirements cannot be met, generate error message using the
  9336. info in l, op, and r arguments and assign basictype, size, kind, and where
  9337. of ANY. */
  9338. static ffebld
  9339. ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  9340. ffeexprExpr_ r)
  9341. {
  9342. ffeinfo linfo, rinfo, ninfo;
  9343. ffeinfoBasictype lbt, rbt, nbt;
  9344. ffeinfoKindtype lkt, rkt, nkt;
  9345. ffeinfoRank lrk, rrk;
  9346. ffeinfoKind lkd, rkd;
  9347. ffeinfoWhere lwh, rwh, nwh;
  9348. linfo = ffebld_info (ffebld_left (reduced));
  9349. lbt = ffeinfo_basictype (linfo);
  9350. lkt = ffeinfo_kindtype (linfo);
  9351. lrk = ffeinfo_rank (linfo);
  9352. lkd = ffeinfo_kind (linfo);
  9353. lwh = ffeinfo_where (linfo);
  9354. rinfo = ffebld_info (ffebld_right (reduced));
  9355. rbt = ffeinfo_basictype (rinfo);
  9356. rkt = ffeinfo_kindtype (rinfo);
  9357. rrk = ffeinfo_rank (rinfo);
  9358. rkd = ffeinfo_kind (rinfo);
  9359. rwh = ffeinfo_where (rinfo);
  9360. if ((rbt == FFEINFO_basictypeINTEGER)
  9361. && ((lbt == FFEINFO_basictypeREAL)
  9362. || (lbt == FFEINFO_basictypeCOMPLEX)))
  9363. {
  9364. nbt = lbt;
  9365. nkt = ffeinfo_kindtype_max (nbt, lkt, FFEINFO_kindtypeREALDEFAULT);
  9366. if (nkt != FFEINFO_kindtypeREALDEFAULT)
  9367. {
  9368. nkt = ffeinfo_kindtype_max (nbt, lkt, FFEINFO_kindtypeREALDOUBLE);
  9369. if (nkt != FFEINFO_kindtypeREALDOUBLE)
  9370. nkt = FFEINFO_kindtypeREALDOUBLE; /* Highest kt we can power! */
  9371. }
  9372. if (rkt == FFEINFO_kindtypeINTEGER4)
  9373. {
  9374. ffebad_start_msg ("Unsupported operand for ** at %1 -- converting to default INTEGER",
  9375. FFEBAD_severityWARNING);
  9376. ffebad_here (0, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9377. ffebad_finish ();
  9378. }
  9379. if (rkt != FFEINFO_kindtypeINTEGERDEFAULT)
  9380. {
  9381. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9382. r->token, op->token,
  9383. FFEINFO_basictypeINTEGER, FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9384. FFETARGET_charactersizeNONE,
  9385. FFEEXPR_contextLET));
  9386. rkt = FFEINFO_kindtypeINTEGERDEFAULT;
  9387. }
  9388. }
  9389. else
  9390. {
  9391. ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
  9392. #if 0 /* INTEGER4**INTEGER4 works now. */
  9393. if ((nbt == FFEINFO_basictypeINTEGER)
  9394. && (nkt != FFEINFO_kindtypeINTEGERDEFAULT))
  9395. nkt = FFEINFO_kindtypeINTEGERDEFAULT; /* Highest kt we can power! */
  9396. #endif
  9397. if (((nbt == FFEINFO_basictypeREAL)
  9398. || (nbt == FFEINFO_basictypeCOMPLEX))
  9399. && (nkt != FFEINFO_kindtypeREALDEFAULT))
  9400. {
  9401. nkt = ffeinfo_kindtype_max (nbt, nkt, FFEINFO_kindtypeREALDOUBLE);
  9402. if (nkt != FFEINFO_kindtypeREALDOUBLE)
  9403. nkt = FFEINFO_kindtypeREALDOUBLE; /* Highest kt we can power! */
  9404. }
  9405. /* else Gonna turn into an error below. */
  9406. }
  9407. if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
  9408. || (nbt == FFEINFO_basictypeCOMPLEX)) && (lrk == 0) && (rrk == 0))
  9409. {
  9410. switch (lwh)
  9411. {
  9412. case FFEINFO_whereCONSTANT:
  9413. switch (rwh)
  9414. {
  9415. case FFEINFO_whereCONSTANT:
  9416. nwh = FFEINFO_whereCONSTANT;
  9417. break;
  9418. case FFEINFO_whereIMMEDIATE:
  9419. nwh = FFEINFO_whereIMMEDIATE;
  9420. break;
  9421. default:
  9422. nwh = FFEINFO_whereFLEETING;
  9423. break;
  9424. }
  9425. break;
  9426. case FFEINFO_whereIMMEDIATE:
  9427. switch (rwh)
  9428. {
  9429. case FFEINFO_whereCONSTANT:
  9430. case FFEINFO_whereIMMEDIATE:
  9431. nwh = FFEINFO_whereIMMEDIATE;
  9432. break;
  9433. default:
  9434. nwh = FFEINFO_whereFLEETING;
  9435. break;
  9436. }
  9437. break;
  9438. default:
  9439. nwh = FFEINFO_whereFLEETING;
  9440. break;
  9441. }
  9442. ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
  9443. FFETARGET_charactersizeNONE);
  9444. ffebld_set_info (reduced, ninfo);
  9445. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9446. l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  9447. FFEEXPR_contextLET));
  9448. if (rbt != FFEINFO_basictypeINTEGER)
  9449. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9450. r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
  9451. FFEEXPR_contextLET));
  9452. return reduced;
  9453. }
  9454. if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
  9455. && (lbt != FFEINFO_basictypeCOMPLEX))
  9456. {
  9457. if ((rbt != FFEINFO_basictypeINTEGER)
  9458. && (rbt != FFEINFO_basictypeREAL) && (rbt != FFEINFO_basictypeCOMPLEX))
  9459. {
  9460. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  9461. && ffebad_start (FFEBAD_MATH_ARGS_TYPE))
  9462. {
  9463. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9464. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9465. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9466. ffebad_finish ();
  9467. }
  9468. }
  9469. else
  9470. {
  9471. if ((lbt != FFEINFO_basictypeANY)
  9472. && ffebad_start (FFEBAD_MATH_ARG_TYPE))
  9473. {
  9474. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9475. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9476. ffebad_finish ();
  9477. }
  9478. }
  9479. }
  9480. else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9481. && (rbt != FFEINFO_basictypeCOMPLEX))
  9482. {
  9483. if ((rbt != FFEINFO_basictypeANY)
  9484. && ffebad_start (FFEBAD_MATH_ARG_TYPE))
  9485. {
  9486. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9487. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9488. ffebad_finish ();
  9489. }
  9490. }
  9491. else if (lrk != 0)
  9492. {
  9493. if ((lkd != FFEINFO_kindANY)
  9494. && ffebad_start (FFEBAD_MATH_ARG_KIND))
  9495. {
  9496. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9497. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9498. ffebad_string ("an array");
  9499. ffebad_finish ();
  9500. }
  9501. }
  9502. else
  9503. {
  9504. if ((rkd != FFEINFO_kindANY)
  9505. && ffebad_start (FFEBAD_MATH_ARG_KIND))
  9506. {
  9507. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9508. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9509. ffebad_string ("an array");
  9510. ffebad_finish ();
  9511. }
  9512. }
  9513. reduced = ffebld_new_any ();
  9514. ffebld_set_info (reduced, ffeinfo_new_any ());
  9515. return reduced;
  9516. }
  9517. /* ffeexpr_reduced_relop2_ -- Wrap up reduction of LT, LE, GE, and GT operators
  9518. reduced = ffeexpr_reduced_relop2_(reduced,l,op,r);
  9519. Makes sure the left and right arguments for reduced have basictype of
  9520. INTEGER, REAL, or CHARACTER. Determine common basictype and
  9521. size for reduction. If both left
  9522. and right arguments have where of CONSTANT, assign where CONSTANT to
  9523. reduced, else assign where FLEETING. Create CONVERT ops for args where
  9524. needed. Convert typeless
  9525. constants to the desired type/size explicitly.
  9526. If these requirements cannot be met, generate error message. */
  9527. static ffebld
  9528. ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  9529. ffeexprExpr_ r)
  9530. {
  9531. ffeinfo linfo, rinfo, ninfo;
  9532. ffeinfoBasictype lbt, rbt, nbt;
  9533. ffeinfoKindtype lkt, rkt, nkt;
  9534. ffeinfoRank lrk, rrk;
  9535. ffeinfoKind lkd, rkd;
  9536. ffeinfoWhere lwh, rwh, nwh;
  9537. ffetargetCharacterSize lsz, rsz;
  9538. linfo = ffebld_info (ffebld_left (reduced));
  9539. lbt = ffeinfo_basictype (linfo);
  9540. lkt = ffeinfo_kindtype (linfo);
  9541. lrk = ffeinfo_rank (linfo);
  9542. lkd = ffeinfo_kind (linfo);
  9543. lwh = ffeinfo_where (linfo);
  9544. lsz = ffebld_size_known (ffebld_left (reduced));
  9545. rinfo = ffebld_info (ffebld_right (reduced));
  9546. rbt = ffeinfo_basictype (rinfo);
  9547. rkt = ffeinfo_kindtype (rinfo);
  9548. rrk = ffeinfo_rank (rinfo);
  9549. rkd = ffeinfo_kind (rinfo);
  9550. rwh = ffeinfo_where (rinfo);
  9551. rsz = ffebld_size_known (ffebld_right (reduced));
  9552. ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
  9553. if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
  9554. || (nbt == FFEINFO_basictypeCHARACTER))
  9555. && (lrk == 0) && (rrk == 0))
  9556. {
  9557. switch (lwh)
  9558. {
  9559. case FFEINFO_whereCONSTANT:
  9560. switch (rwh)
  9561. {
  9562. case FFEINFO_whereCONSTANT:
  9563. nwh = FFEINFO_whereCONSTANT;
  9564. break;
  9565. case FFEINFO_whereIMMEDIATE:
  9566. nwh = FFEINFO_whereIMMEDIATE;
  9567. break;
  9568. default:
  9569. nwh = FFEINFO_whereFLEETING;
  9570. break;
  9571. }
  9572. break;
  9573. case FFEINFO_whereIMMEDIATE:
  9574. switch (rwh)
  9575. {
  9576. case FFEINFO_whereCONSTANT:
  9577. case FFEINFO_whereIMMEDIATE:
  9578. nwh = FFEINFO_whereIMMEDIATE;
  9579. break;
  9580. default:
  9581. nwh = FFEINFO_whereFLEETING;
  9582. break;
  9583. }
  9584. break;
  9585. default:
  9586. nwh = FFEINFO_whereFLEETING;
  9587. break;
  9588. }
  9589. if ((lsz != FFETARGET_charactersizeNONE)
  9590. && (rsz != FFETARGET_charactersizeNONE))
  9591. lsz = rsz = (lsz > rsz) ? lsz : rsz;
  9592. ninfo = ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
  9593. 0, FFEINFO_kindENTITY, nwh, FFETARGET_charactersizeNONE);
  9594. ffebld_set_info (reduced, ninfo);
  9595. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9596. l->token, op->token, nbt, nkt, 0, lsz,
  9597. FFEEXPR_contextLET));
  9598. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9599. r->token, op->token, nbt, nkt, 0, rsz,
  9600. FFEEXPR_contextLET));
  9601. return reduced;
  9602. }
  9603. if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
  9604. && (lbt != FFEINFO_basictypeCHARACTER))
  9605. {
  9606. if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9607. && (rbt != FFEINFO_basictypeCHARACTER))
  9608. {
  9609. if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
  9610. && ffebad_start (FFEBAD_RELOP_ARGS_TYPE))
  9611. {
  9612. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9613. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9614. ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9615. ffebad_finish ();
  9616. }
  9617. }
  9618. else
  9619. {
  9620. if ((lbt != FFEINFO_basictypeANY)
  9621. && ffebad_start (FFEBAD_RELOP_ARG_TYPE))
  9622. {
  9623. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9624. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9625. ffebad_finish ();
  9626. }
  9627. }
  9628. }
  9629. else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
  9630. && (rbt != FFEINFO_basictypeCHARACTER))
  9631. {
  9632. if ((rbt != FFEINFO_basictypeANY)
  9633. && ffebad_start (FFEBAD_RELOP_ARG_TYPE))
  9634. {
  9635. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9636. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9637. ffebad_finish ();
  9638. }
  9639. }
  9640. else if (lrk != 0)
  9641. {
  9642. if ((lkd != FFEINFO_kindANY)
  9643. && ffebad_start (FFEBAD_RELOP_ARG_KIND))
  9644. {
  9645. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9646. ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
  9647. ffebad_string ("an array");
  9648. ffebad_finish ();
  9649. }
  9650. }
  9651. else
  9652. {
  9653. if ((rkd != FFEINFO_kindANY)
  9654. && ffebad_start (FFEBAD_RELOP_ARG_KIND))
  9655. {
  9656. ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
  9657. ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
  9658. ffebad_string ("an array");
  9659. ffebad_finish ();
  9660. }
  9661. }
  9662. reduced = ffebld_new_any ();
  9663. ffebld_set_info (reduced, ffeinfo_new_any ());
  9664. return reduced;
  9665. }
  9666. /* ffeexpr_reduced_ugly1_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
  9667. reduced = ffeexpr_reduced_ugly1_(reduced,op,r);
  9668. Sigh. */
  9669. static ffebld
  9670. ffeexpr_reduced_ugly1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
  9671. {
  9672. ffeinfo rinfo;
  9673. ffeinfoBasictype rbt;
  9674. ffeinfoKindtype rkt;
  9675. ffeinfoRank rrk;
  9676. ffeinfoKind rkd;
  9677. ffeinfoWhere rwh;
  9678. rinfo = ffebld_info (ffebld_left (reduced));
  9679. rbt = ffeinfo_basictype (rinfo);
  9680. rkt = ffeinfo_kindtype (rinfo);
  9681. rrk = ffeinfo_rank (rinfo);
  9682. rkd = ffeinfo_kind (rinfo);
  9683. rwh = ffeinfo_where (rinfo);
  9684. if ((rbt == FFEINFO_basictypeTYPELESS)
  9685. || (rbt == FFEINFO_basictypeHOLLERITH))
  9686. {
  9687. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9688. r->token, op->token, FFEINFO_basictypeINTEGER,
  9689. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9690. FFETARGET_charactersizeNONE,
  9691. FFEEXPR_contextLET));
  9692. rinfo = ffebld_info (ffebld_left (reduced));
  9693. rbt = FFEINFO_basictypeINTEGER;
  9694. rkt = FFEINFO_kindtypeINTEGERDEFAULT;
  9695. rrk = 0;
  9696. rkd = FFEINFO_kindENTITY;
  9697. rwh = ffeinfo_where (rinfo);
  9698. }
  9699. if (rbt == FFEINFO_basictypeLOGICAL)
  9700. {
  9701. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9702. r->token, op->token, FFEINFO_basictypeINTEGER,
  9703. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9704. FFETARGET_charactersizeNONE,
  9705. FFEEXPR_contextLET));
  9706. }
  9707. return reduced;
  9708. }
  9709. /* ffeexpr_reduced_ugly1log_ -- Deal with TYPELESS and HOLLERITH
  9710. reduced = ffeexpr_reduced_ugly1log_(reduced,op,r);
  9711. Sigh. */
  9712. static ffebld
  9713. ffeexpr_reduced_ugly1log_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
  9714. {
  9715. ffeinfo rinfo;
  9716. ffeinfoBasictype rbt;
  9717. ffeinfoKindtype rkt;
  9718. ffeinfoRank rrk;
  9719. ffeinfoKind rkd;
  9720. ffeinfoWhere rwh;
  9721. rinfo = ffebld_info (ffebld_left (reduced));
  9722. rbt = ffeinfo_basictype (rinfo);
  9723. rkt = ffeinfo_kindtype (rinfo);
  9724. rrk = ffeinfo_rank (rinfo);
  9725. rkd = ffeinfo_kind (rinfo);
  9726. rwh = ffeinfo_where (rinfo);
  9727. if ((rbt == FFEINFO_basictypeTYPELESS)
  9728. || (rbt == FFEINFO_basictypeHOLLERITH))
  9729. {
  9730. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9731. r->token, op->token, FFEINFO_basictypeLOGICAL, 0,
  9732. FFEINFO_kindtypeLOGICALDEFAULT,
  9733. FFETARGET_charactersizeNONE,
  9734. FFEEXPR_contextLET));
  9735. rinfo = ffebld_info (ffebld_left (reduced));
  9736. rbt = FFEINFO_basictypeLOGICAL;
  9737. rkt = FFEINFO_kindtypeLOGICALDEFAULT;
  9738. rrk = 0;
  9739. rkd = FFEINFO_kindENTITY;
  9740. rwh = ffeinfo_where (rinfo);
  9741. }
  9742. return reduced;
  9743. }
  9744. /* ffeexpr_reduced_ugly2_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
  9745. reduced = ffeexpr_reduced_ugly2_(reduced,l,op,r);
  9746. Sigh. */
  9747. static ffebld
  9748. ffeexpr_reduced_ugly2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  9749. ffeexprExpr_ r)
  9750. {
  9751. ffeinfo linfo, rinfo;
  9752. ffeinfoBasictype lbt, rbt;
  9753. ffeinfoKindtype lkt, rkt;
  9754. ffeinfoRank lrk, rrk;
  9755. ffeinfoKind lkd, rkd;
  9756. ffeinfoWhere lwh, rwh;
  9757. linfo = ffebld_info (ffebld_left (reduced));
  9758. lbt = ffeinfo_basictype (linfo);
  9759. lkt = ffeinfo_kindtype (linfo);
  9760. lrk = ffeinfo_rank (linfo);
  9761. lkd = ffeinfo_kind (linfo);
  9762. lwh = ffeinfo_where (linfo);
  9763. rinfo = ffebld_info (ffebld_right (reduced));
  9764. rbt = ffeinfo_basictype (rinfo);
  9765. rkt = ffeinfo_kindtype (rinfo);
  9766. rrk = ffeinfo_rank (rinfo);
  9767. rkd = ffeinfo_kind (rinfo);
  9768. rwh = ffeinfo_where (rinfo);
  9769. if ((lbt == FFEINFO_basictypeTYPELESS)
  9770. || (lbt == FFEINFO_basictypeHOLLERITH))
  9771. {
  9772. if ((rbt == FFEINFO_basictypeTYPELESS)
  9773. || (rbt == FFEINFO_basictypeHOLLERITH))
  9774. {
  9775. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9776. l->token, op->token, FFEINFO_basictypeINTEGER,
  9777. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9778. FFETARGET_charactersizeNONE,
  9779. FFEEXPR_contextLET));
  9780. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9781. r->token, op->token, FFEINFO_basictypeINTEGER, 0,
  9782. FFEINFO_kindtypeINTEGERDEFAULT,
  9783. FFETARGET_charactersizeNONE,
  9784. FFEEXPR_contextLET));
  9785. linfo = ffebld_info (ffebld_left (reduced));
  9786. rinfo = ffebld_info (ffebld_right (reduced));
  9787. lbt = rbt = FFEINFO_basictypeINTEGER;
  9788. lkt = rkt = FFEINFO_kindtypeINTEGERDEFAULT;
  9789. lrk = rrk = 0;
  9790. lkd = rkd = FFEINFO_kindENTITY;
  9791. lwh = ffeinfo_where (linfo);
  9792. rwh = ffeinfo_where (rinfo);
  9793. }
  9794. else
  9795. {
  9796. ffebld_set_left (reduced, ffeexpr_convert_expr (ffebld_left (reduced),
  9797. l->token, ffebld_right (reduced), r->token,
  9798. FFEEXPR_contextLET));
  9799. linfo = ffebld_info (ffebld_left (reduced));
  9800. lbt = ffeinfo_basictype (linfo);
  9801. lkt = ffeinfo_kindtype (linfo);
  9802. lrk = ffeinfo_rank (linfo);
  9803. lkd = ffeinfo_kind (linfo);
  9804. lwh = ffeinfo_where (linfo);
  9805. }
  9806. }
  9807. else
  9808. {
  9809. if ((rbt == FFEINFO_basictypeTYPELESS)
  9810. || (rbt == FFEINFO_basictypeHOLLERITH))
  9811. {
  9812. ffebld_set_right (reduced, ffeexpr_convert_expr (ffebld_right (reduced),
  9813. r->token, ffebld_left (reduced), l->token,
  9814. FFEEXPR_contextLET));
  9815. rinfo = ffebld_info (ffebld_right (reduced));
  9816. rbt = ffeinfo_basictype (rinfo);
  9817. rkt = ffeinfo_kindtype (rinfo);
  9818. rrk = ffeinfo_rank (rinfo);
  9819. rkd = ffeinfo_kind (rinfo);
  9820. rwh = ffeinfo_where (rinfo);
  9821. }
  9822. /* else Leave it alone. */
  9823. }
  9824. if (lbt == FFEINFO_basictypeLOGICAL)
  9825. {
  9826. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9827. l->token, op->token, FFEINFO_basictypeINTEGER,
  9828. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9829. FFETARGET_charactersizeNONE,
  9830. FFEEXPR_contextLET));
  9831. }
  9832. if (rbt == FFEINFO_basictypeLOGICAL)
  9833. {
  9834. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9835. r->token, op->token, FFEINFO_basictypeINTEGER,
  9836. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  9837. FFETARGET_charactersizeNONE,
  9838. FFEEXPR_contextLET));
  9839. }
  9840. return reduced;
  9841. }
  9842. /* ffeexpr_reduced_ugly2log_ -- Deal with TYPELESS and HOLLERITH
  9843. reduced = ffeexpr_reduced_ugly2log_(reduced,l,op,r);
  9844. Sigh. */
  9845. static ffebld
  9846. ffeexpr_reduced_ugly2log_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
  9847. ffeexprExpr_ r)
  9848. {
  9849. ffeinfo linfo, rinfo;
  9850. ffeinfoBasictype lbt, rbt;
  9851. ffeinfoKindtype lkt, rkt;
  9852. ffeinfoRank lrk, rrk;
  9853. ffeinfoKind lkd, rkd;
  9854. ffeinfoWhere lwh, rwh;
  9855. linfo = ffebld_info (ffebld_left (reduced));
  9856. lbt = ffeinfo_basictype (linfo);
  9857. lkt = ffeinfo_kindtype (linfo);
  9858. lrk = ffeinfo_rank (linfo);
  9859. lkd = ffeinfo_kind (linfo);
  9860. lwh = ffeinfo_where (linfo);
  9861. rinfo = ffebld_info (ffebld_right (reduced));
  9862. rbt = ffeinfo_basictype (rinfo);
  9863. rkt = ffeinfo_kindtype (rinfo);
  9864. rrk = ffeinfo_rank (rinfo);
  9865. rkd = ffeinfo_kind (rinfo);
  9866. rwh = ffeinfo_where (rinfo);
  9867. if ((lbt == FFEINFO_basictypeTYPELESS)
  9868. || (lbt == FFEINFO_basictypeHOLLERITH))
  9869. {
  9870. if ((rbt == FFEINFO_basictypeTYPELESS)
  9871. || (rbt == FFEINFO_basictypeHOLLERITH))
  9872. {
  9873. ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
  9874. l->token, op->token, FFEINFO_basictypeLOGICAL,
  9875. FFEINFO_kindtypeLOGICALDEFAULT, 0,
  9876. FFETARGET_charactersizeNONE,
  9877. FFEEXPR_contextLET));
  9878. ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
  9879. r->token, op->token, FFEINFO_basictypeLOGICAL,
  9880. FFEINFO_kindtypeLOGICALDEFAULT, 0,
  9881. FFETARGET_charactersizeNONE,
  9882. FFEEXPR_contextLET));
  9883. linfo = ffebld_info (ffebld_left (reduced));
  9884. rinfo = ffebld_info (ffebld_right (reduced));
  9885. lbt = rbt = FFEINFO_basictypeLOGICAL;
  9886. lkt = rkt = FFEINFO_kindtypeLOGICALDEFAULT;
  9887. lrk = rrk = 0;
  9888. lkd = rkd = FFEINFO_kindENTITY;
  9889. lwh = ffeinfo_where (linfo);
  9890. rwh = ffeinfo_where (rinfo);
  9891. }
  9892. else
  9893. {
  9894. ffebld_set_left (reduced, ffeexpr_convert_expr (ffebld_left (reduced),
  9895. l->token, ffebld_right (reduced), r->token,
  9896. FFEEXPR_contextLET));
  9897. linfo = ffebld_info (ffebld_left (reduced));
  9898. lbt = ffeinfo_basictype (linfo);
  9899. lkt = ffeinfo_kindtype (linfo);
  9900. lrk = ffeinfo_rank (linfo);
  9901. lkd = ffeinfo_kind (linfo);
  9902. lwh = ffeinfo_where (linfo);
  9903. }
  9904. }
  9905. else
  9906. {
  9907. if ((rbt == FFEINFO_basictypeTYPELESS)
  9908. || (rbt == FFEINFO_basictypeHOLLERITH))
  9909. {
  9910. ffebld_set_right (reduced, ffeexpr_convert_expr (ffebld_right (reduced),
  9911. r->token, ffebld_left (reduced), l->token,
  9912. FFEEXPR_contextLET));
  9913. rinfo = ffebld_info (ffebld_right (reduced));
  9914. rbt = ffeinfo_basictype (rinfo);
  9915. rkt = ffeinfo_kindtype (rinfo);
  9916. rrk = ffeinfo_rank (rinfo);
  9917. rkd = ffeinfo_kind (rinfo);
  9918. rwh = ffeinfo_where (rinfo);
  9919. }
  9920. /* else Leave it alone. */
  9921. }
  9922. return reduced;
  9923. }
  9924. /* Fumble through tokens until a nonmatching CLOSE_PAREN, EOS, or SEMICOLON
  9925. is found.
  9926. The idea is to process the tokens as they would be done by normal
  9927. expression processing, with the key things being telling the lexer
  9928. when hollerith/character constants are about to happen, until the
  9929. true closing token is found. */
  9930. static ffelexHandler
  9931. ffeexpr_find_close_paren_ (ffelexToken t,
  9932. ffelexHandler after)
  9933. {
  9934. ffeexpr_find_.after = after;
  9935. ffeexpr_find_.level = 1;
  9936. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  9937. }
  9938. static ffelexHandler
  9939. ffeexpr_nil_finished_ (ffelexToken t)
  9940. {
  9941. switch (ffelex_token_type (t))
  9942. {
  9943. case FFELEX_typeCLOSE_PAREN:
  9944. if (--ffeexpr_find_.level == 0)
  9945. return (ffelexHandler) ffeexpr_find_.after;
  9946. return (ffelexHandler) ffeexpr_nil_binary_;
  9947. case FFELEX_typeCOMMA:
  9948. case FFELEX_typeCOLON:
  9949. case FFELEX_typeEQUALS:
  9950. case FFELEX_typePOINTS:
  9951. return (ffelexHandler) ffeexpr_nil_rhs_;
  9952. default:
  9953. if (--ffeexpr_find_.level == 0)
  9954. return (ffelexHandler) ffeexpr_find_.after (t);
  9955. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  9956. }
  9957. }
  9958. static ffelexHandler
  9959. ffeexpr_nil_rhs_ (ffelexToken t)
  9960. {
  9961. switch (ffelex_token_type (t))
  9962. {
  9963. case FFELEX_typeQUOTE:
  9964. if (ffe_is_vxt ())
  9965. return (ffelexHandler) ffeexpr_nil_quote_;
  9966. ffelex_set_expecting_hollerith (-1, '\"',
  9967. ffelex_token_where_line (t),
  9968. ffelex_token_where_column (t));
  9969. return (ffelexHandler) ffeexpr_nil_apostrophe_;
  9970. case FFELEX_typeAPOSTROPHE:
  9971. ffelex_set_expecting_hollerith (-1, '\'',
  9972. ffelex_token_where_line (t),
  9973. ffelex_token_where_column (t));
  9974. return (ffelexHandler) ffeexpr_nil_apostrophe_;
  9975. case FFELEX_typePERCENT:
  9976. return (ffelexHandler) ffeexpr_nil_percent_;
  9977. case FFELEX_typeOPEN_PAREN:
  9978. ++ffeexpr_find_.level;
  9979. return (ffelexHandler) ffeexpr_nil_rhs_;
  9980. case FFELEX_typePLUS:
  9981. case FFELEX_typeMINUS:
  9982. return (ffelexHandler) ffeexpr_nil_rhs_;
  9983. case FFELEX_typePERIOD:
  9984. return (ffelexHandler) ffeexpr_nil_period_;
  9985. case FFELEX_typeNUMBER:
  9986. ffeexpr_hollerith_count_ = atol (ffelex_token_text (t));
  9987. if (ffeexpr_hollerith_count_ > 0)
  9988. ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_,
  9989. '\0',
  9990. ffelex_token_where_line (t),
  9991. ffelex_token_where_column (t));
  9992. return (ffelexHandler) ffeexpr_nil_number_;
  9993. case FFELEX_typeNAME:
  9994. case FFELEX_typeNAMES:
  9995. return (ffelexHandler) ffeexpr_nil_name_rhs_;
  9996. case FFELEX_typeASTERISK:
  9997. case FFELEX_typeSLASH:
  9998. case FFELEX_typePOWER:
  9999. case FFELEX_typeCONCAT:
  10000. case FFELEX_typeREL_EQ:
  10001. case FFELEX_typeREL_NE:
  10002. case FFELEX_typeREL_LE:
  10003. case FFELEX_typeREL_GE:
  10004. return (ffelexHandler) ffeexpr_nil_rhs_;
  10005. default:
  10006. return (ffelexHandler) ffeexpr_nil_finished_ (t);
  10007. }
  10008. }
  10009. static ffelexHandler
  10010. ffeexpr_nil_period_ (ffelexToken t)
  10011. {
  10012. switch (ffelex_token_type (t))
  10013. {
  10014. case FFELEX_typeNAME:
  10015. case FFELEX_typeNAMES:
  10016. ffeexpr_current_dotdot_ = ffestr_other (t);
  10017. switch (ffeexpr_current_dotdot_)
  10018. {
  10019. case FFESTR_otherNone:
  10020. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10021. case FFESTR_otherTRUE:
  10022. case FFESTR_otherFALSE:
  10023. case FFESTR_otherNOT:
  10024. return (ffelexHandler) ffeexpr_nil_end_period_;
  10025. default:
  10026. return (ffelexHandler) ffeexpr_nil_swallow_period_;
  10027. }
  10028. break; /* Nothing really reaches here. */
  10029. case FFELEX_typeNUMBER:
  10030. return (ffelexHandler) ffeexpr_nil_real_;
  10031. default:
  10032. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10033. }
  10034. }
  10035. static ffelexHandler
  10036. ffeexpr_nil_end_period_ (ffelexToken t)
  10037. {
  10038. switch (ffeexpr_current_dotdot_)
  10039. {
  10040. case FFESTR_otherNOT:
  10041. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  10042. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10043. return (ffelexHandler) ffeexpr_nil_rhs_;
  10044. case FFESTR_otherTRUE:
  10045. case FFESTR_otherFALSE:
  10046. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  10047. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10048. return (ffelexHandler) ffeexpr_nil_binary_;
  10049. default:
  10050. assert ("Bad [nil] unary dotdot in ffeexpr_current_dotdot_" == NULL);
  10051. exit (0);
  10052. return NULL;
  10053. }
  10054. }
  10055. static ffelexHandler
  10056. ffeexpr_nil_swallow_period_ (ffelexToken t)
  10057. {
  10058. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  10059. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10060. return (ffelexHandler) ffeexpr_nil_rhs_;
  10061. }
  10062. static ffelexHandler
  10063. ffeexpr_nil_real_ (ffelexToken t)
  10064. {
  10065. char d;
  10066. const char *p;
  10067. if (((ffelex_token_type (t) != FFELEX_typeNAME)
  10068. && (ffelex_token_type (t) != FFELEX_typeNAMES))
  10069. || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  10070. 'D', 'd')
  10071. || ffesrc_char_match_init (d, 'E', 'e')
  10072. || ffesrc_char_match_init (d, 'Q', 'q')))
  10073. && ffeexpr_isdigits_ (++p)))
  10074. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10075. if (*p == '\0')
  10076. return (ffelexHandler) ffeexpr_nil_real_exponent_;
  10077. return (ffelexHandler) ffeexpr_nil_binary_;
  10078. }
  10079. static ffelexHandler
  10080. ffeexpr_nil_real_exponent_ (ffelexToken t)
  10081. {
  10082. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  10083. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  10084. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10085. return (ffelexHandler) ffeexpr_nil_real_exp_sign_;
  10086. }
  10087. static ffelexHandler
  10088. ffeexpr_nil_real_exp_sign_ (ffelexToken t)
  10089. {
  10090. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  10091. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10092. return (ffelexHandler) ffeexpr_nil_binary_;
  10093. }
  10094. static ffelexHandler
  10095. ffeexpr_nil_number_ (ffelexToken t)
  10096. {
  10097. char d;
  10098. const char *p;
  10099. if (ffeexpr_hollerith_count_ > 0)
  10100. ffelex_set_expecting_hollerith (0, '\0',
  10101. ffewhere_line_unknown (),
  10102. ffewhere_column_unknown ());
  10103. switch (ffelex_token_type (t))
  10104. {
  10105. case FFELEX_typeNAME:
  10106. case FFELEX_typeNAMES:
  10107. if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  10108. 'D', 'd')
  10109. || ffesrc_char_match_init (d, 'E', 'e')
  10110. || ffesrc_char_match_init (d, 'Q', 'q'))
  10111. && ffeexpr_isdigits_ (++p))
  10112. {
  10113. if (*p == '\0')
  10114. {
  10115. ffeexpr_find_.t = ffelex_token_use (t);
  10116. return (ffelexHandler) ffeexpr_nil_number_exponent_;
  10117. }
  10118. return (ffelexHandler) ffeexpr_nil_binary_;
  10119. }
  10120. break;
  10121. case FFELEX_typePERIOD:
  10122. ffeexpr_find_.t = ffelex_token_use (t);
  10123. return (ffelexHandler) ffeexpr_nil_number_period_;
  10124. case FFELEX_typeHOLLERITH:
  10125. return (ffelexHandler) ffeexpr_nil_binary_;
  10126. default:
  10127. break;
  10128. }
  10129. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10130. }
  10131. /* Expects ffeexpr_find_.t. */
  10132. static ffelexHandler
  10133. ffeexpr_nil_number_exponent_ (ffelexToken t)
  10134. {
  10135. ffelexHandler nexthandler;
  10136. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  10137. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  10138. {
  10139. nexthandler
  10140. = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
  10141. ffelex_token_kill (ffeexpr_find_.t);
  10142. return (ffelexHandler) (*nexthandler) (t);
  10143. }
  10144. ffelex_token_kill (ffeexpr_find_.t);
  10145. return (ffelexHandler) ffeexpr_nil_number_exp_sign_;
  10146. }
  10147. static ffelexHandler
  10148. ffeexpr_nil_number_exp_sign_ (ffelexToken t)
  10149. {
  10150. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  10151. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10152. return (ffelexHandler) ffeexpr_nil_binary_;
  10153. }
  10154. /* Expects ffeexpr_find_.t. */
  10155. static ffelexHandler
  10156. ffeexpr_nil_number_period_ (ffelexToken t)
  10157. {
  10158. ffelexHandler nexthandler;
  10159. char d;
  10160. const char *p;
  10161. switch (ffelex_token_type (t))
  10162. {
  10163. case FFELEX_typeNAME:
  10164. case FFELEX_typeNAMES:
  10165. if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  10166. 'D', 'd')
  10167. || ffesrc_char_match_init (d, 'E', 'e')
  10168. || ffesrc_char_match_init (d, 'Q', 'q'))
  10169. && ffeexpr_isdigits_ (++p))
  10170. {
  10171. if (*p == '\0')
  10172. return (ffelexHandler) ffeexpr_nil_number_per_exp_;
  10173. ffelex_token_kill (ffeexpr_find_.t);
  10174. return (ffelexHandler) ffeexpr_nil_binary_;
  10175. }
  10176. nexthandler
  10177. = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
  10178. ffelex_token_kill (ffeexpr_find_.t);
  10179. return (ffelexHandler) (*nexthandler) (t);
  10180. case FFELEX_typeNUMBER:
  10181. ffelex_token_kill (ffeexpr_find_.t);
  10182. return (ffelexHandler) ffeexpr_nil_number_real_;
  10183. default:
  10184. break;
  10185. }
  10186. ffelex_token_kill (ffeexpr_find_.t);
  10187. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10188. }
  10189. /* Expects ffeexpr_find_.t. */
  10190. static ffelexHandler
  10191. ffeexpr_nil_number_per_exp_ (ffelexToken t)
  10192. {
  10193. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  10194. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  10195. {
  10196. ffelexHandler nexthandler;
  10197. nexthandler
  10198. = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
  10199. ffelex_token_kill (ffeexpr_find_.t);
  10200. return (ffelexHandler) (*nexthandler) (t);
  10201. }
  10202. ffelex_token_kill (ffeexpr_find_.t);
  10203. return (ffelexHandler) ffeexpr_nil_num_per_exp_sign_;
  10204. }
  10205. static ffelexHandler
  10206. ffeexpr_nil_number_real_ (ffelexToken t)
  10207. {
  10208. char d;
  10209. const char *p;
  10210. if (((ffelex_token_type (t) != FFELEX_typeNAME)
  10211. && (ffelex_token_type (t) != FFELEX_typeNAMES))
  10212. || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  10213. 'D', 'd')
  10214. || ffesrc_char_match_init (d, 'E', 'e')
  10215. || ffesrc_char_match_init (d, 'Q', 'q')))
  10216. && ffeexpr_isdigits_ (++p)))
  10217. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10218. if (*p == '\0')
  10219. return (ffelexHandler) ffeexpr_nil_number_real_exp_;
  10220. return (ffelexHandler) ffeexpr_nil_binary_;
  10221. }
  10222. static ffelexHandler
  10223. ffeexpr_nil_num_per_exp_sign_ (ffelexToken t)
  10224. {
  10225. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  10226. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10227. return (ffelexHandler) ffeexpr_nil_binary_;
  10228. }
  10229. static ffelexHandler
  10230. ffeexpr_nil_number_real_exp_ (ffelexToken t)
  10231. {
  10232. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  10233. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  10234. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10235. return (ffelexHandler) ffeexpr_nil_num_real_exp_sn_;
  10236. }
  10237. static ffelexHandler
  10238. ffeexpr_nil_num_real_exp_sn_ (ffelexToken t)
  10239. {
  10240. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  10241. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10242. return (ffelexHandler) ffeexpr_nil_binary_;
  10243. }
  10244. static ffelexHandler
  10245. ffeexpr_nil_binary_ (ffelexToken t)
  10246. {
  10247. switch (ffelex_token_type (t))
  10248. {
  10249. case FFELEX_typePLUS:
  10250. case FFELEX_typeMINUS:
  10251. case FFELEX_typeASTERISK:
  10252. case FFELEX_typeSLASH:
  10253. case FFELEX_typePOWER:
  10254. case FFELEX_typeCONCAT:
  10255. case FFELEX_typeOPEN_ANGLE:
  10256. case FFELEX_typeCLOSE_ANGLE:
  10257. case FFELEX_typeREL_EQ:
  10258. case FFELEX_typeREL_NE:
  10259. case FFELEX_typeREL_GE:
  10260. case FFELEX_typeREL_LE:
  10261. return (ffelexHandler) ffeexpr_nil_rhs_;
  10262. case FFELEX_typePERIOD:
  10263. return (ffelexHandler) ffeexpr_nil_binary_period_;
  10264. default:
  10265. return (ffelexHandler) ffeexpr_nil_finished_ (t);
  10266. }
  10267. }
  10268. static ffelexHandler
  10269. ffeexpr_nil_binary_period_ (ffelexToken t)
  10270. {
  10271. switch (ffelex_token_type (t))
  10272. {
  10273. case FFELEX_typeNAME:
  10274. case FFELEX_typeNAMES:
  10275. ffeexpr_current_dotdot_ = ffestr_other (t);
  10276. switch (ffeexpr_current_dotdot_)
  10277. {
  10278. case FFESTR_otherTRUE:
  10279. case FFESTR_otherFALSE:
  10280. case FFESTR_otherNOT:
  10281. return (ffelexHandler) ffeexpr_nil_binary_sw_per_;
  10282. default:
  10283. return (ffelexHandler) ffeexpr_nil_binary_end_per_;
  10284. }
  10285. break; /* Nothing really reaches here. */
  10286. default:
  10287. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10288. }
  10289. }
  10290. static ffelexHandler
  10291. ffeexpr_nil_binary_end_per_ (ffelexToken t)
  10292. {
  10293. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  10294. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10295. return (ffelexHandler) ffeexpr_nil_rhs_;
  10296. }
  10297. static ffelexHandler
  10298. ffeexpr_nil_binary_sw_per_ (ffelexToken t)
  10299. {
  10300. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  10301. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10302. return (ffelexHandler) ffeexpr_nil_binary_;
  10303. }
  10304. static ffelexHandler
  10305. ffeexpr_nil_quote_ (ffelexToken t)
  10306. {
  10307. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  10308. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10309. return (ffelexHandler) ffeexpr_nil_binary_;
  10310. }
  10311. static ffelexHandler
  10312. ffeexpr_nil_apostrophe_ (ffelexToken t)
  10313. {
  10314. assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
  10315. return (ffelexHandler) ffeexpr_nil_apos_char_;
  10316. }
  10317. static ffelexHandler
  10318. ffeexpr_nil_apos_char_ (ffelexToken t)
  10319. {
  10320. char c;
  10321. if ((ffelex_token_type (t) == FFELEX_typeNAME)
  10322. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  10323. {
  10324. if ((ffelex_token_length (t) == 1)
  10325. && (ffesrc_char_match_init ((c = ffelex_token_text (t)[0]),
  10326. 'B', 'b')
  10327. || ffesrc_char_match_init (c, 'O', 'o')
  10328. || ffesrc_char_match_init (c, 'X', 'x')
  10329. || ffesrc_char_match_init (c, 'Z', 'z')))
  10330. return (ffelexHandler) ffeexpr_nil_binary_;
  10331. }
  10332. if ((ffelex_token_type (t) == FFELEX_typeNAME)
  10333. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  10334. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10335. return (ffelexHandler) ffeexpr_nil_substrp_ (t);
  10336. }
  10337. static ffelexHandler
  10338. ffeexpr_nil_name_rhs_ (ffelexToken t)
  10339. {
  10340. switch (ffelex_token_type (t))
  10341. {
  10342. case FFELEX_typeQUOTE:
  10343. case FFELEX_typeAPOSTROPHE:
  10344. ffelex_set_hexnum (TRUE);
  10345. return (ffelexHandler) ffeexpr_nil_name_apos_;
  10346. case FFELEX_typeOPEN_PAREN:
  10347. ++ffeexpr_find_.level;
  10348. return (ffelexHandler) ffeexpr_nil_rhs_;
  10349. default:
  10350. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10351. }
  10352. }
  10353. static ffelexHandler
  10354. ffeexpr_nil_name_apos_ (ffelexToken t)
  10355. {
  10356. if (ffelex_token_type (t) == FFELEX_typeNAME)
  10357. return (ffelexHandler) ffeexpr_nil_name_apos_name_;
  10358. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10359. }
  10360. static ffelexHandler
  10361. ffeexpr_nil_name_apos_name_ (ffelexToken t)
  10362. {
  10363. switch (ffelex_token_type (t))
  10364. {
  10365. case FFELEX_typeAPOSTROPHE:
  10366. case FFELEX_typeQUOTE:
  10367. return (ffelexHandler) ffeexpr_nil_finished_;
  10368. default:
  10369. return (ffelexHandler) ffeexpr_nil_finished_ (t);
  10370. }
  10371. }
  10372. static ffelexHandler
  10373. ffeexpr_nil_percent_ (ffelexToken t)
  10374. {
  10375. switch (ffelex_token_type (t))
  10376. {
  10377. case FFELEX_typeNAME:
  10378. case FFELEX_typeNAMES:
  10379. ffeexpr_stack_->percent = ffeexpr_percent_ (t);
  10380. ffeexpr_find_.t = ffelex_token_use (t);
  10381. return (ffelexHandler) ffeexpr_nil_percent_name_;
  10382. default:
  10383. return (ffelexHandler) ffeexpr_nil_rhs_ (t);
  10384. }
  10385. }
  10386. /* Expects ffeexpr_find_.t. */
  10387. static ffelexHandler
  10388. ffeexpr_nil_percent_name_ (ffelexToken t)
  10389. {
  10390. ffelexHandler nexthandler;
  10391. if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
  10392. {
  10393. nexthandler
  10394. = (ffelexHandler) ffeexpr_nil_rhs_ (ffeexpr_find_.t);
  10395. ffelex_token_kill (ffeexpr_find_.t);
  10396. return (ffelexHandler) (*nexthandler) (t);
  10397. }
  10398. ffelex_token_kill (ffeexpr_find_.t);
  10399. ++ffeexpr_find_.level;
  10400. return (ffelexHandler) ffeexpr_nil_rhs_;
  10401. }
  10402. static ffelexHandler
  10403. ffeexpr_nil_substrp_ (ffelexToken t)
  10404. {
  10405. if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
  10406. return (ffelexHandler) ffeexpr_nil_binary_ (t);
  10407. ++ffeexpr_find_.level;
  10408. return (ffelexHandler) ffeexpr_nil_rhs_;
  10409. }
  10410. /* ffeexpr_finished_ -- Reduce expression stack to one expr, finish
  10411. ffelexToken t;
  10412. return ffeexpr_finished_(t);
  10413. Reduces expression stack to one (or zero) elements by repeatedly reducing
  10414. the top operator on the stack (or, if the top element on the stack is
  10415. itself an operator, issuing an error message and discarding it). Calls
  10416. finishing routine with the expression, returning the ffelexHandler it
  10417. returns to the caller. */
  10418. static ffelexHandler
  10419. ffeexpr_finished_ (ffelexToken t)
  10420. {
  10421. ffeexprExpr_ operand; /* This is B in -B or A+B. */
  10422. ffebld expr;
  10423. ffeexprCallback callback;
  10424. ffeexprStack_ s;
  10425. ffebldConstant constnode; /* For detecting magical number. */
  10426. ffelexToken ft; /* Temporary copy of first token in
  10427. expression. */
  10428. ffelexHandler next;
  10429. ffeinfo info;
  10430. bool error = FALSE;
  10431. while (((operand = ffeexpr_stack_->exprstack) != NULL)
  10432. && ((operand->previous != NULL) || (operand->type != FFEEXPR_exprtypeOPERAND_)))
  10433. {
  10434. if (operand->type == FFEEXPR_exprtypeOPERAND_)
  10435. ffeexpr_reduce_ ();
  10436. else
  10437. {
  10438. if (ffest_ffebad_start (FFEBAD_MISSING_OPERAND_FOR_OPERATOR))
  10439. {
  10440. ffebad_here (0, ffelex_token_where_line (t),
  10441. ffelex_token_where_column (t));
  10442. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
  10443. ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
  10444. ffebad_finish ();
  10445. }
  10446. ffeexpr_stack_->exprstack = operand->previous; /* Pop the useless
  10447. operator. */
  10448. ffeexpr_expr_kill_ (operand);
  10449. }
  10450. }
  10451. assert ((operand == NULL) || (operand->previous == NULL));
  10452. ffebld_pool_pop ();
  10453. if (operand == NULL)
  10454. expr = NULL;
  10455. else
  10456. {
  10457. expr = operand->u.operand;
  10458. info = ffebld_info (expr);
  10459. if ((ffebld_op (expr) == FFEBLD_opCONTER)
  10460. && (ffebld_conter_orig (expr) == NULL)
  10461. && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
  10462. {
  10463. ffetarget_integer_bad_magical (operand->token);
  10464. }
  10465. ffeexpr_expr_kill_ (operand);
  10466. ffeexpr_stack_->exprstack = NULL;
  10467. }
  10468. ft = ffeexpr_stack_->first_token;
  10469. again: /* :::::::::::::::::::: */
  10470. switch (ffeexpr_stack_->context)
  10471. {
  10472. case FFEEXPR_contextLET:
  10473. case FFEEXPR_contextSFUNCDEF:
  10474. error = (expr == NULL)
  10475. || (ffeinfo_rank (info) != 0);
  10476. break;
  10477. case FFEEXPR_contextPAREN_:
  10478. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10479. break;
  10480. switch (ffeinfo_basictype (info))
  10481. {
  10482. case FFEINFO_basictypeHOLLERITH:
  10483. case FFEINFO_basictypeTYPELESS:
  10484. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10485. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10486. FFEEXPR_contextLET);
  10487. break;
  10488. default:
  10489. break;
  10490. }
  10491. break;
  10492. case FFEEXPR_contextPARENFILENUM_:
  10493. if (ffelex_token_type (t) != FFELEX_typeCOMMA)
  10494. ffeexpr_stack_->context = FFEEXPR_contextPAREN_;
  10495. else
  10496. ffeexpr_stack_->context = FFEEXPR_contextFILENUM;
  10497. goto again; /* :::::::::::::::::::: */
  10498. case FFEEXPR_contextPARENFILEUNIT_:
  10499. if (ffelex_token_type (t) != FFELEX_typeCOMMA)
  10500. ffeexpr_stack_->context = FFEEXPR_contextPAREN_;
  10501. else
  10502. ffeexpr_stack_->context = FFEEXPR_contextFILEUNIT;
  10503. goto again; /* :::::::::::::::::::: */
  10504. case FFEEXPR_contextACTUALARGEXPR_:
  10505. case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
  10506. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10507. : ffeinfo_basictype (info))
  10508. {
  10509. case FFEINFO_basictypeHOLLERITH:
  10510. case FFEINFO_basictypeTYPELESS:
  10511. if (!ffe_is_ugly_args ()
  10512. && ffebad_start (FFEBAD_ACTUALARG))
  10513. {
  10514. ffebad_here (0, ffelex_token_where_line (ft),
  10515. ffelex_token_where_column (ft));
  10516. ffebad_finish ();
  10517. }
  10518. break;
  10519. default:
  10520. break;
  10521. }
  10522. error = (expr != NULL) && (ffeinfo_rank (info) != 0);
  10523. break;
  10524. case FFEEXPR_contextACTUALARG_:
  10525. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  10526. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10527. : ffeinfo_basictype (info))
  10528. {
  10529. case FFEINFO_basictypeHOLLERITH:
  10530. case FFEINFO_basictypeTYPELESS:
  10531. #if 0 /* Should never get here. */
  10532. expr = ffeexpr_convert (expr, ft, ft,
  10533. FFEINFO_basictypeINTEGER,
  10534. FFEINFO_kindtypeINTEGERDEFAULT,
  10535. 0,
  10536. FFETARGET_charactersizeNONE,
  10537. FFEEXPR_contextLET);
  10538. #else
  10539. assert ("why hollerith/typeless in actualarg_?" == NULL);
  10540. #endif
  10541. break;
  10542. default:
  10543. break;
  10544. }
  10545. switch ((expr == NULL) ? FFEBLD_opANY : ffebld_op (expr))
  10546. {
  10547. case FFEBLD_opSYMTER:
  10548. case FFEBLD_opPERCENT_LOC:
  10549. case FFEBLD_opPERCENT_VAL:
  10550. case FFEBLD_opPERCENT_REF:
  10551. case FFEBLD_opPERCENT_DESCR:
  10552. error = FALSE;
  10553. break;
  10554. default:
  10555. error = (expr != NULL) && (ffeinfo_rank (info) != 0);
  10556. break;
  10557. }
  10558. {
  10559. ffesymbol s;
  10560. ffeinfoWhere where;
  10561. ffeinfoKind kind;
  10562. if (!error
  10563. && (expr != NULL)
  10564. && (ffebld_op (expr) == FFEBLD_opSYMTER)
  10565. && ((s = ffebld_symter (expr)), (where = ffesymbol_where (s)),
  10566. (where == FFEINFO_whereINTRINSIC)
  10567. || (where == FFEINFO_whereGLOBAL)
  10568. || ((where == FFEINFO_whereDUMMY)
  10569. && ((kind = ffesymbol_kind (s)),
  10570. (kind == FFEINFO_kindFUNCTION)
  10571. || (kind == FFEINFO_kindSUBROUTINE))))
  10572. && !ffesymbol_explicitwhere (s))
  10573. {
  10574. ffebad_start (where == FFEINFO_whereINTRINSIC
  10575. ? FFEBAD_NEED_INTRINSIC : FFEBAD_NEED_EXTERNAL);
  10576. ffebad_here (0, ffelex_token_where_line (ft),
  10577. ffelex_token_where_column (ft));
  10578. ffebad_string (ffesymbol_text (s));
  10579. ffebad_finish ();
  10580. ffesymbol_signal_change (s);
  10581. ffesymbol_set_explicitwhere (s, TRUE);
  10582. ffesymbol_signal_unreported (s);
  10583. }
  10584. }
  10585. break;
  10586. case FFEEXPR_contextINDEX_:
  10587. case FFEEXPR_contextSFUNCDEFINDEX_:
  10588. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10589. break;
  10590. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10591. : ffeinfo_basictype (info))
  10592. {
  10593. case FFEINFO_basictypeNONE:
  10594. error = FALSE;
  10595. break;
  10596. case FFEINFO_basictypeLOGICAL:
  10597. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10598. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10599. FFEEXPR_contextLET);
  10600. /* Fall through. */
  10601. case FFEINFO_basictypeREAL:
  10602. case FFEINFO_basictypeCOMPLEX:
  10603. if (ffe_is_pedantic ())
  10604. {
  10605. error = TRUE;
  10606. break;
  10607. }
  10608. /* Fall through. */
  10609. case FFEINFO_basictypeHOLLERITH:
  10610. case FFEINFO_basictypeTYPELESS:
  10611. error = FALSE;
  10612. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10613. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10614. FFEEXPR_contextLET);
  10615. break;
  10616. case FFEINFO_basictypeINTEGER:
  10617. /* Specifically, allow INTEGER(KIND=2), aka INTEGER*8, through
  10618. unmolested. Leave it to downstream to handle kinds. */
  10619. break;
  10620. default:
  10621. error = TRUE;
  10622. break;
  10623. }
  10624. break; /* expr==NULL ok for substring; element case
  10625. caught by callback. */
  10626. case FFEEXPR_contextRETURN:
  10627. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10628. break;
  10629. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10630. : ffeinfo_basictype (info))
  10631. {
  10632. case FFEINFO_basictypeNONE:
  10633. error = FALSE;
  10634. break;
  10635. case FFEINFO_basictypeLOGICAL:
  10636. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10637. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10638. FFEEXPR_contextLET);
  10639. /* Fall through. */
  10640. case FFEINFO_basictypeREAL:
  10641. case FFEINFO_basictypeCOMPLEX:
  10642. if (ffe_is_pedantic ())
  10643. {
  10644. error = TRUE;
  10645. break;
  10646. }
  10647. /* Fall through. */
  10648. case FFEINFO_basictypeINTEGER:
  10649. case FFEINFO_basictypeHOLLERITH:
  10650. case FFEINFO_basictypeTYPELESS:
  10651. error = FALSE;
  10652. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10653. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10654. FFEEXPR_contextLET);
  10655. break;
  10656. default:
  10657. error = TRUE;
  10658. break;
  10659. }
  10660. break;
  10661. case FFEEXPR_contextDO:
  10662. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10663. break;
  10664. switch (ffeinfo_basictype (info))
  10665. {
  10666. case FFEINFO_basictypeLOGICAL:
  10667. error = !ffe_is_ugly_logint ();
  10668. if (!ffeexpr_stack_->is_rhs)
  10669. break; /* Don't convert lhs variable. */
  10670. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10671. ffeinfo_kindtype (ffebld_info (expr)), 0,
  10672. FFETARGET_charactersizeNONE,
  10673. FFEEXPR_contextLET);
  10674. break;
  10675. case FFEINFO_basictypeHOLLERITH:
  10676. case FFEINFO_basictypeTYPELESS:
  10677. if (!ffeexpr_stack_->is_rhs)
  10678. {
  10679. error = TRUE;
  10680. break; /* Don't convert lhs variable. */
  10681. }
  10682. break;
  10683. case FFEINFO_basictypeINTEGER:
  10684. case FFEINFO_basictypeREAL:
  10685. break;
  10686. default:
  10687. error = TRUE;
  10688. break;
  10689. }
  10690. if (!ffeexpr_stack_->is_rhs
  10691. && (ffebld_op (expr) != FFEBLD_opSYMTER))
  10692. error = TRUE;
  10693. break;
  10694. case FFEEXPR_contextDOWHILE:
  10695. case FFEEXPR_contextIF:
  10696. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10697. break;
  10698. switch (ffeinfo_basictype (info))
  10699. {
  10700. case FFEINFO_basictypeINTEGER:
  10701. error = FALSE;
  10702. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10703. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10704. FFEEXPR_contextLET);
  10705. /* Fall through. */
  10706. case FFEINFO_basictypeLOGICAL:
  10707. case FFEINFO_basictypeHOLLERITH:
  10708. case FFEINFO_basictypeTYPELESS:
  10709. error = FALSE;
  10710. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10711. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10712. FFEEXPR_contextLET);
  10713. break;
  10714. default:
  10715. error = TRUE;
  10716. break;
  10717. }
  10718. break;
  10719. case FFEEXPR_contextASSIGN:
  10720. case FFEEXPR_contextAGOTO:
  10721. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10722. : ffeinfo_basictype (info))
  10723. {
  10724. case FFEINFO_basictypeINTEGER:
  10725. error = (ffeinfo_kindtype (info) != ffecom_label_kind ());
  10726. break;
  10727. case FFEINFO_basictypeLOGICAL:
  10728. error = !ffe_is_ugly_logint ()
  10729. || (ffeinfo_kindtype (info) != ffecom_label_kind ());
  10730. break;
  10731. default:
  10732. error = TRUE;
  10733. break;
  10734. }
  10735. if ((expr == NULL) || (ffeinfo_rank (info) != 0)
  10736. || (ffebld_op (expr) != FFEBLD_opSYMTER))
  10737. error = TRUE;
  10738. break;
  10739. case FFEEXPR_contextCGOTO:
  10740. case FFEEXPR_contextFORMAT:
  10741. case FFEEXPR_contextDIMLIST:
  10742. case FFEEXPR_contextFILENUM: /* See equiv code in _ambig_. */
  10743. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10744. break;
  10745. switch (ffeinfo_basictype (info))
  10746. {
  10747. case FFEINFO_basictypeLOGICAL:
  10748. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10749. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10750. FFEEXPR_contextLET);
  10751. /* Fall through. */
  10752. case FFEINFO_basictypeREAL:
  10753. case FFEINFO_basictypeCOMPLEX:
  10754. if (ffe_is_pedantic ())
  10755. {
  10756. error = TRUE;
  10757. break;
  10758. }
  10759. /* Fall through. */
  10760. case FFEINFO_basictypeINTEGER:
  10761. case FFEINFO_basictypeHOLLERITH:
  10762. case FFEINFO_basictypeTYPELESS:
  10763. error = FALSE;
  10764. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10765. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10766. FFEEXPR_contextLET);
  10767. break;
  10768. default:
  10769. error = TRUE;
  10770. break;
  10771. }
  10772. break;
  10773. case FFEEXPR_contextARITHIF:
  10774. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10775. break;
  10776. switch (ffeinfo_basictype (info))
  10777. {
  10778. case FFEINFO_basictypeLOGICAL:
  10779. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10780. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10781. FFEEXPR_contextLET);
  10782. if (ffe_is_pedantic ())
  10783. {
  10784. error = TRUE;
  10785. break;
  10786. }
  10787. /* Fall through. */
  10788. case FFEINFO_basictypeHOLLERITH:
  10789. case FFEINFO_basictypeTYPELESS:
  10790. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10791. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10792. FFEEXPR_contextLET);
  10793. /* Fall through. */
  10794. case FFEINFO_basictypeINTEGER:
  10795. case FFEINFO_basictypeREAL:
  10796. error = FALSE;
  10797. break;
  10798. default:
  10799. error = TRUE;
  10800. break;
  10801. }
  10802. break;
  10803. case FFEEXPR_contextSTOP:
  10804. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10805. break;
  10806. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10807. : ffeinfo_basictype (info))
  10808. {
  10809. case FFEINFO_basictypeINTEGER:
  10810. error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
  10811. break;
  10812. case FFEINFO_basictypeCHARACTER:
  10813. error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT);
  10814. break;
  10815. case FFEINFO_basictypeHOLLERITH:
  10816. case FFEINFO_basictypeTYPELESS:
  10817. error = FALSE;
  10818. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10819. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10820. FFEEXPR_contextLET);
  10821. break;
  10822. case FFEINFO_basictypeNONE:
  10823. error = FALSE;
  10824. break;
  10825. default:
  10826. error = TRUE;
  10827. break;
  10828. }
  10829. if ((expr != NULL) && ((ffebld_op (expr) != FFEBLD_opCONTER)
  10830. || (ffebld_conter_orig (expr) != NULL)))
  10831. error = TRUE;
  10832. break;
  10833. case FFEEXPR_contextINCLUDE:
  10834. error = (expr == NULL) || (ffeinfo_rank (info) != 0)
  10835. || (ffeinfo_basictype (info) != FFEINFO_basictypeCHARACTER)
  10836. || (ffebld_op (expr) != FFEBLD_opCONTER)
  10837. || (ffebld_conter_orig (expr) != NULL);
  10838. break;
  10839. case FFEEXPR_contextSELECTCASE:
  10840. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10841. break;
  10842. switch (ffeinfo_basictype (info))
  10843. {
  10844. case FFEINFO_basictypeINTEGER:
  10845. case FFEINFO_basictypeCHARACTER:
  10846. case FFEINFO_basictypeLOGICAL:
  10847. error = FALSE;
  10848. break;
  10849. case FFEINFO_basictypeHOLLERITH:
  10850. case FFEINFO_basictypeTYPELESS:
  10851. error = FALSE;
  10852. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10853. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10854. FFEEXPR_contextLET);
  10855. break;
  10856. default:
  10857. error = TRUE;
  10858. break;
  10859. }
  10860. break;
  10861. case FFEEXPR_contextCASE:
  10862. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10863. break;
  10864. switch ((expr == NULL) ? FFEINFO_basictypeINTEGER
  10865. : ffeinfo_basictype (info))
  10866. {
  10867. case FFEINFO_basictypeINTEGER:
  10868. case FFEINFO_basictypeCHARACTER:
  10869. case FFEINFO_basictypeLOGICAL:
  10870. error = FALSE;
  10871. break;
  10872. case FFEINFO_basictypeHOLLERITH:
  10873. case FFEINFO_basictypeTYPELESS:
  10874. error = FALSE;
  10875. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10876. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10877. FFEEXPR_contextLET);
  10878. break;
  10879. default:
  10880. error = TRUE;
  10881. break;
  10882. }
  10883. if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
  10884. error = TRUE;
  10885. break;
  10886. case FFEEXPR_contextCHARACTERSIZE:
  10887. case FFEEXPR_contextKINDTYPE:
  10888. case FFEEXPR_contextDIMLISTCOMMON:
  10889. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10890. break;
  10891. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10892. : ffeinfo_basictype (info))
  10893. {
  10894. case FFEINFO_basictypeLOGICAL:
  10895. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10896. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10897. FFEEXPR_contextLET);
  10898. /* Fall through. */
  10899. case FFEINFO_basictypeREAL:
  10900. case FFEINFO_basictypeCOMPLEX:
  10901. if (ffe_is_pedantic ())
  10902. {
  10903. error = TRUE;
  10904. break;
  10905. }
  10906. /* Fall through. */
  10907. case FFEINFO_basictypeINTEGER:
  10908. case FFEINFO_basictypeHOLLERITH:
  10909. case FFEINFO_basictypeTYPELESS:
  10910. error = FALSE;
  10911. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10912. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10913. FFEEXPR_contextLET);
  10914. break;
  10915. default:
  10916. error = TRUE;
  10917. break;
  10918. }
  10919. if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
  10920. error = TRUE;
  10921. break;
  10922. case FFEEXPR_contextEQVINDEX_:
  10923. if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
  10924. break;
  10925. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  10926. : ffeinfo_basictype (info))
  10927. {
  10928. case FFEINFO_basictypeNONE:
  10929. error = FALSE;
  10930. break;
  10931. case FFEINFO_basictypeLOGICAL:
  10932. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  10933. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  10934. FFEEXPR_contextLET);
  10935. /* Fall through. */
  10936. case FFEINFO_basictypeREAL:
  10937. case FFEINFO_basictypeCOMPLEX:
  10938. if (ffe_is_pedantic ())
  10939. {
  10940. error = TRUE;
  10941. break;
  10942. }
  10943. /* Fall through. */
  10944. case FFEINFO_basictypeINTEGER:
  10945. case FFEINFO_basictypeHOLLERITH:
  10946. case FFEINFO_basictypeTYPELESS:
  10947. error = FALSE;
  10948. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  10949. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  10950. FFEEXPR_contextLET);
  10951. break;
  10952. default:
  10953. error = TRUE;
  10954. break;
  10955. }
  10956. if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
  10957. error = TRUE;
  10958. break;
  10959. case FFEEXPR_contextPARAMETER:
  10960. if (ffeexpr_stack_->is_rhs)
  10961. error = (expr == NULL) || (ffeinfo_rank (info) != 0)
  10962. || (ffebld_op (expr) != FFEBLD_opCONTER);
  10963. else
  10964. error = (expr == NULL) || (ffeinfo_rank (info) != 0)
  10965. || (ffebld_op (expr) != FFEBLD_opSYMTER);
  10966. break;
  10967. case FFEEXPR_contextINDEXORACTUALARG_:
  10968. if (ffelex_token_type (t) == FFELEX_typeCOLON)
  10969. ffeexpr_stack_->context = FFEEXPR_contextINDEX_;
  10970. else
  10971. ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
  10972. goto again; /* :::::::::::::::::::: */
  10973. case FFEEXPR_contextINDEXORACTUALARGEXPR_:
  10974. if (ffelex_token_type (t) == FFELEX_typeCOLON)
  10975. ffeexpr_stack_->context = FFEEXPR_contextINDEX_;
  10976. else
  10977. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  10978. goto again; /* :::::::::::::::::::: */
  10979. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  10980. if (ffelex_token_type (t) == FFELEX_typeCOLON)
  10981. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEX_;
  10982. else
  10983. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
  10984. goto again; /* :::::::::::::::::::: */
  10985. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
  10986. if (ffelex_token_type (t) == FFELEX_typeCOLON)
  10987. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEX_;
  10988. else
  10989. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  10990. goto again; /* :::::::::::::::::::: */
  10991. case FFEEXPR_contextIMPDOCTRL_:
  10992. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  10993. break;
  10994. if (!ffeexpr_stack_->is_rhs
  10995. && (ffebld_op (expr) != FFEBLD_opSYMTER))
  10996. error = TRUE;
  10997. switch (ffeinfo_basictype (info))
  10998. {
  10999. case FFEINFO_basictypeLOGICAL:
  11000. if (! ffe_is_ugly_logint ())
  11001. error = TRUE;
  11002. if (! ffeexpr_stack_->is_rhs)
  11003. break;
  11004. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11005. ffeinfo_kindtype (info), 0,
  11006. FFETARGET_charactersizeNONE,
  11007. FFEEXPR_contextLET);
  11008. break;
  11009. case FFEINFO_basictypeINTEGER:
  11010. case FFEINFO_basictypeHOLLERITH:
  11011. case FFEINFO_basictypeTYPELESS:
  11012. break;
  11013. case FFEINFO_basictypeREAL:
  11014. if (!ffeexpr_stack_->is_rhs
  11015. && ffe_is_warn_surprising ()
  11016. && !error)
  11017. {
  11018. ffebad_start (FFEBAD_DO_REAL); /* See error message!!! */
  11019. ffebad_here (0, ffelex_token_where_line (ft),
  11020. ffelex_token_where_column (ft));
  11021. ffebad_string (ffelex_token_text (ft));
  11022. ffebad_finish ();
  11023. }
  11024. break;
  11025. default:
  11026. error = TRUE;
  11027. break;
  11028. }
  11029. break;
  11030. case FFEEXPR_contextDATAIMPDOCTRL_:
  11031. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  11032. break;
  11033. if (ffeexpr_stack_->is_rhs)
  11034. {
  11035. if ((ffebld_op (expr) != FFEBLD_opCONTER)
  11036. && (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
  11037. error = TRUE;
  11038. }
  11039. else if ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11040. || (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
  11041. error = TRUE;
  11042. switch (ffeinfo_basictype (info))
  11043. {
  11044. case FFEINFO_basictypeLOGICAL:
  11045. if (! ffeexpr_stack_->is_rhs)
  11046. break;
  11047. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11048. ffeinfo_kindtype (info), 0,
  11049. FFETARGET_charactersizeNONE,
  11050. FFEEXPR_contextLET);
  11051. /* Fall through. */
  11052. case FFEINFO_basictypeINTEGER:
  11053. if (ffeexpr_stack_->is_rhs
  11054. && (ffeinfo_kindtype (ffebld_info (expr))
  11055. != FFEINFO_kindtypeINTEGERDEFAULT))
  11056. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11057. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  11058. FFETARGET_charactersizeNONE,
  11059. FFEEXPR_contextLET);
  11060. break;
  11061. case FFEINFO_basictypeHOLLERITH:
  11062. case FFEINFO_basictypeTYPELESS:
  11063. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11064. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11065. FFEEXPR_contextLET);
  11066. break;
  11067. case FFEINFO_basictypeREAL:
  11068. if (!ffeexpr_stack_->is_rhs
  11069. && ffe_is_warn_surprising ()
  11070. && !error)
  11071. {
  11072. ffebad_start (FFEBAD_DO_REAL); /* See error message!!! */
  11073. ffebad_here (0, ffelex_token_where_line (ft),
  11074. ffelex_token_where_column (ft));
  11075. ffebad_string (ffelex_token_text (ft));
  11076. ffebad_finish ();
  11077. }
  11078. break;
  11079. default:
  11080. error = TRUE;
  11081. break;
  11082. }
  11083. break;
  11084. case FFEEXPR_contextIMPDOITEM_:
  11085. if (ffelex_token_type (t) == FFELEX_typeEQUALS)
  11086. {
  11087. ffeexpr_stack_->is_rhs = FALSE;
  11088. ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
  11089. goto again; /* :::::::::::::::::::: */
  11090. }
  11091. /* Fall through. */
  11092. case FFEEXPR_contextIOLIST:
  11093. case FFEEXPR_contextFILEVXTCODE:
  11094. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11095. : ffeinfo_basictype (info))
  11096. {
  11097. case FFEINFO_basictypeHOLLERITH:
  11098. case FFEINFO_basictypeTYPELESS:
  11099. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11100. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11101. FFEEXPR_contextLET);
  11102. break;
  11103. default:
  11104. break;
  11105. }
  11106. error = (expr == NULL)
  11107. || ((ffeinfo_rank (info) != 0)
  11108. && ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11109. || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
  11110. || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
  11111. == FFEBLD_opSTAR))); /* Bad if null expr, or if
  11112. array that is not a SYMTER
  11113. (can't happen yet, I
  11114. think) or has a NULL or
  11115. STAR (assumed) array
  11116. size. */
  11117. break;
  11118. case FFEEXPR_contextIMPDOITEMDF_:
  11119. if (ffelex_token_type (t) == FFELEX_typeEQUALS)
  11120. {
  11121. ffeexpr_stack_->is_rhs = FALSE;
  11122. ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
  11123. goto again; /* :::::::::::::::::::: */
  11124. }
  11125. /* Fall through. */
  11126. case FFEEXPR_contextIOLISTDF:
  11127. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11128. : ffeinfo_basictype (info))
  11129. {
  11130. case FFEINFO_basictypeHOLLERITH:
  11131. case FFEINFO_basictypeTYPELESS:
  11132. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11133. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11134. FFEEXPR_contextLET);
  11135. break;
  11136. default:
  11137. break;
  11138. }
  11139. error
  11140. = (expr == NULL)
  11141. || ((ffeinfo_basictype (info) == FFEINFO_basictypeCHARACTER)
  11142. && (ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT))
  11143. || ((ffeinfo_rank (info) != 0)
  11144. && ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11145. || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
  11146. || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
  11147. == FFEBLD_opSTAR))); /* Bad if null expr,
  11148. non-default-kindtype
  11149. character expr, or if
  11150. array that is not a SYMTER
  11151. (can't happen yet, I
  11152. think) or has a NULL or
  11153. STAR (assumed) array
  11154. size. */
  11155. break;
  11156. case FFEEXPR_contextDATAIMPDOITEM_:
  11157. error = (expr == NULL)
  11158. || (ffebld_op (expr) != FFEBLD_opARRAYREF)
  11159. || ((ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR)
  11160. && (ffeinfo_where (info) != FFEINFO_whereFLEETING_IADDR));
  11161. break;
  11162. case FFEEXPR_contextDATAIMPDOINDEX_:
  11163. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  11164. break;
  11165. switch (ffeinfo_basictype (info))
  11166. {
  11167. case FFEINFO_basictypeLOGICAL:
  11168. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  11169. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  11170. FFEEXPR_contextLET);
  11171. /* Fall through. */
  11172. case FFEINFO_basictypeREAL:
  11173. case FFEINFO_basictypeCOMPLEX:
  11174. if (ffe_is_pedantic ())
  11175. {
  11176. error = TRUE;
  11177. break;
  11178. }
  11179. /* Fall through. */
  11180. case FFEINFO_basictypeINTEGER:
  11181. case FFEINFO_basictypeHOLLERITH:
  11182. case FFEINFO_basictypeTYPELESS:
  11183. error = FALSE;
  11184. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11185. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11186. FFEEXPR_contextLET);
  11187. break;
  11188. default:
  11189. error = TRUE;
  11190. break;
  11191. }
  11192. if ((ffeinfo_where (info) != FFEINFO_whereCONSTANT)
  11193. && (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
  11194. error = TRUE;
  11195. break;
  11196. case FFEEXPR_contextDATA:
  11197. if (expr == NULL)
  11198. error = TRUE;
  11199. else if (ffeexpr_stack_->is_rhs)
  11200. error = (ffebld_op (expr) != FFEBLD_opCONTER);
  11201. else if (ffebld_op (expr) == FFEBLD_opSYMTER)
  11202. error = FALSE;
  11203. else
  11204. error = (ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR);
  11205. break;
  11206. case FFEEXPR_contextINITVAL:
  11207. error = (expr == NULL) || (ffebld_op (expr) != FFEBLD_opCONTER);
  11208. break;
  11209. case FFEEXPR_contextEQUIVALENCE:
  11210. if (expr == NULL)
  11211. error = TRUE;
  11212. else if (ffebld_op (expr) == FFEBLD_opSYMTER)
  11213. error = FALSE;
  11214. else
  11215. error = (ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR);
  11216. break;
  11217. case FFEEXPR_contextFILEASSOC:
  11218. case FFEEXPR_contextFILEINT:
  11219. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11220. : ffeinfo_basictype (info))
  11221. {
  11222. case FFEINFO_basictypeINTEGER:
  11223. /* Maybe this should be supported someday, but, right now,
  11224. g77 can't generate a call to libf2c to write to an
  11225. integer other than the default size. */
  11226. error = ((! ffeexpr_stack_->is_rhs)
  11227. && ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
  11228. break;
  11229. default:
  11230. error = TRUE;
  11231. break;
  11232. }
  11233. if ((expr == NULL) || (ffeinfo_rank (info) != 0))
  11234. error = TRUE;
  11235. break;
  11236. case FFEEXPR_contextFILEDFINT:
  11237. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11238. : ffeinfo_basictype (info))
  11239. {
  11240. case FFEINFO_basictypeINTEGER:
  11241. error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
  11242. break;
  11243. default:
  11244. error = TRUE;
  11245. break;
  11246. }
  11247. if ((expr == NULL) || (ffeinfo_rank (info) != 0))
  11248. error = TRUE;
  11249. break;
  11250. case FFEEXPR_contextFILELOG:
  11251. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11252. : ffeinfo_basictype (info))
  11253. {
  11254. case FFEINFO_basictypeLOGICAL:
  11255. error = FALSE;
  11256. break;
  11257. default:
  11258. error = TRUE;
  11259. break;
  11260. }
  11261. if ((expr == NULL) || (ffeinfo_rank (info) != 0))
  11262. error = TRUE;
  11263. break;
  11264. case FFEEXPR_contextFILECHAR:
  11265. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11266. : ffeinfo_basictype (info))
  11267. {
  11268. case FFEINFO_basictypeCHARACTER:
  11269. error = FALSE;
  11270. break;
  11271. default:
  11272. error = TRUE;
  11273. break;
  11274. }
  11275. if ((expr == NULL) || (ffeinfo_rank (info) != 0))
  11276. error = TRUE;
  11277. break;
  11278. case FFEEXPR_contextFILENUMCHAR:
  11279. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  11280. break;
  11281. switch (ffeinfo_basictype (info))
  11282. {
  11283. case FFEINFO_basictypeLOGICAL:
  11284. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  11285. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  11286. FFEEXPR_contextLET);
  11287. /* Fall through. */
  11288. case FFEINFO_basictypeREAL:
  11289. case FFEINFO_basictypeCOMPLEX:
  11290. if (ffe_is_pedantic ())
  11291. {
  11292. error = TRUE;
  11293. break;
  11294. }
  11295. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11296. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11297. FFEEXPR_contextLET);
  11298. break;
  11299. case FFEINFO_basictypeINTEGER:
  11300. case FFEINFO_basictypeCHARACTER:
  11301. error = FALSE;
  11302. break;
  11303. default:
  11304. error = TRUE;
  11305. break;
  11306. }
  11307. break;
  11308. case FFEEXPR_contextFILEDFCHAR:
  11309. if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
  11310. break;
  11311. switch (ffeinfo_basictype (info))
  11312. {
  11313. case FFEINFO_basictypeCHARACTER:
  11314. error
  11315. = (ffeinfo_kindtype (info)
  11316. != FFEINFO_kindtypeCHARACTERDEFAULT);
  11317. break;
  11318. default:
  11319. error = TRUE;
  11320. break;
  11321. }
  11322. if (!ffeexpr_stack_->is_rhs
  11323. && (ffebld_op (expr) == FFEBLD_opSUBSTR))
  11324. error = TRUE;
  11325. break;
  11326. case FFEEXPR_contextFILEUNIT: /* See equiv code in _ambig_. */
  11327. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11328. : ffeinfo_basictype (info))
  11329. {
  11330. case FFEINFO_basictypeLOGICAL:
  11331. if ((error = (ffeinfo_rank (info) != 0)))
  11332. break;
  11333. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  11334. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  11335. FFEEXPR_contextLET);
  11336. /* Fall through. */
  11337. case FFEINFO_basictypeREAL:
  11338. case FFEINFO_basictypeCOMPLEX:
  11339. if ((error = (ffeinfo_rank (info) != 0)))
  11340. break;
  11341. if (ffe_is_pedantic ())
  11342. {
  11343. error = TRUE;
  11344. break;
  11345. }
  11346. /* Fall through. */
  11347. case FFEINFO_basictypeINTEGER:
  11348. case FFEINFO_basictypeHOLLERITH:
  11349. case FFEINFO_basictypeTYPELESS:
  11350. if ((error = (ffeinfo_rank (info) != 0)))
  11351. break;
  11352. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11353. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11354. FFEEXPR_contextLET);
  11355. break;
  11356. case FFEINFO_basictypeCHARACTER:
  11357. switch (ffebld_op (expr))
  11358. { /* As if _lhs had been called instead of
  11359. _rhs. */
  11360. case FFEBLD_opSYMTER:
  11361. error
  11362. = (ffeinfo_where (ffebld_info (expr)) == FFEINFO_whereCONSTANT);
  11363. break;
  11364. case FFEBLD_opSUBSTR:
  11365. error = (ffeinfo_where (ffebld_info (expr))
  11366. == FFEINFO_whereCONSTANT_SUBOBJECT);
  11367. break;
  11368. case FFEBLD_opARRAYREF:
  11369. error = FALSE;
  11370. break;
  11371. default:
  11372. error = TRUE;
  11373. break;
  11374. }
  11375. if (!error
  11376. && ((ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT)
  11377. || ((ffeinfo_rank (info) != 0)
  11378. && ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11379. || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
  11380. || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
  11381. == FFEBLD_opSTAR))))) /* Bad if
  11382. non-default-kindtype
  11383. character expr, or if
  11384. array that is not a SYMTER
  11385. (can't happen yet, I
  11386. think), or has a NULL or
  11387. STAR (assumed) array
  11388. size. */
  11389. error = TRUE;
  11390. break;
  11391. default:
  11392. error = TRUE;
  11393. break;
  11394. }
  11395. break;
  11396. case FFEEXPR_contextFILEFORMAT:
  11397. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11398. : ffeinfo_basictype (info))
  11399. {
  11400. case FFEINFO_basictypeINTEGER:
  11401. error = (expr == NULL)
  11402. || ((ffeinfo_rank (info) != 0) ?
  11403. ffe_is_pedantic () /* F77 C5. */
  11404. : (ffeinfo_kindtype (info) != ffecom_label_kind ()))
  11405. || (ffebld_op (expr) != FFEBLD_opSYMTER);
  11406. break;
  11407. case FFEINFO_basictypeLOGICAL:
  11408. case FFEINFO_basictypeREAL:
  11409. case FFEINFO_basictypeCOMPLEX:
  11410. /* F77 C5 -- must be an array of hollerith. */
  11411. error
  11412. = ffe_is_pedantic ()
  11413. || (ffeinfo_rank (info) == 0);
  11414. break;
  11415. case FFEINFO_basictypeCHARACTER:
  11416. if ((ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT)
  11417. || ((ffeinfo_rank (info) != 0)
  11418. && ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11419. || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
  11420. || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
  11421. == FFEBLD_opSTAR)))) /* Bad if
  11422. non-default-kindtype
  11423. character expr, or if
  11424. array that is not a SYMTER
  11425. (can't happen yet, I
  11426. think), or has a NULL or
  11427. STAR (assumed) array
  11428. size. */
  11429. error = TRUE;
  11430. else
  11431. error = FALSE;
  11432. break;
  11433. default:
  11434. error = TRUE;
  11435. break;
  11436. }
  11437. break;
  11438. case FFEEXPR_contextLOC_:
  11439. /* See also ffeintrin_check_loc_. */
  11440. if ((expr == NULL)
  11441. || (ffeinfo_kind (info) != FFEINFO_kindENTITY)
  11442. || ((ffebld_op (expr) != FFEBLD_opSYMTER)
  11443. && (ffebld_op (expr) != FFEBLD_opSUBSTR)
  11444. && (ffebld_op (expr) != FFEBLD_opARRAYREF)))
  11445. error = TRUE;
  11446. break;
  11447. default:
  11448. error = FALSE;
  11449. break;
  11450. }
  11451. if (error && ((expr == NULL) || (ffebld_op (expr) != FFEBLD_opANY)))
  11452. {
  11453. ffebad_start (FFEBAD_EXPR_WRONG);
  11454. ffebad_here (0, ffelex_token_where_line (ft),
  11455. ffelex_token_where_column (ft));
  11456. ffebad_finish ();
  11457. expr = ffebld_new_any ();
  11458. ffebld_set_info (expr, ffeinfo_new_any ());
  11459. }
  11460. callback = ffeexpr_stack_->callback;
  11461. s = ffeexpr_stack_->previous;
  11462. malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
  11463. sizeof (*ffeexpr_stack_));
  11464. ffeexpr_stack_ = s;
  11465. next = (ffelexHandler) (*callback) (ft, expr, t);
  11466. ffelex_token_kill (ft);
  11467. return (ffelexHandler) next;
  11468. }
  11469. /* ffeexpr_finished_ambig_ -- Check validity of ambiguous unit/form spec
  11470. ffebld expr;
  11471. expr = ffeexpr_finished_ambig_(expr);
  11472. Replicates a bit of ffeexpr_finished_'s task when in a context
  11473. of UNIT or FORMAT. */
  11474. static ffebld
  11475. ffeexpr_finished_ambig_ (ffelexToken ft, ffebld expr)
  11476. {
  11477. ffeinfo info = ffebld_info (expr);
  11478. bool error;
  11479. switch (ffeexpr_stack_->context)
  11480. {
  11481. case FFEEXPR_contextFILENUMAMBIG: /* Same as FILENUM in _finished_. */
  11482. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11483. : ffeinfo_basictype (info))
  11484. {
  11485. case FFEINFO_basictypeLOGICAL:
  11486. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  11487. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  11488. FFEEXPR_contextLET);
  11489. /* Fall through. */
  11490. case FFEINFO_basictypeREAL:
  11491. case FFEINFO_basictypeCOMPLEX:
  11492. if (ffe_is_pedantic ())
  11493. {
  11494. error = TRUE;
  11495. break;
  11496. }
  11497. /* Fall through. */
  11498. case FFEINFO_basictypeINTEGER:
  11499. case FFEINFO_basictypeHOLLERITH:
  11500. case FFEINFO_basictypeTYPELESS:
  11501. error = FALSE;
  11502. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11503. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11504. FFEEXPR_contextLET);
  11505. break;
  11506. default:
  11507. error = TRUE;
  11508. break;
  11509. }
  11510. if ((expr == NULL) || (ffeinfo_rank (info) != 0))
  11511. error = TRUE;
  11512. break;
  11513. case FFEEXPR_contextFILEUNITAMBIG: /* Same as FILEUNIT in _finished_. */
  11514. if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
  11515. {
  11516. error = FALSE;
  11517. break;
  11518. }
  11519. switch ((expr == NULL) ? FFEINFO_basictypeNONE
  11520. : ffeinfo_basictype (info))
  11521. {
  11522. case FFEINFO_basictypeLOGICAL:
  11523. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
  11524. FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
  11525. FFEEXPR_contextLET);
  11526. /* Fall through. */
  11527. case FFEINFO_basictypeREAL:
  11528. case FFEINFO_basictypeCOMPLEX:
  11529. if (ffe_is_pedantic ())
  11530. {
  11531. error = TRUE;
  11532. break;
  11533. }
  11534. /* Fall through. */
  11535. case FFEINFO_basictypeINTEGER:
  11536. case FFEINFO_basictypeHOLLERITH:
  11537. case FFEINFO_basictypeTYPELESS:
  11538. error = (ffeinfo_rank (info) != 0);
  11539. expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
  11540. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
  11541. FFEEXPR_contextLET);
  11542. break;
  11543. case FFEINFO_basictypeCHARACTER:
  11544. switch (ffebld_op (expr))
  11545. { /* As if _lhs had been called instead of
  11546. _rhs. */
  11547. case FFEBLD_opSYMTER:
  11548. error
  11549. = (ffeinfo_where (ffebld_info (expr)) == FFEINFO_whereCONSTANT);
  11550. break;
  11551. case FFEBLD_opSUBSTR:
  11552. error = (ffeinfo_where (ffebld_info (expr))
  11553. == FFEINFO_whereCONSTANT_SUBOBJECT);
  11554. break;
  11555. case FFEBLD_opARRAYREF:
  11556. error = FALSE;
  11557. break;
  11558. default:
  11559. error = TRUE;
  11560. break;
  11561. }
  11562. break;
  11563. default:
  11564. error = TRUE;
  11565. break;
  11566. }
  11567. break;
  11568. default:
  11569. assert ("bad context" == NULL);
  11570. error = TRUE;
  11571. break;
  11572. }
  11573. if (error && ((expr == NULL) || (ffebld_op (expr) != FFEBLD_opANY)))
  11574. {
  11575. ffebad_start (FFEBAD_EXPR_WRONG);
  11576. ffebad_here (0, ffelex_token_where_line (ft),
  11577. ffelex_token_where_column (ft));
  11578. ffebad_finish ();
  11579. expr = ffebld_new_any ();
  11580. ffebld_set_info (expr, ffeinfo_new_any ());
  11581. }
  11582. return expr;
  11583. }
  11584. /* ffeexpr_token_lhs_ -- Initial state for lhs expression
  11585. Return a pointer to this function to the lexer (ffelex), which will
  11586. invoke it for the next token.
  11587. Basically a smaller version of _rhs_; keep them both in sync, of course. */
  11588. static ffelexHandler
  11589. ffeexpr_token_lhs_ (ffelexToken t)
  11590. {
  11591. /* When changing the list of valid initial lhs tokens, check whether to
  11592. update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
  11593. READ (expr) <token> case -- it assumes it knows which tokens <token> can
  11594. be to indicate an lhs (or implied DO), which right now is the set
  11595. {NAME,OPEN_PAREN}.
  11596. This comment also appears in ffeexpr_token_first_lhs_. */
  11597. switch (ffelex_token_type (t))
  11598. {
  11599. case FFELEX_typeNAME:
  11600. case FFELEX_typeNAMES:
  11601. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11602. return (ffelexHandler) ffeexpr_token_name_lhs_;
  11603. default:
  11604. return (ffelexHandler) ffeexpr_finished_ (t);
  11605. }
  11606. }
  11607. /* ffeexpr_token_rhs_ -- Initial state for rhs expression
  11608. Return a pointer to this function to the lexer (ffelex), which will
  11609. invoke it for the next token.
  11610. The initial state and the post-binary-operator state are the same and
  11611. both handled here, with the expression stack used to distinguish
  11612. between them. Binary operators are invalid here; unary operators,
  11613. constants, subexpressions, and name references are valid. */
  11614. static ffelexHandler
  11615. ffeexpr_token_rhs_ (ffelexToken t)
  11616. {
  11617. ffeexprExpr_ e;
  11618. switch (ffelex_token_type (t))
  11619. {
  11620. case FFELEX_typeQUOTE:
  11621. if (ffe_is_vxt ())
  11622. {
  11623. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11624. return (ffelexHandler) ffeexpr_token_quote_;
  11625. }
  11626. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11627. ffelex_set_expecting_hollerith (-1, '\"',
  11628. ffelex_token_where_line (t),
  11629. ffelex_token_where_column (t));
  11630. /* Don't have to unset this one. */
  11631. return (ffelexHandler) ffeexpr_token_apostrophe_;
  11632. case FFELEX_typeAPOSTROPHE:
  11633. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11634. ffelex_set_expecting_hollerith (-1, '\'',
  11635. ffelex_token_where_line (t),
  11636. ffelex_token_where_column (t));
  11637. /* Don't have to unset this one. */
  11638. return (ffelexHandler) ffeexpr_token_apostrophe_;
  11639. case FFELEX_typePERCENT:
  11640. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11641. return (ffelexHandler) ffeexpr_token_percent_;
  11642. case FFELEX_typeOPEN_PAREN:
  11643. ffeexpr_stack_->tokens[0] = ffelex_token_use (t);
  11644. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  11645. FFEEXPR_contextPAREN_,
  11646. ffeexpr_cb_close_paren_c_);
  11647. case FFELEX_typePLUS:
  11648. e = ffeexpr_expr_new_ ();
  11649. e->type = FFEEXPR_exprtypeUNARY_;
  11650. e->token = ffelex_token_use (t);
  11651. e->u.operator.op = FFEEXPR_operatorADD_;
  11652. e->u.operator.prec = FFEEXPR_operatorprecedenceADD_;
  11653. e->u.operator.as = FFEEXPR_operatorassociativityADD_;
  11654. ffeexpr_exprstack_push_unary_ (e);
  11655. return (ffelexHandler) ffeexpr_token_rhs_;
  11656. case FFELEX_typeMINUS:
  11657. e = ffeexpr_expr_new_ ();
  11658. e->type = FFEEXPR_exprtypeUNARY_;
  11659. e->token = ffelex_token_use (t);
  11660. e->u.operator.op = FFEEXPR_operatorSUBTRACT_;
  11661. e->u.operator.prec = FFEEXPR_operatorprecedenceSUBTRACT_;
  11662. e->u.operator.as = FFEEXPR_operatorassociativitySUBTRACT_;
  11663. ffeexpr_exprstack_push_unary_ (e);
  11664. return (ffelexHandler) ffeexpr_token_rhs_;
  11665. case FFELEX_typePERIOD:
  11666. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11667. return (ffelexHandler) ffeexpr_token_period_;
  11668. case FFELEX_typeNUMBER:
  11669. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11670. ffeexpr_hollerith_count_ = atol (ffelex_token_text (t));
  11671. if (ffeexpr_hollerith_count_ > 0)
  11672. ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_,
  11673. '\0',
  11674. ffelex_token_where_line (t),
  11675. ffelex_token_where_column (t));
  11676. return (ffelexHandler) ffeexpr_token_number_;
  11677. case FFELEX_typeNAME:
  11678. case FFELEX_typeNAMES:
  11679. ffeexpr_tokens_[0] = ffelex_token_use (t);
  11680. switch (ffeexpr_stack_->context)
  11681. {
  11682. case FFEEXPR_contextACTUALARG_:
  11683. case FFEEXPR_contextINDEXORACTUALARG_:
  11684. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  11685. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  11686. return (ffelexHandler) ffeexpr_token_name_arg_;
  11687. default:
  11688. return (ffelexHandler) ffeexpr_token_name_rhs_;
  11689. }
  11690. case FFELEX_typeASTERISK:
  11691. case FFELEX_typeSLASH:
  11692. case FFELEX_typePOWER:
  11693. case FFELEX_typeCONCAT:
  11694. case FFELEX_typeREL_EQ:
  11695. case FFELEX_typeREL_NE:
  11696. case FFELEX_typeREL_LE:
  11697. case FFELEX_typeREL_GE:
  11698. if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND))
  11699. {
  11700. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  11701. ffebad_finish ();
  11702. }
  11703. return (ffelexHandler) ffeexpr_token_rhs_;
  11704. #if 0
  11705. case FFELEX_typeEQUALS:
  11706. case FFELEX_typePOINTS:
  11707. case FFELEX_typeCLOSE_ANGLE:
  11708. case FFELEX_typeCLOSE_PAREN:
  11709. case FFELEX_typeCOMMA:
  11710. case FFELEX_typeCOLON:
  11711. case FFELEX_typeEOS:
  11712. case FFELEX_typeSEMICOLON:
  11713. #endif
  11714. default:
  11715. return (ffelexHandler) ffeexpr_finished_ (t);
  11716. }
  11717. }
  11718. /* ffeexpr_token_period_ -- Rhs PERIOD
  11719. Return a pointer to this function to the lexer (ffelex), which will
  11720. invoke it for the next token.
  11721. Handle a period detected at rhs (expecting unary op or operand) state.
  11722. Must begin a floating-point value (as in .12) or a dot-dot name, of
  11723. which only .NOT., .TRUE., and .FALSE. are truly valid. Other sort-of-
  11724. valid names represent binary operators, which are invalid here because
  11725. there isn't an operand at the top of the stack. */
  11726. static ffelexHandler
  11727. ffeexpr_token_period_ (ffelexToken t)
  11728. {
  11729. switch (ffelex_token_type (t))
  11730. {
  11731. case FFELEX_typeNAME:
  11732. case FFELEX_typeNAMES:
  11733. ffeexpr_current_dotdot_ = ffestr_other (t);
  11734. switch (ffeexpr_current_dotdot_)
  11735. {
  11736. case FFESTR_otherNone:
  11737. if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
  11738. {
  11739. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  11740. ffelex_token_where_column (ffeexpr_tokens_[0]));
  11741. ffebad_finish ();
  11742. }
  11743. ffelex_token_kill (ffeexpr_tokens_[0]);
  11744. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  11745. case FFESTR_otherTRUE:
  11746. case FFESTR_otherFALSE:
  11747. case FFESTR_otherNOT:
  11748. ffeexpr_tokens_[1] = ffelex_token_use (t);
  11749. return (ffelexHandler) ffeexpr_token_end_period_;
  11750. default:
  11751. if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND))
  11752. {
  11753. ffebad_here (0, ffelex_token_where_line (t),
  11754. ffelex_token_where_column (t));
  11755. ffebad_finish ();
  11756. }
  11757. ffelex_token_kill (ffeexpr_tokens_[0]);
  11758. return (ffelexHandler) ffeexpr_token_swallow_period_;
  11759. }
  11760. break; /* Nothing really reaches here. */
  11761. case FFELEX_typeNUMBER:
  11762. ffeexpr_tokens_[1] = ffelex_token_use (t);
  11763. return (ffelexHandler) ffeexpr_token_real_;
  11764. default:
  11765. if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
  11766. {
  11767. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  11768. ffelex_token_where_column (ffeexpr_tokens_[0]));
  11769. ffebad_finish ();
  11770. }
  11771. ffelex_token_kill (ffeexpr_tokens_[0]);
  11772. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  11773. }
  11774. }
  11775. /* ffeexpr_token_end_period_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
  11776. Return a pointer to this function to the lexer (ffelex), which will
  11777. invoke it for the next token.
  11778. Expecting a period to close a .NOT, .TRUE, or .FALSE at rhs (unary op
  11779. or operator) state. If period isn't found, issue a diagnostic but
  11780. pretend we saw one. ffeexpr_current_dotdot_ must already contained the
  11781. dotdot representation of the name in between the two PERIOD tokens. */
  11782. static ffelexHandler
  11783. ffeexpr_token_end_period_ (ffelexToken t)
  11784. {
  11785. ffeexprExpr_ e;
  11786. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  11787. {
  11788. if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD))
  11789. {
  11790. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  11791. ffelex_token_where_column (ffeexpr_tokens_[0]));
  11792. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  11793. ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
  11794. ffebad_finish ();
  11795. }
  11796. }
  11797. ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill "NOT"/"TRUE"/"FALSE"
  11798. token. */
  11799. e = ffeexpr_expr_new_ ();
  11800. e->token = ffeexpr_tokens_[0];
  11801. switch (ffeexpr_current_dotdot_)
  11802. {
  11803. case FFESTR_otherNOT:
  11804. e->type = FFEEXPR_exprtypeUNARY_;
  11805. e->u.operator.op = FFEEXPR_operatorNOT_;
  11806. e->u.operator.prec = FFEEXPR_operatorprecedenceNOT_;
  11807. e->u.operator.as = FFEEXPR_operatorassociativityNOT_;
  11808. ffeexpr_exprstack_push_unary_ (e);
  11809. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  11810. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  11811. return (ffelexHandler) ffeexpr_token_rhs_;
  11812. case FFESTR_otherTRUE:
  11813. e->type = FFEEXPR_exprtypeOPERAND_;
  11814. e->u.operand
  11815. = ffebld_new_conter (ffebld_constant_new_logicaldefault (TRUE));
  11816. ffebld_set_info (e->u.operand,
  11817. ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
  11818. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  11819. ffeexpr_exprstack_push_operand_ (e);
  11820. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  11821. return (ffelexHandler) ffeexpr_token_binary_ (t);
  11822. return (ffelexHandler) ffeexpr_token_binary_;
  11823. case FFESTR_otherFALSE:
  11824. e->type = FFEEXPR_exprtypeOPERAND_;
  11825. e->u.operand
  11826. = ffebld_new_conter (ffebld_constant_new_logicaldefault (FALSE));
  11827. ffebld_set_info (e->u.operand,
  11828. ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
  11829. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  11830. ffeexpr_exprstack_push_operand_ (e);
  11831. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  11832. return (ffelexHandler) ffeexpr_token_binary_ (t);
  11833. return (ffelexHandler) ffeexpr_token_binary_;
  11834. default:
  11835. assert ("Bad unary dotdot in ffeexpr_current_dotdot_" == NULL);
  11836. exit (0);
  11837. return NULL;
  11838. }
  11839. }
  11840. /* ffeexpr_token_swallow_period_ -- Rhs PERIOD NAME(not NOT, TRUE, or FALSE)
  11841. Return a pointer to this function to the lexer (ffelex), which will
  11842. invoke it for the next token.
  11843. A diagnostic has already been issued; just swallow a period if there is
  11844. one, then continue with ffeexpr_token_rhs_. */
  11845. static ffelexHandler
  11846. ffeexpr_token_swallow_period_ (ffelexToken t)
  11847. {
  11848. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  11849. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  11850. return (ffelexHandler) ffeexpr_token_rhs_;
  11851. }
  11852. /* ffeexpr_token_real_ -- Rhs PERIOD NUMBER
  11853. Return a pointer to this function to the lexer (ffelex), which will
  11854. invoke it for the next token.
  11855. After a period and a string of digits, check next token for possible
  11856. exponent designation (D, E, or Q as first/only character) and continue
  11857. real-number handling accordingly. Else form basic real constant, push
  11858. onto expression stack, and enter binary state using current token (which,
  11859. if it is a name not beginning with D, E, or Q, will certainly result
  11860. in an error, but that's not for this routine to deal with). */
  11861. static ffelexHandler
  11862. ffeexpr_token_real_ (ffelexToken t)
  11863. {
  11864. char d;
  11865. const char *p;
  11866. if (((ffelex_token_type (t) != FFELEX_typeNAME)
  11867. && (ffelex_token_type (t) != FFELEX_typeNAMES))
  11868. || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  11869. 'D', 'd')
  11870. || ffesrc_char_match_init (d, 'E', 'e')
  11871. || ffesrc_char_match_init (d, 'Q', 'q')))
  11872. && ffeexpr_isdigits_ (++p)))
  11873. {
  11874. #if 0
  11875. /* This code has been removed because it seems inconsistent to
  11876. produce a diagnostic in this case, but not all of the other
  11877. ones that look for an exponent and cannot recognize one. */
  11878. if (((ffelex_token_type (t) == FFELEX_typeNAME)
  11879. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  11880. && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT))
  11881. {
  11882. char bad[2];
  11883. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  11884. ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
  11885. ffelex_token_where_column (ffeexpr_tokens_[0]));
  11886. bad[0] = *(p - 1);
  11887. bad[1] = '\0';
  11888. ffebad_string (bad);
  11889. ffebad_finish ();
  11890. }
  11891. #endif
  11892. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
  11893. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  11894. NULL, NULL, NULL);
  11895. ffelex_token_kill (ffeexpr_tokens_[0]);
  11896. ffelex_token_kill (ffeexpr_tokens_[1]);
  11897. return (ffelexHandler) ffeexpr_token_binary_ (t);
  11898. }
  11899. /* Just exponent character by itself? In which case, PLUS or MINUS must
  11900. surely be next, followed by a NUMBER token. */
  11901. if (*p == '\0')
  11902. {
  11903. ffeexpr_tokens_[2] = ffelex_token_use (t);
  11904. return (ffelexHandler) ffeexpr_token_real_exponent_;
  11905. }
  11906. ffeexpr_make_float_const_ (d, NULL, ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  11907. t, NULL, NULL);
  11908. ffelex_token_kill (ffeexpr_tokens_[0]);
  11909. ffelex_token_kill (ffeexpr_tokens_[1]);
  11910. return (ffelexHandler) ffeexpr_token_binary_;
  11911. }
  11912. /* ffeexpr_token_real_exponent_ -- Rhs PERIOD NUMBER NAME(D, E, or Q)
  11913. Return a pointer to this function to the lexer (ffelex), which will
  11914. invoke it for the next token.
  11915. Ensures this token is PLUS or MINUS, preserves it, goes to final state
  11916. for real number (exponent digits). Else issues diagnostic, assumes a
  11917. zero exponent field for number, passes token on to binary state as if
  11918. previous token had been "E0" instead of "E", for example. */
  11919. static ffelexHandler
  11920. ffeexpr_token_real_exponent_ (ffelexToken t)
  11921. {
  11922. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  11923. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  11924. {
  11925. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  11926. {
  11927. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
  11928. ffelex_token_where_column (ffeexpr_tokens_[2]));
  11929. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  11930. ffebad_finish ();
  11931. }
  11932. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
  11933. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  11934. NULL, NULL, NULL);
  11935. ffelex_token_kill (ffeexpr_tokens_[0]);
  11936. ffelex_token_kill (ffeexpr_tokens_[1]);
  11937. ffelex_token_kill (ffeexpr_tokens_[2]);
  11938. return (ffelexHandler) ffeexpr_token_binary_ (t);
  11939. }
  11940. ffeexpr_tokens_[3] = ffelex_token_use (t);
  11941. return (ffelexHandler) ffeexpr_token_real_exp_sign_;
  11942. }
  11943. /* ffeexpr_token_real_exp_sign_ -- Rhs PERIOD NUMBER NAME(D,E,Q) PLUS/MINUS
  11944. Return a pointer to this function to the lexer (ffelex), which will
  11945. invoke it for the next token.
  11946. Make sure token is a NUMBER, make a real constant out of all we have and
  11947. push it onto the expression stack. Else issue diagnostic and pretend
  11948. exponent field was a zero. */
  11949. static ffelexHandler
  11950. ffeexpr_token_real_exp_sign_ (ffelexToken t)
  11951. {
  11952. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  11953. {
  11954. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  11955. {
  11956. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
  11957. ffelex_token_where_column (ffeexpr_tokens_[2]));
  11958. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  11959. ffebad_finish ();
  11960. }
  11961. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
  11962. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  11963. NULL, NULL, NULL);
  11964. ffelex_token_kill (ffeexpr_tokens_[0]);
  11965. ffelex_token_kill (ffeexpr_tokens_[1]);
  11966. ffelex_token_kill (ffeexpr_tokens_[2]);
  11967. ffelex_token_kill (ffeexpr_tokens_[3]);
  11968. return (ffelexHandler) ffeexpr_token_binary_ (t);
  11969. }
  11970. ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[2])[0], NULL,
  11971. ffeexpr_tokens_[0], ffeexpr_tokens_[1], ffeexpr_tokens_[2],
  11972. ffeexpr_tokens_[3], t);
  11973. ffelex_token_kill (ffeexpr_tokens_[0]);
  11974. ffelex_token_kill (ffeexpr_tokens_[1]);
  11975. ffelex_token_kill (ffeexpr_tokens_[2]);
  11976. ffelex_token_kill (ffeexpr_tokens_[3]);
  11977. return (ffelexHandler) ffeexpr_token_binary_;
  11978. }
  11979. /* ffeexpr_token_number_ -- Rhs NUMBER
  11980. Return a pointer to this function to the lexer (ffelex), which will
  11981. invoke it for the next token.
  11982. If the token is a period, we may have a floating-point number, or an
  11983. integer followed by a dotdot binary operator. If the token is a name
  11984. beginning with D, E, or Q, we definitely have a floating-point number.
  11985. If the token is a hollerith constant, that's what we've got, so push
  11986. it onto the expression stack and continue with the binary state.
  11987. Otherwise, we have an integer followed by something the binary state
  11988. should be able to swallow. */
  11989. static ffelexHandler
  11990. ffeexpr_token_number_ (ffelexToken t)
  11991. {
  11992. ffeexprExpr_ e;
  11993. ffeinfo ni;
  11994. char d;
  11995. const char *p;
  11996. if (ffeexpr_hollerith_count_ > 0)
  11997. ffelex_set_expecting_hollerith (0, '\0',
  11998. ffewhere_line_unknown (),
  11999. ffewhere_column_unknown ());
  12000. /* See if we've got a floating-point number here. */
  12001. switch (ffelex_token_type (t))
  12002. {
  12003. case FFELEX_typeNAME:
  12004. case FFELEX_typeNAMES:
  12005. if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  12006. 'D', 'd')
  12007. || ffesrc_char_match_init (d, 'E', 'e')
  12008. || ffesrc_char_match_init (d, 'Q', 'q'))
  12009. && ffeexpr_isdigits_ (++p))
  12010. {
  12011. /* Just exponent character by itself? In which case, PLUS or MINUS
  12012. must surely be next, followed by a NUMBER token. */
  12013. if (*p == '\0')
  12014. {
  12015. ffeexpr_tokens_[1] = ffelex_token_use (t);
  12016. return (ffelexHandler) ffeexpr_token_number_exponent_;
  12017. }
  12018. ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0], NULL, NULL, t,
  12019. NULL, NULL);
  12020. ffelex_token_kill (ffeexpr_tokens_[0]);
  12021. return (ffelexHandler) ffeexpr_token_binary_;
  12022. }
  12023. break;
  12024. case FFELEX_typePERIOD:
  12025. ffeexpr_tokens_[1] = ffelex_token_use (t);
  12026. return (ffelexHandler) ffeexpr_token_number_period_;
  12027. case FFELEX_typeHOLLERITH:
  12028. e = ffeexpr_expr_new_ ();
  12029. e->type = FFEEXPR_exprtypeOPERAND_;
  12030. e->token = ffeexpr_tokens_[0];
  12031. e->u.operand = ffebld_new_conter (ffebld_constant_new_hollerith (t));
  12032. ni = ffeinfo_new (FFEINFO_basictypeHOLLERITH, FFEINFO_kindtypeNONE,
  12033. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  12034. ffelex_token_length (t));
  12035. ffebld_set_info (e->u.operand, ni);
  12036. ffeexpr_exprstack_push_operand_ (e);
  12037. return (ffelexHandler) ffeexpr_token_binary_;
  12038. default:
  12039. break;
  12040. }
  12041. /* Nothing specific we were looking for, so make an integer and pass the
  12042. current token to the binary state. */
  12043. ffeexpr_make_float_const_ ('I', ffeexpr_tokens_[0], NULL, NULL,
  12044. NULL, NULL, NULL);
  12045. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12046. }
  12047. /* ffeexpr_token_number_exponent_ -- Rhs NUMBER NAME(D, E, or Q)
  12048. Return a pointer to this function to the lexer (ffelex), which will
  12049. invoke it for the next token.
  12050. Ensures this token is PLUS or MINUS, preserves it, goes to final state
  12051. for real number (exponent digits). Else treats number as integer, passes
  12052. name to binary, passes current token to subsequent handler. */
  12053. static ffelexHandler
  12054. ffeexpr_token_number_exponent_ (ffelexToken t)
  12055. {
  12056. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  12057. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  12058. {
  12059. ffeexprExpr_ e;
  12060. ffelexHandler nexthandler;
  12061. e = ffeexpr_expr_new_ ();
  12062. e->type = FFEEXPR_exprtypeOPERAND_;
  12063. e->token = ffeexpr_tokens_[0];
  12064. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
  12065. (ffeexpr_tokens_[0]));
  12066. ffebld_set_info (e->u.operand,
  12067. ffeinfo_new (FFEINFO_basictypeINTEGER, FFEINFO_kindtypeINTEGERDEFAULT,
  12068. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  12069. ffeexpr_exprstack_push_operand_ (e);
  12070. nexthandler = (ffelexHandler) ffeexpr_token_binary_ (ffeexpr_tokens_[1]);
  12071. ffelex_token_kill (ffeexpr_tokens_[1]);
  12072. return (ffelexHandler) (*nexthandler) (t);
  12073. }
  12074. ffeexpr_tokens_[2] = ffelex_token_use (t);
  12075. return (ffelexHandler) ffeexpr_token_number_exp_sign_;
  12076. }
  12077. /* ffeexpr_token_number_exp_sign_ -- Rhs NUMBER NAME(D,E,Q) PLUS/MINUS
  12078. Return a pointer to this function to the lexer (ffelex), which will
  12079. invoke it for the next token.
  12080. Make sure token is a NUMBER, make a real constant out of all we have and
  12081. push it onto the expression stack. Else issue diagnostic and pretend
  12082. exponent field was a zero. */
  12083. static ffelexHandler
  12084. ffeexpr_token_number_exp_sign_ (ffelexToken t)
  12085. {
  12086. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  12087. {
  12088. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  12089. {
  12090. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[1]),
  12091. ffelex_token_where_column (ffeexpr_tokens_[1]));
  12092. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12093. ffebad_finish ();
  12094. }
  12095. ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[1])[0],
  12096. ffeexpr_tokens_[0], NULL, NULL,
  12097. ffeexpr_tokens_[1], ffeexpr_tokens_[2],
  12098. NULL);
  12099. ffelex_token_kill (ffeexpr_tokens_[0]);
  12100. ffelex_token_kill (ffeexpr_tokens_[1]);
  12101. ffelex_token_kill (ffeexpr_tokens_[2]);
  12102. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12103. }
  12104. ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[1])[0],
  12105. ffeexpr_tokens_[0], NULL, NULL,
  12106. ffeexpr_tokens_[1], ffeexpr_tokens_[2], t);
  12107. ffelex_token_kill (ffeexpr_tokens_[0]);
  12108. ffelex_token_kill (ffeexpr_tokens_[1]);
  12109. ffelex_token_kill (ffeexpr_tokens_[2]);
  12110. return (ffelexHandler) ffeexpr_token_binary_;
  12111. }
  12112. /* ffeexpr_token_number_period_ -- Rhs NUMBER PERIOD
  12113. Return a pointer to this function to the lexer (ffelex), which will
  12114. invoke it for the next token.
  12115. Handle a period detected following a number at rhs state. Must begin a
  12116. floating-point value (as in 1., 1.2, 1.E3, or 1.E+3) or a dot-dot name. */
  12117. static ffelexHandler
  12118. ffeexpr_token_number_period_ (ffelexToken t)
  12119. {
  12120. ffeexprExpr_ e;
  12121. ffelexHandler nexthandler;
  12122. const char *p;
  12123. char d;
  12124. switch (ffelex_token_type (t))
  12125. {
  12126. case FFELEX_typeNAME:
  12127. case FFELEX_typeNAMES:
  12128. if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  12129. 'D', 'd')
  12130. || ffesrc_char_match_init (d, 'E', 'e')
  12131. || ffesrc_char_match_init (d, 'Q', 'q'))
  12132. && ffeexpr_isdigits_ (++p))
  12133. {
  12134. /* Just exponent character by itself? In which case, PLUS or MINUS
  12135. must surely be next, followed by a NUMBER token. */
  12136. if (*p == '\0')
  12137. {
  12138. ffeexpr_tokens_[2] = ffelex_token_use (t);
  12139. return (ffelexHandler) ffeexpr_token_number_per_exp_;
  12140. }
  12141. ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0],
  12142. ffeexpr_tokens_[1], NULL, t, NULL,
  12143. NULL);
  12144. ffelex_token_kill (ffeexpr_tokens_[0]);
  12145. ffelex_token_kill (ffeexpr_tokens_[1]);
  12146. return (ffelexHandler) ffeexpr_token_binary_;
  12147. }
  12148. /* A name not representing an exponent, so assume it will be something
  12149. like EQ, make an integer from the number, pass the period to binary
  12150. state and the current token to the resulting state. */
  12151. e = ffeexpr_expr_new_ ();
  12152. e->type = FFEEXPR_exprtypeOPERAND_;
  12153. e->token = ffeexpr_tokens_[0];
  12154. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
  12155. (ffeexpr_tokens_[0]));
  12156. ffebld_set_info (e->u.operand,
  12157. ffeinfo_new (FFEINFO_basictypeINTEGER,
  12158. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  12159. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  12160. FFETARGET_charactersizeNONE));
  12161. ffeexpr_exprstack_push_operand_ (e);
  12162. nexthandler = (ffelexHandler) ffeexpr_token_binary_
  12163. (ffeexpr_tokens_[1]);
  12164. ffelex_token_kill (ffeexpr_tokens_[1]);
  12165. return (ffelexHandler) (*nexthandler) (t);
  12166. case FFELEX_typeNUMBER:
  12167. ffeexpr_tokens_[2] = ffelex_token_use (t);
  12168. return (ffelexHandler) ffeexpr_token_number_real_;
  12169. default:
  12170. break;
  12171. }
  12172. /* Nothing specific we were looking for, so make a real number and pass the
  12173. period and then the current token to the binary state. */
  12174. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12175. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12176. NULL, NULL, NULL, NULL);
  12177. ffelex_token_kill (ffeexpr_tokens_[0]);
  12178. ffelex_token_kill (ffeexpr_tokens_[1]);
  12179. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12180. }
  12181. /* ffeexpr_token_number_per_exp_ -- Rhs NUMBER PERIOD NAME(D, E, or Q)
  12182. Return a pointer to this function to the lexer (ffelex), which will
  12183. invoke it for the next token.
  12184. Ensures this token is PLUS or MINUS, preserves it, goes to final state
  12185. for real number (exponent digits). Else treats number as real, passes
  12186. name to binary, passes current token to subsequent handler. */
  12187. static ffelexHandler
  12188. ffeexpr_token_number_per_exp_ (ffelexToken t)
  12189. {
  12190. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  12191. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  12192. {
  12193. ffelexHandler nexthandler;
  12194. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12195. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12196. NULL, NULL, NULL, NULL);
  12197. ffelex_token_kill (ffeexpr_tokens_[0]);
  12198. ffelex_token_kill (ffeexpr_tokens_[1]);
  12199. nexthandler = (ffelexHandler) ffeexpr_token_binary_ (ffeexpr_tokens_[2]);
  12200. ffelex_token_kill (ffeexpr_tokens_[2]);
  12201. return (ffelexHandler) (*nexthandler) (t);
  12202. }
  12203. ffeexpr_tokens_[3] = ffelex_token_use (t);
  12204. return (ffelexHandler) ffeexpr_token_num_per_exp_sign_;
  12205. }
  12206. /* ffeexpr_token_number_real_ -- Rhs NUMBER PERIOD NUMBER
  12207. Return a pointer to this function to the lexer (ffelex), which will
  12208. invoke it for the next token.
  12209. After a number, period, and number, check next token for possible
  12210. exponent designation (D, E, or Q as first/only character) and continue
  12211. real-number handling accordingly. Else form basic real constant, push
  12212. onto expression stack, and enter binary state using current token (which,
  12213. if it is a name not beginning with D, E, or Q, will certainly result
  12214. in an error, but that's not for this routine to deal with). */
  12215. static ffelexHandler
  12216. ffeexpr_token_number_real_ (ffelexToken t)
  12217. {
  12218. char d;
  12219. const char *p;
  12220. if (((ffelex_token_type (t) != FFELEX_typeNAME)
  12221. && (ffelex_token_type (t) != FFELEX_typeNAMES))
  12222. || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
  12223. 'D', 'd')
  12224. || ffesrc_char_match_init (d, 'E', 'e')
  12225. || ffesrc_char_match_init (d, 'Q', 'q')))
  12226. && ffeexpr_isdigits_ (++p)))
  12227. {
  12228. #if 0
  12229. /* This code has been removed because it seems inconsistent to
  12230. produce a diagnostic in this case, but not all of the other
  12231. ones that look for an exponent and cannot recognize one. */
  12232. if (((ffelex_token_type (t) == FFELEX_typeNAME)
  12233. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  12234. && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT))
  12235. {
  12236. char bad[2];
  12237. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12238. ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12239. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12240. bad[0] = *(p - 1);
  12241. bad[1] = '\0';
  12242. ffebad_string (bad);
  12243. ffebad_finish ();
  12244. }
  12245. #endif
  12246. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12247. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12248. ffeexpr_tokens_[2], NULL, NULL, NULL);
  12249. ffelex_token_kill (ffeexpr_tokens_[0]);
  12250. ffelex_token_kill (ffeexpr_tokens_[1]);
  12251. ffelex_token_kill (ffeexpr_tokens_[2]);
  12252. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12253. }
  12254. /* Just exponent character by itself? In which case, PLUS or MINUS must
  12255. surely be next, followed by a NUMBER token. */
  12256. if (*p == '\0')
  12257. {
  12258. ffeexpr_tokens_[3] = ffelex_token_use (t);
  12259. return (ffelexHandler) ffeexpr_token_number_real_exp_;
  12260. }
  12261. ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12262. ffeexpr_tokens_[2], t, NULL, NULL);
  12263. ffelex_token_kill (ffeexpr_tokens_[0]);
  12264. ffelex_token_kill (ffeexpr_tokens_[1]);
  12265. ffelex_token_kill (ffeexpr_tokens_[2]);
  12266. return (ffelexHandler) ffeexpr_token_binary_;
  12267. }
  12268. /* ffeexpr_token_num_per_exp_sign_ -- Rhs NUMBER PERIOD NAME(D,E,Q) PLUS/MINUS
  12269. Return a pointer to this function to the lexer (ffelex), which will
  12270. invoke it for the next token.
  12271. Make sure token is a NUMBER, make a real constant out of all we have and
  12272. push it onto the expression stack. Else issue diagnostic and pretend
  12273. exponent field was a zero. */
  12274. static ffelexHandler
  12275. ffeexpr_token_num_per_exp_sign_ (ffelexToken t)
  12276. {
  12277. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  12278. {
  12279. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  12280. {
  12281. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
  12282. ffelex_token_where_column (ffeexpr_tokens_[2]));
  12283. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12284. ffebad_finish ();
  12285. }
  12286. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12287. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12288. NULL, NULL, NULL, NULL);
  12289. ffelex_token_kill (ffeexpr_tokens_[0]);
  12290. ffelex_token_kill (ffeexpr_tokens_[1]);
  12291. ffelex_token_kill (ffeexpr_tokens_[2]);
  12292. ffelex_token_kill (ffeexpr_tokens_[3]);
  12293. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12294. }
  12295. ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[2])[0],
  12296. ffeexpr_tokens_[0], ffeexpr_tokens_[1], NULL,
  12297. ffeexpr_tokens_[2], ffeexpr_tokens_[3], t);
  12298. ffelex_token_kill (ffeexpr_tokens_[0]);
  12299. ffelex_token_kill (ffeexpr_tokens_[1]);
  12300. ffelex_token_kill (ffeexpr_tokens_[2]);
  12301. ffelex_token_kill (ffeexpr_tokens_[3]);
  12302. return (ffelexHandler) ffeexpr_token_binary_;
  12303. }
  12304. /* ffeexpr_token_number_real_exp_ -- Rhs NUMBER PERIOD NUMBER NAME(D, E, or Q)
  12305. Return a pointer to this function to the lexer (ffelex), which will
  12306. invoke it for the next token.
  12307. Ensures this token is PLUS or MINUS, preserves it, goes to final state
  12308. for real number (exponent digits). Else issues diagnostic, assumes a
  12309. zero exponent field for number, passes token on to binary state as if
  12310. previous token had been "E0" instead of "E", for example. */
  12311. static ffelexHandler
  12312. ffeexpr_token_number_real_exp_ (ffelexToken t)
  12313. {
  12314. if ((ffelex_token_type (t) != FFELEX_typePLUS)
  12315. && (ffelex_token_type (t) != FFELEX_typeMINUS))
  12316. {
  12317. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  12318. {
  12319. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[3]),
  12320. ffelex_token_where_column (ffeexpr_tokens_[3]));
  12321. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12322. ffebad_finish ();
  12323. }
  12324. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12325. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12326. ffeexpr_tokens_[2], NULL, NULL, NULL);
  12327. ffelex_token_kill (ffeexpr_tokens_[0]);
  12328. ffelex_token_kill (ffeexpr_tokens_[1]);
  12329. ffelex_token_kill (ffeexpr_tokens_[2]);
  12330. ffelex_token_kill (ffeexpr_tokens_[3]);
  12331. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12332. }
  12333. ffeexpr_tokens_[4] = ffelex_token_use (t);
  12334. return (ffelexHandler) ffeexpr_token_num_real_exp_sn_;
  12335. }
  12336. /* ffeexpr_token_num_real_exp_sn_ -- Rhs NUMBER PERIOD NUMBER NAME(D,E,Q)
  12337. PLUS/MINUS
  12338. Return a pointer to this function to the lexer (ffelex), which will
  12339. invoke it for the next token.
  12340. Make sure token is a NUMBER, make a real constant out of all we have and
  12341. push it onto the expression stack. Else issue diagnostic and pretend
  12342. exponent field was a zero. */
  12343. static ffelexHandler
  12344. ffeexpr_token_num_real_exp_sn_ (ffelexToken t)
  12345. {
  12346. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  12347. {
  12348. if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
  12349. {
  12350. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[3]),
  12351. ffelex_token_where_column (ffeexpr_tokens_[3]));
  12352. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12353. ffebad_finish ();
  12354. }
  12355. ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
  12356. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12357. ffeexpr_tokens_[2], NULL, NULL, NULL);
  12358. ffelex_token_kill (ffeexpr_tokens_[0]);
  12359. ffelex_token_kill (ffeexpr_tokens_[1]);
  12360. ffelex_token_kill (ffeexpr_tokens_[2]);
  12361. ffelex_token_kill (ffeexpr_tokens_[3]);
  12362. ffelex_token_kill (ffeexpr_tokens_[4]);
  12363. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12364. }
  12365. ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[3])[0],
  12366. ffeexpr_tokens_[0], ffeexpr_tokens_[1],
  12367. ffeexpr_tokens_[2], ffeexpr_tokens_[3],
  12368. ffeexpr_tokens_[4], t);
  12369. ffelex_token_kill (ffeexpr_tokens_[0]);
  12370. ffelex_token_kill (ffeexpr_tokens_[1]);
  12371. ffelex_token_kill (ffeexpr_tokens_[2]);
  12372. ffelex_token_kill (ffeexpr_tokens_[3]);
  12373. ffelex_token_kill (ffeexpr_tokens_[4]);
  12374. return (ffelexHandler) ffeexpr_token_binary_;
  12375. }
  12376. /* ffeexpr_token_binary_ -- Handle binary operator possibility
  12377. Return a pointer to this function to the lexer (ffelex), which will
  12378. invoke it for the next token.
  12379. The possibility of a binary operator is handled here, meaning the previous
  12380. token was an operand. */
  12381. static ffelexHandler
  12382. ffeexpr_token_binary_ (ffelexToken t)
  12383. {
  12384. ffeexprExpr_ e;
  12385. if (!ffeexpr_stack_->is_rhs)
  12386. return (ffelexHandler) ffeexpr_finished_ (t); /* For now. */
  12387. switch (ffelex_token_type (t))
  12388. {
  12389. case FFELEX_typePLUS:
  12390. e = ffeexpr_expr_new_ ();
  12391. e->type = FFEEXPR_exprtypeBINARY_;
  12392. e->token = ffelex_token_use (t);
  12393. e->u.operator.op = FFEEXPR_operatorADD_;
  12394. e->u.operator.prec = FFEEXPR_operatorprecedenceADD_;
  12395. e->u.operator.as = FFEEXPR_operatorassociativityADD_;
  12396. ffeexpr_exprstack_push_binary_ (e);
  12397. return (ffelexHandler) ffeexpr_token_rhs_;
  12398. case FFELEX_typeMINUS:
  12399. e = ffeexpr_expr_new_ ();
  12400. e->type = FFEEXPR_exprtypeBINARY_;
  12401. e->token = ffelex_token_use (t);
  12402. e->u.operator.op = FFEEXPR_operatorSUBTRACT_;
  12403. e->u.operator.prec = FFEEXPR_operatorprecedenceSUBTRACT_;
  12404. e->u.operator.as = FFEEXPR_operatorassociativitySUBTRACT_;
  12405. ffeexpr_exprstack_push_binary_ (e);
  12406. return (ffelexHandler) ffeexpr_token_rhs_;
  12407. case FFELEX_typeASTERISK:
  12408. switch (ffeexpr_stack_->context)
  12409. {
  12410. case FFEEXPR_contextDATA:
  12411. return (ffelexHandler) ffeexpr_finished_ (t);
  12412. default:
  12413. break;
  12414. }
  12415. e = ffeexpr_expr_new_ ();
  12416. e->type = FFEEXPR_exprtypeBINARY_;
  12417. e->token = ffelex_token_use (t);
  12418. e->u.operator.op = FFEEXPR_operatorMULTIPLY_;
  12419. e->u.operator.prec = FFEEXPR_operatorprecedenceMULTIPLY_;
  12420. e->u.operator.as = FFEEXPR_operatorassociativityMULTIPLY_;
  12421. ffeexpr_exprstack_push_binary_ (e);
  12422. return (ffelexHandler) ffeexpr_token_rhs_;
  12423. case FFELEX_typeSLASH:
  12424. switch (ffeexpr_stack_->context)
  12425. {
  12426. case FFEEXPR_contextDATA:
  12427. return (ffelexHandler) ffeexpr_finished_ (t);
  12428. default:
  12429. break;
  12430. }
  12431. e = ffeexpr_expr_new_ ();
  12432. e->type = FFEEXPR_exprtypeBINARY_;
  12433. e->token = ffelex_token_use (t);
  12434. e->u.operator.op = FFEEXPR_operatorDIVIDE_;
  12435. e->u.operator.prec = FFEEXPR_operatorprecedenceDIVIDE_;
  12436. e->u.operator.as = FFEEXPR_operatorassociativityDIVIDE_;
  12437. ffeexpr_exprstack_push_binary_ (e);
  12438. return (ffelexHandler) ffeexpr_token_rhs_;
  12439. case FFELEX_typePOWER:
  12440. e = ffeexpr_expr_new_ ();
  12441. e->type = FFEEXPR_exprtypeBINARY_;
  12442. e->token = ffelex_token_use (t);
  12443. e->u.operator.op = FFEEXPR_operatorPOWER_;
  12444. e->u.operator.prec = FFEEXPR_operatorprecedencePOWER_;
  12445. e->u.operator.as = FFEEXPR_operatorassociativityPOWER_;
  12446. ffeexpr_exprstack_push_binary_ (e);
  12447. return (ffelexHandler) ffeexpr_token_rhs_;
  12448. case FFELEX_typeCONCAT:
  12449. e = ffeexpr_expr_new_ ();
  12450. e->type = FFEEXPR_exprtypeBINARY_;
  12451. e->token = ffelex_token_use (t);
  12452. e->u.operator.op = FFEEXPR_operatorCONCATENATE_;
  12453. e->u.operator.prec = FFEEXPR_operatorprecedenceCONCATENATE_;
  12454. e->u.operator.as = FFEEXPR_operatorassociativityCONCATENATE_;
  12455. ffeexpr_exprstack_push_binary_ (e);
  12456. return (ffelexHandler) ffeexpr_token_rhs_;
  12457. case FFELEX_typeOPEN_ANGLE:
  12458. switch (ffeexpr_stack_->context)
  12459. {
  12460. case FFEEXPR_contextFORMAT:
  12461. ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
  12462. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12463. ffebad_finish ();
  12464. break;
  12465. default:
  12466. break;
  12467. }
  12468. e = ffeexpr_expr_new_ ();
  12469. e->type = FFEEXPR_exprtypeBINARY_;
  12470. e->token = ffelex_token_use (t);
  12471. e->u.operator.op = FFEEXPR_operatorLT_;
  12472. e->u.operator.prec = FFEEXPR_operatorprecedenceLT_;
  12473. e->u.operator.as = FFEEXPR_operatorassociativityLT_;
  12474. ffeexpr_exprstack_push_binary_ (e);
  12475. return (ffelexHandler) ffeexpr_token_rhs_;
  12476. case FFELEX_typeCLOSE_ANGLE:
  12477. switch (ffeexpr_stack_->context)
  12478. {
  12479. case FFEEXPR_contextFORMAT:
  12480. return ffeexpr_finished_ (t);
  12481. default:
  12482. break;
  12483. }
  12484. e = ffeexpr_expr_new_ ();
  12485. e->type = FFEEXPR_exprtypeBINARY_;
  12486. e->token = ffelex_token_use (t);
  12487. e->u.operator.op = FFEEXPR_operatorGT_;
  12488. e->u.operator.prec = FFEEXPR_operatorprecedenceGT_;
  12489. e->u.operator.as = FFEEXPR_operatorassociativityGT_;
  12490. ffeexpr_exprstack_push_binary_ (e);
  12491. return (ffelexHandler) ffeexpr_token_rhs_;
  12492. case FFELEX_typeREL_EQ:
  12493. switch (ffeexpr_stack_->context)
  12494. {
  12495. case FFEEXPR_contextFORMAT:
  12496. ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
  12497. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12498. ffebad_finish ();
  12499. break;
  12500. default:
  12501. break;
  12502. }
  12503. e = ffeexpr_expr_new_ ();
  12504. e->type = FFEEXPR_exprtypeBINARY_;
  12505. e->token = ffelex_token_use (t);
  12506. e->u.operator.op = FFEEXPR_operatorEQ_;
  12507. e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
  12508. e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
  12509. ffeexpr_exprstack_push_binary_ (e);
  12510. return (ffelexHandler) ffeexpr_token_rhs_;
  12511. case FFELEX_typeREL_NE:
  12512. switch (ffeexpr_stack_->context)
  12513. {
  12514. case FFEEXPR_contextFORMAT:
  12515. ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
  12516. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12517. ffebad_finish ();
  12518. break;
  12519. default:
  12520. break;
  12521. }
  12522. e = ffeexpr_expr_new_ ();
  12523. e->type = FFEEXPR_exprtypeBINARY_;
  12524. e->token = ffelex_token_use (t);
  12525. e->u.operator.op = FFEEXPR_operatorNE_;
  12526. e->u.operator.prec = FFEEXPR_operatorprecedenceNE_;
  12527. e->u.operator.as = FFEEXPR_operatorassociativityNE_;
  12528. ffeexpr_exprstack_push_binary_ (e);
  12529. return (ffelexHandler) ffeexpr_token_rhs_;
  12530. case FFELEX_typeREL_LE:
  12531. switch (ffeexpr_stack_->context)
  12532. {
  12533. case FFEEXPR_contextFORMAT:
  12534. ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
  12535. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12536. ffebad_finish ();
  12537. break;
  12538. default:
  12539. break;
  12540. }
  12541. e = ffeexpr_expr_new_ ();
  12542. e->type = FFEEXPR_exprtypeBINARY_;
  12543. e->token = ffelex_token_use (t);
  12544. e->u.operator.op = FFEEXPR_operatorLE_;
  12545. e->u.operator.prec = FFEEXPR_operatorprecedenceLE_;
  12546. e->u.operator.as = FFEEXPR_operatorassociativityLE_;
  12547. ffeexpr_exprstack_push_binary_ (e);
  12548. return (ffelexHandler) ffeexpr_token_rhs_;
  12549. case FFELEX_typeREL_GE:
  12550. switch (ffeexpr_stack_->context)
  12551. {
  12552. case FFEEXPR_contextFORMAT:
  12553. ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
  12554. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12555. ffebad_finish ();
  12556. break;
  12557. default:
  12558. break;
  12559. }
  12560. e = ffeexpr_expr_new_ ();
  12561. e->type = FFEEXPR_exprtypeBINARY_;
  12562. e->token = ffelex_token_use (t);
  12563. e->u.operator.op = FFEEXPR_operatorGE_;
  12564. e->u.operator.prec = FFEEXPR_operatorprecedenceGE_;
  12565. e->u.operator.as = FFEEXPR_operatorassociativityGE_;
  12566. ffeexpr_exprstack_push_binary_ (e);
  12567. return (ffelexHandler) ffeexpr_token_rhs_;
  12568. case FFELEX_typePERIOD:
  12569. ffeexpr_tokens_[0] = ffelex_token_use (t);
  12570. return (ffelexHandler) ffeexpr_token_binary_period_;
  12571. #if 0
  12572. case FFELEX_typeOPEN_PAREN:
  12573. case FFELEX_typeCLOSE_PAREN:
  12574. case FFELEX_typeEQUALS:
  12575. case FFELEX_typePOINTS:
  12576. case FFELEX_typeCOMMA:
  12577. case FFELEX_typeCOLON:
  12578. case FFELEX_typeEOS:
  12579. case FFELEX_typeSEMICOLON:
  12580. case FFELEX_typeNAME:
  12581. case FFELEX_typeNAMES:
  12582. #endif
  12583. default:
  12584. return (ffelexHandler) ffeexpr_finished_ (t);
  12585. }
  12586. }
  12587. /* ffeexpr_token_binary_period_ -- Binary PERIOD
  12588. Return a pointer to this function to the lexer (ffelex), which will
  12589. invoke it for the next token.
  12590. Handle a period detected at binary (expecting binary op or end) state.
  12591. Must begin a dot-dot name, of which .NOT., .TRUE., and .FALSE. are not
  12592. valid. */
  12593. static ffelexHandler
  12594. ffeexpr_token_binary_period_ (ffelexToken t)
  12595. {
  12596. ffeexprExpr_ operand;
  12597. switch (ffelex_token_type (t))
  12598. {
  12599. case FFELEX_typeNAME:
  12600. case FFELEX_typeNAMES:
  12601. ffeexpr_current_dotdot_ = ffestr_other (t);
  12602. switch (ffeexpr_current_dotdot_)
  12603. {
  12604. case FFESTR_otherTRUE:
  12605. case FFESTR_otherFALSE:
  12606. case FFESTR_otherNOT:
  12607. if (ffest_ffebad_start (FFEBAD_MISSING_BINARY_OPERATOR))
  12608. {
  12609. operand = ffeexpr_stack_->exprstack;
  12610. assert (operand != NULL);
  12611. assert (operand->type == FFEEXPR_exprtypeOPERAND_);
  12612. ffebad_here (0, ffelex_token_where_line (operand->token), ffelex_token_where_column (operand->token));
  12613. ffebad_here (1, ffelex_token_where_line (t),
  12614. ffelex_token_where_column (t));
  12615. ffebad_finish ();
  12616. }
  12617. ffelex_token_kill (ffeexpr_tokens_[0]);
  12618. return (ffelexHandler) ffeexpr_token_binary_sw_per_;
  12619. default:
  12620. ffeexpr_tokens_[1] = ffelex_token_use (t);
  12621. return (ffelexHandler) ffeexpr_token_binary_end_per_;
  12622. }
  12623. break; /* Nothing really reaches here. */
  12624. default:
  12625. if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
  12626. {
  12627. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12628. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12629. ffebad_finish ();
  12630. }
  12631. ffelex_token_kill (ffeexpr_tokens_[0]);
  12632. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12633. }
  12634. }
  12635. /* ffeexpr_token_binary_end_per_ -- Binary PERIOD NAME(not NOT, TRUE, or FALSE)
  12636. Return a pointer to this function to the lexer (ffelex), which will
  12637. invoke it for the next token.
  12638. Expecting a period to close a dot-dot at binary (binary op
  12639. or operator) state. If period isn't found, issue a diagnostic but
  12640. pretend we saw one. ffeexpr_current_dotdot_ must already contained the
  12641. dotdot representation of the name in between the two PERIOD tokens. */
  12642. static ffelexHandler
  12643. ffeexpr_token_binary_end_per_ (ffelexToken t)
  12644. {
  12645. ffeexprExpr_ e;
  12646. e = ffeexpr_expr_new_ ();
  12647. e->type = FFEEXPR_exprtypeBINARY_;
  12648. e->token = ffeexpr_tokens_[0];
  12649. switch (ffeexpr_current_dotdot_)
  12650. {
  12651. case FFESTR_otherAND:
  12652. e->u.operator.op = FFEEXPR_operatorAND_;
  12653. e->u.operator.prec = FFEEXPR_operatorprecedenceAND_;
  12654. e->u.operator.as = FFEEXPR_operatorassociativityAND_;
  12655. break;
  12656. case FFESTR_otherOR:
  12657. e->u.operator.op = FFEEXPR_operatorOR_;
  12658. e->u.operator.prec = FFEEXPR_operatorprecedenceOR_;
  12659. e->u.operator.as = FFEEXPR_operatorassociativityOR_;
  12660. break;
  12661. case FFESTR_otherXOR:
  12662. e->u.operator.op = FFEEXPR_operatorXOR_;
  12663. e->u.operator.prec = FFEEXPR_operatorprecedenceXOR_;
  12664. e->u.operator.as = FFEEXPR_operatorassociativityXOR_;
  12665. break;
  12666. case FFESTR_otherEQV:
  12667. e->u.operator.op = FFEEXPR_operatorEQV_;
  12668. e->u.operator.prec = FFEEXPR_operatorprecedenceEQV_;
  12669. e->u.operator.as = FFEEXPR_operatorassociativityEQV_;
  12670. break;
  12671. case FFESTR_otherNEQV:
  12672. e->u.operator.op = FFEEXPR_operatorNEQV_;
  12673. e->u.operator.prec = FFEEXPR_operatorprecedenceNEQV_;
  12674. e->u.operator.as = FFEEXPR_operatorassociativityNEQV_;
  12675. break;
  12676. case FFESTR_otherLT:
  12677. e->u.operator.op = FFEEXPR_operatorLT_;
  12678. e->u.operator.prec = FFEEXPR_operatorprecedenceLT_;
  12679. e->u.operator.as = FFEEXPR_operatorassociativityLT_;
  12680. break;
  12681. case FFESTR_otherLE:
  12682. e->u.operator.op = FFEEXPR_operatorLE_;
  12683. e->u.operator.prec = FFEEXPR_operatorprecedenceLE_;
  12684. e->u.operator.as = FFEEXPR_operatorassociativityLE_;
  12685. break;
  12686. case FFESTR_otherEQ:
  12687. e->u.operator.op = FFEEXPR_operatorEQ_;
  12688. e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
  12689. e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
  12690. break;
  12691. case FFESTR_otherNE:
  12692. e->u.operator.op = FFEEXPR_operatorNE_;
  12693. e->u.operator.prec = FFEEXPR_operatorprecedenceNE_;
  12694. e->u.operator.as = FFEEXPR_operatorassociativityNE_;
  12695. break;
  12696. case FFESTR_otherGT:
  12697. e->u.operator.op = FFEEXPR_operatorGT_;
  12698. e->u.operator.prec = FFEEXPR_operatorprecedenceGT_;
  12699. e->u.operator.as = FFEEXPR_operatorassociativityGT_;
  12700. break;
  12701. case FFESTR_otherGE:
  12702. e->u.operator.op = FFEEXPR_operatorGE_;
  12703. e->u.operator.prec = FFEEXPR_operatorprecedenceGE_;
  12704. e->u.operator.as = FFEEXPR_operatorassociativityGE_;
  12705. break;
  12706. default:
  12707. if (ffest_ffebad_start (FFEBAD_INVALID_DOTDOT))
  12708. {
  12709. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12710. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12711. ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
  12712. ffebad_finish ();
  12713. }
  12714. e->u.operator.op = FFEEXPR_operatorEQ_;
  12715. e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
  12716. e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
  12717. break;
  12718. }
  12719. ffeexpr_exprstack_push_binary_ (e);
  12720. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  12721. {
  12722. if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD))
  12723. {
  12724. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12725. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12726. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12727. ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
  12728. ffebad_finish ();
  12729. }
  12730. ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill dot-dot token. */
  12731. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  12732. }
  12733. ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill dot-dot token. */
  12734. return (ffelexHandler) ffeexpr_token_rhs_;
  12735. }
  12736. /* ffeexpr_token_binary_sw_per_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
  12737. Return a pointer to this function to the lexer (ffelex), which will
  12738. invoke it for the next token.
  12739. A diagnostic has already been issued; just swallow a period if there is
  12740. one, then continue with ffeexpr_token_binary_. */
  12741. static ffelexHandler
  12742. ffeexpr_token_binary_sw_per_ (ffelexToken t)
  12743. {
  12744. if (ffelex_token_type (t) != FFELEX_typePERIOD)
  12745. return (ffelexHandler) ffeexpr_token_binary_ (t);
  12746. return (ffelexHandler) ffeexpr_token_binary_;
  12747. }
  12748. /* ffeexpr_token_quote_ -- Rhs QUOTE
  12749. Return a pointer to this function to the lexer (ffelex), which will
  12750. invoke it for the next token.
  12751. Expecting a NUMBER that we'll treat as an octal integer. */
  12752. static ffelexHandler
  12753. ffeexpr_token_quote_ (ffelexToken t)
  12754. {
  12755. ffeexprExpr_ e;
  12756. ffebld anyexpr;
  12757. if (ffelex_token_type (t) != FFELEX_typeNUMBER)
  12758. {
  12759. if (ffest_ffebad_start (FFEBAD_QUOTE_MISSES_DIGITS))
  12760. {
  12761. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12762. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12763. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12764. ffebad_finish ();
  12765. }
  12766. ffelex_token_kill (ffeexpr_tokens_[0]);
  12767. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  12768. }
  12769. /* This is kind of a kludge to prevent any whining about magical numbers
  12770. that start out as these octal integers, so "20000000000 (on a 32-bit
  12771. 2's-complement machine) by itself won't produce an error. */
  12772. anyexpr = ffebld_new_any ();
  12773. ffebld_set_info (anyexpr, ffeinfo_new_any ());
  12774. e = ffeexpr_expr_new_ ();
  12775. e->type = FFEEXPR_exprtypeOPERAND_;
  12776. e->token = ffeexpr_tokens_[0];
  12777. e->u.operand = ffebld_new_conter_with_orig
  12778. (ffebld_constant_new_integeroctal (t), anyexpr);
  12779. ffebld_set_info (e->u.operand, ffeinfo_new (FFEINFO_basictypeINTEGER,
  12780. FFEINFO_kindtypeINTEGERDEFAULT, 0, FFEINFO_kindENTITY,
  12781. FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  12782. ffeexpr_exprstack_push_operand_ (e);
  12783. return (ffelexHandler) ffeexpr_token_binary_;
  12784. }
  12785. /* ffeexpr_token_apostrophe_ -- Rhs APOSTROPHE
  12786. Return a pointer to this function to the lexer (ffelex), which will
  12787. invoke it for the next token.
  12788. Handle an open-apostrophe, which begins either a character ('char-const'),
  12789. typeless octal ('octal-const'O), or typeless hexadecimal ('hex-const'Z or
  12790. 'hex-const'X) constant. */
  12791. static ffelexHandler
  12792. ffeexpr_token_apostrophe_ (ffelexToken t)
  12793. {
  12794. assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
  12795. if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t) == 0))
  12796. {
  12797. ffebad_start (FFEBAD_NULL_CHAR_CONST);
  12798. ffebad_here (0, ffelex_token_where_line (t),
  12799. ffelex_token_where_column (t));
  12800. ffebad_finish ();
  12801. }
  12802. ffeexpr_tokens_[1] = ffelex_token_use (t);
  12803. return (ffelexHandler) ffeexpr_token_apos_char_;
  12804. }
  12805. /* ffeexpr_token_apos_char_ -- Rhs APOSTROPHE CHARACTER
  12806. Return a pointer to this function to the lexer (ffelex), which will
  12807. invoke it for the next token.
  12808. Close-apostrophe is implicit; if this token is NAME, it is a possible
  12809. typeless-constant radix specifier. */
  12810. static ffelexHandler
  12811. ffeexpr_token_apos_char_ (ffelexToken t)
  12812. {
  12813. ffeexprExpr_ e;
  12814. ffeinfo ni;
  12815. char c;
  12816. ffetargetCharacterSize size;
  12817. if ((ffelex_token_type (t) == FFELEX_typeNAME)
  12818. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  12819. {
  12820. if ((ffelex_token_length (t) == 1)
  12821. && (ffesrc_char_match_init ((c = ffelex_token_text (t)[0]), 'B',
  12822. 'b')
  12823. || ffesrc_char_match_init (c, 'O', 'o')
  12824. || ffesrc_char_match_init (c, 'X', 'x')
  12825. || ffesrc_char_match_init (c, 'Z', 'z')))
  12826. {
  12827. e = ffeexpr_expr_new_ ();
  12828. e->type = FFEEXPR_exprtypeOPERAND_;
  12829. e->token = ffeexpr_tokens_[0];
  12830. switch (c)
  12831. {
  12832. case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b, no_match):
  12833. e->u.operand = ffebld_new_conter
  12834. (ffebld_constant_new_typeless_bv (ffeexpr_tokens_[1]));
  12835. size = ffetarget_size_typeless_binary (ffeexpr_tokens_[1]);
  12836. break;
  12837. case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o, no_match):
  12838. e->u.operand = ffebld_new_conter
  12839. (ffebld_constant_new_typeless_ov (ffeexpr_tokens_[1]));
  12840. size = ffetarget_size_typeless_octal (ffeexpr_tokens_[1]);
  12841. break;
  12842. case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x, no_match):
  12843. e->u.operand = ffebld_new_conter
  12844. (ffebld_constant_new_typeless_hxv (ffeexpr_tokens_[1]));
  12845. size = ffetarget_size_typeless_hex (ffeexpr_tokens_[1]);
  12846. break;
  12847. case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z, no_match):
  12848. e->u.operand = ffebld_new_conter
  12849. (ffebld_constant_new_typeless_hzv (ffeexpr_tokens_[1]));
  12850. size = ffetarget_size_typeless_hex (ffeexpr_tokens_[1]);
  12851. break;
  12852. default:
  12853. no_match: /* :::::::::::::::::::: */
  12854. assert ("not BOXZ!" == NULL);
  12855. size = 0;
  12856. break;
  12857. }
  12858. ffebld_set_info (e->u.operand,
  12859. ffeinfo_new (FFEINFO_basictypeTYPELESS, FFEINFO_kindtypeNONE,
  12860. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, size));
  12861. ffeexpr_exprstack_push_operand_ (e);
  12862. ffelex_token_kill (ffeexpr_tokens_[1]);
  12863. return (ffelexHandler) ffeexpr_token_binary_;
  12864. }
  12865. }
  12866. e = ffeexpr_expr_new_ ();
  12867. e->type = FFEEXPR_exprtypeOPERAND_;
  12868. e->token = ffeexpr_tokens_[0];
  12869. e->u.operand = ffebld_new_conter (ffebld_constant_new_characterdefault
  12870. (ffeexpr_tokens_[1]));
  12871. ni = ffeinfo_new (FFEINFO_basictypeCHARACTER, FFEINFO_kindtypeCHARACTERDEFAULT,
  12872. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  12873. ffelex_token_length (ffeexpr_tokens_[1]));
  12874. ffebld_set_info (e->u.operand, ni);
  12875. ffelex_token_kill (ffeexpr_tokens_[1]);
  12876. ffeexpr_exprstack_push_operand_ (e);
  12877. if ((ffelex_token_type (t) == FFELEX_typeNAME)
  12878. || (ffelex_token_type (t) == FFELEX_typeNAMES))
  12879. {
  12880. if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
  12881. {
  12882. ffebad_string (ffelex_token_text (t));
  12883. ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
  12884. ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
  12885. ffelex_token_where_column (ffeexpr_tokens_[0]));
  12886. ffebad_finish ();
  12887. }
  12888. e = ffeexpr_expr_new_ ();
  12889. e->type = FFEEXPR_exprtypeBINARY_;
  12890. e->token = ffelex_token_use (t);
  12891. e->u.operator.op = FFEEXPR_operatorCONCATENATE_;
  12892. e->u.operator.prec = FFEEXPR_operatorprecedenceCONCATENATE_;
  12893. e->u.operator.as = FFEEXPR_operatorassociativityCONCATENATE_;
  12894. ffeexpr_exprstack_push_binary_ (e);
  12895. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  12896. }
  12897. ffeexpr_is_substr_ok_ = !ffe_is_pedantic_not_90 (); /* Allow "'hello'(3:5)". */
  12898. return (ffelexHandler) ffeexpr_token_substrp_ (t);
  12899. }
  12900. /* ffeexpr_token_name_lhs_ -- Lhs NAME
  12901. Return a pointer to this function to the lexer (ffelex), which will
  12902. invoke it for the next token.
  12903. Handle a name followed by open-paren, period (RECORD.MEMBER), percent
  12904. (RECORD%MEMBER), or nothing at all. */
  12905. static ffelexHandler
  12906. ffeexpr_token_name_lhs_ (ffelexToken t)
  12907. {
  12908. ffeexprExpr_ e;
  12909. ffeexprParenType_ paren_type;
  12910. ffesymbol s;
  12911. ffebld expr;
  12912. ffeinfo info;
  12913. switch (ffelex_token_type (t))
  12914. {
  12915. case FFELEX_typeOPEN_PAREN:
  12916. switch (ffeexpr_stack_->context)
  12917. {
  12918. case FFEEXPR_contextASSIGN:
  12919. case FFEEXPR_contextAGOTO:
  12920. case FFEEXPR_contextFILEUNIT_DF:
  12921. goto just_name; /* :::::::::::::::::::: */
  12922. default:
  12923. break;
  12924. }
  12925. e = ffeexpr_expr_new_ ();
  12926. e->type = FFEEXPR_exprtypeOPERAND_;
  12927. e->token = ffelex_token_use (ffeexpr_tokens_[0]);
  12928. s = ffeexpr_declare_parenthesized_ (ffeexpr_tokens_[0], FALSE,
  12929. &paren_type);
  12930. switch (ffesymbol_where (s))
  12931. {
  12932. case FFEINFO_whereLOCAL:
  12933. if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
  12934. ffesymbol_error (s, ffeexpr_tokens_[0]); /* Recursion. */
  12935. break;
  12936. case FFEINFO_whereINTRINSIC:
  12937. case FFEINFO_whereGLOBAL:
  12938. if (ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
  12939. ffesymbol_error (s, ffeexpr_tokens_[0]); /* Can call intrin. */
  12940. break;
  12941. case FFEINFO_whereCOMMON:
  12942. case FFEINFO_whereDUMMY:
  12943. case FFEINFO_whereRESULT:
  12944. break;
  12945. case FFEINFO_whereNONE:
  12946. case FFEINFO_whereANY:
  12947. break;
  12948. default:
  12949. ffesymbol_error (s, ffeexpr_tokens_[0]);
  12950. break;
  12951. }
  12952. if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
  12953. {
  12954. e->u.operand = ffebld_new_any ();
  12955. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  12956. }
  12957. else
  12958. {
  12959. e->u.operand = ffebld_new_symter (s,
  12960. ffesymbol_generic (s),
  12961. ffesymbol_specific (s),
  12962. ffesymbol_implementation (s));
  12963. ffebld_set_info (e->u.operand, ffesymbol_info (s));
  12964. }
  12965. ffeexpr_exprstack_push_ (e); /* Not a complete operand yet. */
  12966. ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
  12967. switch (paren_type)
  12968. {
  12969. case FFEEXPR_parentypeSUBROUTINE_:
  12970. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  12971. return
  12972. (ffelexHandler)
  12973. ffeexpr_rhs (ffeexpr_stack_->pool,
  12974. FFEEXPR_contextACTUALARG_,
  12975. ffeexpr_token_arguments_);
  12976. case FFEEXPR_parentypeARRAY_:
  12977. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  12978. ffeexpr_stack_->bound_list = ffesymbol_dims (s);
  12979. ffeexpr_stack_->rank = 0;
  12980. ffeexpr_stack_->constant = TRUE;
  12981. ffeexpr_stack_->immediate = TRUE;
  12982. switch (ffeexpr_stack_->context)
  12983. {
  12984. case FFEEXPR_contextDATAIMPDOITEM_:
  12985. return
  12986. (ffelexHandler)
  12987. ffeexpr_rhs (ffeexpr_stack_->pool,
  12988. FFEEXPR_contextDATAIMPDOINDEX_,
  12989. ffeexpr_token_elements_);
  12990. case FFEEXPR_contextEQUIVALENCE:
  12991. return
  12992. (ffelexHandler)
  12993. ffeexpr_rhs (ffeexpr_stack_->pool,
  12994. FFEEXPR_contextEQVINDEX_,
  12995. ffeexpr_token_elements_);
  12996. default:
  12997. return
  12998. (ffelexHandler)
  12999. ffeexpr_rhs (ffeexpr_stack_->pool,
  13000. FFEEXPR_contextINDEX_,
  13001. ffeexpr_token_elements_);
  13002. }
  13003. case FFEEXPR_parentypeSUBSTRING_:
  13004. e->u.operand = ffeexpr_collapse_symter (e->u.operand,
  13005. ffeexpr_tokens_[0]);
  13006. return
  13007. (ffelexHandler)
  13008. ffeexpr_rhs (ffeexpr_stack_->pool,
  13009. FFEEXPR_contextINDEX_,
  13010. ffeexpr_token_substring_);
  13011. case FFEEXPR_parentypeEQUIVALENCE_:
  13012. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  13013. ffeexpr_stack_->bound_list = ffesymbol_dims (s);
  13014. ffeexpr_stack_->rank = 0;
  13015. ffeexpr_stack_->constant = TRUE;
  13016. ffeexpr_stack_->immediate = TRUE;
  13017. return
  13018. (ffelexHandler)
  13019. ffeexpr_rhs (ffeexpr_stack_->pool,
  13020. FFEEXPR_contextEQVINDEX_,
  13021. ffeexpr_token_equivalence_);
  13022. case FFEEXPR_parentypeFUNCTION_: /* Invalid case. */
  13023. case FFEEXPR_parentypeFUNSUBSTR_: /* Invalid case. */
  13024. ffesymbol_error (s, ffeexpr_tokens_[0]);
  13025. /* Fall through. */
  13026. case FFEEXPR_parentypeANY_:
  13027. e->u.operand = ffebld_new_any ();
  13028. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  13029. return
  13030. (ffelexHandler)
  13031. ffeexpr_rhs (ffeexpr_stack_->pool,
  13032. FFEEXPR_contextACTUALARG_,
  13033. ffeexpr_token_anything_);
  13034. default:
  13035. assert ("bad paren type" == NULL);
  13036. break;
  13037. }
  13038. case FFELEX_typeEQUALS: /* As in "VAR=". */
  13039. switch (ffeexpr_stack_->context)
  13040. {
  13041. case FFEEXPR_contextIMPDOITEM_: /* within
  13042. "(,VAR=start,end[,incr])". */
  13043. case FFEEXPR_contextIMPDOITEMDF_:
  13044. ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
  13045. break;
  13046. case FFEEXPR_contextDATAIMPDOITEM_:
  13047. ffeexpr_stack_->context = FFEEXPR_contextDATAIMPDOCTRL_;
  13048. break;
  13049. default:
  13050. break;
  13051. }
  13052. break;
  13053. #if 0
  13054. case FFELEX_typePERIOD:
  13055. case FFELEX_typePERCENT:
  13056. assert ("FOO%, FOO. not yet supported!~~" == NULL);
  13057. break;
  13058. #endif
  13059. default:
  13060. break;
  13061. }
  13062. just_name: /* :::::::::::::::::::: */
  13063. e = ffeexpr_expr_new_ ();
  13064. e->type = FFEEXPR_exprtypeOPERAND_;
  13065. e->token = ffeexpr_tokens_[0];
  13066. s = ffeexpr_declare_unadorned_ (ffeexpr_tokens_[0],
  13067. (ffeexpr_stack_->context
  13068. == FFEEXPR_contextSUBROUTINEREF));
  13069. switch (ffesymbol_where (s))
  13070. {
  13071. case FFEINFO_whereCONSTANT:
  13072. if ((ffeexpr_stack_->context != FFEEXPR_contextPARAMETER)
  13073. || (ffesymbol_kind (s) != FFEINFO_kindENTITY))
  13074. ffesymbol_error (s, ffeexpr_tokens_[0]);
  13075. break;
  13076. case FFEINFO_whereIMMEDIATE:
  13077. if ((ffeexpr_stack_->context != FFEEXPR_contextDATAIMPDOCTRL_)
  13078. && (ffeexpr_stack_->context != FFEEXPR_contextDATAIMPDOINDEX_))
  13079. ffesymbol_error (s, ffeexpr_tokens_[0]);
  13080. break;
  13081. case FFEINFO_whereLOCAL:
  13082. if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
  13083. ffesymbol_error (s, ffeexpr_tokens_[0]); /* Recurse!. */
  13084. break;
  13085. case FFEINFO_whereINTRINSIC:
  13086. if (ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
  13087. ffesymbol_error (s, ffeexpr_tokens_[0]); /* Can call intrin. */
  13088. break;
  13089. default:
  13090. break;
  13091. }
  13092. if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
  13093. {
  13094. expr = ffebld_new_any ();
  13095. info = ffeinfo_new_any ();
  13096. ffebld_set_info (expr, info);
  13097. }
  13098. else
  13099. {
  13100. expr = ffebld_new_symter (s,
  13101. ffesymbol_generic (s),
  13102. ffesymbol_specific (s),
  13103. ffesymbol_implementation (s));
  13104. info = ffesymbol_info (s);
  13105. ffebld_set_info (expr, info);
  13106. if (ffesymbol_is_doiter (s))
  13107. {
  13108. ffebad_start (FFEBAD_DOITER);
  13109. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13110. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13111. ffest_ffebad_here_doiter (1, s);
  13112. ffebad_string (ffesymbol_text (s));
  13113. ffebad_finish ();
  13114. }
  13115. expr = ffeexpr_collapse_symter (expr, ffeexpr_tokens_[0]);
  13116. }
  13117. if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
  13118. {
  13119. if (ffebld_op (expr) == FFEBLD_opANY)
  13120. {
  13121. expr = ffebld_new_any ();
  13122. ffebld_set_info (expr, ffeinfo_new_any ());
  13123. }
  13124. else
  13125. {
  13126. expr = ffebld_new_subrref (expr, NULL); /* No argument list. */
  13127. if (ffesymbol_generic (s) != FFEINTRIN_genNONE)
  13128. ffeintrin_fulfill_generic (&expr, &info, e->token);
  13129. else if (ffesymbol_specific (s) != FFEINTRIN_specNONE)
  13130. ffeintrin_fulfill_specific (&expr, &info, NULL, e->token);
  13131. else
  13132. ffeexpr_fulfill_call_ (&expr, e->token);
  13133. if (ffebld_op (expr) != FFEBLD_opANY)
  13134. ffebld_set_info (expr,
  13135. ffeinfo_new (ffeinfo_basictype (info),
  13136. ffeinfo_kindtype (info),
  13137. 0,
  13138. FFEINFO_kindENTITY,
  13139. FFEINFO_whereFLEETING,
  13140. ffeinfo_size (info)));
  13141. else
  13142. ffebld_set_info (expr, ffeinfo_new_any ());
  13143. }
  13144. }
  13145. e->u.operand = expr;
  13146. ffeexpr_exprstack_push_operand_ (e);
  13147. return (ffelexHandler) ffeexpr_finished_ (t);
  13148. }
  13149. /* ffeexpr_token_name_arg_ -- Rhs NAME
  13150. Return a pointer to this function to the lexer (ffelex), which will
  13151. invoke it for the next token.
  13152. Handle first token in an actual-arg (or possible actual-arg) context
  13153. being a NAME, and use second token to refine the context. */
  13154. static ffelexHandler
  13155. ffeexpr_token_name_arg_ (ffelexToken t)
  13156. {
  13157. switch (ffelex_token_type (t))
  13158. {
  13159. case FFELEX_typeCLOSE_PAREN:
  13160. case FFELEX_typeCOMMA:
  13161. switch (ffeexpr_stack_->context)
  13162. {
  13163. case FFEEXPR_contextINDEXORACTUALARG_:
  13164. ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
  13165. break;
  13166. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  13167. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
  13168. break;
  13169. default:
  13170. break;
  13171. }
  13172. break;
  13173. default:
  13174. switch (ffeexpr_stack_->context)
  13175. {
  13176. case FFEEXPR_contextACTUALARG_:
  13177. ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
  13178. break;
  13179. case FFEEXPR_contextINDEXORACTUALARG_:
  13180. ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
  13181. break;
  13182. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  13183. ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
  13184. break;
  13185. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  13186. ffeexpr_stack_->context
  13187. = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
  13188. break;
  13189. default:
  13190. assert ("bad context in _name_arg_" == NULL);
  13191. break;
  13192. }
  13193. break;
  13194. }
  13195. return (ffelexHandler) ffeexpr_token_name_rhs_ (t);
  13196. }
  13197. /* ffeexpr_token_name_rhs_ -- Rhs NAME
  13198. Return a pointer to this function to the lexer (ffelex), which will
  13199. invoke it for the next token.
  13200. Handle a name followed by open-paren, apostrophe (O'octal-const',
  13201. Z'hex-const', or X'hex-const'), period (RECORD.MEMBER).
  13202. 26-Nov-91 JCB 1.2
  13203. When followed by apostrophe or quote, set lex hexnum flag on so
  13204. [0-9] as first char of next token seen as starting a potentially
  13205. hex number (NAME).
  13206. 04-Oct-91 JCB 1.1
  13207. In case of intrinsic, decorate its SYMTER with the type info for
  13208. the specific intrinsic. */
  13209. static ffelexHandler
  13210. ffeexpr_token_name_rhs_ (ffelexToken t)
  13211. {
  13212. ffeexprExpr_ e;
  13213. ffeexprParenType_ paren_type;
  13214. ffesymbol s;
  13215. bool sfdef;
  13216. switch (ffelex_token_type (t))
  13217. {
  13218. case FFELEX_typeQUOTE:
  13219. case FFELEX_typeAPOSTROPHE:
  13220. ffeexpr_tokens_[1] = ffelex_token_use (t);
  13221. ffelex_set_hexnum (TRUE);
  13222. return (ffelexHandler) ffeexpr_token_name_apos_;
  13223. case FFELEX_typeOPEN_PAREN:
  13224. e = ffeexpr_expr_new_ ();
  13225. e->type = FFEEXPR_exprtypeOPERAND_;
  13226. e->token = ffelex_token_use (ffeexpr_tokens_[0]);
  13227. s = ffeexpr_declare_parenthesized_ (ffeexpr_tokens_[0], TRUE,
  13228. &paren_type);
  13229. if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
  13230. e->u.operand = ffebld_new_any ();
  13231. else
  13232. e->u.operand = ffebld_new_symter (s, ffesymbol_generic (s),
  13233. ffesymbol_specific (s),
  13234. ffesymbol_implementation (s));
  13235. ffeexpr_exprstack_push_ (e); /* Not a complete operand yet. */
  13236. ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
  13237. switch (ffeexpr_context_outer_ (ffeexpr_stack_))
  13238. {
  13239. case FFEEXPR_contextSFUNCDEF:
  13240. case FFEEXPR_contextSFUNCDEFINDEX_:
  13241. case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
  13242. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
  13243. sfdef = TRUE;
  13244. break;
  13245. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  13246. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  13247. assert ("weird context!" == NULL);
  13248. sfdef = FALSE;
  13249. break;
  13250. default:
  13251. sfdef = FALSE;
  13252. break;
  13253. }
  13254. switch (paren_type)
  13255. {
  13256. case FFEEXPR_parentypeFUNCTION_:
  13257. ffebld_set_info (e->u.operand, ffesymbol_info (s));
  13258. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  13259. if (ffesymbol_where (s) == FFEINFO_whereCONSTANT)
  13260. { /* A statement function. */
  13261. ffeexpr_stack_->num_args
  13262. = ffebld_list_length
  13263. (ffeexpr_stack_->next_dummy
  13264. = ffesymbol_dummyargs (s));
  13265. ffeexpr_stack_->tokens[1] = NULL; /* !=NULL when > num_args. */
  13266. }
  13267. else if ((ffesymbol_where (s) == FFEINFO_whereINTRINSIC)
  13268. && !ffe_is_pedantic_not_90 ()
  13269. && ((ffesymbol_implementation (s)
  13270. == FFEINTRIN_impICHAR)
  13271. || (ffesymbol_implementation (s)
  13272. == FFEINTRIN_impIACHAR)
  13273. || (ffesymbol_implementation (s)
  13274. == FFEINTRIN_impLEN)))
  13275. { /* Allow arbitrary concatenations. */
  13276. return
  13277. (ffelexHandler)
  13278. ffeexpr_rhs (ffeexpr_stack_->pool,
  13279. sfdef
  13280. ? FFEEXPR_contextSFUNCDEF
  13281. : FFEEXPR_contextLET,
  13282. ffeexpr_token_arguments_);
  13283. }
  13284. return
  13285. (ffelexHandler)
  13286. ffeexpr_rhs (ffeexpr_stack_->pool,
  13287. sfdef
  13288. ? FFEEXPR_contextSFUNCDEFACTUALARG_
  13289. : FFEEXPR_contextACTUALARG_,
  13290. ffeexpr_token_arguments_);
  13291. case FFEEXPR_parentypeARRAY_:
  13292. ffebld_set_info (e->u.operand,
  13293. ffesymbol_info (ffebld_symter (e->u.operand)));
  13294. ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
  13295. ffeexpr_stack_->bound_list = ffesymbol_dims (s);
  13296. ffeexpr_stack_->rank = 0;
  13297. ffeexpr_stack_->constant = TRUE;
  13298. ffeexpr_stack_->immediate = TRUE;
  13299. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  13300. sfdef
  13301. ? FFEEXPR_contextSFUNCDEFINDEX_
  13302. : FFEEXPR_contextINDEX_,
  13303. ffeexpr_token_elements_);
  13304. case FFEEXPR_parentypeSUBSTRING_:
  13305. ffebld_set_info (e->u.operand,
  13306. ffesymbol_info (ffebld_symter (e->u.operand)));
  13307. e->u.operand = ffeexpr_collapse_symter (e->u.operand,
  13308. ffeexpr_tokens_[0]);
  13309. return
  13310. (ffelexHandler)
  13311. ffeexpr_rhs (ffeexpr_stack_->pool,
  13312. sfdef
  13313. ? FFEEXPR_contextSFUNCDEFINDEX_
  13314. : FFEEXPR_contextINDEX_,
  13315. ffeexpr_token_substring_);
  13316. case FFEEXPR_parentypeFUNSUBSTR_:
  13317. return
  13318. (ffelexHandler)
  13319. ffeexpr_rhs (ffeexpr_stack_->pool,
  13320. sfdef
  13321. ? FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
  13322. : FFEEXPR_contextINDEXORACTUALARG_,
  13323. ffeexpr_token_funsubstr_);
  13324. case FFEEXPR_parentypeANY_:
  13325. ffebld_set_info (e->u.operand, ffesymbol_info (s));
  13326. return
  13327. (ffelexHandler)
  13328. ffeexpr_rhs (ffeexpr_stack_->pool,
  13329. sfdef
  13330. ? FFEEXPR_contextSFUNCDEFACTUALARG_
  13331. : FFEEXPR_contextACTUALARG_,
  13332. ffeexpr_token_anything_);
  13333. default:
  13334. assert ("bad paren type" == NULL);
  13335. break;
  13336. }
  13337. case FFELEX_typeEQUALS: /* As in "VAR=". */
  13338. switch (ffeexpr_stack_->context)
  13339. {
  13340. case FFEEXPR_contextIMPDOITEM_: /* "(,VAR=start,end[,incr])". */
  13341. case FFEEXPR_contextIMPDOITEMDF_:
  13342. ffeexpr_stack_->is_rhs = FALSE; /* Really an lhs construct. */
  13343. ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
  13344. break;
  13345. default:
  13346. break;
  13347. }
  13348. break;
  13349. #if 0
  13350. case FFELEX_typePERIOD:
  13351. case FFELEX_typePERCENT:
  13352. ~~Support these two someday, though not required
  13353. assert ("FOO%, FOO. not yet supported!~~" == NULL);
  13354. break;
  13355. #endif
  13356. default:
  13357. break;
  13358. }
  13359. switch (ffeexpr_stack_->context)
  13360. {
  13361. case FFEEXPR_contextINDEXORACTUALARG_:
  13362. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
  13363. assert ("strange context" == NULL);
  13364. break;
  13365. default:
  13366. break;
  13367. }
  13368. e = ffeexpr_expr_new_ ();
  13369. e->type = FFEEXPR_exprtypeOPERAND_;
  13370. e->token = ffeexpr_tokens_[0];
  13371. s = ffeexpr_declare_unadorned_ (ffeexpr_tokens_[0], FALSE);
  13372. if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
  13373. {
  13374. e->u.operand = ffebld_new_any ();
  13375. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  13376. }
  13377. else
  13378. {
  13379. e->u.operand = ffebld_new_symter (s, FFEINTRIN_genNONE,
  13380. ffesymbol_specific (s),
  13381. ffesymbol_implementation (s));
  13382. if (ffesymbol_specific (s) == FFEINTRIN_specNONE)
  13383. ffebld_set_info (e->u.operand, ffeinfo_use (ffesymbol_info (s)));
  13384. else
  13385. { /* Decorate the SYMTER with the actual type
  13386. of the intrinsic. */
  13387. ffebld_set_info (e->u.operand, ffeinfo_new
  13388. (ffeintrin_basictype (ffesymbol_specific (s)),
  13389. ffeintrin_kindtype (ffesymbol_specific (s)),
  13390. 0,
  13391. ffesymbol_kind (s),
  13392. ffesymbol_where (s),
  13393. FFETARGET_charactersizeNONE));
  13394. }
  13395. if (ffesymbol_is_doiter (s))
  13396. ffebld_symter_set_is_doiter (e->u.operand, TRUE);
  13397. e->u.operand = ffeexpr_collapse_symter (e->u.operand,
  13398. ffeexpr_tokens_[0]);
  13399. }
  13400. ffeexpr_exprstack_push_operand_ (e);
  13401. return (ffelexHandler) ffeexpr_token_binary_ (t);
  13402. }
  13403. /* ffeexpr_token_name_apos_ -- Rhs NAME APOSTROPHE
  13404. Return a pointer to this function to the lexer (ffelex), which will
  13405. invoke it for the next token.
  13406. Expecting a NAME token, analyze the previous NAME token to see what kind,
  13407. if any, typeless constant we've got.
  13408. 01-Sep-90 JCB 1.1
  13409. Expect a NAME instead of CHARACTER in this situation. */
  13410. static ffelexHandler
  13411. ffeexpr_token_name_apos_ (ffelexToken t)
  13412. {
  13413. ffeexprExpr_ e;
  13414. ffelex_set_hexnum (FALSE);
  13415. switch (ffelex_token_type (t))
  13416. {
  13417. case FFELEX_typeNAME:
  13418. ffeexpr_tokens_[2] = ffelex_token_use (t);
  13419. return (ffelexHandler) ffeexpr_token_name_apos_name_;
  13420. default:
  13421. break;
  13422. }
  13423. if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
  13424. {
  13425. ffebad_string (ffelex_token_text (ffeexpr_tokens_[0]));
  13426. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13427. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13428. ffebad_here (1, ffelex_token_where_line (t),
  13429. ffelex_token_where_column (t));
  13430. ffebad_finish ();
  13431. }
  13432. ffelex_token_kill (ffeexpr_tokens_[1]);
  13433. e = ffeexpr_expr_new_ ();
  13434. e->type = FFEEXPR_exprtypeOPERAND_;
  13435. e->u.operand = ffebld_new_any ();
  13436. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  13437. e->token = ffeexpr_tokens_[0];
  13438. ffeexpr_exprstack_push_operand_ (e);
  13439. return (ffelexHandler) ffeexpr_token_binary_ (t);
  13440. }
  13441. /* ffeexpr_token_name_apos_name_ -- Rhs NAME APOSTROPHE NAME
  13442. Return a pointer to this function to the lexer (ffelex), which will
  13443. invoke it for the next token.
  13444. Expecting an APOSTROPHE token, analyze the previous NAME token to see
  13445. what kind, if any, typeless constant we've got. */
  13446. static ffelexHandler
  13447. ffeexpr_token_name_apos_name_ (ffelexToken t)
  13448. {
  13449. ffeexprExpr_ e;
  13450. char c;
  13451. e = ffeexpr_expr_new_ ();
  13452. e->type = FFEEXPR_exprtypeOPERAND_;
  13453. e->token = ffeexpr_tokens_[0];
  13454. if ((ffelex_token_type (t) == ffelex_token_type (ffeexpr_tokens_[1]))
  13455. && (ffelex_token_length (ffeexpr_tokens_[0]) == 1)
  13456. && (ffesrc_char_match_init ((c = ffelex_token_text (ffeexpr_tokens_[0])[0]),
  13457. 'B', 'b')
  13458. || ffesrc_char_match_init (c, 'O', 'o')
  13459. || ffesrc_char_match_init (c, 'X', 'x')
  13460. || ffesrc_char_match_init (c, 'Z', 'z')))
  13461. {
  13462. ffetargetCharacterSize size;
  13463. if (!ffe_is_typeless_boz ()) {
  13464. switch (c)
  13465. {
  13466. case FFESRC_CASE_MATCH_INIT ('B', 'b', imatch_b, no_imatch):
  13467. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerbinary
  13468. (ffeexpr_tokens_[2]));
  13469. break;
  13470. case FFESRC_CASE_MATCH_INIT ('O', 'o', imatch_o, no_imatch):
  13471. e->u.operand = ffebld_new_conter (ffebld_constant_new_integeroctal
  13472. (ffeexpr_tokens_[2]));
  13473. break;
  13474. case FFESRC_CASE_MATCH_INIT ('X', 'x', imatch_x, no_imatch):
  13475. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerhex
  13476. (ffeexpr_tokens_[2]));
  13477. break;
  13478. case FFESRC_CASE_MATCH_INIT ('Z', 'z', imatch_z, no_imatch):
  13479. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerhex
  13480. (ffeexpr_tokens_[2]));
  13481. break;
  13482. default:
  13483. no_imatch: /* :::::::::::::::::::: */
  13484. assert ("not BOXZ!" == NULL);
  13485. abort ();
  13486. }
  13487. ffebld_set_info (e->u.operand,
  13488. ffeinfo_new (FFEINFO_basictypeINTEGER,
  13489. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  13490. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  13491. FFETARGET_charactersizeNONE));
  13492. ffeexpr_exprstack_push_operand_ (e);
  13493. ffelex_token_kill (ffeexpr_tokens_[1]);
  13494. ffelex_token_kill (ffeexpr_tokens_[2]);
  13495. return (ffelexHandler) ffeexpr_token_binary_;
  13496. }
  13497. switch (c)
  13498. {
  13499. case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b, no_match):
  13500. e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_bm
  13501. (ffeexpr_tokens_[2]));
  13502. size = ffetarget_size_typeless_binary (ffeexpr_tokens_[2]);
  13503. break;
  13504. case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o, no_match):
  13505. e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_om
  13506. (ffeexpr_tokens_[2]));
  13507. size = ffetarget_size_typeless_octal (ffeexpr_tokens_[2]);
  13508. break;
  13509. case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x, no_match):
  13510. e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hxm
  13511. (ffeexpr_tokens_[2]));
  13512. size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
  13513. break;
  13514. case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z, no_match):
  13515. e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hzm
  13516. (ffeexpr_tokens_[2]));
  13517. size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
  13518. break;
  13519. default:
  13520. no_match: /* :::::::::::::::::::: */
  13521. assert ("not BOXZ!" == NULL);
  13522. e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hzm
  13523. (ffeexpr_tokens_[2]));
  13524. size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
  13525. break;
  13526. }
  13527. ffebld_set_info (e->u.operand,
  13528. ffeinfo_new (FFEINFO_basictypeTYPELESS, FFEINFO_kindtypeNONE,
  13529. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, size));
  13530. ffeexpr_exprstack_push_operand_ (e);
  13531. ffelex_token_kill (ffeexpr_tokens_[1]);
  13532. ffelex_token_kill (ffeexpr_tokens_[2]);
  13533. return (ffelexHandler) ffeexpr_token_binary_;
  13534. }
  13535. if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
  13536. {
  13537. ffebad_string (ffelex_token_text (ffeexpr_tokens_[0]));
  13538. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13539. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13540. ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
  13541. ffebad_finish ();
  13542. }
  13543. ffelex_token_kill (ffeexpr_tokens_[1]);
  13544. ffelex_token_kill (ffeexpr_tokens_[2]);
  13545. e->type = FFEEXPR_exprtypeOPERAND_;
  13546. e->u.operand = ffebld_new_any ();
  13547. ffebld_set_info (e->u.operand, ffeinfo_new_any ());
  13548. e->token = ffeexpr_tokens_[0];
  13549. ffeexpr_exprstack_push_operand_ (e);
  13550. switch (ffelex_token_type (t))
  13551. {
  13552. case FFELEX_typeAPOSTROPHE:
  13553. case FFELEX_typeQUOTE:
  13554. return (ffelexHandler) ffeexpr_token_binary_;
  13555. default:
  13556. return (ffelexHandler) ffeexpr_token_binary_ (t);
  13557. }
  13558. }
  13559. /* ffeexpr_token_percent_ -- Rhs PERCENT
  13560. Handle a percent sign possibly followed by "LOC". If followed instead
  13561. by "VAL", "REF", or "DESCR", issue an error message and substitute
  13562. "LOC". If followed by something else, treat the percent sign as a
  13563. spurious incorrect token and reprocess the token via _rhs_. */
  13564. static ffelexHandler
  13565. ffeexpr_token_percent_ (ffelexToken t)
  13566. {
  13567. switch (ffelex_token_type (t))
  13568. {
  13569. case FFELEX_typeNAME:
  13570. case FFELEX_typeNAMES:
  13571. ffeexpr_stack_->percent = ffeexpr_percent_ (t);
  13572. ffeexpr_tokens_[1] = ffelex_token_use (t);
  13573. return (ffelexHandler) ffeexpr_token_percent_name_;
  13574. default:
  13575. if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
  13576. {
  13577. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13578. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13579. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  13580. ffelex_token_where_column (ffeexpr_stack_->first_token));
  13581. ffebad_finish ();
  13582. }
  13583. ffelex_token_kill (ffeexpr_tokens_[0]);
  13584. return (ffelexHandler) ffeexpr_token_rhs_ (t);
  13585. }
  13586. }
  13587. /* ffeexpr_token_percent_name_ -- Rhs PERCENT NAME
  13588. Make sure the token is OPEN_PAREN and prepare for the one-item list of
  13589. LHS expressions. Else display an error message. */
  13590. static ffelexHandler
  13591. ffeexpr_token_percent_name_ (ffelexToken t)
  13592. {
  13593. ffelexHandler nexthandler;
  13594. if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
  13595. {
  13596. if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
  13597. {
  13598. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13599. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13600. ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
  13601. ffelex_token_where_column (ffeexpr_stack_->first_token));
  13602. ffebad_finish ();
  13603. }
  13604. ffelex_token_kill (ffeexpr_tokens_[0]);
  13605. nexthandler = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_tokens_[1]);
  13606. ffelex_token_kill (ffeexpr_tokens_[1]);
  13607. return (ffelexHandler) (*nexthandler) (t);
  13608. }
  13609. switch (ffeexpr_stack_->percent)
  13610. {
  13611. default:
  13612. if (ffest_ffebad_start (FFEBAD_INVALID_PERCENT))
  13613. {
  13614. ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
  13615. ffelex_token_where_column (ffeexpr_tokens_[0]));
  13616. ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
  13617. ffebad_finish ();
  13618. }
  13619. ffeexpr_stack_->percent = FFEEXPR_percentLOC_;
  13620. /* Fall through. */
  13621. case FFEEXPR_percentLOC_:
  13622. ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
  13623. ffelex_token_kill (ffeexpr_tokens_[1]);
  13624. ffeexpr_stack_->tokens[1] = ffelex_token_use (t);
  13625. return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
  13626. FFEEXPR_contextLOC_,
  13627. ffeexpr_cb_end_loc_);
  13628. }
  13629. }
  13630. /* ffeexpr_make_float_const_ -- Make a floating-point constant
  13631. See prototype.
  13632. Pass 'E', 'D', or 'Q' for exponent letter. */
  13633. static void
  13634. ffeexpr_make_float_const_ (char exp_letter, ffelexToken integer,
  13635. ffelexToken decimal, ffelexToken fraction,
  13636. ffelexToken exponent, ffelexToken exponent_sign,
  13637. ffelexToken exponent_digits)
  13638. {
  13639. ffeexprExpr_ e;
  13640. e = ffeexpr_expr_new_ ();
  13641. e->type = FFEEXPR_exprtypeOPERAND_;
  13642. if (integer != NULL)
  13643. e->token = ffelex_token_use (integer);
  13644. else
  13645. {
  13646. assert (decimal != NULL);
  13647. e->token = ffelex_token_use (decimal);
  13648. }
  13649. switch (exp_letter)
  13650. {
  13651. #if !FFETARGET_okREALQUAD
  13652. case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q, no_match):
  13653. if (ffebad_start (FFEBAD_QUAD_UNSUPPORTED))
  13654. {
  13655. ffebad_here (0, ffelex_token_where_line (e->token),
  13656. ffelex_token_where_column (e->token));
  13657. ffebad_finish ();
  13658. }
  13659. goto match_d; /* The FFESRC_CASE_* macros don't
  13660. allow fall-through! */
  13661. #endif
  13662. case FFESRC_CASE_MATCH_INIT ('D', 'd', match_d, no_match):
  13663. e->u.operand = ffebld_new_conter (ffebld_constant_new_realdouble
  13664. (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
  13665. ffebld_set_info (e->u.operand,
  13666. ffeinfo_new (FFEINFO_basictypeREAL, FFEINFO_kindtypeREALDOUBLE,
  13667. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  13668. break;
  13669. case FFESRC_CASE_MATCH_INIT ('E', 'e', match_e, no_match):
  13670. e->u.operand = ffebld_new_conter (ffebld_constant_new_realdefault
  13671. (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
  13672. ffebld_set_info (e->u.operand, ffeinfo_new (FFEINFO_basictypeREAL,
  13673. FFEINFO_kindtypeREALDEFAULT, 0, FFEINFO_kindENTITY,
  13674. FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  13675. break;
  13676. #if FFETARGET_okREALQUAD
  13677. case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q, no_match):
  13678. e->u.operand = ffebld_new_conter (ffebld_constant_new_realquad
  13679. (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
  13680. ffebld_set_info (e->u.operand,
  13681. ffeinfo_new (FFEINFO_basictypeREAL, FFEINFO_kindtypeREALQUAD,
  13682. 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
  13683. break;
  13684. #endif
  13685. case 'I': /* Make an integer. */
  13686. e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
  13687. (ffeexpr_tokens_[0]));
  13688. ffebld_set_info (e->u.operand,
  13689. ffeinfo_new (FFEINFO_basictypeINTEGER,
  13690. FFEINFO_kindtypeINTEGERDEFAULT, 0,
  13691. FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
  13692. FFETARGET_charactersizeNONE));
  13693. break;
  13694. default:
  13695. no_match: /* :::::::::::::::::::: */
  13696. assert ("Lost the exponent letter!" == NULL);
  13697. }
  13698. ffeexpr_exprstack_push_operand_ (e);
  13699. }
  13700. /* Just like ffesymbol_declare_local, except performs any implicit info
  13701. assignment necessary. */
  13702. static ffesymbol
  13703. ffeexpr_declare_unadorned_ (ffelexToken t, bool maybe_intrin)
  13704. {
  13705. ffesymbol s;
  13706. ffeinfoKind k;
  13707. bool bad;
  13708. s = ffesymbol_declare_local (t, maybe_intrin);
  13709. switch (ffeexpr_context_outer_ (ffeexpr_stack_))
  13710. /* Special-case these since they can involve a different concept
  13711. of "state" (in the stmtfunc name space). */
  13712. {
  13713. case FFEEXPR_contextDATAIMPDOINDEX_:
  13714. case FFEEXPR_contextDATAIMPDOCTRL_:
  13715. if (ffeexpr_context_outer_ (ffeexpr_stack_)
  13716. == FFEEXPR_contextDATAIMPDOINDEX_)
  13717. s = ffeexpr_sym_impdoitem_ (s, t);
  13718. else
  13719. if (ffeexpr_stack_->is_rhs)
  13720. s = ffeexpr_sym_impdoitem_ (s, t);
  13721. else
  13722. s = ffeexpr_sym_lhs_impdoctrl_ (s, t);
  13723. bad = (ffesymbol_kind (s) != FFEINFO_kindENTITY)
  13724. || ((ffesymbol_where (s) != FFEINFO_whereCONSTANT)
  13725. && (ffesymbol_where (s) != FFEINFO_whereIMMEDIATE));
  13726. if (bad && (ffesymbol_kind (s) != FFEINFO_kindANY))
  13727. ffesymbol_error (s, t);
  13728. return s;
  13729. default:
  13730. break;
  13731. }
  13732. switch ((ffesymbol_sfdummyparent (s) == NULL)
  13733. ? ffesymbol_state (s)
  13734. : FFESYMBOL_stateUNDERSTOOD)
  13735. {
  13736. case FFESYMBOL_stateNONE: /* Before first exec, not seen in expr
  13737. context. */
  13738. if (!ffest_seen_first_exec ())
  13739. goto seen; /* :::::::::::::::::::: */
  13740. /* Fall through. */
  13741. case FFESYMBOL_stateUNCERTAIN: /* Unseen since first exec. */
  13742. switch (ffeexpr_context_outer_ (ffeexpr_stack_))
  13743. {
  13744. case FFEEXPR_contextSUBROUTINEREF:
  13745. s = ffeexpr_sym_lhs_call_ (s, t);
  13746. break;
  13747. case FFEEXPR_contextFILEEXTFUNC:
  13748. s = ffeexpr_sym_lhs_extfunc_ (s, t);
  13749. break;
  13750. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  13751. s = ffecom_sym_exec_transition (s);
  13752. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  13753. goto understood; /* :::::::::::::::::::: */
  13754. /* Fall through. */
  13755. case FFEEXPR_contextACTUALARG_:
  13756. s = ffeexpr_sym_rhs_actualarg_ (s, t);
  13757. break;
  13758. case FFEEXPR_contextDATA:
  13759. if (ffeexpr_stack_->is_rhs)
  13760. s = ffeexpr_sym_rhs_let_ (s, t);
  13761. else
  13762. s = ffeexpr_sym_lhs_data_ (s, t);
  13763. break;
  13764. case FFEEXPR_contextDATAIMPDOITEM_:
  13765. s = ffeexpr_sym_lhs_data_ (s, t);
  13766. break;
  13767. case FFEEXPR_contextSFUNCDEF:
  13768. case FFEEXPR_contextSFUNCDEFINDEX_:
  13769. case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
  13770. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
  13771. s = ffecom_sym_exec_transition (s);
  13772. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  13773. goto understood; /* :::::::::::::::::::: */
  13774. /* Fall through. */
  13775. case FFEEXPR_contextLET:
  13776. case FFEEXPR_contextPAREN_:
  13777. case FFEEXPR_contextACTUALARGEXPR_:
  13778. case FFEEXPR_contextINDEXORACTUALARGEXPR_:
  13779. case FFEEXPR_contextASSIGN:
  13780. case FFEEXPR_contextIOLIST:
  13781. case FFEEXPR_contextIOLISTDF:
  13782. case FFEEXPR_contextDO:
  13783. case FFEEXPR_contextDOWHILE:
  13784. case FFEEXPR_contextAGOTO:
  13785. case FFEEXPR_contextCGOTO:
  13786. case FFEEXPR_contextIF:
  13787. case FFEEXPR_contextARITHIF:
  13788. case FFEEXPR_contextFORMAT:
  13789. case FFEEXPR_contextSTOP:
  13790. case FFEEXPR_contextRETURN:
  13791. case FFEEXPR_contextSELECTCASE:
  13792. case FFEEXPR_contextCASE:
  13793. case FFEEXPR_contextFILEASSOC:
  13794. case FFEEXPR_contextFILEINT:
  13795. case FFEEXPR_contextFILEDFINT:
  13796. case FFEEXPR_contextFILELOG:
  13797. case FFEEXPR_contextFILENUM:
  13798. case FFEEXPR_contextFILENUMAMBIG:
  13799. case FFEEXPR_contextFILECHAR:
  13800. case FFEEXPR_contextFILENUMCHAR:
  13801. case FFEEXPR_contextFILEDFCHAR:
  13802. case FFEEXPR_contextFILEKEY:
  13803. case FFEEXPR_contextFILEUNIT:
  13804. case FFEEXPR_contextFILEUNIT_DF:
  13805. case FFEEXPR_contextFILEUNITAMBIG:
  13806. case FFEEXPR_contextFILEFORMAT:
  13807. case FFEEXPR_contextFILENAMELIST:
  13808. case FFEEXPR_contextFILEVXTCODE:
  13809. case FFEEXPR_contextINDEX_:
  13810. case FFEEXPR_contextIMPDOITEM_:
  13811. case FFEEXPR_contextIMPDOITEMDF_:
  13812. case FFEEXPR_contextIMPDOCTRL_:
  13813. case FFEEXPR_contextLOC_:
  13814. if (ffeexpr_stack_->is_rhs)
  13815. s = ffeexpr_sym_rhs_let_ (s, t);
  13816. else
  13817. s = ffeexpr_sym_lhs_let_ (s, t);
  13818. break;
  13819. case FFEEXPR_contextCHARACTERSIZE:
  13820. case FFEEXPR_contextEQUIVALENCE:
  13821. case FFEEXPR_contextINCLUDE:
  13822. case FFEEXPR_contextPARAMETER:
  13823. case FFEEXPR_contextDIMLIST:
  13824. case FFEEXPR_contextDIMLISTCOMMON:
  13825. case FFEEXPR_contextKINDTYPE:
  13826. case FFEEXPR_contextINITVAL:
  13827. case FFEEXPR_contextEQVINDEX_:
  13828. break; /* Will turn into errors below. */
  13829. default:
  13830. ffesymbol_error (s, t);
  13831. break;
  13832. }
  13833. /* Fall through. */
  13834. case FFESYMBOL_stateUNDERSTOOD: /* Nothing much more to learn. */
  13835. understood: /* :::::::::::::::::::: */
  13836. k = ffesymbol_kind (s);
  13837. switch (ffeexpr_context_outer_ (ffeexpr_stack_))
  13838. {
  13839. case FFEEXPR_contextSUBROUTINEREF:
  13840. bad = ((k != FFEINFO_kindSUBROUTINE)
  13841. && ((ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
  13842. || (k != FFEINFO_kindNONE)));
  13843. break;
  13844. case FFEEXPR_contextFILEEXTFUNC:
  13845. bad = (k != FFEINFO_kindFUNCTION)
  13846. || (ffesymbol_where (s) != FFEINFO_whereGLOBAL);
  13847. break;
  13848. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  13849. case FFEEXPR_contextACTUALARG_:
  13850. switch (k)
  13851. {
  13852. case FFEINFO_kindENTITY:
  13853. bad = FALSE;
  13854. break;
  13855. case FFEINFO_kindFUNCTION:
  13856. case FFEINFO_kindSUBROUTINE:
  13857. bad
  13858. = ((ffesymbol_where (s) != FFEINFO_whereGLOBAL)
  13859. && (ffesymbol_where (s) != FFEINFO_whereDUMMY)
  13860. && ((ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
  13861. || !ffeintrin_is_actualarg (ffesymbol_specific (s))));
  13862. break;
  13863. case FFEINFO_kindNONE:
  13864. if (ffesymbol_where (s) == FFEINFO_whereINTRINSIC)
  13865. {
  13866. bad = !(ffeintrin_is_actualarg (ffesymbol_specific (s)));
  13867. break;
  13868. }
  13869. /* If state is UNDERSTOOD here, it's CHAR*(*) or attrsANY,
  13870. and in the former case, attrsTYPE is set, so we
  13871. see this as an error as we should, since CHAR*(*)
  13872. cannot be actually referenced in a main/block data
  13873. program unit. */
  13874. if ((ffesymbol_attrs (s) & (FFESYMBOL_attrsANY
  13875. | FFESYMBOL_attrsEXTERNAL
  13876. | FFESYMBOL_attrsTYPE))
  13877. == FFESYMBOL_attrsEXTERNAL)
  13878. bad = FALSE;
  13879. else
  13880. bad = TRUE;
  13881. break;
  13882. default:
  13883. bad = TRUE;
  13884. break;
  13885. }
  13886. break;
  13887. case FFEEXPR_contextDATA:
  13888. if (ffeexpr_stack_->is_rhs)
  13889. bad = (k != FFEINFO_kindENTITY)
  13890. || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
  13891. else
  13892. bad = (k != FFEINFO_kindENTITY)
  13893. || ((ffesymbol_where (s) != FFEINFO_whereNONE)
  13894. && (ffesymbol_where (s) != FFEINFO_whereLOCAL)
  13895. && (ffesymbol_where (s) != FFEINFO_whereCOMMON));
  13896. break;
  13897. case FFEEXPR_contextDATAIMPDOITEM_:
  13898. bad = TRUE; /* Unadorned item never valid. */
  13899. break;
  13900. case FFEEXPR_contextSFUNCDEF:
  13901. case FFEEXPR_contextSFUNCDEFINDEX_:
  13902. case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
  13903. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
  13904. case FFEEXPR_contextLET:
  13905. case FFEEXPR_contextPAREN_:
  13906. case FFEEXPR_contextACTUALARGEXPR_:
  13907. case FFEEXPR_contextINDEXORACTUALARGEXPR_:
  13908. case FFEEXPR_contextASSIGN:
  13909. case FFEEXPR_contextIOLIST:
  13910. case FFEEXPR_contextIOLISTDF:
  13911. case FFEEXPR_contextDO:
  13912. case FFEEXPR_contextDOWHILE:
  13913. case FFEEXPR_contextAGOTO:
  13914. case FFEEXPR_contextCGOTO:
  13915. case FFEEXPR_contextIF:
  13916. case FFEEXPR_contextARITHIF:
  13917. case FFEEXPR_contextFORMAT:
  13918. case FFEEXPR_contextSTOP:
  13919. case FFEEXPR_contextRETURN:
  13920. case FFEEXPR_contextSELECTCASE:
  13921. case FFEEXPR_contextCASE:
  13922. case FFEEXPR_contextFILEASSOC:
  13923. case FFEEXPR_contextFILEINT:
  13924. case FFEEXPR_contextFILEDFINT:
  13925. case FFEEXPR_contextFILELOG:
  13926. case FFEEXPR_contextFILENUM:
  13927. case FFEEXPR_contextFILENUMAMBIG:
  13928. case FFEEXPR_contextFILECHAR:
  13929. case FFEEXPR_contextFILENUMCHAR:
  13930. case FFEEXPR_contextFILEDFCHAR:
  13931. case FFEEXPR_contextFILEKEY:
  13932. case FFEEXPR_contextFILEUNIT:
  13933. case FFEEXPR_contextFILEUNIT_DF:
  13934. case FFEEXPR_contextFILEUNITAMBIG:
  13935. case FFEEXPR_contextFILEFORMAT:
  13936. case FFEEXPR_contextFILENAMELIST:
  13937. case FFEEXPR_contextFILEVXTCODE:
  13938. case FFEEXPR_contextINDEX_:
  13939. case FFEEXPR_contextIMPDOITEM_:
  13940. case FFEEXPR_contextIMPDOITEMDF_:
  13941. case FFEEXPR_contextIMPDOCTRL_:
  13942. case FFEEXPR_contextLOC_:
  13943. bad = (k != FFEINFO_kindENTITY); /* This catches "SUBROUTINE
  13944. X(A);EXTERNAL A;CALL
  13945. Y(A);B=A", for example. */
  13946. break;
  13947. case FFEEXPR_contextCHARACTERSIZE:
  13948. case FFEEXPR_contextEQUIVALENCE:
  13949. case FFEEXPR_contextPARAMETER:
  13950. case FFEEXPR_contextDIMLIST:
  13951. case FFEEXPR_contextDIMLISTCOMMON:
  13952. case FFEEXPR_contextKINDTYPE:
  13953. case FFEEXPR_contextINITVAL:
  13954. case FFEEXPR_contextEQVINDEX_:
  13955. bad = (k != FFEINFO_kindENTITY)
  13956. || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
  13957. break;
  13958. case FFEEXPR_contextINCLUDE:
  13959. bad = TRUE;
  13960. break;
  13961. default:
  13962. bad = TRUE;
  13963. break;
  13964. }
  13965. if (bad && (k != FFEINFO_kindANY))
  13966. ffesymbol_error (s, t);
  13967. return s;
  13968. case FFESYMBOL_stateSEEN: /* Seen but not yet in exec portion. */
  13969. seen: /* :::::::::::::::::::: */
  13970. switch (ffeexpr_context_outer_ (ffeexpr_stack_))
  13971. {
  13972. case FFEEXPR_contextPARAMETER:
  13973. if (ffeexpr_stack_->is_rhs)
  13974. ffesymbol_error (s, t);
  13975. else
  13976. s = ffeexpr_sym_lhs_parameter_ (s, t);
  13977. break;
  13978. case FFEEXPR_contextDATA:
  13979. s = ffecom_sym_exec_transition (s);
  13980. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  13981. goto understood; /* :::::::::::::::::::: */
  13982. if (ffeexpr_stack_->is_rhs)
  13983. ffesymbol_error (s, t);
  13984. else
  13985. s = ffeexpr_sym_lhs_data_ (s, t);
  13986. goto understood; /* :::::::::::::::::::: */
  13987. case FFEEXPR_contextDATAIMPDOITEM_:
  13988. s = ffecom_sym_exec_transition (s);
  13989. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  13990. goto understood; /* :::::::::::::::::::: */
  13991. s = ffeexpr_sym_lhs_data_ (s, t);
  13992. goto understood; /* :::::::::::::::::::: */
  13993. case FFEEXPR_contextEQUIVALENCE:
  13994. s = ffeexpr_sym_lhs_equivalence_ (s, t);
  13995. break;
  13996. case FFEEXPR_contextDIMLIST:
  13997. s = ffeexpr_sym_rhs_dimlist_ (s, t);
  13998. break;
  13999. case FFEEXPR_contextCHARACTERSIZE:
  14000. case FFEEXPR_contextKINDTYPE:
  14001. case FFEEXPR_contextDIMLISTCOMMON:
  14002. case FFEEXPR_contextINITVAL:
  14003. case FFEEXPR_contextEQVINDEX_:
  14004. ffesymbol_error (s, t);
  14005. break;
  14006. case FFEEXPR_contextINCLUDE:
  14007. ffesymbol_error (s, t);
  14008. break;
  14009. case FFEEXPR_contextACTUALARG_: /* E.g. I in REAL A(Y(I)). */
  14010. case FFEEXPR_contextSFUNCDEFACTUALARG_:
  14011. s = ffecom_sym_exec_transition (s);
  14012. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  14013. goto understood; /* :::::::::::::::::::: */
  14014. s = ffeexpr_sym_rhs_actualarg_ (s, t);
  14015. goto understood; /* :::::::::::::::::::: */
  14016. case FFEEXPR_contextINDEX_:
  14017. case FFEEXPR_contextACTUALARGEXPR_:
  14018. case FFEEXPR_contextINDEXORACTUALARGEXPR_:
  14019. case FFEEXPR_contextSFUNCDEF:
  14020. case FFEEXPR_contextSFUNCDEFINDEX_:
  14021. case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
  14022. case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
  14023. assert (ffeexpr_stack_->is_rhs);
  14024. s = ffecom_sym_exec_transition (s);
  14025. if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
  14026. goto understood; /* :::::::::::::::::::: */
  14027. s = ffeexpr_sym_rhs_let_ (s, t);
  14028. goto understood; /* :::::::::::::::::::: */
  14029. default:
  14030. ffesymbol_error (s, t);
  14031. break;
  14032. }
  14033. return s;
  14034. default:
  14035. assert ("bad symbol state" == NULL);
  14036. return NULL;
  14037. break;
  14038. }
  14039. }
  14040. /* Have FOO in DATA (XYZ(FOO),...)/.../ or DATA (...,XYZ=FOO,BAR,BLETCH).
  14041. Could be found via the "statement-function" name space (in which case
  14042. it should become an iterator) or the local name space (in which case
  14043. it should be either a named constant, or a variable that will have an
  14044. sfunc name space sibling that should become an iterator). */
  14045. static ffesymbol
  14046. ffeexpr_sym_impdoitem_ (ffesymbol sp, ffelexToken t)
  14047. {
  14048. ffesymbol s;
  14049. ffesymbolAttrs sa;
  14050. ffesymbolAttrs na;
  14051. ffesymbolState ss;
  14052. ffesymbolState ns;
  14053. ffeinfoKind kind;
  14054. ffeinfoWhere where;
  14055. ss = ffesymbol_state (sp);
  14056. if (ffesymbol_sfdummyparent (sp) != NULL)
  14057. { /* Have symbol in sfunc name space. */
  14058. switch (ss)
  14059. {
  14060. case FFESYMBOL_stateNONE: /* Used as iterator already. */
  14061. if (ffeexpr_level_ < ffesymbol_maxentrynum (sp))
  14062. ffesymbol_error (sp, t); /* Can't use dead iterator. */
  14063. else
  14064. { /* Can use dead iterator because we're at at
  14065. least an innermore (higher-numbered) level
  14066. than the iterator's outermost
  14067. (lowest-numbered) level. */
  14068. ffesymbol_signal_change (sp);
  14069. ffesymbol_set_state (sp, FFESYMBOL_stateSEEN);
  14070. ffesymbol_set_maxentrynum (sp, ffeexpr_level_);
  14071. ffesymbol_signal_unreported (sp);
  14072. }
  14073. break;
  14074. case FFESYMBOL_stateSEEN: /* Seen already in this or other
  14075. implied-DO. Set symbol level
  14076. number to outermost value, as that
  14077. tells us we can see it as iterator
  14078. at that level at the innermost. */
  14079. if (ffeexpr_level_ < ffesymbol_maxentrynum (sp))
  14080. {
  14081. ffesymbol_signal_change (sp);
  14082. ffesymbol_set_maxentrynum (sp, ffeexpr_level_);
  14083. ffesymbol_signal_unreported (sp);
  14084. }
  14085. break;
  14086. case FFESYMBOL_stateUNCERTAIN: /* Iterator. */
  14087. assert (ffeexpr_level_ == ffesymbol_maxentrynum (sp));
  14088. ffesymbol_error (sp, t); /* (,,,I=I,10). */
  14089. break;
  14090. case FFESYMBOL_stateUNDERSTOOD:
  14091. break; /* ANY. */
  14092. default:
  14093. assert ("Foo Bar!!" == NULL);
  14094. break;
  14095. }
  14096. return sp;
  14097. }
  14098. /* Got symbol in local name space, so we haven't seen it in impdo yet.
  14099. First, if it is brand-new and we're in executable statements, set the
  14100. attributes and exec-transition it to set state UNCERTAIN or UNDERSTOOD.
  14101. Second, if it is now a constant (PARAMETER), then just return it, it
  14102. can't be an implied-do iterator. If it is understood, complain if it is
  14103. not a valid variable, but make the inner name space iterator anyway and
  14104. return that. If it is not understood, improve understanding of the
  14105. symbol accordingly, complain accordingly, in either case make the inner
  14106. name space iterator and return that. */
  14107. sa = ffesymbol_attrs (sp);
  14108. if (ffesymbol_state_is_specable (ss)
  14109. && ffest_seen_first_exec ())
  14110. {
  14111. assert (sa == FFESYMBOL_attrsetNONE);
  14112. ffesymbol_signal_change (sp);
  14113. ffesymbol_set_state (sp, FFESYMBOL_stateSEEN);
  14114. ffesymbol_resolve_intrin (sp);
  14115. if (ffeimplic_establish_symbol (sp))
  14116. ffesymbol_set_attr (sp, FFESYMBOL_attrSFARG);
  14117. else
  14118. ffesymbol_error (sp, t);
  14119. /* After the exec transition, the state will either be UNCERTAIN (could
  14120. be a dummy or local var) or UNDERSTOOD (local var, because this is a
  14121. PROGRAM/BLOCKDATA program unit). */
  14122. sp = ffecom_sym_exec_transition (sp);
  14123. sa = ffesymbol_attrs (sp);
  14124. ss = ffesymbol_state (sp);
  14125. }
  14126. ns = ss;
  14127. kind = ffesymbol_kind (sp);
  14128. where = ffesymbol_where (sp);
  14129. if (ss == FFESYMBOL_stateUNDERSTOOD)
  14130. {
  14131. if (kind != FFEINFO_kindENTITY)
  14132. ffesymbol_error (sp, t);
  14133. if (where == FFEINFO_whereCONSTANT)
  14134. return sp;
  14135. }
  14136. else
  14137. {
  14138. /* Enhance understanding of local symbol. This used to imply exec
  14139. transition, but that doesn't seem necessary, since the local symbol
  14140. doesn't actually get put into an ffebld tree here -- we just learn
  14141. more about it, just like when we see a local symbol's name in the
  14142. dummy-arg list of a statement function. */
  14143. if (ss != FFESYMBOL_stateUNCERTAIN)
  14144. {
  14145. /* Figure out what kind of object we've got based on previous
  14146. declarations of or references to the object. */
  14147. ns = FFESYMBOL_stateSEEN;
  14148. if (sa & FFESYMBOL_attrsANY)
  14149. na = sa;
  14150. else if (!(sa & ~(FFESYMBOL_attrsADJUSTS
  14151. | FFESYMBOL_attrsANY
  14152. | FFESYMBOL_attrsCOMMON
  14153. | FFESYMBOL_attrsDUMMY
  14154. | FFESYMBOL_attrsEQUIV
  14155. | FFESYMBOL_attrsINIT
  14156. | FFESYMBOL_attrsNAMELIST
  14157. | FFESYMBOL_attrsRESULT
  14158. | FFESYMBOL_attrsSAVE
  14159. | FFESYMBOL_attrsSFARG
  14160. | FFESYMBOL_attrsTYPE)))
  14161. na = sa | FFESYMBOL_attrsSFARG;
  14162. else
  14163. na = FFESYMBOL_attrsetNONE;
  14164. }
  14165. else
  14166. { /* stateUNCERTAIN. */
  14167. na = sa | FFESYMBOL_attrsSFARG;
  14168. ns = FFESYMBOL_stateUNDERSTOOD;
  14169. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14170. | FFESYMBOL_attrsADJUSTABLE
  14171. | FFESYMBOL_attrsANYLEN
  14172. | FFESYMBOL_attrsARRAY
  14173. | FFESYMBOL_attrsDUMMY
  14174. | FFESYMBOL_attrsEXTERNAL
  14175. | FFESYMBOL_attrsSFARG
  14176. | FFESYMBOL_attrsTYPE)));
  14177. if (sa & FFESYMBOL_attrsEXTERNAL)
  14178. {
  14179. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14180. | FFESYMBOL_attrsDUMMY
  14181. | FFESYMBOL_attrsEXTERNAL
  14182. | FFESYMBOL_attrsTYPE)));
  14183. na = FFESYMBOL_attrsetNONE;
  14184. }
  14185. else if (sa & FFESYMBOL_attrsDUMMY)
  14186. {
  14187. assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
  14188. assert (!(sa & ~(FFESYMBOL_attrsDUMMY
  14189. | FFESYMBOL_attrsEXTERNAL
  14190. | FFESYMBOL_attrsTYPE)));
  14191. kind = FFEINFO_kindENTITY;
  14192. }
  14193. else if (sa & FFESYMBOL_attrsARRAY)
  14194. {
  14195. assert (!(sa & ~(FFESYMBOL_attrsARRAY
  14196. | FFESYMBOL_attrsADJUSTABLE
  14197. | FFESYMBOL_attrsTYPE)));
  14198. na = FFESYMBOL_attrsetNONE;
  14199. }
  14200. else if (sa & FFESYMBOL_attrsSFARG)
  14201. {
  14202. assert (!(sa & ~(FFESYMBOL_attrsSFARG
  14203. | FFESYMBOL_attrsTYPE)));
  14204. ns = FFESYMBOL_stateUNCERTAIN;
  14205. }
  14206. else if (sa & FFESYMBOL_attrsTYPE)
  14207. {
  14208. assert (!(sa & (FFESYMBOL_attrsARRAY
  14209. | FFESYMBOL_attrsDUMMY
  14210. | FFESYMBOL_attrsEXTERNAL
  14211. | FFESYMBOL_attrsSFARG))); /* Handled above. */
  14212. assert (!(sa & ~(FFESYMBOL_attrsTYPE
  14213. | FFESYMBOL_attrsADJUSTABLE
  14214. | FFESYMBOL_attrsANYLEN
  14215. | FFESYMBOL_attrsARRAY
  14216. | FFESYMBOL_attrsDUMMY
  14217. | FFESYMBOL_attrsEXTERNAL
  14218. | FFESYMBOL_attrsSFARG)));
  14219. kind = FFEINFO_kindENTITY;
  14220. if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
  14221. na = FFESYMBOL_attrsetNONE;
  14222. else if (ffest_is_entry_valid ())
  14223. ns = FFESYMBOL_stateUNCERTAIN; /* Could be DUMMY or LOCAL. */
  14224. else
  14225. where = FFEINFO_whereLOCAL;
  14226. }
  14227. else
  14228. na = FFESYMBOL_attrsetNONE; /* Error. */
  14229. }
  14230. /* Now see what we've got for a new object: NONE means a new error
  14231. cropped up; ANY means an old error to be ignored; otherwise,
  14232. everything's ok, update the object (symbol) and continue on. */
  14233. if (na == FFESYMBOL_attrsetNONE)
  14234. ffesymbol_error (sp, t);
  14235. else if (!(na & FFESYMBOL_attrsANY))
  14236. {
  14237. ffesymbol_signal_change (sp); /* May need to back up to previous
  14238. version. */
  14239. if (!ffeimplic_establish_symbol (sp))
  14240. ffesymbol_error (sp, t);
  14241. else
  14242. {
  14243. ffesymbol_set_info (sp,
  14244. ffeinfo_new (ffesymbol_basictype (sp),
  14245. ffesymbol_kindtype (sp),
  14246. ffesymbol_rank (sp),
  14247. kind,
  14248. where,
  14249. ffesymbol_size (sp)));
  14250. ffesymbol_set_attrs (sp, na);
  14251. ffesymbol_set_state (sp, ns);
  14252. ffesymbol_resolve_intrin (sp);
  14253. if (!ffesymbol_state_is_specable (ns))
  14254. sp = ffecom_sym_learned (sp);
  14255. ffesymbol_signal_unreported (sp); /* For debugging purposes. */
  14256. }
  14257. }
  14258. }
  14259. /* Here we create the sfunc-name-space symbol representing what should
  14260. become an iterator in this name space at this or an outermore (lower-
  14261. numbered) expression level, else the implied-DO construct is in error. */
  14262. s = ffesymbol_declare_sfdummy (t); /* Sets maxentrynum to 0 for new obj;
  14263. also sets sfa_dummy_parent to
  14264. parent symbol. */
  14265. assert (sp == ffesymbol_sfdummyparent (s));
  14266. ffesymbol_signal_change (s);
  14267. ffesymbol_set_state (s, FFESYMBOL_stateSEEN);
  14268. ffesymbol_set_maxentrynum (s, ffeexpr_level_);
  14269. ffesymbol_set_info (s,
  14270. ffeinfo_new (FFEINFO_basictypeINTEGER,
  14271. FFEINFO_kindtypeINTEGERDEFAULT,
  14272. 0,
  14273. FFEINFO_kindENTITY,
  14274. FFEINFO_whereIMMEDIATE,
  14275. FFETARGET_charactersizeNONE));
  14276. ffesymbol_signal_unreported (s);
  14277. if (((ffesymbol_basictype (sp) != FFEINFO_basictypeINTEGER)
  14278. && (ffesymbol_basictype (sp) != FFEINFO_basictypeANY))
  14279. || ((ffesymbol_kindtype (sp) != FFEINFO_kindtypeINTEGERDEFAULT)
  14280. && (ffesymbol_kindtype (sp) != FFEINFO_kindtypeANY)))
  14281. ffesymbol_error (s, t);
  14282. return s;
  14283. }
  14284. /* Have FOO in CALL FOO. Local name space, executable context only. */
  14285. static ffesymbol
  14286. ffeexpr_sym_lhs_call_ (ffesymbol s, ffelexToken t)
  14287. {
  14288. ffesymbolAttrs sa;
  14289. ffesymbolAttrs na;
  14290. ffeinfoKind kind;
  14291. ffeinfoWhere where;
  14292. ffeintrinGen gen;
  14293. ffeintrinSpec spec;
  14294. ffeintrinImp imp;
  14295. bool error = FALSE;
  14296. assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
  14297. || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
  14298. na = sa = ffesymbol_attrs (s);
  14299. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14300. | FFESYMBOL_attrsADJUSTABLE
  14301. | FFESYMBOL_attrsANYLEN
  14302. | FFESYMBOL_attrsARRAY
  14303. | FFESYMBOL_attrsDUMMY
  14304. | FFESYMBOL_attrsEXTERNAL
  14305. | FFESYMBOL_attrsSFARG
  14306. | FFESYMBOL_attrsTYPE)));
  14307. kind = ffesymbol_kind (s);
  14308. where = ffesymbol_where (s);
  14309. /* Figure out what kind of object we've got based on previous declarations
  14310. of or references to the object. */
  14311. if (sa & FFESYMBOL_attrsEXTERNAL)
  14312. {
  14313. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14314. | FFESYMBOL_attrsDUMMY
  14315. | FFESYMBOL_attrsEXTERNAL
  14316. | FFESYMBOL_attrsTYPE)));
  14317. if (sa & FFESYMBOL_attrsTYPE)
  14318. error = TRUE;
  14319. else
  14320. /* Not TYPE. */
  14321. {
  14322. kind = FFEINFO_kindSUBROUTINE;
  14323. if (sa & FFESYMBOL_attrsDUMMY)
  14324. ; /* Not TYPE. */
  14325. else if (sa & FFESYMBOL_attrsACTUALARG)
  14326. ; /* Not DUMMY or TYPE. */
  14327. else /* Not ACTUALARG, DUMMY, or TYPE. */
  14328. where = FFEINFO_whereGLOBAL;
  14329. }
  14330. }
  14331. else if (sa & FFESYMBOL_attrsDUMMY)
  14332. {
  14333. assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
  14334. assert (!(sa & ~(FFESYMBOL_attrsDUMMY
  14335. | FFESYMBOL_attrsEXTERNAL
  14336. | FFESYMBOL_attrsTYPE)));
  14337. if (sa & FFESYMBOL_attrsTYPE)
  14338. error = TRUE;
  14339. else
  14340. kind = FFEINFO_kindSUBROUTINE;
  14341. }
  14342. else if (sa & FFESYMBOL_attrsARRAY)
  14343. {
  14344. assert (!(sa & ~(FFESYMBOL_attrsARRAY
  14345. | FFESYMBOL_attrsADJUSTABLE
  14346. | FFESYMBOL_attrsTYPE)));
  14347. error = TRUE;
  14348. }
  14349. else if (sa & FFESYMBOL_attrsSFARG)
  14350. {
  14351. assert (!(sa & ~(FFESYMBOL_attrsSFARG
  14352. | FFESYMBOL_attrsTYPE)));
  14353. error = TRUE;
  14354. }
  14355. else if (sa & FFESYMBOL_attrsTYPE)
  14356. {
  14357. assert (!(sa & (FFESYMBOL_attrsARRAY
  14358. | FFESYMBOL_attrsDUMMY
  14359. | FFESYMBOL_attrsEXTERNAL
  14360. | FFESYMBOL_attrsSFARG))); /* Handled above. */
  14361. assert (!(sa & ~(FFESYMBOL_attrsTYPE
  14362. | FFESYMBOL_attrsADJUSTABLE
  14363. | FFESYMBOL_attrsANYLEN
  14364. | FFESYMBOL_attrsARRAY
  14365. | FFESYMBOL_attrsDUMMY
  14366. | FFESYMBOL_attrsEXTERNAL
  14367. | FFESYMBOL_attrsSFARG)));
  14368. error = TRUE;
  14369. }
  14370. else if (sa == FFESYMBOL_attrsetNONE)
  14371. {
  14372. assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
  14373. if (ffeintrin_is_intrinsic (ffesymbol_text (s), t, FALSE,
  14374. &gen, &spec, &imp))
  14375. {
  14376. ffesymbol_signal_change (s); /* May need to back up to previous
  14377. version. */
  14378. ffesymbol_set_generic (s, gen);
  14379. ffesymbol_set_specific (s, spec);
  14380. ffesymbol_set_implementation (s, imp);
  14381. ffesymbol_set_info (s,
  14382. ffeinfo_new (FFEINFO_basictypeNONE,
  14383. FFEINFO_kindtypeNONE,
  14384. 0,
  14385. FFEINFO_kindSUBROUTINE,
  14386. FFEINFO_whereINTRINSIC,
  14387. FFETARGET_charactersizeNONE));
  14388. ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
  14389. ffesymbol_resolve_intrin (s);
  14390. ffesymbol_reference (s, t, FALSE);
  14391. s = ffecom_sym_learned (s);
  14392. ffesymbol_signal_unreported (s); /* For debugging purposes. */
  14393. return s;
  14394. }
  14395. kind = FFEINFO_kindSUBROUTINE;
  14396. where = FFEINFO_whereGLOBAL;
  14397. }
  14398. else
  14399. error = TRUE;
  14400. /* Now see what we've got for a new object: NONE means a new error cropped
  14401. up; ANY means an old error to be ignored; otherwise, everything's ok,
  14402. update the object (symbol) and continue on. */
  14403. if (error)
  14404. ffesymbol_error (s, t);
  14405. else if (!(na & FFESYMBOL_attrsANY))
  14406. {
  14407. ffesymbol_signal_change (s); /* May need to back up to previous
  14408. version. */
  14409. ffesymbol_set_info (s,
  14410. ffeinfo_new (ffesymbol_basictype (s),
  14411. ffesymbol_kindtype (s),
  14412. ffesymbol_rank (s),
  14413. kind, /* SUBROUTINE. */
  14414. where, /* GLOBAL or DUMMY. */
  14415. ffesymbol_size (s)));
  14416. ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
  14417. ffesymbol_resolve_intrin (s);
  14418. ffesymbol_reference (s, t, FALSE);
  14419. s = ffecom_sym_learned (s);
  14420. ffesymbol_signal_unreported (s); /* For debugging purposes. */
  14421. }
  14422. return s;
  14423. }
  14424. /* Have FOO in DATA FOO/.../. Local name space and executable context
  14425. only. (This will change in the future when DATA FOO may be followed
  14426. by COMMON FOO or even INTEGER FOO(10), etc.) */
  14427. static ffesymbol
  14428. ffeexpr_sym_lhs_data_ (ffesymbol s, ffelexToken t)
  14429. {
  14430. ffesymbolAttrs sa;
  14431. ffesymbolAttrs na;
  14432. ffeinfoKind kind;
  14433. ffeinfoWhere where;
  14434. bool error = FALSE;
  14435. assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
  14436. || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
  14437. na = sa = ffesymbol_attrs (s);
  14438. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14439. | FFESYMBOL_attrsADJUSTABLE
  14440. | FFESYMBOL_attrsANYLEN
  14441. | FFESYMBOL_attrsARRAY
  14442. | FFESYMBOL_attrsDUMMY
  14443. | FFESYMBOL_attrsEXTERNAL
  14444. | FFESYMBOL_attrsSFARG
  14445. | FFESYMBOL_attrsTYPE)));
  14446. kind = ffesymbol_kind (s);
  14447. where = ffesymbol_where (s);
  14448. /* Figure out what kind of object we've got based on previous declarations
  14449. of or references to the object. */
  14450. if (sa & FFESYMBOL_attrsEXTERNAL)
  14451. {
  14452. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14453. | FFESYMBOL_attrsDUMMY
  14454. | FFESYMBOL_attrsEXTERNAL
  14455. | FFESYMBOL_attrsTYPE)));
  14456. error = TRUE;
  14457. }
  14458. else if (sa & FFESYMBOL_attrsDUMMY)
  14459. {
  14460. assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
  14461. assert (!(sa & ~(FFESYMBOL_attrsDUMMY
  14462. | FFESYMBOL_attrsEXTERNAL
  14463. | FFESYMBOL_attrsTYPE)));
  14464. error = TRUE;
  14465. }
  14466. else if (sa & FFESYMBOL_attrsARRAY)
  14467. {
  14468. assert (!(sa & ~(FFESYMBOL_attrsARRAY
  14469. | FFESYMBOL_attrsADJUSTABLE
  14470. | FFESYMBOL_attrsTYPE)));
  14471. if (sa & FFESYMBOL_attrsADJUSTABLE)
  14472. error = TRUE;
  14473. where = FFEINFO_whereLOCAL;
  14474. }
  14475. else if (sa & FFESYMBOL_attrsSFARG)
  14476. {
  14477. assert (!(sa & ~(FFESYMBOL_attrsSFARG
  14478. | FFESYMBOL_attrsTYPE)));
  14479. where = FFEINFO_whereLOCAL;
  14480. }
  14481. else if (sa & FFESYMBOL_attrsTYPE)
  14482. {
  14483. assert (!(sa & (FFESYMBOL_attrsARRAY
  14484. | FFESYMBOL_attrsDUMMY
  14485. | FFESYMBOL_attrsEXTERNAL
  14486. | FFESYMBOL_attrsSFARG))); /* Handled above. */
  14487. assert (!(sa & ~(FFESYMBOL_attrsTYPE
  14488. | FFESYMBOL_attrsADJUSTABLE
  14489. | FFESYMBOL_attrsANYLEN
  14490. | FFESYMBOL_attrsARRAY
  14491. | FFESYMBOL_attrsDUMMY
  14492. | FFESYMBOL_attrsEXTERNAL
  14493. | FFESYMBOL_attrsSFARG)));
  14494. if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
  14495. error = TRUE;
  14496. else
  14497. {
  14498. kind = FFEINFO_kindENTITY;
  14499. where = FFEINFO_whereLOCAL;
  14500. }
  14501. }
  14502. else if (sa == FFESYMBOL_attrsetNONE)
  14503. {
  14504. assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
  14505. kind = FFEINFO_kindENTITY;
  14506. where = FFEINFO_whereLOCAL;
  14507. }
  14508. else
  14509. error = TRUE;
  14510. /* Now see what we've got for a new object: NONE means a new error cropped
  14511. up; ANY means an old error to be ignored; otherwise, everything's ok,
  14512. update the object (symbol) and continue on. */
  14513. if (error)
  14514. ffesymbol_error (s, t);
  14515. else if (!(na & FFESYMBOL_attrsANY))
  14516. {
  14517. ffesymbol_signal_change (s); /* May need to back up to previous
  14518. version. */
  14519. if (!ffeimplic_establish_symbol (s))
  14520. {
  14521. ffesymbol_error (s, t);
  14522. return s;
  14523. }
  14524. ffesymbol_set_info (s,
  14525. ffeinfo_new (ffesymbol_basictype (s),
  14526. ffesymbol_kindtype (s),
  14527. ffesymbol_rank (s),
  14528. kind, /* ENTITY. */
  14529. where, /* LOCAL. */
  14530. ffesymbol_size (s)));
  14531. ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
  14532. ffesymbol_resolve_intrin (s);
  14533. s = ffecom_sym_learned (s);
  14534. ffesymbol_signal_unreported (s); /* For debugging purposes. */
  14535. }
  14536. return s;
  14537. }
  14538. /* Have FOO in EQUIVALENCE (...,FOO,...). Does not include
  14539. EQUIVALENCE (...,BAR(FOO),...). */
  14540. static ffesymbol
  14541. ffeexpr_sym_lhs_equivalence_ (ffesymbol s, ffelexToken t)
  14542. {
  14543. ffesymbolAttrs sa;
  14544. ffesymbolAttrs na;
  14545. ffeinfoKind kind;
  14546. ffeinfoWhere where;
  14547. na = sa = ffesymbol_attrs (s);
  14548. kind = FFEINFO_kindENTITY;
  14549. where = ffesymbol_where (s);
  14550. /* Figure out what kind of object we've got based on previous declarations
  14551. of or references to the object. */
  14552. if (!(sa & ~(FFESYMBOL_attrsADJUSTS
  14553. | FFESYMBOL_attrsARRAY
  14554. | FFESYMBOL_attrsCOMMON
  14555. | FFESYMBOL_attrsEQUIV
  14556. | FFESYMBOL_attrsINIT
  14557. | FFESYMBOL_attrsNAMELIST
  14558. | FFESYMBOL_attrsSAVE
  14559. | FFESYMBOL_attrsSFARG
  14560. | FFESYMBOL_attrsTYPE)))
  14561. na = sa | FFESYMBOL_attrsEQUIV;
  14562. else
  14563. na = FFESYMBOL_attrsetNONE;
  14564. /* Don't know why we're bothering to set kind and where in this code, but
  14565. added the following to make it complete, in case it's really important.
  14566. Generally this is left up to symbol exec transition. */
  14567. if (where == FFEINFO_whereNONE)
  14568. {
  14569. if (na & (FFESYMBOL_attrsADJUSTS
  14570. | FFESYMBOL_attrsCOMMON))
  14571. where = FFEINFO_whereCOMMON;
  14572. else if (na & FFESYMBOL_attrsSAVE)
  14573. where = FFEINFO_whereLOCAL;
  14574. }
  14575. /* Now see what we've got for a new object: NONE means a new error cropped
  14576. up; ANY means an old error to be ignored; otherwise, everything's ok,
  14577. update the object (symbol) and continue on. */
  14578. if (na == FFESYMBOL_attrsetNONE)
  14579. ffesymbol_error (s, t);
  14580. else if (!(na & FFESYMBOL_attrsANY))
  14581. {
  14582. ffesymbol_signal_change (s); /* May need to back up to previous
  14583. version. */
  14584. ffesymbol_set_info (s,
  14585. ffeinfo_new (ffesymbol_basictype (s),
  14586. ffesymbol_kindtype (s),
  14587. ffesymbol_rank (s),
  14588. kind, /* Always ENTITY. */
  14589. where, /* NONE, COMMON, or LOCAL. */
  14590. ffesymbol_size (s)));
  14591. ffesymbol_set_attrs (s, na);
  14592. ffesymbol_set_state (s, FFESYMBOL_stateSEEN);
  14593. ffesymbol_resolve_intrin (s);
  14594. ffesymbol_signal_unreported (s); /* For debugging purposes. */
  14595. }
  14596. return s;
  14597. }
  14598. /* Have FOO in OPEN(...,USEROPEN=FOO,...). Executable context only.
  14599. Note that I think this should be considered semantically similar to
  14600. doing CALL XYZ(FOO), in that it should be considered like an
  14601. ACTUALARG context. In particular, without EXTERNAL being specified,
  14602. it should not be allowed. */
  14603. static ffesymbol
  14604. ffeexpr_sym_lhs_extfunc_ (ffesymbol s, ffelexToken t)
  14605. {
  14606. ffesymbolAttrs sa;
  14607. ffesymbolAttrs na;
  14608. ffeinfoKind kind;
  14609. ffeinfoWhere where;
  14610. bool needs_type = FALSE;
  14611. bool error = FALSE;
  14612. assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
  14613. || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
  14614. na = sa = ffesymbol_attrs (s);
  14615. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14616. | FFESYMBOL_attrsADJUSTABLE
  14617. | FFESYMBOL_attrsANYLEN
  14618. | FFESYMBOL_attrsARRAY
  14619. | FFESYMBOL_attrsDUMMY
  14620. | FFESYMBOL_attrsEXTERNAL
  14621. | FFESYMBOL_attrsSFARG
  14622. | FFESYMBOL_attrsTYPE)));
  14623. kind = ffesymbol_kind (s);
  14624. where = ffesymbol_where (s);
  14625. /* Figure out what kind of object we've got based on previous declarations
  14626. of or references to the object. */
  14627. if (sa & FFESYMBOL_attrsEXTERNAL)
  14628. {
  14629. assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
  14630. | FFESYMBOL_attrsDUMMY
  14631. | FFESYMBOL_attrsEXTERNAL
  14632. | FFESYMBOL_attrsTYPE)));
  14633. if (sa & FFESYMBOL_attrsTYPE)
  14634. where = FFEINFO_whereGLOBAL;
  14635. else
  14636. /* Not TYPE. */
  14637. {
  14638. kind = FFEINFO_kindFUNCTION;
  14639. needs_type = TRUE;
  14640. if (sa & FFESYMBOL_attrsDUMMY)
  14641. ; /* Not TYPE. */
  14642. else if (sa & FFESYMBOL_attrsACTUALARG)
  14643. ; /* Not DUMMY or TYPE. */
  14644. else /* Not ACTUALARG, DUMMY, or TYPE. */
  14645. where = FFEINFO_whereGLOBAL;
  14646. }
  14647. }
  14648. else if (sa & FFESYMBOL_attrsDUMMY)
  14649. {
  14650. assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
  14651. assert (!(sa & ~(FFESYMBOL_attrsDUMMY
  14652. | FFESYMBOL_attrsEXTERNAL
  14653. | FFESYMBOL_attrsTYPE)));
  14654. kind = FFEINFO_kindFUNCTION;
  14655. if (!(sa & FFESYMBOL_attrsTYPE))
  14656. needs_type = TRUE;
  14657. }
  14658. else if (sa & FFESYMBOL_attrsARRAY)
  14659. {
  14660. assert (!(sa & ~(FFESYMBOL_attrsARRAY
  14661. | FFESYMBOL_attrsADJUSTABLE
  14662. | FFESYMBOL_attrsTYPE)));
  14663. error = TRUE;
  14664. }
  14665. else if (sa & FFESYMBOL_attrsSFARG)
  14666. {
  14667. assert (!(sa & ~(FFESYMBOL_attrsSFARG
  14668. | FFESYMBOL_attrsTYPE)));
  14669. error = TRUE;
  14670. }
  14671. else if (sa & FFESYMBOL_attrsTYPE)
  14672. {
  14673. assert (!(sa & (FFESYMBOL_attrsARRAY
  14674. | FFESYMBOL_attrsDUMMY
  14675. | FFESYMBOL_attrsEXTERNAL
  14676. | FFESYMBOL_attrsSFARG))); /* Handled above. */
  14677. assert (!(sa & ~(FFESYMBOL_attrsTYPE
  14678. | FFESYMBOL_attrsADJUSTABLE
  14679. | FFESYMBOL_attrsANYLEN
  14680. | FFESYMBOL_attrsARRAY
  14681. | FFESYMBOL_attrsDUMMY
  14682. | FFESYMBOL_attrsEXTERNAL
  14683. | FFESYMBOL_attrsSFARG)));
  14684. if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
  14685. error = TRUE;
  14686. else
  14687. {
  14688. kind = FFEINFO_kindFUNCTION;
  14689. where = FFEINFO_whereGLOBAL;
  14690. }
  14691. }
  14692. else if (sa == FFESYMBOL_attrsetNONE)
  14693. {
  14694. assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
  14695. kind = FFEINFO_kindFUNCTION;
  14696. where = FFEINFO_whereGLOBAL;
  14697. needs_type = TRUE;
  14698. }
  14699. else
  14700. error = TRUE;
  14701. /* Now see what we've got for a new object: NONE means a new error cropped
  14702. up; ANY means an old error to be ignored; otherwise, everything's ok,
  14703. update the object (symbol) and continue on. */
  14704. if (error)
  14705. ffesymbol_error (s, t);
  14706. else if (!(na & FFESYMBOL_attrsANY))
  14707. {
  14708. ffesymbol_signal_change (s); /* May need to back up to previous
  14709. version. */
  14710. if (needs_type && !ffeimplic_establish_symbol (s))
  14711. {
  14712. ffesymbol_error (s, t);
  14713. return s;
  14714. }
  14715. if (!ffesymbol_explicitwhere (s))
  14716. {
  14717. ffebad_start (FFEBAD_NEED_EXTERNAL);
  14718. ffebad_here (0, ffelex_token_where_line (t),
  14719. ffelex_token_where_column (t));
  14720. ffebad_string (ffesymbol_text (s));
  14721. ffebad_finish ();
  14722. ffesymbol_set_explicitwhere (s, TRUE);
  14723. }
  14724. ffesymbol_set_info (s,
  14725. ffeinfo_new (ffesymbol_basictype (s),
  14726. ffesymbol_kindtype (s),
  14727. ffesymbol_rank (s),
  14728. kind, /* FUNCTION. */
  14729. where, /* GLOBAL or DUMMY. */
  14730. ffesymbol_size (s)));
  14731. ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
  14732. ffesymbol_resolve_intrin (s);
  14733. ffesymbol_reference (s, t, FALSE);
  14734. s = ffecom_sym_learned (s);
  14735. ffesymbol_signal_unreported (s); /* For debugging purposes. */
  14736. }
  14737. return s;
  14738. }
  14739. /* Have FOO in DATA (stuff,FOO=1,10)/.../. */
  14740. static ffesymbol
  14741. ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s, ffelexToken t)
  14742. {
  14743. ffesymbolState ss;
  14744. /* If the symbol isn't in the sfunc name space, pretend as though we saw a
  14745. reference to it already within the imp-DO construct at this level, so as
  14746. to get a symbol that is in the sfunc name space. But this is an
  14747. erroneous construct, and should be caught elsewhere. */
  14748. if (ffesymbol_sfdummyparent (s) == NULL)
  14749. {
  14750. s = ffeexpr_sym_impdoitem_ (s, t);
  14751. if (ffesymbol_sfdummyparent (s) == NULL)
  14752. { /* PARAMETER FOO...DATA (A(I),FOO=...). */
  14753. ffesymbol_error (s, t);
  14754. return s;
  14755. }
  14756. }
  14757. ss = ffesymbol_state (s);
  14758. switch (ss)
  14759. {
  14760. case FFESYMBOL_stateNONE: /* Used as iterator already. */
  14761. if (ffeexpr_level_ < ffesymbol_maxentrynum (s))
  14762. ffesymbol_error (s, t); /* Can't reuse dead iterator. F90 disallows
  14763. this; F77 allows it but it is a stupid
  14764. feature. */
  14765. else
  14766. { /* Can use dead iterator because we're at at
  14767. least a innermore (higher-numbered) level
  14768. than the iterator's outermost
  14769. (lowest-numbered) level. This should be
  14770. diagnosed later, because it means an item
  14771. in this list didn't reference this
  14772. iterator. */
  14773. #if 1
  14774. ffesymbol_error (s, t); /* For now, complain. */
  14775. #else /* Someday will detect all cases where initializer doesn't reference
  14776. all applicable iterators, in which case reenable this code. */
  14777. ffesymbol_signal_change (s);
  14778. ffesymbol_set_state (s, FFESYMBOL_stateUNCERTAIN);
  14779. ffesymbol_set_maxentrynum (s, ffeexpr_level_);
  14780. ffesymbol_signal_unreported (s);
  14781. #endif
  14782. }
  14783. break;
  14784. case FFESYMBOL_stateSEEN: /* Seen already in this or other implied-DO.
  14785. If seen in outermore level, can't be an
  14786. iterator here, so complain. If not seen
  14787. at current level, complain for now,
  14788. because that indicates something F90
  14789. rejects (though we currently don't detect
  14790. all such cases for now). */
  14791. if (ffeexpr_level_ <= ffesymbol_maxentrynum (s))
  14792. {
  14793. ffesymbol_signal_change (s);
  14794. ffesymbol_set_state (s, FFESYMBOL_stateUNCERTAIN);
  14795. ffesymbol_signal_unreported (s);
  14796. }
  14797. else
  14798. ffesymbol_error (s, t);
  14799. break;
  14800. case FFESYMBOL_stateUNCERTAIN: /* Already iterator! */
  14801. assert ("DATA implied-DO control var seen twice!!" == NULL);
  14802. ffesymbol_error (s, t);
  14803. break;
  14804. case FFESYMBOL_stateUNDERSTOOD:
  14805. break; /* ANY. */
  14806. default:
  14807. assert ("Foo Bletch!!" == NULL);
  14808. break;
  14809. }
  14810. return s;
  14811. }
  14812. /* Have FOO in PARAMETER (FOO=...). */
  14813. static ffesymbol
  14814. ffeexpr_sym_lhs_parameter_ (ffesymbol s, ffelexToken t)
  14815. {
  14816. ffesymbolAttrs sa;
  14817. sa = ffesymbol_attrs (s);
  14818. /* Figure out what kind of object we've got based on previous declarations
  14819. of or references to the object. */
  14820. if (sa & ~(FFESYMBOL_attrsANYLEN
  14821. | FFESYMBOL_attrsTYPE))
  14822. {
  14823. if (!(sa & FFESYMBOL_attrsANY))
  14824. ffesymbol_error (s, t);
  14825. }
  14826. else
  14827. {
  14828. ffesymbol_signal_change (s); /* May need to back up to previous
  14829. version. */
  14830. if (!ffeimplic_establish_symbol (s))
  14831. {
  14832. ffesymbol_error (s, t);
  14833. return s;
  14834. }
  14835. ffesymbol_set_info (s,
  14836. ffeinfo_new (ffesymbol_basictype (s),
  14837. ffesymbol_kindtype (s),
  14838. ffesymbol_rank (s),
  14839. FFEINFO_kindENTITY,
  14840. FFEINFO_whereCONSTANT,
  14841. ffesymbol_size (s)));
  14842. ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
  14843. ffesymbol_resolve_intrin (s);
  14844. s = ffecom_sym_learned (s);
  14845. ffesymbol_signal