]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/f/expr.c
Imported from mainline FSF repositories
[thirdparty/gcc.git] / gcc / f / expr.c
1 /* expr.c -- Implementation File (module.c template V1.0)
2 Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4 Contributed by James Craig Burley.
5
6 This file is part of GNU Fortran.
7
8 GNU Fortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU Fortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU Fortran; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.
22
23 Related Modules:
24 None.
25
26 Description:
27 Handles syntactic and semantic analysis of Fortran expressions.
28
29 Modifications:
30 */
31
32 /* Include files. */
33
34 #include "proj.h"
35 #include "expr.h"
36 #include "bad.h"
37 #include "bld.h"
38 #include "com.h"
39 #include "global.h"
40 #include "implic.h"
41 #include "intrin.h"
42 #include "info.h"
43 #include "lex.h"
44 #include "malloc.h"
45 #include "src.h"
46 #include "st.h"
47 #include "symbol.h"
48 #include "str.h"
49 #include "target.h"
50 #include "where.h"
51 #include "real.h"
52
53 /* Externals defined here. */
54
55
56 /* Simple definitions and enumerations. */
57
58 typedef enum
59 {
60 FFEEXPR_exprtypeUNKNOWN_,
61 FFEEXPR_exprtypeOPERAND_,
62 FFEEXPR_exprtypeUNARY_,
63 FFEEXPR_exprtypeBINARY_,
64 FFEEXPR_exprtype_
65 } ffeexprExprtype_;
66
67 typedef enum
68 {
69 FFEEXPR_operatorPOWER_,
70 FFEEXPR_operatorMULTIPLY_,
71 FFEEXPR_operatorDIVIDE_,
72 FFEEXPR_operatorADD_,
73 FFEEXPR_operatorSUBTRACT_,
74 FFEEXPR_operatorCONCATENATE_,
75 FFEEXPR_operatorLT_,
76 FFEEXPR_operatorLE_,
77 FFEEXPR_operatorEQ_,
78 FFEEXPR_operatorNE_,
79 FFEEXPR_operatorGT_,
80 FFEEXPR_operatorGE_,
81 FFEEXPR_operatorNOT_,
82 FFEEXPR_operatorAND_,
83 FFEEXPR_operatorOR_,
84 FFEEXPR_operatorXOR_,
85 FFEEXPR_operatorEQV_,
86 FFEEXPR_operatorNEQV_,
87 FFEEXPR_operator_
88 } ffeexprOperator_;
89
90 typedef enum
91 {
92 FFEEXPR_operatorprecedenceHIGHEST_ = 1,
93 FFEEXPR_operatorprecedencePOWER_ = 1,
94 FFEEXPR_operatorprecedenceMULTIPLY_ = 2,
95 FFEEXPR_operatorprecedenceDIVIDE_ = 2,
96 FFEEXPR_operatorprecedenceADD_ = 3,
97 FFEEXPR_operatorprecedenceSUBTRACT_ = 3,
98 FFEEXPR_operatorprecedenceLOWARITH_ = 3,
99 FFEEXPR_operatorprecedenceCONCATENATE_ = 3,
100 FFEEXPR_operatorprecedenceLT_ = 4,
101 FFEEXPR_operatorprecedenceLE_ = 4,
102 FFEEXPR_operatorprecedenceEQ_ = 4,
103 FFEEXPR_operatorprecedenceNE_ = 4,
104 FFEEXPR_operatorprecedenceGT_ = 4,
105 FFEEXPR_operatorprecedenceGE_ = 4,
106 FFEEXPR_operatorprecedenceNOT_ = 5,
107 FFEEXPR_operatorprecedenceAND_ = 6,
108 FFEEXPR_operatorprecedenceOR_ = 7,
109 FFEEXPR_operatorprecedenceXOR_ = 8,
110 FFEEXPR_operatorprecedenceEQV_ = 8,
111 FFEEXPR_operatorprecedenceNEQV_ = 8,
112 FFEEXPR_operatorprecedenceLOWEST_ = 8,
113 FFEEXPR_operatorprecedence_
114 } ffeexprOperatorPrecedence_;
115
116 #define FFEEXPR_operatorassociativityL2R_ TRUE
117 #define FFEEXPR_operatorassociativityR2L_ FALSE
118 #define FFEEXPR_operatorassociativityPOWER_ FFEEXPR_operatorassociativityR2L_
119 #define FFEEXPR_operatorassociativityMULTIPLY_ FFEEXPR_operatorassociativityL2R_
120 #define FFEEXPR_operatorassociativityDIVIDE_ FFEEXPR_operatorassociativityL2R_
121 #define FFEEXPR_operatorassociativityADD_ FFEEXPR_operatorassociativityL2R_
122 #define FFEEXPR_operatorassociativitySUBTRACT_ FFEEXPR_operatorassociativityL2R_
123 #define FFEEXPR_operatorassociativityCONCATENATE_ FFEEXPR_operatorassociativityL2R_
124 #define FFEEXPR_operatorassociativityLT_ FFEEXPR_operatorassociativityL2R_
125 #define FFEEXPR_operatorassociativityLE_ FFEEXPR_operatorassociativityL2R_
126 #define FFEEXPR_operatorassociativityEQ_ FFEEXPR_operatorassociativityL2R_
127 #define FFEEXPR_operatorassociativityNE_ FFEEXPR_operatorassociativityL2R_
128 #define FFEEXPR_operatorassociativityGT_ FFEEXPR_operatorassociativityL2R_
129 #define FFEEXPR_operatorassociativityGE_ FFEEXPR_operatorassociativityL2R_
130 #define FFEEXPR_operatorassociativityNOT_ FFEEXPR_operatorassociativityL2R_
131 #define FFEEXPR_operatorassociativityAND_ FFEEXPR_operatorassociativityL2R_
132 #define FFEEXPR_operatorassociativityOR_ FFEEXPR_operatorassociativityL2R_
133 #define FFEEXPR_operatorassociativityXOR_ FFEEXPR_operatorassociativityL2R_
134 #define FFEEXPR_operatorassociativityEQV_ FFEEXPR_operatorassociativityL2R_
135 #define FFEEXPR_operatorassociativityNEQV_ FFEEXPR_operatorassociativityL2R_
136
137 typedef enum
138 {
139 FFEEXPR_parentypeFUNCTION_,
140 FFEEXPR_parentypeSUBROUTINE_,
141 FFEEXPR_parentypeARRAY_,
142 FFEEXPR_parentypeSUBSTRING_,
143 FFEEXPR_parentypeFUNSUBSTR_,/* Ambig: check for colon after first expr. */
144 FFEEXPR_parentypeEQUIVALENCE_, /* Ambig: ARRAY_ or SUBSTRING_. */
145 FFEEXPR_parentypeANY_, /* Allow basically anything. */
146 FFEEXPR_parentype_
147 } ffeexprParenType_;
148
149 typedef enum
150 {
151 FFEEXPR_percentNONE_,
152 FFEEXPR_percentLOC_,
153 FFEEXPR_percentVAL_,
154 FFEEXPR_percentREF_,
155 FFEEXPR_percentDESCR_,
156 FFEEXPR_percent_
157 } ffeexprPercent_;
158
159 /* Internal typedefs. */
160
161 typedef struct _ffeexpr_expr_ *ffeexprExpr_;
162 typedef bool ffeexprOperatorAssociativity_;
163 typedef struct _ffeexpr_stack_ *ffeexprStack_;
164
165 /* Private include files. */
166
167
168 /* Internal structure definitions. */
169
170 struct _ffeexpr_expr_
171 {
172 ffeexprExpr_ previous;
173 ffelexToken token;
174 ffeexprExprtype_ type;
175 union
176 {
177 struct
178 {
179 ffeexprOperator_ op;
180 ffeexprOperatorPrecedence_ prec;
181 ffeexprOperatorAssociativity_ as;
182 }
183 operator;
184 ffebld operand;
185 }
186 u;
187 };
188
189 struct _ffeexpr_stack_
190 {
191 ffeexprStack_ previous;
192 mallocPool pool;
193 ffeexprContext context;
194 ffeexprCallback callback;
195 ffelexToken first_token;
196 ffeexprExpr_ exprstack;
197 ffelexToken tokens[10]; /* Used in certain cases, like (unary)
198 open-paren. */
199 ffebld expr; /* For first of
200 complex/implied-do/substring/array-elements
201 / actual-args expression. */
202 ffebld bound_list; /* For tracking dimension bounds list of
203 array. */
204 ffebldListBottom bottom; /* For building lists. */
205 ffeinfoRank rank; /* For elements in an array reference. */
206 bool constant; /* TRUE while elements seen so far are
207 constants. */
208 bool immediate; /* TRUE while elements seen so far are
209 immediate/constants. */
210 ffebld next_dummy; /* Next SFUNC dummy arg in arg list. */
211 ffebldListLength num_args; /* Number of dummy args expected in arg list. */
212 bool is_rhs; /* TRUE if rhs context, FALSE otherwise. */
213 ffeexprPercent_ percent; /* Current %FOO keyword. */
214 };
215
216 struct _ffeexpr_find_
217 {
218 ffelexToken t;
219 ffelexHandler after;
220 int level;
221 };
222
223 /* Static objects accessed by functions in this module. */
224
225 static ffeexprStack_ ffeexpr_stack_; /* Expression stack for semantic. */
226 static ffelexToken ffeexpr_tokens_[10]; /* Scratchpad tokens for syntactic. */
227 static ffestrOther ffeexpr_current_dotdot_; /* Current .FOO. keyword. */
228 static long ffeexpr_hollerith_count_; /* ffeexpr_token_number_ and caller. */
229 static int ffeexpr_level_; /* Level of DATA implied-DO construct. */
230 static bool ffeexpr_is_substr_ok_; /* If OPEN_PAREN as binary "op" ok. */
231 static struct _ffeexpr_find_ ffeexpr_find_;
232
233 /* Static functions (internal). */
234
235 static ffelexHandler ffeexpr_cb_close_paren_ (ffelexToken ft, ffebld expr,
236 ffelexToken t);
237 static ffelexHandler ffeexpr_cb_close_paren_ambig_ (ffelexToken ft,
238 ffebld expr,
239 ffelexToken t);
240 static ffelexHandler ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t);
241 static ffelexHandler ffeexpr_cb_close_paren_c_ (ffelexToken ft,
242 ffebld expr, ffelexToken t);
243 static ffelexHandler ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr,
244 ffelexToken t);
245 static ffelexHandler ffeexpr_cb_close_paren_ci_ (ffelexToken ft,
246 ffebld expr, ffelexToken t);
247 static ffelexHandler ffeexpr_cb_comma_ci_ (ffelexToken ft, ffebld expr,
248 ffelexToken t);
249 static ffelexHandler ffeexpr_cb_comma_i_ (ffelexToken ft, ffebld expr,
250 ffelexToken t);
251 static ffelexHandler ffeexpr_cb_comma_i_1_ (ffelexToken ft, ffebld expr,
252 ffelexToken t);
253 static ffelexHandler ffeexpr_cb_comma_i_2_ (ffelexToken ft, ffebld expr,
254 ffelexToken t);
255 static ffelexHandler ffeexpr_cb_comma_i_3_ (ffelexToken ft, ffebld expr,
256 ffelexToken t);
257 static ffelexHandler ffeexpr_cb_comma_i_4_ (ffelexToken ft, ffebld expr,
258 ffelexToken t);
259 static ffelexHandler ffeexpr_cb_comma_i_5_ (ffelexToken t);
260 static ffelexHandler ffeexpr_cb_end_loc_ (ffelexToken ft, ffebld expr,
261 ffelexToken t);
262 static ffelexHandler ffeexpr_cb_end_notloc_ (ffelexToken ft, ffebld expr,
263 ffelexToken t);
264 static ffelexHandler ffeexpr_cb_end_notloc_1_ (ffelexToken t);
265 static ffesymbol ffeexpr_check_impctrl_ (ffesymbol s);
266 static void ffeexpr_check_impdo_ (ffebld list, ffelexToken list_t,
267 ffebld dovar, ffelexToken dovar_t);
268 static void ffeexpr_update_impdo_ (ffebld expr, ffebld dovar);
269 static void ffeexpr_update_impdo_sym_ (ffebld expr, ffesymbol dovar);
270 static ffeexprContext ffeexpr_context_outer_ (ffeexprStack_ s);
271 static ffeexprExpr_ ffeexpr_expr_new_ (void);
272 static void ffeexpr_fulfill_call_ (ffebld *expr, ffelexToken t);
273 static bool ffeexpr_isdigits_ (const char *p);
274 static ffelexHandler ffeexpr_token_first_lhs_ (ffelexToken t);
275 static ffelexHandler ffeexpr_token_first_lhs_1_ (ffelexToken t);
276 static ffelexHandler ffeexpr_token_first_rhs_ (ffelexToken t);
277 static ffelexHandler ffeexpr_token_first_rhs_1_ (ffelexToken t);
278 static ffelexHandler ffeexpr_token_first_rhs_2_ (ffelexToken t);
279 static ffelexHandler ffeexpr_token_first_rhs_3_ (ffelexToken t);
280 static ffelexHandler ffeexpr_token_first_rhs_4_ (ffelexToken t);
281 static ffelexHandler ffeexpr_token_first_rhs_5_ (ffelexToken t);
282 static ffelexHandler ffeexpr_token_first_rhs_6_ (ffelexToken t);
283 static ffelexHandler ffeexpr_token_namelist_ (ffelexToken t);
284 static void ffeexpr_expr_kill_ (ffeexprExpr_ e);
285 static void ffeexpr_exprstack_push_ (ffeexprExpr_ e);
286 static void ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e);
287 static void ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e);
288 static void ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e);
289 static void ffeexpr_reduce_ (void);
290 static ffebld ffeexpr_reduced_bool1_ (ffebld reduced, ffeexprExpr_ op,
291 ffeexprExpr_ r);
292 static ffebld ffeexpr_reduced_bool2_ (ffebld reduced, ffeexprExpr_ l,
293 ffeexprExpr_ op, ffeexprExpr_ r);
294 static ffebld ffeexpr_reduced_concatenate_ (ffebld reduced, ffeexprExpr_ l,
295 ffeexprExpr_ op, ffeexprExpr_ r);
296 static ffebld ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l,
297 ffeexprExpr_ op, ffeexprExpr_ r);
298 static ffebld ffeexpr_reduced_math1_ (ffebld reduced, ffeexprExpr_ op,
299 ffeexprExpr_ r);
300 static ffebld ffeexpr_reduced_math2_ (ffebld reduced, ffeexprExpr_ l,
301 ffeexprExpr_ op, ffeexprExpr_ r);
302 static ffebld ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l,
303 ffeexprExpr_ op, ffeexprExpr_ r);
304 static ffebld ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l,
305 ffeexprExpr_ op, ffeexprExpr_ r);
306 static ffebld ffeexpr_reduced_ugly1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);
307 static ffebld ffeexpr_reduced_ugly1log_ (ffebld reduced, ffeexprExpr_ op,
308 ffeexprExpr_ r);
309 static ffebld ffeexpr_reduced_ugly2_ (ffebld reduced, ffeexprExpr_ l,
310 ffeexprExpr_ op, ffeexprExpr_ r);
311 static ffebld ffeexpr_reduced_ugly2log_ (ffebld reduced, ffeexprExpr_ l,
312 ffeexprExpr_ op, ffeexprExpr_ r,
313 bool *);
314 static ffelexHandler ffeexpr_find_close_paren_ (ffelexToken t,
315 ffelexHandler after);
316 static ffelexHandler ffeexpr_nil_finished_ (ffelexToken t);
317 static ffelexHandler ffeexpr_nil_rhs_ (ffelexToken t);
318 static ffelexHandler ffeexpr_nil_period_ (ffelexToken t);
319 static ffelexHandler ffeexpr_nil_end_period_ (ffelexToken t);
320 static ffelexHandler ffeexpr_nil_swallow_period_ (ffelexToken t);
321 static ffelexHandler ffeexpr_nil_real_ (ffelexToken t);
322 static ffelexHandler ffeexpr_nil_real_exponent_ (ffelexToken t);
323 static ffelexHandler ffeexpr_nil_real_exp_sign_ (ffelexToken t);
324 static ffelexHandler ffeexpr_nil_number_ (ffelexToken t);
325 static ffelexHandler ffeexpr_nil_number_exponent_ (ffelexToken t);
326 static ffelexHandler ffeexpr_nil_number_exp_sign_ (ffelexToken t);
327 static ffelexHandler ffeexpr_nil_number_period_ (ffelexToken t);
328 static ffelexHandler ffeexpr_nil_number_per_exp_ (ffelexToken t);
329 static ffelexHandler ffeexpr_nil_number_real_ (ffelexToken t);
330 static ffelexHandler ffeexpr_nil_num_per_exp_sign_ (ffelexToken t);
331 static ffelexHandler ffeexpr_nil_number_real_exp_ (ffelexToken t);
332 static ffelexHandler ffeexpr_nil_num_real_exp_sn_ (ffelexToken t);
333 static ffelexHandler ffeexpr_nil_binary_ (ffelexToken t);
334 static ffelexHandler ffeexpr_nil_binary_period_ (ffelexToken t);
335 static ffelexHandler ffeexpr_nil_binary_end_per_ (ffelexToken t);
336 static ffelexHandler ffeexpr_nil_binary_sw_per_ (ffelexToken t);
337 static ffelexHandler ffeexpr_nil_quote_ (ffelexToken t);
338 static ffelexHandler ffeexpr_nil_apostrophe_ (ffelexToken t);
339 static ffelexHandler ffeexpr_nil_apos_char_ (ffelexToken t);
340 static ffelexHandler ffeexpr_nil_name_rhs_ (ffelexToken t);
341 static ffelexHandler ffeexpr_nil_name_apos_ (ffelexToken t);
342 static ffelexHandler ffeexpr_nil_name_apos_name_ (ffelexToken t);
343 static ffelexHandler ffeexpr_nil_percent_ (ffelexToken t);
344 static ffelexHandler ffeexpr_nil_percent_name_ (ffelexToken t);
345 static ffelexHandler ffeexpr_nil_substrp_ (ffelexToken t);
346 static ffelexHandler ffeexpr_finished_ (ffelexToken t);
347 static ffebld ffeexpr_finished_ambig_ (ffelexToken t, ffebld expr);
348 static ffelexHandler ffeexpr_token_lhs_ (ffelexToken t);
349 static ffelexHandler ffeexpr_token_rhs_ (ffelexToken t);
350 static ffelexHandler ffeexpr_token_binary_ (ffelexToken t);
351 static ffelexHandler ffeexpr_token_period_ (ffelexToken t);
352 static ffelexHandler ffeexpr_token_end_period_ (ffelexToken t);
353 static ffelexHandler ffeexpr_token_swallow_period_ (ffelexToken t);
354 static ffelexHandler ffeexpr_token_real_ (ffelexToken t);
355 static ffelexHandler ffeexpr_token_real_exponent_ (ffelexToken t);
356 static ffelexHandler ffeexpr_token_real_exp_sign_ (ffelexToken t);
357 static ffelexHandler ffeexpr_token_number_ (ffelexToken t);
358 static ffelexHandler ffeexpr_token_number_exponent_ (ffelexToken t);
359 static ffelexHandler ffeexpr_token_number_exp_sign_ (ffelexToken t);
360 static ffelexHandler ffeexpr_token_number_period_ (ffelexToken t);
361 static ffelexHandler ffeexpr_token_number_per_exp_ (ffelexToken t);
362 static ffelexHandler ffeexpr_token_number_real_ (ffelexToken t);
363 static ffelexHandler ffeexpr_token_num_per_exp_sign_ (ffelexToken t);
364 static ffelexHandler ffeexpr_token_number_real_exp_ (ffelexToken t);
365 static ffelexHandler ffeexpr_token_num_real_exp_sn_ (ffelexToken t);
366 static ffelexHandler ffeexpr_token_binary_period_ (ffelexToken t);
367 static ffelexHandler ffeexpr_token_binary_end_per_ (ffelexToken t);
368 static ffelexHandler ffeexpr_token_binary_sw_per_ (ffelexToken t);
369 static ffelexHandler ffeexpr_token_quote_ (ffelexToken t);
370 static ffelexHandler ffeexpr_token_apostrophe_ (ffelexToken t);
371 static ffelexHandler ffeexpr_token_apos_char_ (ffelexToken t);
372 static ffelexHandler ffeexpr_token_name_lhs_ (ffelexToken t);
373 static ffelexHandler ffeexpr_token_name_arg_ (ffelexToken t);
374 static ffelexHandler ffeexpr_token_name_rhs_ (ffelexToken t);
375 static ffelexHandler ffeexpr_token_name_apos_ (ffelexToken t);
376 static ffelexHandler ffeexpr_token_name_apos_name_ (ffelexToken t);
377 static ffelexHandler ffeexpr_token_percent_ (ffelexToken t);
378 static ffelexHandler ffeexpr_token_percent_name_ (ffelexToken t);
379 static ffelexHandler ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr,
380 ffelexToken t);
381 static ffelexHandler ffeexpr_token_elements_ (ffelexToken ft, ffebld expr,
382 ffelexToken t);
383 static ffelexHandler ffeexpr_token_equivalence_ (ffelexToken ft, ffebld expr,
384 ffelexToken t);
385 static ffelexHandler ffeexpr_token_substring_ (ffelexToken ft, ffebld expr,
386 ffelexToken t);
387 static ffelexHandler ffeexpr_token_substring_1_ (ffelexToken ft, ffebld expr,
388 ffelexToken t);
389 static ffelexHandler ffeexpr_token_substrp_ (ffelexToken t);
390 static ffelexHandler ffeexpr_token_intrincheck_ (ffelexToken t);
391 static ffelexHandler ffeexpr_token_funsubstr_ (ffelexToken ft, ffebld expr,
392 ffelexToken t);
393 static ffelexHandler ffeexpr_token_anything_ (ffelexToken ft, ffebld expr,
394 ffelexToken t);
395 static void ffeexpr_make_float_const_ (char exp_letter, ffelexToken integer,
396 ffelexToken decimal, ffelexToken fraction, ffelexToken exponent,
397 ffelexToken exponent_sign, ffelexToken exponent_digits);
398 static ffesymbol ffeexpr_declare_unadorned_ (ffelexToken t, bool maybe_intrin);
399 static ffesymbol ffeexpr_sym_impdoitem_ (ffesymbol s, ffelexToken t);
400 static ffesymbol ffeexpr_sym_lhs_call_ (ffesymbol s, ffelexToken t);
401 static ffesymbol ffeexpr_sym_lhs_data_ (ffesymbol s, ffelexToken t);
402 static ffesymbol ffeexpr_sym_lhs_equivalence_ (ffesymbol s, ffelexToken t);
403 static ffesymbol ffeexpr_sym_lhs_extfunc_ (ffesymbol s, ffelexToken t);
404 static ffesymbol ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s, ffelexToken t);
405 static ffesymbol ffeexpr_sym_lhs_parameter_ (ffesymbol s, ffelexToken t);
406 static ffesymbol ffeexpr_sym_rhs_actualarg_ (ffesymbol s, ffelexToken t);
407 static ffesymbol ffeexpr_sym_rhs_dimlist_ (ffesymbol s, ffelexToken t);
408 static ffesymbol ffeexpr_sym_rhs_let_ (ffesymbol s, ffelexToken t);
409 static ffesymbol ffeexpr_declare_parenthesized_ (ffelexToken t,
410 bool maybe_intrin,
411 ffeexprParenType_ *paren_type);
412 static ffesymbol ffeexpr_paren_rhs_let_ (ffesymbol s, ffelexToken t);
413
414 /* Internal macros. */
415
416 #define ffeexpr_paren_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
417 #define ffeexpr_sym_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
418 \f
419 /* ffeexpr_collapse_convert -- Collapse convert expr
420
421 ffebld expr;
422 ffelexToken token;
423 expr = ffeexpr_collapse_convert(expr,token);
424
425 If the result of the expr is a constant, replaces the expr with the
426 computed constant. */
427
428 ffebld
429 ffeexpr_collapse_convert (ffebld expr, ffelexToken t)
430 {
431 ffebad error = FFEBAD;
432 ffebld l;
433 ffebldConstantUnion u;
434 ffeinfoBasictype bt;
435 ffeinfoKindtype kt;
436 ffetargetCharacterSize sz;
437 ffetargetCharacterSize sz2;
438
439 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
440 return expr;
441
442 l = ffebld_left (expr);
443
444 if (ffebld_op (l) != FFEBLD_opCONTER)
445 return expr;
446
447 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
448 {
449 case FFEINFO_basictypeANY:
450 return expr;
451
452 case FFEINFO_basictypeINTEGER:
453 sz = FFETARGET_charactersizeNONE;
454 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
455 {
456 #if FFETARGET_okINTEGER1
457 case FFEINFO_kindtypeINTEGER1:
458 switch (ffeinfo_basictype (ffebld_info (l)))
459 {
460 case FFEINFO_basictypeINTEGER:
461 switch (ffeinfo_kindtype (ffebld_info (l)))
462 {
463 #if FFETARGET_okINTEGER2
464 case FFEINFO_kindtypeINTEGER2:
465 error = ffetarget_convert_integer1_integer2
466 (ffebld_cu_ptr_integer1 (u),
467 ffebld_constant_integer2 (ffebld_conter (l)));
468 break;
469 #endif
470
471 #if FFETARGET_okINTEGER3
472 case FFEINFO_kindtypeINTEGER3:
473 error = ffetarget_convert_integer1_integer3
474 (ffebld_cu_ptr_integer1 (u),
475 ffebld_constant_integer3 (ffebld_conter (l)));
476 break;
477 #endif
478
479 #if FFETARGET_okINTEGER4
480 case FFEINFO_kindtypeINTEGER4:
481 error = ffetarget_convert_integer1_integer4
482 (ffebld_cu_ptr_integer1 (u),
483 ffebld_constant_integer4 (ffebld_conter (l)));
484 break;
485 #endif
486
487 default:
488 assert ("INTEGER1/INTEGER bad source kind type" == NULL);
489 break;
490 }
491 break;
492
493 case FFEINFO_basictypeREAL:
494 switch (ffeinfo_kindtype (ffebld_info (l)))
495 {
496 #if FFETARGET_okREAL1
497 case FFEINFO_kindtypeREAL1:
498 error = ffetarget_convert_integer1_real1
499 (ffebld_cu_ptr_integer1 (u),
500 ffebld_constant_real1 (ffebld_conter (l)));
501 break;
502 #endif
503
504 #if FFETARGET_okREAL2
505 case FFEINFO_kindtypeREAL2:
506 error = ffetarget_convert_integer1_real2
507 (ffebld_cu_ptr_integer1 (u),
508 ffebld_constant_real2 (ffebld_conter (l)));
509 break;
510 #endif
511
512 #if FFETARGET_okREAL3
513 case FFEINFO_kindtypeREAL3:
514 error = ffetarget_convert_integer1_real3
515 (ffebld_cu_ptr_integer1 (u),
516 ffebld_constant_real3 (ffebld_conter (l)));
517 break;
518 #endif
519
520 default:
521 assert ("INTEGER1/REAL bad source kind type" == NULL);
522 break;
523 }
524 break;
525
526 case FFEINFO_basictypeCOMPLEX:
527 switch (ffeinfo_kindtype (ffebld_info (l)))
528 {
529 #if FFETARGET_okCOMPLEX1
530 case FFEINFO_kindtypeREAL1:
531 error = ffetarget_convert_integer1_complex1
532 (ffebld_cu_ptr_integer1 (u),
533 ffebld_constant_complex1 (ffebld_conter (l)));
534 break;
535 #endif
536
537 #if FFETARGET_okCOMPLEX2
538 case FFEINFO_kindtypeREAL2:
539 error = ffetarget_convert_integer1_complex2
540 (ffebld_cu_ptr_integer1 (u),
541 ffebld_constant_complex2 (ffebld_conter (l)));
542 break;
543 #endif
544
545 #if FFETARGET_okCOMPLEX3
546 case FFEINFO_kindtypeREAL3:
547 error = ffetarget_convert_integer1_complex3
548 (ffebld_cu_ptr_integer1 (u),
549 ffebld_constant_complex3 (ffebld_conter (l)));
550 break;
551 #endif
552
553 default:
554 assert ("INTEGER1/COMPLEX bad source kind type" == NULL);
555 break;
556 }
557 break;
558
559 case FFEINFO_basictypeLOGICAL:
560 switch (ffeinfo_kindtype (ffebld_info (l)))
561 {
562 #if FFETARGET_okLOGICAL1
563 case FFEINFO_kindtypeLOGICAL1:
564 error = ffetarget_convert_integer1_logical1
565 (ffebld_cu_ptr_integer1 (u),
566 ffebld_constant_logical1 (ffebld_conter (l)));
567 break;
568 #endif
569
570 #if FFETARGET_okLOGICAL2
571 case FFEINFO_kindtypeLOGICAL2:
572 error = ffetarget_convert_integer1_logical2
573 (ffebld_cu_ptr_integer1 (u),
574 ffebld_constant_logical2 (ffebld_conter (l)));
575 break;
576 #endif
577
578 #if FFETARGET_okLOGICAL3
579 case FFEINFO_kindtypeLOGICAL3:
580 error = ffetarget_convert_integer1_logical3
581 (ffebld_cu_ptr_integer1 (u),
582 ffebld_constant_logical3 (ffebld_conter (l)));
583 break;
584 #endif
585
586 #if FFETARGET_okLOGICAL4
587 case FFEINFO_kindtypeLOGICAL4:
588 error = ffetarget_convert_integer1_logical4
589 (ffebld_cu_ptr_integer1 (u),
590 ffebld_constant_logical4 (ffebld_conter (l)));
591 break;
592 #endif
593
594 default:
595 assert ("INTEGER1/LOGICAL bad source kind type" == NULL);
596 break;
597 }
598 break;
599
600 case FFEINFO_basictypeCHARACTER:
601 error = ffetarget_convert_integer1_character1
602 (ffebld_cu_ptr_integer1 (u),
603 ffebld_constant_character1 (ffebld_conter (l)));
604 break;
605
606 case FFEINFO_basictypeHOLLERITH:
607 error = ffetarget_convert_integer1_hollerith
608 (ffebld_cu_ptr_integer1 (u),
609 ffebld_constant_hollerith (ffebld_conter (l)));
610 break;
611
612 case FFEINFO_basictypeTYPELESS:
613 error = ffetarget_convert_integer1_typeless
614 (ffebld_cu_ptr_integer1 (u),
615 ffebld_constant_typeless (ffebld_conter (l)));
616 break;
617
618 default:
619 assert ("INTEGER1 bad type" == NULL);
620 break;
621 }
622
623 /* If conversion operation is not implemented, return original expr. */
624 if (error == FFEBAD_NOCANDO)
625 return expr;
626
627 expr = ffebld_new_conter_with_orig
628 (ffebld_constant_new_integer1_val
629 (ffebld_cu_val_integer1 (u)), expr);
630 break;
631 #endif
632
633 #if FFETARGET_okINTEGER2
634 case FFEINFO_kindtypeINTEGER2:
635 switch (ffeinfo_basictype (ffebld_info (l)))
636 {
637 case FFEINFO_basictypeINTEGER:
638 switch (ffeinfo_kindtype (ffebld_info (l)))
639 {
640 #if FFETARGET_okINTEGER1
641 case FFEINFO_kindtypeINTEGER1:
642 error = ffetarget_convert_integer2_integer1
643 (ffebld_cu_ptr_integer2 (u),
644 ffebld_constant_integer1 (ffebld_conter (l)));
645 break;
646 #endif
647
648 #if FFETARGET_okINTEGER3
649 case FFEINFO_kindtypeINTEGER3:
650 error = ffetarget_convert_integer2_integer3
651 (ffebld_cu_ptr_integer2 (u),
652 ffebld_constant_integer3 (ffebld_conter (l)));
653 break;
654 #endif
655
656 #if FFETARGET_okINTEGER4
657 case FFEINFO_kindtypeINTEGER4:
658 error = ffetarget_convert_integer2_integer4
659 (ffebld_cu_ptr_integer2 (u),
660 ffebld_constant_integer4 (ffebld_conter (l)));
661 break;
662 #endif
663
664 default:
665 assert ("INTEGER2/INTEGER bad source kind type" == NULL);
666 break;
667 }
668 break;
669
670 case FFEINFO_basictypeREAL:
671 switch (ffeinfo_kindtype (ffebld_info (l)))
672 {
673 #if FFETARGET_okREAL1
674 case FFEINFO_kindtypeREAL1:
675 error = ffetarget_convert_integer2_real1
676 (ffebld_cu_ptr_integer2 (u),
677 ffebld_constant_real1 (ffebld_conter (l)));
678 break;
679 #endif
680
681 #if FFETARGET_okREAL2
682 case FFEINFO_kindtypeREAL2:
683 error = ffetarget_convert_integer2_real2
684 (ffebld_cu_ptr_integer2 (u),
685 ffebld_constant_real2 (ffebld_conter (l)));
686 break;
687 #endif
688
689 #if FFETARGET_okREAL3
690 case FFEINFO_kindtypeREAL3:
691 error = ffetarget_convert_integer2_real3
692 (ffebld_cu_ptr_integer2 (u),
693 ffebld_constant_real3 (ffebld_conter (l)));
694 break;
695 #endif
696
697 default:
698 assert ("INTEGER2/REAL bad source kind type" == NULL);
699 break;
700 }
701 break;
702
703 case FFEINFO_basictypeCOMPLEX:
704 switch (ffeinfo_kindtype (ffebld_info (l)))
705 {
706 #if FFETARGET_okCOMPLEX1
707 case FFEINFO_kindtypeREAL1:
708 error = ffetarget_convert_integer2_complex1
709 (ffebld_cu_ptr_integer2 (u),
710 ffebld_constant_complex1 (ffebld_conter (l)));
711 break;
712 #endif
713
714 #if FFETARGET_okCOMPLEX2
715 case FFEINFO_kindtypeREAL2:
716 error = ffetarget_convert_integer2_complex2
717 (ffebld_cu_ptr_integer2 (u),
718 ffebld_constant_complex2 (ffebld_conter (l)));
719 break;
720 #endif
721
722 #if FFETARGET_okCOMPLEX3
723 case FFEINFO_kindtypeREAL3:
724 error = ffetarget_convert_integer2_complex3
725 (ffebld_cu_ptr_integer2 (u),
726 ffebld_constant_complex3 (ffebld_conter (l)));
727 break;
728 #endif
729
730 default:
731 assert ("INTEGER2/COMPLEX bad source kind type" == NULL);
732 break;
733 }
734 break;
735
736 case FFEINFO_basictypeLOGICAL:
737 switch (ffeinfo_kindtype (ffebld_info (l)))
738 {
739 #if FFETARGET_okLOGICAL1
740 case FFEINFO_kindtypeLOGICAL1:
741 error = ffetarget_convert_integer2_logical1
742 (ffebld_cu_ptr_integer2 (u),
743 ffebld_constant_logical1 (ffebld_conter (l)));
744 break;
745 #endif
746
747 #if FFETARGET_okLOGICAL2
748 case FFEINFO_kindtypeLOGICAL2:
749 error = ffetarget_convert_integer2_logical2
750 (ffebld_cu_ptr_integer2 (u),
751 ffebld_constant_logical2 (ffebld_conter (l)));
752 break;
753 #endif
754
755 #if FFETARGET_okLOGICAL3
756 case FFEINFO_kindtypeLOGICAL3:
757 error = ffetarget_convert_integer2_logical3
758 (ffebld_cu_ptr_integer2 (u),
759 ffebld_constant_logical3 (ffebld_conter (l)));
760 break;
761 #endif
762
763 #if FFETARGET_okLOGICAL4
764 case FFEINFO_kindtypeLOGICAL4:
765 error = ffetarget_convert_integer2_logical4
766 (ffebld_cu_ptr_integer2 (u),
767 ffebld_constant_logical4 (ffebld_conter (l)));
768 break;
769 #endif
770
771 default:
772 assert ("INTEGER2/LOGICAL bad source kind type" == NULL);
773 break;
774 }
775 break;
776
777 case FFEINFO_basictypeCHARACTER:
778 error = ffetarget_convert_integer2_character1
779 (ffebld_cu_ptr_integer2 (u),
780 ffebld_constant_character1 (ffebld_conter (l)));
781 break;
782
783 case FFEINFO_basictypeHOLLERITH:
784 error = ffetarget_convert_integer2_hollerith
785 (ffebld_cu_ptr_integer2 (u),
786 ffebld_constant_hollerith (ffebld_conter (l)));
787 break;
788
789 case FFEINFO_basictypeTYPELESS:
790 error = ffetarget_convert_integer2_typeless
791 (ffebld_cu_ptr_integer2 (u),
792 ffebld_constant_typeless (ffebld_conter (l)));
793 break;
794
795 default:
796 assert ("INTEGER2 bad type" == NULL);
797 break;
798 }
799
800 /* If conversion operation is not implemented, return original expr. */
801 if (error == FFEBAD_NOCANDO)
802 return expr;
803
804 expr = ffebld_new_conter_with_orig
805 (ffebld_constant_new_integer2_val
806 (ffebld_cu_val_integer2 (u)), expr);
807 break;
808 #endif
809
810 #if FFETARGET_okINTEGER3
811 case FFEINFO_kindtypeINTEGER3:
812 switch (ffeinfo_basictype (ffebld_info (l)))
813 {
814 case FFEINFO_basictypeINTEGER:
815 switch (ffeinfo_kindtype (ffebld_info (l)))
816 {
817 #if FFETARGET_okINTEGER1
818 case FFEINFO_kindtypeINTEGER1:
819 error = ffetarget_convert_integer3_integer1
820 (ffebld_cu_ptr_integer3 (u),
821 ffebld_constant_integer1 (ffebld_conter (l)));
822 break;
823 #endif
824
825 #if FFETARGET_okINTEGER2
826 case FFEINFO_kindtypeINTEGER2:
827 error = ffetarget_convert_integer3_integer2
828 (ffebld_cu_ptr_integer3 (u),
829 ffebld_constant_integer2 (ffebld_conter (l)));
830 break;
831 #endif
832
833 #if FFETARGET_okINTEGER4
834 case FFEINFO_kindtypeINTEGER4:
835 error = ffetarget_convert_integer3_integer4
836 (ffebld_cu_ptr_integer3 (u),
837 ffebld_constant_integer4 (ffebld_conter (l)));
838 break;
839 #endif
840
841 default:
842 assert ("INTEGER3/INTEGER bad source kind type" == NULL);
843 break;
844 }
845 break;
846
847 case FFEINFO_basictypeREAL:
848 switch (ffeinfo_kindtype (ffebld_info (l)))
849 {
850 #if FFETARGET_okREAL1
851 case FFEINFO_kindtypeREAL1:
852 error = ffetarget_convert_integer3_real1
853 (ffebld_cu_ptr_integer3 (u),
854 ffebld_constant_real1 (ffebld_conter (l)));
855 break;
856 #endif
857
858 #if FFETARGET_okREAL2
859 case FFEINFO_kindtypeREAL2:
860 error = ffetarget_convert_integer3_real2
861 (ffebld_cu_ptr_integer3 (u),
862 ffebld_constant_real2 (ffebld_conter (l)));
863 break;
864 #endif
865
866 #if FFETARGET_okREAL3
867 case FFEINFO_kindtypeREAL3:
868 error = ffetarget_convert_integer3_real3
869 (ffebld_cu_ptr_integer3 (u),
870 ffebld_constant_real3 (ffebld_conter (l)));
871 break;
872 #endif
873
874 default:
875 assert ("INTEGER3/REAL bad source kind type" == NULL);
876 break;
877 }
878 break;
879
880 case FFEINFO_basictypeCOMPLEX:
881 switch (ffeinfo_kindtype (ffebld_info (l)))
882 {
883 #if FFETARGET_okCOMPLEX1
884 case FFEINFO_kindtypeREAL1:
885 error = ffetarget_convert_integer3_complex1
886 (ffebld_cu_ptr_integer3 (u),
887 ffebld_constant_complex1 (ffebld_conter (l)));
888 break;
889 #endif
890
891 #if FFETARGET_okCOMPLEX2
892 case FFEINFO_kindtypeREAL2:
893 error = ffetarget_convert_integer3_complex2
894 (ffebld_cu_ptr_integer3 (u),
895 ffebld_constant_complex2 (ffebld_conter (l)));
896 break;
897 #endif
898
899 #if FFETARGET_okCOMPLEX3
900 case FFEINFO_kindtypeREAL3:
901 error = ffetarget_convert_integer3_complex3
902 (ffebld_cu_ptr_integer3 (u),
903 ffebld_constant_complex3 (ffebld_conter (l)));
904 break;
905 #endif
906
907 default:
908 assert ("INTEGER3/COMPLEX bad source kind type" == NULL);
909 break;
910 }
911 break;
912
913 case FFEINFO_basictypeLOGICAL:
914 switch (ffeinfo_kindtype (ffebld_info (l)))
915 {
916 #if FFETARGET_okLOGICAL1
917 case FFEINFO_kindtypeLOGICAL1:
918 error = ffetarget_convert_integer3_logical1
919 (ffebld_cu_ptr_integer3 (u),
920 ffebld_constant_logical1 (ffebld_conter (l)));
921 break;
922 #endif
923
924 #if FFETARGET_okLOGICAL2
925 case FFEINFO_kindtypeLOGICAL2:
926 error = ffetarget_convert_integer3_logical2
927 (ffebld_cu_ptr_integer3 (u),
928 ffebld_constant_logical2 (ffebld_conter (l)));
929 break;
930 #endif
931
932 #if FFETARGET_okLOGICAL3
933 case FFEINFO_kindtypeLOGICAL3:
934 error = ffetarget_convert_integer3_logical3
935 (ffebld_cu_ptr_integer3 (u),
936 ffebld_constant_logical3 (ffebld_conter (l)));
937 break;
938 #endif
939
940 #if FFETARGET_okLOGICAL4
941 case FFEINFO_kindtypeLOGICAL4:
942 error = ffetarget_convert_integer3_logical4
943 (ffebld_cu_ptr_integer3 (u),
944 ffebld_constant_logical4 (ffebld_conter (l)));
945 break;
946 #endif
947
948 default:
949 assert ("INTEGER3/LOGICAL bad source kind type" == NULL);
950 break;
951 }
952 break;
953
954 case FFEINFO_basictypeCHARACTER:
955 error = ffetarget_convert_integer3_character1
956 (ffebld_cu_ptr_integer3 (u),
957 ffebld_constant_character1 (ffebld_conter (l)));
958 break;
959
960 case FFEINFO_basictypeHOLLERITH:
961 error = ffetarget_convert_integer3_hollerith
962 (ffebld_cu_ptr_integer3 (u),
963 ffebld_constant_hollerith (ffebld_conter (l)));
964 break;
965
966 case FFEINFO_basictypeTYPELESS:
967 error = ffetarget_convert_integer3_typeless
968 (ffebld_cu_ptr_integer3 (u),
969 ffebld_constant_typeless (ffebld_conter (l)));
970 break;
971
972 default:
973 assert ("INTEGER3 bad type" == NULL);
974 break;
975 }
976
977 /* If conversion operation is not implemented, return original expr. */
978 if (error == FFEBAD_NOCANDO)
979 return expr;
980
981 expr = ffebld_new_conter_with_orig
982 (ffebld_constant_new_integer3_val
983 (ffebld_cu_val_integer3 (u)), expr);
984 break;
985 #endif
986
987 #if FFETARGET_okINTEGER4
988 case FFEINFO_kindtypeINTEGER4:
989 switch (ffeinfo_basictype (ffebld_info (l)))
990 {
991 case FFEINFO_basictypeINTEGER:
992 switch (ffeinfo_kindtype (ffebld_info (l)))
993 {
994 #if FFETARGET_okINTEGER1
995 case FFEINFO_kindtypeINTEGER1:
996 error = ffetarget_convert_integer4_integer1
997 (ffebld_cu_ptr_integer4 (u),
998 ffebld_constant_integer1 (ffebld_conter (l)));
999 break;
1000 #endif
1001
1002 #if FFETARGET_okINTEGER2
1003 case FFEINFO_kindtypeINTEGER2:
1004 error = ffetarget_convert_integer4_integer2
1005 (ffebld_cu_ptr_integer4 (u),
1006 ffebld_constant_integer2 (ffebld_conter (l)));
1007 break;
1008 #endif
1009
1010 #if FFETARGET_okINTEGER3
1011 case FFEINFO_kindtypeINTEGER3:
1012 error = ffetarget_convert_integer4_integer3
1013 (ffebld_cu_ptr_integer4 (u),
1014 ffebld_constant_integer3 (ffebld_conter (l)));
1015 break;
1016 #endif
1017
1018 default:
1019 assert ("INTEGER4/INTEGER bad source kind type" == NULL);
1020 break;
1021 }
1022 break;
1023
1024 case FFEINFO_basictypeREAL:
1025 switch (ffeinfo_kindtype (ffebld_info (l)))
1026 {
1027 #if FFETARGET_okREAL1
1028 case FFEINFO_kindtypeREAL1:
1029 error = ffetarget_convert_integer4_real1
1030 (ffebld_cu_ptr_integer4 (u),
1031 ffebld_constant_real1 (ffebld_conter (l)));
1032 break;
1033 #endif
1034
1035 #if FFETARGET_okREAL2
1036 case FFEINFO_kindtypeREAL2:
1037 error = ffetarget_convert_integer4_real2
1038 (ffebld_cu_ptr_integer4 (u),
1039 ffebld_constant_real2 (ffebld_conter (l)));
1040 break;
1041 #endif
1042
1043 #if FFETARGET_okREAL3
1044 case FFEINFO_kindtypeREAL3:
1045 error = ffetarget_convert_integer4_real3
1046 (ffebld_cu_ptr_integer4 (u),
1047 ffebld_constant_real3 (ffebld_conter (l)));
1048 break;
1049 #endif
1050
1051 default:
1052 assert ("INTEGER4/REAL bad source kind type" == NULL);
1053 break;
1054 }
1055 break;
1056
1057 case FFEINFO_basictypeCOMPLEX:
1058 switch (ffeinfo_kindtype (ffebld_info (l)))
1059 {
1060 #if FFETARGET_okCOMPLEX1
1061 case FFEINFO_kindtypeREAL1:
1062 error = ffetarget_convert_integer4_complex1
1063 (ffebld_cu_ptr_integer4 (u),
1064 ffebld_constant_complex1 (ffebld_conter (l)));
1065 break;
1066 #endif
1067
1068 #if FFETARGET_okCOMPLEX2
1069 case FFEINFO_kindtypeREAL2:
1070 error = ffetarget_convert_integer4_complex2
1071 (ffebld_cu_ptr_integer4 (u),
1072 ffebld_constant_complex2 (ffebld_conter (l)));
1073 break;
1074 #endif
1075
1076 #if FFETARGET_okCOMPLEX3
1077 case FFEINFO_kindtypeREAL3:
1078 error = ffetarget_convert_integer4_complex3
1079 (ffebld_cu_ptr_integer4 (u),
1080 ffebld_constant_complex3 (ffebld_conter (l)));
1081 break;
1082 #endif
1083
1084 default:
1085 assert ("INTEGER3/COMPLEX bad source kind type" == NULL);
1086 break;
1087 }
1088 break;
1089
1090 case FFEINFO_basictypeLOGICAL:
1091 switch (ffeinfo_kindtype (ffebld_info (l)))
1092 {
1093 #if FFETARGET_okLOGICAL1
1094 case FFEINFO_kindtypeLOGICAL1:
1095 error = ffetarget_convert_integer4_logical1
1096 (ffebld_cu_ptr_integer4 (u),
1097 ffebld_constant_logical1 (ffebld_conter (l)));
1098 break;
1099 #endif
1100
1101 #if FFETARGET_okLOGICAL2
1102 case FFEINFO_kindtypeLOGICAL2:
1103 error = ffetarget_convert_integer4_logical2
1104 (ffebld_cu_ptr_integer4 (u),
1105 ffebld_constant_logical2 (ffebld_conter (l)));
1106 break;
1107 #endif
1108
1109 #if FFETARGET_okLOGICAL3
1110 case FFEINFO_kindtypeLOGICAL3:
1111 error = ffetarget_convert_integer4_logical3
1112 (ffebld_cu_ptr_integer4 (u),
1113 ffebld_constant_logical3 (ffebld_conter (l)));
1114 break;
1115 #endif
1116
1117 #if FFETARGET_okLOGICAL4
1118 case FFEINFO_kindtypeLOGICAL4:
1119 error = ffetarget_convert_integer4_logical4
1120 (ffebld_cu_ptr_integer4 (u),
1121 ffebld_constant_logical4 (ffebld_conter (l)));
1122 break;
1123 #endif
1124
1125 default:
1126 assert ("INTEGER4/LOGICAL bad source kind type" == NULL);
1127 break;
1128 }
1129 break;
1130
1131 case FFEINFO_basictypeCHARACTER:
1132 error = ffetarget_convert_integer4_character1
1133 (ffebld_cu_ptr_integer4 (u),
1134 ffebld_constant_character1 (ffebld_conter (l)));
1135 break;
1136
1137 case FFEINFO_basictypeHOLLERITH:
1138 error = ffetarget_convert_integer4_hollerith
1139 (ffebld_cu_ptr_integer4 (u),
1140 ffebld_constant_hollerith (ffebld_conter (l)));
1141 break;
1142
1143 case FFEINFO_basictypeTYPELESS:
1144 error = ffetarget_convert_integer4_typeless
1145 (ffebld_cu_ptr_integer4 (u),
1146 ffebld_constant_typeless (ffebld_conter (l)));
1147 break;
1148
1149 default:
1150 assert ("INTEGER4 bad type" == NULL);
1151 break;
1152 }
1153
1154 /* If conversion operation is not implemented, return original expr. */
1155 if (error == FFEBAD_NOCANDO)
1156 return expr;
1157
1158 expr = ffebld_new_conter_with_orig
1159 (ffebld_constant_new_integer4_val
1160 (ffebld_cu_val_integer4 (u)), expr);
1161 break;
1162 #endif
1163
1164 default:
1165 assert ("bad integer kind type" == NULL);
1166 break;
1167 }
1168 break;
1169
1170 case FFEINFO_basictypeLOGICAL:
1171 sz = FFETARGET_charactersizeNONE;
1172 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
1173 {
1174 #if FFETARGET_okLOGICAL1
1175 case FFEINFO_kindtypeLOGICAL1:
1176 switch (ffeinfo_basictype (ffebld_info (l)))
1177 {
1178 case FFEINFO_basictypeLOGICAL:
1179 switch (ffeinfo_kindtype (ffebld_info (l)))
1180 {
1181 #if FFETARGET_okLOGICAL2
1182 case FFEINFO_kindtypeLOGICAL2:
1183 error = ffetarget_convert_logical1_logical2
1184 (ffebld_cu_ptr_logical1 (u),
1185 ffebld_constant_logical2 (ffebld_conter (l)));
1186 break;
1187 #endif
1188
1189 #if FFETARGET_okLOGICAL3
1190 case FFEINFO_kindtypeLOGICAL3:
1191 error = ffetarget_convert_logical1_logical3
1192 (ffebld_cu_ptr_logical1 (u),
1193 ffebld_constant_logical3 (ffebld_conter (l)));
1194 break;
1195 #endif
1196
1197 #if FFETARGET_okLOGICAL4
1198 case FFEINFO_kindtypeLOGICAL4:
1199 error = ffetarget_convert_logical1_logical4
1200 (ffebld_cu_ptr_logical1 (u),
1201 ffebld_constant_logical4 (ffebld_conter (l)));
1202 break;
1203 #endif
1204
1205 default:
1206 assert ("LOGICAL1/LOGICAL bad source kind type" == NULL);
1207 break;
1208 }
1209 break;
1210
1211 case FFEINFO_basictypeINTEGER:
1212 switch (ffeinfo_kindtype (ffebld_info (l)))
1213 {
1214 #if FFETARGET_okINTEGER1
1215 case FFEINFO_kindtypeINTEGER1:
1216 error = ffetarget_convert_logical1_integer1
1217 (ffebld_cu_ptr_logical1 (u),
1218 ffebld_constant_integer1 (ffebld_conter (l)));
1219 break;
1220 #endif
1221
1222 #if FFETARGET_okINTEGER2
1223 case FFEINFO_kindtypeINTEGER2:
1224 error = ffetarget_convert_logical1_integer2
1225 (ffebld_cu_ptr_logical1 (u),
1226 ffebld_constant_integer2 (ffebld_conter (l)));
1227 break;
1228 #endif
1229
1230 #if FFETARGET_okINTEGER3
1231 case FFEINFO_kindtypeINTEGER3:
1232 error = ffetarget_convert_logical1_integer3
1233 (ffebld_cu_ptr_logical1 (u),
1234 ffebld_constant_integer3 (ffebld_conter (l)));
1235 break;
1236 #endif
1237
1238 #if FFETARGET_okINTEGER4
1239 case FFEINFO_kindtypeINTEGER4:
1240 error = ffetarget_convert_logical1_integer4
1241 (ffebld_cu_ptr_logical1 (u),
1242 ffebld_constant_integer4 (ffebld_conter (l)));
1243 break;
1244 #endif
1245
1246 default:
1247 assert ("LOGICAL1/INTEGER bad source kind type" == NULL);
1248 break;
1249 }
1250 break;
1251
1252 case FFEINFO_basictypeCHARACTER:
1253 error = ffetarget_convert_logical1_character1
1254 (ffebld_cu_ptr_logical1 (u),
1255 ffebld_constant_character1 (ffebld_conter (l)));
1256 break;
1257
1258 case FFEINFO_basictypeHOLLERITH:
1259 error = ffetarget_convert_logical1_hollerith
1260 (ffebld_cu_ptr_logical1 (u),
1261 ffebld_constant_hollerith (ffebld_conter (l)));
1262 break;
1263
1264 case FFEINFO_basictypeTYPELESS:
1265 error = ffetarget_convert_logical1_typeless
1266 (ffebld_cu_ptr_logical1 (u),
1267 ffebld_constant_typeless (ffebld_conter (l)));
1268 break;
1269
1270 default:
1271 assert ("LOGICAL1 bad type" == NULL);
1272 break;
1273 }
1274
1275 /* If conversion operation is not implemented, return original expr. */
1276 if (error == FFEBAD_NOCANDO)
1277 return expr;
1278
1279 expr = ffebld_new_conter_with_orig
1280 (ffebld_constant_new_logical1_val
1281 (ffebld_cu_val_logical1 (u)), expr);
1282 break;
1283 #endif
1284
1285 #if FFETARGET_okLOGICAL2
1286 case FFEINFO_kindtypeLOGICAL2:
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_logical2_logical1
1295 (ffebld_cu_ptr_logical2 (u),
1296 ffebld_constant_logical1 (ffebld_conter (l)));
1297 break;
1298 #endif
1299
1300 #if FFETARGET_okLOGICAL3
1301 case FFEINFO_kindtypeLOGICAL3:
1302 error = ffetarget_convert_logical2_logical3
1303 (ffebld_cu_ptr_logical2 (u),
1304 ffebld_constant_logical3 (ffebld_conter (l)));
1305 break;
1306 #endif
1307
1308 #if FFETARGET_okLOGICAL4
1309 case FFEINFO_kindtypeLOGICAL4:
1310 error = ffetarget_convert_logical2_logical4
1311 (ffebld_cu_ptr_logical2 (u),
1312 ffebld_constant_logical4 (ffebld_conter (l)));
1313 break;
1314 #endif
1315
1316 default:
1317 assert ("LOGICAL2/LOGICAL bad source kind type" == NULL);
1318 break;
1319 }
1320 break;
1321
1322 case FFEINFO_basictypeINTEGER:
1323 switch (ffeinfo_kindtype (ffebld_info (l)))
1324 {
1325 #if FFETARGET_okINTEGER1
1326 case FFEINFO_kindtypeINTEGER1:
1327 error = ffetarget_convert_logical2_integer1
1328 (ffebld_cu_ptr_logical2 (u),
1329 ffebld_constant_integer1 (ffebld_conter (l)));
1330 break;
1331 #endif
1332
1333 #if FFETARGET_okINTEGER2
1334 case FFEINFO_kindtypeINTEGER2:
1335 error = ffetarget_convert_logical2_integer2
1336 (ffebld_cu_ptr_logical2 (u),
1337 ffebld_constant_integer2 (ffebld_conter (l)));
1338 break;
1339 #endif
1340
1341 #if FFETARGET_okINTEGER3
1342 case FFEINFO_kindtypeINTEGER3:
1343 error = ffetarget_convert_logical2_integer3
1344 (ffebld_cu_ptr_logical2 (u),
1345 ffebld_constant_integer3 (ffebld_conter (l)));
1346 break;
1347 #endif
1348
1349 #if FFETARGET_okINTEGER4
1350 case FFEINFO_kindtypeINTEGER4:
1351 error = ffetarget_convert_logical2_integer4
1352 (ffebld_cu_ptr_logical2 (u),
1353 ffebld_constant_integer4 (ffebld_conter (l)));
1354 break;
1355 #endif
1356
1357 default:
1358 assert ("LOGICAL2/INTEGER bad source kind type" == NULL);
1359 break;
1360 }
1361 break;
1362
1363 case FFEINFO_basictypeCHARACTER:
1364 error = ffetarget_convert_logical2_character1
1365 (ffebld_cu_ptr_logical2 (u),
1366 ffebld_constant_character1 (ffebld_conter (l)));
1367 break;
1368
1369 case FFEINFO_basictypeHOLLERITH:
1370 error = ffetarget_convert_logical2_hollerith
1371 (ffebld_cu_ptr_logical2 (u),
1372 ffebld_constant_hollerith (ffebld_conter (l)));
1373 break;
1374
1375 case FFEINFO_basictypeTYPELESS:
1376 error = ffetarget_convert_logical2_typeless
1377 (ffebld_cu_ptr_logical2 (u),
1378 ffebld_constant_typeless (ffebld_conter (l)));
1379 break;
1380
1381 default:
1382 assert ("LOGICAL2 bad type" == NULL);
1383 break;
1384 }
1385
1386 /* If conversion operation is not implemented, return original expr. */
1387 if (error == FFEBAD_NOCANDO)
1388 return expr;
1389
1390 expr = ffebld_new_conter_with_orig
1391 (ffebld_constant_new_logical2_val
1392 (ffebld_cu_val_logical2 (u)), expr);
1393 break;
1394 #endif
1395
1396 #if FFETARGET_okLOGICAL3
1397 case FFEINFO_kindtypeLOGICAL3:
1398 switch (ffeinfo_basictype (ffebld_info (l)))
1399 {
1400 case FFEINFO_basictypeLOGICAL:
1401 switch (ffeinfo_kindtype (ffebld_info (l)))
1402 {
1403 #if FFETARGET_okLOGICAL1
1404 case FFEINFO_kindtypeLOGICAL1:
1405 error = ffetarget_convert_logical3_logical1
1406 (ffebld_cu_ptr_logical3 (u),
1407 ffebld_constant_logical1 (ffebld_conter (l)));
1408 break;
1409 #endif
1410
1411 #if FFETARGET_okLOGICAL2
1412 case FFEINFO_kindtypeLOGICAL2:
1413 error = ffetarget_convert_logical3_logical2
1414 (ffebld_cu_ptr_logical3 (u),
1415 ffebld_constant_logical2 (ffebld_conter (l)));
1416 break;
1417 #endif
1418
1419 #if FFETARGET_okLOGICAL4
1420 case FFEINFO_kindtypeLOGICAL4:
1421 error = ffetarget_convert_logical3_logical4
1422 (ffebld_cu_ptr_logical3 (u),
1423 ffebld_constant_logical4 (ffebld_conter (l)));
1424 break;
1425 #endif
1426
1427 default:
1428 assert ("LOGICAL3/LOGICAL bad source kind type" == NULL);
1429 break;
1430 }
1431 break;
1432
1433 case FFEINFO_basictypeINTEGER:
1434 switch (ffeinfo_kindtype (ffebld_info (l)))
1435 {
1436 #if FFETARGET_okINTEGER1
1437 case FFEINFO_kindtypeINTEGER1:
1438 error = ffetarget_convert_logical3_integer1
1439 (ffebld_cu_ptr_logical3 (u),
1440 ffebld_constant_integer1 (ffebld_conter (l)));
1441 break;
1442 #endif
1443
1444 #if FFETARGET_okINTEGER2
1445 case FFEINFO_kindtypeINTEGER2:
1446 error = ffetarget_convert_logical3_integer2
1447 (ffebld_cu_ptr_logical3 (u),
1448 ffebld_constant_integer2 (ffebld_conter (l)));
1449 break;
1450 #endif
1451
1452 #if FFETARGET_okINTEGER3
1453 case FFEINFO_kindtypeINTEGER3:
1454 error = ffetarget_convert_logical3_integer3
1455 (ffebld_cu_ptr_logical3 (u),
1456 ffebld_constant_integer3 (ffebld_conter (l)));
1457 break;
1458 #endif
1459
1460 #if FFETARGET_okINTEGER4
1461 case FFEINFO_kindtypeINTEGER4:
1462 error = ffetarget_convert_logical3_integer4
1463 (ffebld_cu_ptr_logical3 (u),
1464 ffebld_constant_integer4 (ffebld_conter (l)));
1465 break;
1466 #endif
1467
1468 default:
1469 assert ("LOGICAL3/INTEGER bad source kind type" == NULL);
1470 break;
1471 }
1472 break;
1473
1474 case FFEINFO_basictypeCHARACTER:
1475 error = ffetarget_convert_logical3_character1
1476 (ffebld_cu_ptr_logical3 (u),
1477 ffebld_constant_character1 (ffebld_conter (l)));
1478 break;
1479
1480 case FFEINFO_basictypeHOLLERITH:
1481 error = ffetarget_convert_logical3_hollerith
1482 (ffebld_cu_ptr_logical3 (u),
1483 ffebld_constant_hollerith (ffebld_conter (l)));
1484 break;
1485
1486 case FFEINFO_basictypeTYPELESS:
1487 error = ffetarget_convert_logical3_typeless
1488 (ffebld_cu_ptr_logical3 (u),
1489 ffebld_constant_typeless (ffebld_conter (l)));
1490 break;
1491
1492 default:
1493 assert ("LOGICAL3 bad type" == NULL);
1494 break;
1495 }
1496
1497 /* If conversion operation is not implemented, return original expr. */
1498 if (error == FFEBAD_NOCANDO)
1499 return expr;
1500
1501 expr = ffebld_new_conter_with_orig
1502 (ffebld_constant_new_logical3_val
1503 (ffebld_cu_val_logical3 (u)), expr);
1504 break;
1505 #endif
1506
1507 #if FFETARGET_okLOGICAL4
1508 case FFEINFO_kindtypeLOGICAL4:
1509 switch (ffeinfo_basictype (ffebld_info (l)))
1510 {
1511 case FFEINFO_basictypeLOGICAL:
1512 switch (ffeinfo_kindtype (ffebld_info (l)))
1513 {
1514 #if FFETARGET_okLOGICAL1
1515 case FFEINFO_kindtypeLOGICAL1:
1516 error = ffetarget_convert_logical4_logical1
1517 (ffebld_cu_ptr_logical4 (u),
1518 ffebld_constant_logical1 (ffebld_conter (l)));
1519 break;
1520 #endif
1521
1522 #if FFETARGET_okLOGICAL2
1523 case FFEINFO_kindtypeLOGICAL2:
1524 error = ffetarget_convert_logical4_logical2
1525 (ffebld_cu_ptr_logical4 (u),
1526 ffebld_constant_logical2 (ffebld_conter (l)));
1527 break;
1528 #endif
1529
1530 #if FFETARGET_okLOGICAL3
1531 case FFEINFO_kindtypeLOGICAL3:
1532 error = ffetarget_convert_logical4_logical3
1533 (ffebld_cu_ptr_logical4 (u),
1534 ffebld_constant_logical3 (ffebld_conter (l)));
1535 break;
1536 #endif
1537
1538 default:
1539 assert ("LOGICAL4/LOGICAL bad source kind type" == NULL);
1540 break;
1541 }
1542 break;
1543
1544 case FFEINFO_basictypeINTEGER:
1545 switch (ffeinfo_kindtype (ffebld_info (l)))
1546 {
1547 #if FFETARGET_okINTEGER1
1548 case FFEINFO_kindtypeINTEGER1:
1549 error = ffetarget_convert_logical4_integer1
1550 (ffebld_cu_ptr_logical4 (u),
1551 ffebld_constant_integer1 (ffebld_conter (l)));
1552 break;
1553 #endif
1554
1555 #if FFETARGET_okINTEGER2
1556 case FFEINFO_kindtypeINTEGER2:
1557 error = ffetarget_convert_logical4_integer2
1558 (ffebld_cu_ptr_logical4 (u),
1559 ffebld_constant_integer2 (ffebld_conter (l)));
1560 break;
1561 #endif
1562
1563 #if FFETARGET_okINTEGER3
1564 case FFEINFO_kindtypeINTEGER3:
1565 error = ffetarget_convert_logical4_integer3
1566 (ffebld_cu_ptr_logical4 (u),
1567 ffebld_constant_integer3 (ffebld_conter (l)));
1568 break;
1569 #endif
1570
1571 #if FFETARGET_okINTEGER4
1572 case FFEINFO_kindtypeINTEGER4:
1573 error = ffetarget_convert_logical4_integer4
1574 (ffebld_cu_ptr_logical4 (u),
1575 ffebld_constant_integer4 (ffebld_conter (l)));
1576 break;
1577 #endif
1578
1579 default:
1580 assert ("LOGICAL4/INTEGER bad source kind type" == NULL);
1581 break;
1582 }
1583 break;
1584
1585 case FFEINFO_basictypeCHARACTER:
1586 error = ffetarget_convert_logical4_character1
1587 (ffebld_cu_ptr_logical4 (u),
1588 ffebld_constant_character1 (ffebld_conter (l)));
1589 break;
1590
1591 case FFEINFO_basictypeHOLLERITH:
1592 error = ffetarget_convert_logical4_hollerith
1593 (ffebld_cu_ptr_logical4 (u),
1594 ffebld_constant_hollerith (ffebld_conter (l)));
1595 break;
1596
1597 case FFEINFO_basictypeTYPELESS:
1598 error = ffetarget_convert_logical4_typeless
1599 (ffebld_cu_ptr_logical4 (u),
1600 ffebld_constant_typeless (ffebld_conter (l)));
1601 break;
1602
1603 default:
1604 assert ("LOGICAL4 bad type" == NULL);
1605 break;
1606 }
1607
1608 /* If conversion operation is not implemented, return original expr. */
1609 if (error == FFEBAD_NOCANDO)
1610 return expr;
1611
1612 expr = ffebld_new_conter_with_orig
1613 (ffebld_constant_new_logical4_val
1614 (ffebld_cu_val_logical4 (u)), expr);
1615 break;
1616 #endif
1617
1618 default:
1619 assert ("bad logical kind type" == NULL);
1620 break;
1621 }
1622 break;
1623
1624 case FFEINFO_basictypeREAL:
1625 sz = FFETARGET_charactersizeNONE;
1626 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
1627 {
1628 #if FFETARGET_okREAL1
1629 case FFEINFO_kindtypeREAL1:
1630 switch (ffeinfo_basictype (ffebld_info (l)))
1631 {
1632 case FFEINFO_basictypeINTEGER:
1633 switch (ffeinfo_kindtype (ffebld_info (l)))
1634 {
1635 #if FFETARGET_okINTEGER1
1636 case FFEINFO_kindtypeINTEGER1:
1637 error = ffetarget_convert_real1_integer1
1638 (ffebld_cu_ptr_real1 (u),
1639 ffebld_constant_integer1 (ffebld_conter (l)));
1640 break;
1641 #endif
1642
1643 #if FFETARGET_okINTEGER2
1644 case FFEINFO_kindtypeINTEGER2:
1645 error = ffetarget_convert_real1_integer2
1646 (ffebld_cu_ptr_real1 (u),
1647 ffebld_constant_integer2 (ffebld_conter (l)));
1648 break;
1649 #endif
1650
1651 #if FFETARGET_okINTEGER3
1652 case FFEINFO_kindtypeINTEGER3:
1653 error = ffetarget_convert_real1_integer3
1654 (ffebld_cu_ptr_real1 (u),
1655 ffebld_constant_integer3 (ffebld_conter (l)));
1656 break;
1657 #endif
1658
1659 #if FFETARGET_okINTEGER4
1660 case FFEINFO_kindtypeINTEGER4:
1661 error = ffetarget_convert_real1_integer4
1662 (ffebld_cu_ptr_real1 (u),
1663 ffebld_constant_integer4 (ffebld_conter (l)));
1664 break;
1665 #endif
1666
1667 default:
1668 assert ("REAL1/INTEGER bad source kind type" == NULL);
1669 break;
1670 }
1671 break;
1672
1673 case FFEINFO_basictypeREAL:
1674 switch (ffeinfo_kindtype (ffebld_info (l)))
1675 {
1676 #if FFETARGET_okREAL2
1677 case FFEINFO_kindtypeREAL2:
1678 error = ffetarget_convert_real1_real2
1679 (ffebld_cu_ptr_real1 (u),
1680 ffebld_constant_real2 (ffebld_conter (l)));
1681 break;
1682 #endif
1683
1684 #if FFETARGET_okREAL3
1685 case FFEINFO_kindtypeREAL3:
1686 error = ffetarget_convert_real1_real3
1687 (ffebld_cu_ptr_real1 (u),
1688 ffebld_constant_real3 (ffebld_conter (l)));
1689 break;
1690 #endif
1691
1692 default:
1693 assert ("REAL1/REAL bad source kind type" == NULL);
1694 break;
1695 }
1696 break;
1697
1698 case FFEINFO_basictypeCOMPLEX:
1699 switch (ffeinfo_kindtype (ffebld_info (l)))
1700 {
1701 #if FFETARGET_okCOMPLEX1
1702 case FFEINFO_kindtypeREAL1:
1703 error = ffetarget_convert_real1_complex1
1704 (ffebld_cu_ptr_real1 (u),
1705 ffebld_constant_complex1 (ffebld_conter (l)));
1706 break;
1707 #endif
1708
1709 #if FFETARGET_okCOMPLEX2
1710 case FFEINFO_kindtypeREAL2:
1711 error = ffetarget_convert_real1_complex2
1712 (ffebld_cu_ptr_real1 (u),
1713 ffebld_constant_complex2 (ffebld_conter (l)));
1714 break;
1715 #endif
1716
1717 #if FFETARGET_okCOMPLEX3
1718 case FFEINFO_kindtypeREAL3:
1719 error = ffetarget_convert_real1_complex3
1720 (ffebld_cu_ptr_real1 (u),
1721 ffebld_constant_complex3 (ffebld_conter (l)));
1722 break;
1723 #endif
1724
1725 default:
1726 assert ("REAL1/COMPLEX bad source kind type" == NULL);
1727 break;
1728 }
1729 break;
1730
1731 case FFEINFO_basictypeCHARACTER:
1732 error = ffetarget_convert_real1_character1
1733 (ffebld_cu_ptr_real1 (u),
1734 ffebld_constant_character1 (ffebld_conter (l)));
1735 break;
1736
1737 case FFEINFO_basictypeHOLLERITH:
1738 error = ffetarget_convert_real1_hollerith
1739 (ffebld_cu_ptr_real1 (u),
1740 ffebld_constant_hollerith (ffebld_conter (l)));
1741 break;
1742
1743 case FFEINFO_basictypeTYPELESS:
1744 error = ffetarget_convert_real1_typeless
1745 (ffebld_cu_ptr_real1 (u),
1746 ffebld_constant_typeless (ffebld_conter (l)));
1747 break;
1748
1749 default:
1750 assert ("REAL1 bad type" == NULL);
1751 break;
1752 }
1753
1754 /* If conversion operation is not implemented, return original expr. */
1755 if (error == FFEBAD_NOCANDO)
1756 return expr;
1757
1758 expr = ffebld_new_conter_with_orig
1759 (ffebld_constant_new_real1_val
1760 (ffebld_cu_val_real1 (u)), expr);
1761 break;
1762 #endif
1763
1764 #if FFETARGET_okREAL2
1765 case FFEINFO_kindtypeREAL2:
1766 switch (ffeinfo_basictype (ffebld_info (l)))
1767 {
1768 case FFEINFO_basictypeINTEGER:
1769 switch (ffeinfo_kindtype (ffebld_info (l)))
1770 {
1771 #if FFETARGET_okINTEGER1
1772 case FFEINFO_kindtypeINTEGER1:
1773 error = ffetarget_convert_real2_integer1
1774 (ffebld_cu_ptr_real2 (u),
1775 ffebld_constant_integer1 (ffebld_conter (l)));
1776 break;
1777 #endif
1778
1779 #if FFETARGET_okINTEGER2
1780 case FFEINFO_kindtypeINTEGER2:
1781 error = ffetarget_convert_real2_integer2
1782 (ffebld_cu_ptr_real2 (u),
1783 ffebld_constant_integer2 (ffebld_conter (l)));
1784 break;
1785 #endif
1786
1787 #if FFETARGET_okINTEGER3
1788 case FFEINFO_kindtypeINTEGER3:
1789 error = ffetarget_convert_real2_integer3
1790 (ffebld_cu_ptr_real2 (u),
1791 ffebld_constant_integer3 (ffebld_conter (l)));
1792 break;
1793 #endif
1794
1795 #if FFETARGET_okINTEGER4
1796 case FFEINFO_kindtypeINTEGER4:
1797 error = ffetarget_convert_real2_integer4
1798 (ffebld_cu_ptr_real2 (u),
1799 ffebld_constant_integer4 (ffebld_conter (l)));
1800 break;
1801 #endif
1802
1803 default:
1804 assert ("REAL2/INTEGER bad source kind type" == NULL);
1805 break;
1806 }
1807 break;
1808
1809 case FFEINFO_basictypeREAL:
1810 switch (ffeinfo_kindtype (ffebld_info (l)))
1811 {
1812 #if FFETARGET_okREAL1
1813 case FFEINFO_kindtypeREAL1:
1814 error = ffetarget_convert_real2_real1
1815 (ffebld_cu_ptr_real2 (u),
1816 ffebld_constant_real1 (ffebld_conter (l)));
1817 break;
1818 #endif
1819
1820 #if FFETARGET_okREAL3
1821 case FFEINFO_kindtypeREAL3:
1822 error = ffetarget_convert_real2_real3
1823 (ffebld_cu_ptr_real2 (u),
1824 ffebld_constant_real3 (ffebld_conter (l)));
1825 break;
1826 #endif
1827
1828 default:
1829 assert ("REAL2/REAL bad source kind type" == NULL);
1830 break;
1831 }
1832 break;
1833
1834 case FFEINFO_basictypeCOMPLEX:
1835 switch (ffeinfo_kindtype (ffebld_info (l)))
1836 {
1837 #if FFETARGET_okCOMPLEX1
1838 case FFEINFO_kindtypeREAL1:
1839 error = ffetarget_convert_real2_complex1
1840 (ffebld_cu_ptr_real2 (u),
1841 ffebld_constant_complex1 (ffebld_conter (l)));
1842 break;
1843 #endif
1844
1845 #if FFETARGET_okCOMPLEX2
1846 case FFEINFO_kindtypeREAL2:
1847 error = ffetarget_convert_real2_complex2
1848 (ffebld_cu_ptr_real2 (u),
1849 ffebld_constant_complex2 (ffebld_conter (l)));
1850 break;
1851 #endif
1852
1853 #if FFETARGET_okCOMPLEX3
1854 case FFEINFO_kindtypeREAL3:
1855 error = ffetarget_convert_real2_complex3
1856 (ffebld_cu_ptr_real2 (u),
1857 ffebld_constant_complex3 (ffebld_conter (l)));
1858 break;
1859 #endif
1860
1861 default:
1862 assert ("REAL2/COMPLEX bad source kind type" == NULL);
1863 break;
1864 }
1865 break;
1866
1867 case FFEINFO_basictypeCHARACTER:
1868 error = ffetarget_convert_real2_character1
1869 (ffebld_cu_ptr_real2 (u),
1870 ffebld_constant_character1 (ffebld_conter (l)));
1871 break;
1872
1873 case FFEINFO_basictypeHOLLERITH:
1874 error = ffetarget_convert_real2_hollerith
1875 (ffebld_cu_ptr_real2 (u),
1876 ffebld_constant_hollerith (ffebld_conter (l)));
1877 break;
1878
1879 case FFEINFO_basictypeTYPELESS:
1880 error = ffetarget_convert_real2_typeless
1881 (ffebld_cu_ptr_real2 (u),
1882 ffebld_constant_typeless (ffebld_conter (l)));
1883 break;
1884
1885 default:
1886 assert ("REAL2 bad type" == NULL);
1887 break;
1888 }
1889
1890 /* If conversion operation is not implemented, return original expr. */
1891 if (error == FFEBAD_NOCANDO)
1892 return expr;
1893
1894 expr = ffebld_new_conter_with_orig
1895 (ffebld_constant_new_real2_val
1896 (ffebld_cu_val_real2 (u)), expr);
1897 break;
1898 #endif
1899
1900 #if FFETARGET_okREAL3
1901 case FFEINFO_kindtypeREAL3:
1902 switch (ffeinfo_basictype (ffebld_info (l)))
1903 {
1904 case FFEINFO_basictypeINTEGER:
1905 switch (ffeinfo_kindtype (ffebld_info (l)))
1906 {
1907 #if FFETARGET_okINTEGER1
1908 case FFEINFO_kindtypeINTEGER1:
1909 error = ffetarget_convert_real3_integer1
1910 (ffebld_cu_ptr_real3 (u),
1911 ffebld_constant_integer1 (ffebld_conter (l)));
1912 break;
1913 #endif
1914
1915 #if FFETARGET_okINTEGER2
1916 case FFEINFO_kindtypeINTEGER2:
1917 error = ffetarget_convert_real3_integer2
1918 (ffebld_cu_ptr_real3 (u),
1919 ffebld_constant_integer2 (ffebld_conter (l)));
1920 break;
1921 #endif
1922
1923 #if FFETARGET_okINTEGER3
1924 case FFEINFO_kindtypeINTEGER3:
1925 error = ffetarget_convert_real3_integer3
1926 (ffebld_cu_ptr_real3 (u),
1927 ffebld_constant_integer3 (ffebld_conter (l)));
1928 break;
1929 #endif
1930
1931 #if FFETARGET_okINTEGER4
1932 case FFEINFO_kindtypeINTEGER4:
1933 error = ffetarget_convert_real3_integer4
1934 (ffebld_cu_ptr_real3 (u),
1935 ffebld_constant_integer4 (ffebld_conter (l)));
1936 break;
1937 #endif
1938
1939 default:
1940 assert ("REAL3/INTEGER bad source kind type" == NULL);
1941 break;
1942 }
1943 break;
1944
1945 case FFEINFO_basictypeREAL:
1946 switch (ffeinfo_kindtype (ffebld_info (l)))
1947 {
1948 #if FFETARGET_okREAL1
1949 case FFEINFO_kindtypeREAL1:
1950 error = ffetarget_convert_real3_real1
1951 (ffebld_cu_ptr_real3 (u),
1952 ffebld_constant_real1 (ffebld_conter (l)));
1953 break;
1954 #endif
1955
1956 #if FFETARGET_okREAL2
1957 case FFEINFO_kindtypeREAL2:
1958 error = ffetarget_convert_real3_real2
1959 (ffebld_cu_ptr_real3 (u),
1960 ffebld_constant_real2 (ffebld_conter (l)));
1961 break;
1962 #endif
1963
1964 default:
1965 assert ("REAL3/REAL bad source kind type" == NULL);
1966 break;
1967 }
1968 break;
1969
1970 case FFEINFO_basictypeCOMPLEX:
1971 switch (ffeinfo_kindtype (ffebld_info (l)))
1972 {
1973 #if FFETARGET_okCOMPLEX1
1974 case FFEINFO_kindtypeREAL1:
1975 error = ffetarget_convert_real3_complex1
1976 (ffebld_cu_ptr_real3 (u),
1977 ffebld_constant_complex1 (ffebld_conter (l)));
1978 break;
1979 #endif
1980
1981 #if FFETARGET_okCOMPLEX2
1982 case FFEINFO_kindtypeREAL2:
1983 error = ffetarget_convert_real3_complex2
1984 (ffebld_cu_ptr_real3 (u),
1985 ffebld_constant_complex2 (ffebld_conter (l)));
1986 break;
1987 #endif
1988
1989 #if FFETARGET_okCOMPLEX3
1990 case FFEINFO_kindtypeREAL3:
1991 error = ffetarget_convert_real3_complex3
1992 (ffebld_cu_ptr_real3 (u),
1993 ffebld_constant_complex3 (ffebld_conter (l)));
1994 break;
1995 #endif
1996
1997 default:
1998 assert ("REAL3/COMPLEX bad source kind type" == NULL);
1999 break;
2000 }
2001 break;
2002
2003 case FFEINFO_basictypeCHARACTER:
2004 error = ffetarget_convert_real3_character1
2005 (ffebld_cu_ptr_real3 (u),
2006 ffebld_constant_character1 (ffebld_conter (l)));
2007 break;
2008
2009 case FFEINFO_basictypeHOLLERITH:
2010 error = ffetarget_convert_real3_hollerith
2011 (ffebld_cu_ptr_real3 (u),
2012 ffebld_constant_hollerith (ffebld_conter (l)));
2013 break;
2014
2015 case FFEINFO_basictypeTYPELESS:
2016 error = ffetarget_convert_real3_typeless
2017 (ffebld_cu_ptr_real3 (u),
2018 ffebld_constant_typeless (ffebld_conter (l)));
2019 break;
2020
2021 default:
2022 assert ("REAL3 bad type" == NULL);
2023 break;
2024 }
2025
2026 /* If conversion operation is not implemented, return original expr. */
2027 if (error == FFEBAD_NOCANDO)
2028 return expr;
2029
2030 expr = ffebld_new_conter_with_orig
2031 (ffebld_constant_new_real3_val
2032 (ffebld_cu_val_real3 (u)), expr);
2033 break;
2034 #endif
2035
2036 default:
2037 assert ("bad real kind type" == NULL);
2038 break;
2039 }
2040 break;
2041
2042 case FFEINFO_basictypeCOMPLEX:
2043 sz = FFETARGET_charactersizeNONE;
2044 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2045 {
2046 #if FFETARGET_okCOMPLEX1
2047 case FFEINFO_kindtypeREAL1:
2048 switch (ffeinfo_basictype (ffebld_info (l)))
2049 {
2050 case FFEINFO_basictypeINTEGER:
2051 switch (ffeinfo_kindtype (ffebld_info (l)))
2052 {
2053 #if FFETARGET_okINTEGER1
2054 case FFEINFO_kindtypeINTEGER1:
2055 error = ffetarget_convert_complex1_integer1
2056 (ffebld_cu_ptr_complex1 (u),
2057 ffebld_constant_integer1 (ffebld_conter (l)));
2058 break;
2059 #endif
2060
2061 #if FFETARGET_okINTEGER2
2062 case FFEINFO_kindtypeINTEGER2:
2063 error = ffetarget_convert_complex1_integer2
2064 (ffebld_cu_ptr_complex1 (u),
2065 ffebld_constant_integer2 (ffebld_conter (l)));
2066 break;
2067 #endif
2068
2069 #if FFETARGET_okINTEGER3
2070 case FFEINFO_kindtypeINTEGER3:
2071 error = ffetarget_convert_complex1_integer3
2072 (ffebld_cu_ptr_complex1 (u),
2073 ffebld_constant_integer3 (ffebld_conter (l)));
2074 break;
2075 #endif
2076
2077 #if FFETARGET_okINTEGER4
2078 case FFEINFO_kindtypeINTEGER4:
2079 error = ffetarget_convert_complex1_integer4
2080 (ffebld_cu_ptr_complex1 (u),
2081 ffebld_constant_integer4 (ffebld_conter (l)));
2082 break;
2083 #endif
2084
2085 default:
2086 assert ("COMPLEX1/INTEGER bad source kind type" == NULL);
2087 break;
2088 }
2089 break;
2090
2091 case FFEINFO_basictypeREAL:
2092 switch (ffeinfo_kindtype (ffebld_info (l)))
2093 {
2094 #if FFETARGET_okREAL1
2095 case FFEINFO_kindtypeREAL1:
2096 error = ffetarget_convert_complex1_real1
2097 (ffebld_cu_ptr_complex1 (u),
2098 ffebld_constant_real1 (ffebld_conter (l)));
2099 break;
2100 #endif
2101
2102 #if FFETARGET_okREAL2
2103 case FFEINFO_kindtypeREAL2:
2104 error = ffetarget_convert_complex1_real2
2105 (ffebld_cu_ptr_complex1 (u),
2106 ffebld_constant_real2 (ffebld_conter (l)));
2107 break;
2108 #endif
2109
2110 #if FFETARGET_okREAL3
2111 case FFEINFO_kindtypeREAL3:
2112 error = ffetarget_convert_complex1_real3
2113 (ffebld_cu_ptr_complex1 (u),
2114 ffebld_constant_real3 (ffebld_conter (l)));
2115 break;
2116 #endif
2117
2118 default:
2119 assert ("COMPLEX1/REAL bad source kind type" == NULL);
2120 break;
2121 }
2122 break;
2123
2124 case FFEINFO_basictypeCOMPLEX:
2125 switch (ffeinfo_kindtype (ffebld_info (l)))
2126 {
2127 #if FFETARGET_okCOMPLEX2
2128 case FFEINFO_kindtypeREAL2:
2129 error = ffetarget_convert_complex1_complex2
2130 (ffebld_cu_ptr_complex1 (u),
2131 ffebld_constant_complex2 (ffebld_conter (l)));
2132 break;
2133 #endif
2134
2135 #if FFETARGET_okCOMPLEX3
2136 case FFEINFO_kindtypeREAL3:
2137 error = ffetarget_convert_complex1_complex3
2138 (ffebld_cu_ptr_complex1 (u),
2139 ffebld_constant_complex3 (ffebld_conter (l)));
2140 break;
2141 #endif
2142
2143 default:
2144 assert ("COMPLEX1/COMPLEX bad source kind type" == NULL);
2145 break;
2146 }
2147 break;
2148
2149 case FFEINFO_basictypeCHARACTER:
2150 error = ffetarget_convert_complex1_character1
2151 (ffebld_cu_ptr_complex1 (u),
2152 ffebld_constant_character1 (ffebld_conter (l)));
2153 break;
2154
2155 case FFEINFO_basictypeHOLLERITH:
2156 error = ffetarget_convert_complex1_hollerith
2157 (ffebld_cu_ptr_complex1 (u),
2158 ffebld_constant_hollerith (ffebld_conter (l)));
2159 break;
2160
2161 case FFEINFO_basictypeTYPELESS:
2162 error = ffetarget_convert_complex1_typeless
2163 (ffebld_cu_ptr_complex1 (u),
2164 ffebld_constant_typeless (ffebld_conter (l)));
2165 break;
2166
2167 default:
2168 assert ("COMPLEX1 bad type" == NULL);
2169 break;
2170 }
2171
2172 /* If conversion operation is not implemented, return original expr. */
2173 if (error == FFEBAD_NOCANDO)
2174 return expr;
2175
2176 expr = ffebld_new_conter_with_orig
2177 (ffebld_constant_new_complex1_val
2178 (ffebld_cu_val_complex1 (u)), expr);
2179 break;
2180 #endif
2181
2182 #if FFETARGET_okCOMPLEX2
2183 case FFEINFO_kindtypeREAL2:
2184 switch (ffeinfo_basictype (ffebld_info (l)))
2185 {
2186 case FFEINFO_basictypeINTEGER:
2187 switch (ffeinfo_kindtype (ffebld_info (l)))
2188 {
2189 #if FFETARGET_okINTEGER1
2190 case FFEINFO_kindtypeINTEGER1:
2191 error = ffetarget_convert_complex2_integer1
2192 (ffebld_cu_ptr_complex2 (u),
2193 ffebld_constant_integer1 (ffebld_conter (l)));
2194 break;
2195 #endif
2196
2197 #if FFETARGET_okINTEGER2
2198 case FFEINFO_kindtypeINTEGER2:
2199 error = ffetarget_convert_complex2_integer2
2200 (ffebld_cu_ptr_complex2 (u),
2201 ffebld_constant_integer2 (ffebld_conter (l)));
2202 break;
2203 #endif
2204
2205 #if FFETARGET_okINTEGER3
2206 case FFEINFO_kindtypeINTEGER3:
2207 error = ffetarget_convert_complex2_integer3
2208 (ffebld_cu_ptr_complex2 (u),
2209 ffebld_constant_integer3 (ffebld_conter (l)));
2210 break;
2211 #endif
2212
2213 #if FFETARGET_okINTEGER4
2214 case FFEINFO_kindtypeINTEGER4:
2215 error = ffetarget_convert_complex2_integer4
2216 (ffebld_cu_ptr_complex2 (u),
2217 ffebld_constant_integer4 (ffebld_conter (l)));
2218 break;
2219 #endif
2220
2221 default:
2222 assert ("COMPLEX2/INTEGER bad source kind type" == NULL);
2223 break;
2224 }
2225 break;
2226
2227 case FFEINFO_basictypeREAL:
2228 switch (ffeinfo_kindtype (ffebld_info (l)))
2229 {
2230 #if FFETARGET_okREAL1
2231 case FFEINFO_kindtypeREAL1:
2232 error = ffetarget_convert_complex2_real1
2233 (ffebld_cu_ptr_complex2 (u),
2234 ffebld_constant_real1 (ffebld_conter (l)));
2235 break;
2236 #endif
2237
2238 #if FFETARGET_okREAL2
2239 case FFEINFO_kindtypeREAL2:
2240 error = ffetarget_convert_complex2_real2
2241 (ffebld_cu_ptr_complex2 (u),
2242 ffebld_constant_real2 (ffebld_conter (l)));
2243 break;
2244 #endif
2245
2246 #if FFETARGET_okREAL3
2247 case FFEINFO_kindtypeREAL3:
2248 error = ffetarget_convert_complex2_real3
2249 (ffebld_cu_ptr_complex2 (u),
2250 ffebld_constant_real3 (ffebld_conter (l)));
2251 break;
2252 #endif
2253
2254 default:
2255 assert ("COMPLEX2/REAL bad source kind type" == NULL);
2256 break;
2257 }
2258 break;
2259
2260 case FFEINFO_basictypeCOMPLEX:
2261 switch (ffeinfo_kindtype (ffebld_info (l)))
2262 {
2263 #if FFETARGET_okCOMPLEX1
2264 case FFEINFO_kindtypeREAL1:
2265 error = ffetarget_convert_complex2_complex1
2266 (ffebld_cu_ptr_complex2 (u),
2267 ffebld_constant_complex1 (ffebld_conter (l)));
2268 break;
2269 #endif
2270
2271 #if FFETARGET_okCOMPLEX3
2272 case FFEINFO_kindtypeREAL3:
2273 error = ffetarget_convert_complex2_complex3
2274 (ffebld_cu_ptr_complex2 (u),
2275 ffebld_constant_complex3 (ffebld_conter (l)));
2276 break;
2277 #endif
2278
2279 default:
2280 assert ("COMPLEX2/COMPLEX bad source kind type" == NULL);
2281 break;
2282 }
2283 break;
2284
2285 case FFEINFO_basictypeCHARACTER:
2286 error = ffetarget_convert_complex2_character1
2287 (ffebld_cu_ptr_complex2 (u),
2288 ffebld_constant_character1 (ffebld_conter (l)));
2289 break;
2290
2291 case FFEINFO_basictypeHOLLERITH:
2292 error = ffetarget_convert_complex2_hollerith
2293 (ffebld_cu_ptr_complex2 (u),
2294 ffebld_constant_hollerith (ffebld_conter (l)));
2295 break;
2296
2297 case FFEINFO_basictypeTYPELESS:
2298 error = ffetarget_convert_complex2_typeless
2299 (ffebld_cu_ptr_complex2 (u),
2300 ffebld_constant_typeless (ffebld_conter (l)));
2301 break;
2302
2303 default:
2304 assert ("COMPLEX2 bad type" == NULL);
2305 break;
2306 }
2307
2308 /* If conversion operation is not implemented, return original expr. */
2309 if (error == FFEBAD_NOCANDO)
2310 return expr;
2311
2312 expr = ffebld_new_conter_with_orig
2313 (ffebld_constant_new_complex2_val
2314 (ffebld_cu_val_complex2 (u)), expr);
2315 break;
2316 #endif
2317
2318 #if FFETARGET_okCOMPLEX3
2319 case FFEINFO_kindtypeREAL3:
2320 switch (ffeinfo_basictype (ffebld_info (l)))
2321 {
2322 case FFEINFO_basictypeINTEGER:
2323 switch (ffeinfo_kindtype (ffebld_info (l)))
2324 {
2325 #if FFETARGET_okINTEGER1
2326 case FFEINFO_kindtypeINTEGER1:
2327 error = ffetarget_convert_complex3_integer1
2328 (ffebld_cu_ptr_complex3 (u),
2329 ffebld_constant_integer1 (ffebld_conter (l)));
2330 break;
2331 #endif
2332
2333 #if FFETARGET_okINTEGER2
2334 case FFEINFO_kindtypeINTEGER2:
2335 error = ffetarget_convert_complex3_integer2
2336 (ffebld_cu_ptr_complex3 (u),
2337 ffebld_constant_integer2 (ffebld_conter (l)));
2338 break;
2339 #endif
2340
2341 #if FFETARGET_okINTEGER3
2342 case FFEINFO_kindtypeINTEGER3:
2343 error = ffetarget_convert_complex3_integer3
2344 (ffebld_cu_ptr_complex3 (u),
2345 ffebld_constant_integer3 (ffebld_conter (l)));
2346 break;
2347 #endif
2348
2349 #if FFETARGET_okINTEGER4
2350 case FFEINFO_kindtypeINTEGER4:
2351 error = ffetarget_convert_complex3_integer4
2352 (ffebld_cu_ptr_complex3 (u),
2353 ffebld_constant_integer4 (ffebld_conter (l)));
2354 break;
2355 #endif
2356
2357 default:
2358 assert ("COMPLEX3/INTEGER bad source kind type" == NULL);
2359 break;
2360 }
2361 break;
2362
2363 case FFEINFO_basictypeREAL:
2364 switch (ffeinfo_kindtype (ffebld_info (l)))
2365 {
2366 #if FFETARGET_okREAL1
2367 case FFEINFO_kindtypeREAL1:
2368 error = ffetarget_convert_complex3_real1
2369 (ffebld_cu_ptr_complex3 (u),
2370 ffebld_constant_real1 (ffebld_conter (l)));
2371 break;
2372 #endif
2373
2374 #if FFETARGET_okREAL2
2375 case FFEINFO_kindtypeREAL2:
2376 error = ffetarget_convert_complex3_real2
2377 (ffebld_cu_ptr_complex3 (u),
2378 ffebld_constant_real2 (ffebld_conter (l)));
2379 break;
2380 #endif
2381
2382 #if FFETARGET_okREAL3
2383 case FFEINFO_kindtypeREAL3:
2384 error = ffetarget_convert_complex3_real3
2385 (ffebld_cu_ptr_complex3 (u),
2386 ffebld_constant_real3 (ffebld_conter (l)));
2387 break;
2388 #endif
2389
2390 default:
2391 assert ("COMPLEX3/REAL bad source kind type" == NULL);
2392 break;
2393 }
2394 break;
2395
2396 case FFEINFO_basictypeCOMPLEX:
2397 switch (ffeinfo_kindtype (ffebld_info (l)))
2398 {
2399 #if FFETARGET_okCOMPLEX1
2400 case FFEINFO_kindtypeREAL1:
2401 error = ffetarget_convert_complex3_complex1
2402 (ffebld_cu_ptr_complex3 (u),
2403 ffebld_constant_complex1 (ffebld_conter (l)));
2404 break;
2405 #endif
2406
2407 #if FFETARGET_okCOMPLEX2
2408 case FFEINFO_kindtypeREAL2:
2409 error = ffetarget_convert_complex3_complex2
2410 (ffebld_cu_ptr_complex3 (u),
2411 ffebld_constant_complex2 (ffebld_conter (l)));
2412 break;
2413 #endif
2414
2415 default:
2416 assert ("COMPLEX3/COMPLEX bad source kind type" == NULL);
2417 break;
2418 }
2419 break;
2420
2421 case FFEINFO_basictypeCHARACTER:
2422 error = ffetarget_convert_complex3_character1
2423 (ffebld_cu_ptr_complex3 (u),
2424 ffebld_constant_character1 (ffebld_conter (l)));
2425 break;
2426
2427 case FFEINFO_basictypeHOLLERITH:
2428 error = ffetarget_convert_complex3_hollerith
2429 (ffebld_cu_ptr_complex3 (u),
2430 ffebld_constant_hollerith (ffebld_conter (l)));
2431 break;
2432
2433 case FFEINFO_basictypeTYPELESS:
2434 error = ffetarget_convert_complex3_typeless
2435 (ffebld_cu_ptr_complex3 (u),
2436 ffebld_constant_typeless (ffebld_conter (l)));
2437 break;
2438
2439 default:
2440 assert ("COMPLEX3 bad type" == NULL);
2441 break;
2442 }
2443
2444 /* If conversion operation is not implemented, return original expr. */
2445 if (error == FFEBAD_NOCANDO)
2446 return expr;
2447
2448 expr = ffebld_new_conter_with_orig
2449 (ffebld_constant_new_complex3_val
2450 (ffebld_cu_val_complex3 (u)), expr);
2451 break;
2452 #endif
2453
2454 default:
2455 assert ("bad complex kind type" == NULL);
2456 break;
2457 }
2458 break;
2459
2460 case FFEINFO_basictypeCHARACTER:
2461 if ((sz = ffebld_size (expr)) == FFETARGET_charactersizeNONE)
2462 return expr;
2463 kt = ffeinfo_kindtype (ffebld_info (expr));
2464 switch (kt)
2465 {
2466 #if FFETARGET_okCHARACTER1
2467 case FFEINFO_kindtypeCHARACTER1:
2468 switch (ffeinfo_basictype (ffebld_info (l)))
2469 {
2470 case FFEINFO_basictypeCHARACTER:
2471 if ((sz2 = ffebld_size (l)) == FFETARGET_charactersizeNONE)
2472 return expr;
2473 assert (kt == ffeinfo_kindtype (ffebld_info (l)));
2474 assert (sz2 == ffetarget_length_character1
2475 (ffebld_constant_character1
2476 (ffebld_conter (l))));
2477 error
2478 = ffetarget_convert_character1_character1
2479 (ffebld_cu_ptr_character1 (u), sz,
2480 ffebld_constant_character1 (ffebld_conter (l)),
2481 ffebld_constant_pool ());
2482 break;
2483
2484 case FFEINFO_basictypeINTEGER:
2485 switch (ffeinfo_kindtype (ffebld_info (l)))
2486 {
2487 #if FFETARGET_okINTEGER1
2488 case FFEINFO_kindtypeINTEGER1:
2489 error
2490 = ffetarget_convert_character1_integer1
2491 (ffebld_cu_ptr_character1 (u),
2492 sz,
2493 ffebld_constant_integer1 (ffebld_conter (l)),
2494 ffebld_constant_pool ());
2495 break;
2496 #endif
2497
2498 #if FFETARGET_okINTEGER2
2499 case FFEINFO_kindtypeINTEGER2:
2500 error
2501 = ffetarget_convert_character1_integer2
2502 (ffebld_cu_ptr_character1 (u),
2503 sz,
2504 ffebld_constant_integer2 (ffebld_conter (l)),
2505 ffebld_constant_pool ());
2506 break;
2507 #endif
2508
2509 #if FFETARGET_okINTEGER3
2510 case FFEINFO_kindtypeINTEGER3:
2511 error
2512 = ffetarget_convert_character1_integer3
2513 (ffebld_cu_ptr_character1 (u),
2514 sz,
2515 ffebld_constant_integer3 (ffebld_conter (l)),
2516 ffebld_constant_pool ());
2517 break;
2518 #endif
2519
2520 #if FFETARGET_okINTEGER4
2521 case FFEINFO_kindtypeINTEGER4:
2522 error
2523 = ffetarget_convert_character1_integer4
2524 (ffebld_cu_ptr_character1 (u),
2525 sz,
2526 ffebld_constant_integer4 (ffebld_conter (l)),
2527 ffebld_constant_pool ());
2528 break;
2529 #endif
2530
2531 default:
2532 assert ("CHARACTER1/INTEGER bad source kind type" == NULL);
2533 break;
2534 }
2535 break;
2536
2537 case FFEINFO_basictypeLOGICAL:
2538 switch (ffeinfo_kindtype (ffebld_info (l)))
2539 {
2540 #if FFETARGET_okLOGICAL1
2541 case FFEINFO_kindtypeLOGICAL1:
2542 error
2543 = ffetarget_convert_character1_logical1
2544 (ffebld_cu_ptr_character1 (u),
2545 sz,
2546 ffebld_constant_logical1 (ffebld_conter (l)),
2547 ffebld_constant_pool ());
2548 break;
2549 #endif
2550
2551 #if FFETARGET_okLOGICAL2
2552 case FFEINFO_kindtypeLOGICAL2:
2553 error
2554 = ffetarget_convert_character1_logical2
2555 (ffebld_cu_ptr_character1 (u),
2556 sz,
2557 ffebld_constant_logical2 (ffebld_conter (l)),
2558 ffebld_constant_pool ());
2559 break;
2560 #endif
2561
2562 #if FFETARGET_okLOGICAL3
2563 case FFEINFO_kindtypeLOGICAL3:
2564 error
2565 = ffetarget_convert_character1_logical3
2566 (ffebld_cu_ptr_character1 (u),
2567 sz,
2568 ffebld_constant_logical3 (ffebld_conter (l)),
2569 ffebld_constant_pool ());
2570 break;
2571 #endif
2572
2573 #if FFETARGET_okLOGICAL4
2574 case FFEINFO_kindtypeLOGICAL4:
2575 error
2576 = ffetarget_convert_character1_logical4
2577 (ffebld_cu_ptr_character1 (u),
2578 sz,
2579 ffebld_constant_logical4 (ffebld_conter (l)),
2580 ffebld_constant_pool ());
2581 break;
2582 #endif
2583
2584 default:
2585 assert ("CHARACTER1/LOGICAL bad source kind type" == NULL);
2586 break;
2587 }
2588 break;
2589
2590 case FFEINFO_basictypeHOLLERITH:
2591 error
2592 = ffetarget_convert_character1_hollerith
2593 (ffebld_cu_ptr_character1 (u),
2594 sz,
2595 ffebld_constant_hollerith (ffebld_conter (l)),
2596 ffebld_constant_pool ());
2597 break;
2598
2599 case FFEINFO_basictypeTYPELESS:
2600 error
2601 = ffetarget_convert_character1_typeless
2602 (ffebld_cu_ptr_character1 (u),
2603 sz,
2604 ffebld_constant_typeless (ffebld_conter (l)),
2605 ffebld_constant_pool ());
2606 break;
2607
2608 default:
2609 assert ("CHARACTER1 bad type" == NULL);
2610 }
2611
2612 expr
2613 = ffebld_new_conter_with_orig
2614 (ffebld_constant_new_character1_val
2615 (ffebld_cu_val_character1 (u)),
2616 expr);
2617 break;
2618 #endif
2619
2620 default:
2621 assert ("bad character kind type" == NULL);
2622 break;
2623 }
2624 break;
2625
2626 default:
2627 assert ("bad type" == NULL);
2628 return expr;
2629 }
2630
2631 ffebld_set_info (expr, ffeinfo_new
2632 (bt,
2633 kt,
2634 0,
2635 FFEINFO_kindENTITY,
2636 FFEINFO_whereCONSTANT,
2637 sz));
2638
2639 if ((error != FFEBAD)
2640 && ffebad_start (error))
2641 {
2642 assert (t != NULL);
2643 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
2644 ffebad_finish ();
2645 }
2646
2647 return expr;
2648 }
2649
2650 /* ffeexpr_collapse_paren -- Collapse paren expr
2651
2652 ffebld expr;
2653 ffelexToken token;
2654 expr = ffeexpr_collapse_paren(expr,token);
2655
2656 If the result of the expr is a constant, replaces the expr with the
2657 computed constant. */
2658
2659 ffebld
2660 ffeexpr_collapse_paren (ffebld expr, ffelexToken t UNUSED)
2661 {
2662 ffebld r;
2663 ffeinfoBasictype bt;
2664 ffeinfoKindtype kt;
2665 ffetargetCharacterSize len;
2666
2667 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
2668 return expr;
2669
2670 r = ffebld_left (expr);
2671
2672 if (ffebld_op (r) != FFEBLD_opCONTER)
2673 return expr;
2674
2675 bt = ffeinfo_basictype (ffebld_info (r));
2676 kt = ffeinfo_kindtype (ffebld_info (r));
2677 len = ffebld_size (r);
2678
2679 expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
2680 expr);
2681
2682 ffebld_set_info (expr, ffeinfo_new
2683 (bt,
2684 kt,
2685 0,
2686 FFEINFO_kindENTITY,
2687 FFEINFO_whereCONSTANT,
2688 len));
2689
2690 return expr;
2691 }
2692
2693 /* ffeexpr_collapse_uplus -- Collapse uplus expr
2694
2695 ffebld expr;
2696 ffelexToken token;
2697 expr = ffeexpr_collapse_uplus(expr,token);
2698
2699 If the result of the expr is a constant, replaces the expr with the
2700 computed constant. */
2701
2702 ffebld
2703 ffeexpr_collapse_uplus (ffebld expr, ffelexToken t UNUSED)
2704 {
2705 ffebld r;
2706 ffeinfoBasictype bt;
2707 ffeinfoKindtype kt;
2708 ffetargetCharacterSize len;
2709
2710 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
2711 return expr;
2712
2713 r = ffebld_left (expr);
2714
2715 if (ffebld_op (r) != FFEBLD_opCONTER)
2716 return expr;
2717
2718 bt = ffeinfo_basictype (ffebld_info (r));
2719 kt = ffeinfo_kindtype (ffebld_info (r));
2720 len = ffebld_size (r);
2721
2722 expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
2723 expr);
2724
2725 ffebld_set_info (expr, ffeinfo_new
2726 (bt,
2727 kt,
2728 0,
2729 FFEINFO_kindENTITY,
2730 FFEINFO_whereCONSTANT,
2731 len));
2732
2733 return expr;
2734 }
2735
2736 /* ffeexpr_collapse_uminus -- Collapse uminus expr
2737
2738 ffebld expr;
2739 ffelexToken token;
2740 expr = ffeexpr_collapse_uminus(expr,token);
2741
2742 If the result of the expr is a constant, replaces the expr with the
2743 computed constant. */
2744
2745 ffebld
2746 ffeexpr_collapse_uminus (ffebld expr, ffelexToken t)
2747 {
2748 ffebad error = FFEBAD;
2749 ffebld r;
2750 ffebldConstantUnion u;
2751 ffeinfoBasictype bt;
2752 ffeinfoKindtype kt;
2753
2754 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
2755 return expr;
2756
2757 r = ffebld_left (expr);
2758
2759 if (ffebld_op (r) != FFEBLD_opCONTER)
2760 return expr;
2761
2762 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
2763 {
2764 case FFEINFO_basictypeANY:
2765 return expr;
2766
2767 case FFEINFO_basictypeINTEGER:
2768 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2769 {
2770 #if FFETARGET_okINTEGER1
2771 case FFEINFO_kindtypeINTEGER1:
2772 error = ffetarget_uminus_integer1 (ffebld_cu_ptr_integer1 (u),
2773 ffebld_constant_integer1 (ffebld_conter (r)));
2774 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
2775 (ffebld_cu_val_integer1 (u)), expr);
2776 break;
2777 #endif
2778
2779 #if FFETARGET_okINTEGER2
2780 case FFEINFO_kindtypeINTEGER2:
2781 error = ffetarget_uminus_integer2 (ffebld_cu_ptr_integer2 (u),
2782 ffebld_constant_integer2 (ffebld_conter (r)));
2783 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
2784 (ffebld_cu_val_integer2 (u)), expr);
2785 break;
2786 #endif
2787
2788 #if FFETARGET_okINTEGER3
2789 case FFEINFO_kindtypeINTEGER3:
2790 error = ffetarget_uminus_integer3 (ffebld_cu_ptr_integer3 (u),
2791 ffebld_constant_integer3 (ffebld_conter (r)));
2792 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
2793 (ffebld_cu_val_integer3 (u)), expr);
2794 break;
2795 #endif
2796
2797 #if FFETARGET_okINTEGER4
2798 case FFEINFO_kindtypeINTEGER4:
2799 error = ffetarget_uminus_integer4 (ffebld_cu_ptr_integer4 (u),
2800 ffebld_constant_integer4 (ffebld_conter (r)));
2801 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
2802 (ffebld_cu_val_integer4 (u)), expr);
2803 break;
2804 #endif
2805
2806 default:
2807 assert ("bad integer kind type" == NULL);
2808 break;
2809 }
2810 break;
2811
2812 case FFEINFO_basictypeREAL:
2813 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2814 {
2815 #if FFETARGET_okREAL1
2816 case FFEINFO_kindtypeREAL1:
2817 error = ffetarget_uminus_real1 (ffebld_cu_ptr_real1 (u),
2818 ffebld_constant_real1 (ffebld_conter (r)));
2819 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
2820 (ffebld_cu_val_real1 (u)), expr);
2821 break;
2822 #endif
2823
2824 #if FFETARGET_okREAL2
2825 case FFEINFO_kindtypeREAL2:
2826 error = ffetarget_uminus_real2 (ffebld_cu_ptr_real2 (u),
2827 ffebld_constant_real2 (ffebld_conter (r)));
2828 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
2829 (ffebld_cu_val_real2 (u)), expr);
2830 break;
2831 #endif
2832
2833 #if FFETARGET_okREAL3
2834 case FFEINFO_kindtypeREAL3:
2835 error = ffetarget_uminus_real3 (ffebld_cu_ptr_real3 (u),
2836 ffebld_constant_real3 (ffebld_conter (r)));
2837 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
2838 (ffebld_cu_val_real3 (u)), expr);
2839 break;
2840 #endif
2841
2842 default:
2843 assert ("bad real kind type" == NULL);
2844 break;
2845 }
2846 break;
2847
2848 case FFEINFO_basictypeCOMPLEX:
2849 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2850 {
2851 #if FFETARGET_okCOMPLEX1
2852 case FFEINFO_kindtypeREAL1:
2853 error = ffetarget_uminus_complex1 (ffebld_cu_ptr_complex1 (u),
2854 ffebld_constant_complex1 (ffebld_conter (r)));
2855 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
2856 (ffebld_cu_val_complex1 (u)), expr);
2857 break;
2858 #endif
2859
2860 #if FFETARGET_okCOMPLEX2
2861 case FFEINFO_kindtypeREAL2:
2862 error = ffetarget_uminus_complex2 (ffebld_cu_ptr_complex2 (u),
2863 ffebld_constant_complex2 (ffebld_conter (r)));
2864 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
2865 (ffebld_cu_val_complex2 (u)), expr);
2866 break;
2867 #endif
2868
2869 #if FFETARGET_okCOMPLEX3
2870 case FFEINFO_kindtypeREAL3:
2871 error = ffetarget_uminus_complex3 (ffebld_cu_ptr_complex3 (u),
2872 ffebld_constant_complex3 (ffebld_conter (r)));
2873 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
2874 (ffebld_cu_val_complex3 (u)), expr);
2875 break;
2876 #endif
2877
2878 default:
2879 assert ("bad complex kind type" == NULL);
2880 break;
2881 }
2882 break;
2883
2884 default:
2885 assert ("bad type" == NULL);
2886 return expr;
2887 }
2888
2889 ffebld_set_info (expr, ffeinfo_new
2890 (bt,
2891 kt,
2892 0,
2893 FFEINFO_kindENTITY,
2894 FFEINFO_whereCONSTANT,
2895 FFETARGET_charactersizeNONE));
2896
2897 if ((error != FFEBAD)
2898 && ffebad_start (error))
2899 {
2900 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
2901 ffebad_finish ();
2902 }
2903
2904 return expr;
2905 }
2906
2907 /* ffeexpr_collapse_not -- Collapse not expr
2908
2909 ffebld expr;
2910 ffelexToken token;
2911 expr = ffeexpr_collapse_not(expr,token);
2912
2913 If the result of the expr is a constant, replaces the expr with the
2914 computed constant. */
2915
2916 ffebld
2917 ffeexpr_collapse_not (ffebld expr, ffelexToken t)
2918 {
2919 ffebad error = FFEBAD;
2920 ffebld r;
2921 ffebldConstantUnion u;
2922 ffeinfoBasictype bt;
2923 ffeinfoKindtype kt;
2924
2925 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
2926 return expr;
2927
2928 r = ffebld_left (expr);
2929
2930 if (ffebld_op (r) != FFEBLD_opCONTER)
2931 return expr;
2932
2933 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
2934 {
2935 case FFEINFO_basictypeANY:
2936 return expr;
2937
2938 case FFEINFO_basictypeINTEGER:
2939 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2940 {
2941 #if FFETARGET_okINTEGER1
2942 case FFEINFO_kindtypeINTEGER1:
2943 error = ffetarget_not_integer1 (ffebld_cu_ptr_integer1 (u),
2944 ffebld_constant_integer1 (ffebld_conter (r)));
2945 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
2946 (ffebld_cu_val_integer1 (u)), expr);
2947 break;
2948 #endif
2949
2950 #if FFETARGET_okINTEGER2
2951 case FFEINFO_kindtypeINTEGER2:
2952 error = ffetarget_not_integer2 (ffebld_cu_ptr_integer2 (u),
2953 ffebld_constant_integer2 (ffebld_conter (r)));
2954 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
2955 (ffebld_cu_val_integer2 (u)), expr);
2956 break;
2957 #endif
2958
2959 #if FFETARGET_okINTEGER3
2960 case FFEINFO_kindtypeINTEGER3:
2961 error = ffetarget_not_integer3 (ffebld_cu_ptr_integer3 (u),
2962 ffebld_constant_integer3 (ffebld_conter (r)));
2963 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
2964 (ffebld_cu_val_integer3 (u)), expr);
2965 break;
2966 #endif
2967
2968 #if FFETARGET_okINTEGER4
2969 case FFEINFO_kindtypeINTEGER4:
2970 error = ffetarget_not_integer4 (ffebld_cu_ptr_integer4 (u),
2971 ffebld_constant_integer4 (ffebld_conter (r)));
2972 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
2973 (ffebld_cu_val_integer4 (u)), expr);
2974 break;
2975 #endif
2976
2977 default:
2978 assert ("bad integer kind type" == NULL);
2979 break;
2980 }
2981 break;
2982
2983 case FFEINFO_basictypeLOGICAL:
2984 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
2985 {
2986 #if FFETARGET_okLOGICAL1
2987 case FFEINFO_kindtypeLOGICAL1:
2988 error = ffetarget_not_logical1 (ffebld_cu_ptr_logical1 (u),
2989 ffebld_constant_logical1 (ffebld_conter (r)));
2990 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
2991 (ffebld_cu_val_logical1 (u)), expr);
2992 break;
2993 #endif
2994
2995 #if FFETARGET_okLOGICAL2
2996 case FFEINFO_kindtypeLOGICAL2:
2997 error = ffetarget_not_logical2 (ffebld_cu_ptr_logical2 (u),
2998 ffebld_constant_logical2 (ffebld_conter (r)));
2999 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
3000 (ffebld_cu_val_logical2 (u)), expr);
3001 break;
3002 #endif
3003
3004 #if FFETARGET_okLOGICAL3
3005 case FFEINFO_kindtypeLOGICAL3:
3006 error = ffetarget_not_logical3 (ffebld_cu_ptr_logical3 (u),
3007 ffebld_constant_logical3 (ffebld_conter (r)));
3008 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
3009 (ffebld_cu_val_logical3 (u)), expr);
3010 break;
3011 #endif
3012
3013 #if FFETARGET_okLOGICAL4
3014 case FFEINFO_kindtypeLOGICAL4:
3015 error = ffetarget_not_logical4 (ffebld_cu_ptr_logical4 (u),
3016 ffebld_constant_logical4 (ffebld_conter (r)));
3017 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
3018 (ffebld_cu_val_logical4 (u)), expr);
3019 break;
3020 #endif
3021
3022 default:
3023 assert ("bad logical kind type" == NULL);
3024 break;
3025 }
3026 break;
3027
3028 default:
3029 assert ("bad type" == NULL);
3030 return expr;
3031 }
3032
3033 ffebld_set_info (expr, ffeinfo_new
3034 (bt,
3035 kt,
3036 0,
3037 FFEINFO_kindENTITY,
3038 FFEINFO_whereCONSTANT,
3039 FFETARGET_charactersizeNONE));
3040
3041 if ((error != FFEBAD)
3042 && ffebad_start (error))
3043 {
3044 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
3045 ffebad_finish ();
3046 }
3047
3048 return expr;
3049 }
3050
3051 /* ffeexpr_collapse_add -- Collapse add expr
3052
3053 ffebld expr;
3054 ffelexToken token;
3055 expr = ffeexpr_collapse_add(expr,token);
3056
3057 If the result of the expr is a constant, replaces the expr with the
3058 computed constant. */
3059
3060 ffebld
3061 ffeexpr_collapse_add (ffebld expr, ffelexToken t)
3062 {
3063 ffebad error = FFEBAD;
3064 ffebld l;
3065 ffebld r;
3066 ffebldConstantUnion u;
3067 ffeinfoBasictype bt;
3068 ffeinfoKindtype kt;
3069
3070 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3071 return expr;
3072
3073 l = ffebld_left (expr);
3074 r = ffebld_right (expr);
3075
3076 if (ffebld_op (l) != FFEBLD_opCONTER)
3077 return expr;
3078 if (ffebld_op (r) != FFEBLD_opCONTER)
3079 return expr;
3080
3081 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
3082 {
3083 case FFEINFO_basictypeANY:
3084 return expr;
3085
3086 case FFEINFO_basictypeINTEGER:
3087 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3088 {
3089 #if FFETARGET_okINTEGER1
3090 case FFEINFO_kindtypeINTEGER1:
3091 error = ffetarget_add_integer1 (ffebld_cu_ptr_integer1 (u),
3092 ffebld_constant_integer1 (ffebld_conter (l)),
3093 ffebld_constant_integer1 (ffebld_conter (r)));
3094 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3095 (ffebld_cu_val_integer1 (u)), expr);
3096 break;
3097 #endif
3098
3099 #if FFETARGET_okINTEGER2
3100 case FFEINFO_kindtypeINTEGER2:
3101 error = ffetarget_add_integer2 (ffebld_cu_ptr_integer2 (u),
3102 ffebld_constant_integer2 (ffebld_conter (l)),
3103 ffebld_constant_integer2 (ffebld_conter (r)));
3104 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3105 (ffebld_cu_val_integer2 (u)), expr);
3106 break;
3107 #endif
3108
3109 #if FFETARGET_okINTEGER3
3110 case FFEINFO_kindtypeINTEGER3:
3111 error = ffetarget_add_integer3 (ffebld_cu_ptr_integer3 (u),
3112 ffebld_constant_integer3 (ffebld_conter (l)),
3113 ffebld_constant_integer3 (ffebld_conter (r)));
3114 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3115 (ffebld_cu_val_integer3 (u)), expr);
3116 break;
3117 #endif
3118
3119 #if FFETARGET_okINTEGER4
3120 case FFEINFO_kindtypeINTEGER4:
3121 error = ffetarget_add_integer4 (ffebld_cu_ptr_integer4 (u),
3122 ffebld_constant_integer4 (ffebld_conter (l)),
3123 ffebld_constant_integer4 (ffebld_conter (r)));
3124 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3125 (ffebld_cu_val_integer4 (u)), expr);
3126 break;
3127 #endif
3128
3129 default:
3130 assert ("bad integer kind type" == NULL);
3131 break;
3132 }
3133 break;
3134
3135 case FFEINFO_basictypeREAL:
3136 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3137 {
3138 #if FFETARGET_okREAL1
3139 case FFEINFO_kindtypeREAL1:
3140 error = ffetarget_add_real1 (ffebld_cu_ptr_real1 (u),
3141 ffebld_constant_real1 (ffebld_conter (l)),
3142 ffebld_constant_real1 (ffebld_conter (r)));
3143 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3144 (ffebld_cu_val_real1 (u)), expr);
3145 break;
3146 #endif
3147
3148 #if FFETARGET_okREAL2
3149 case FFEINFO_kindtypeREAL2:
3150 error = ffetarget_add_real2 (ffebld_cu_ptr_real2 (u),
3151 ffebld_constant_real2 (ffebld_conter (l)),
3152 ffebld_constant_real2 (ffebld_conter (r)));
3153 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3154 (ffebld_cu_val_real2 (u)), expr);
3155 break;
3156 #endif
3157
3158 #if FFETARGET_okREAL3
3159 case FFEINFO_kindtypeREAL3:
3160 error = ffetarget_add_real3 (ffebld_cu_ptr_real3 (u),
3161 ffebld_constant_real3 (ffebld_conter (l)),
3162 ffebld_constant_real3 (ffebld_conter (r)));
3163 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3164 (ffebld_cu_val_real3 (u)), expr);
3165 break;
3166 #endif
3167
3168 default:
3169 assert ("bad real kind type" == NULL);
3170 break;
3171 }
3172 break;
3173
3174 case FFEINFO_basictypeCOMPLEX:
3175 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3176 {
3177 #if FFETARGET_okCOMPLEX1
3178 case FFEINFO_kindtypeREAL1:
3179 error = ffetarget_add_complex1 (ffebld_cu_ptr_complex1 (u),
3180 ffebld_constant_complex1 (ffebld_conter (l)),
3181 ffebld_constant_complex1 (ffebld_conter (r)));
3182 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3183 (ffebld_cu_val_complex1 (u)), expr);
3184 break;
3185 #endif
3186
3187 #if FFETARGET_okCOMPLEX2
3188 case FFEINFO_kindtypeREAL2:
3189 error = ffetarget_add_complex2 (ffebld_cu_ptr_complex2 (u),
3190 ffebld_constant_complex2 (ffebld_conter (l)),
3191 ffebld_constant_complex2 (ffebld_conter (r)));
3192 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3193 (ffebld_cu_val_complex2 (u)), expr);
3194 break;
3195 #endif
3196
3197 #if FFETARGET_okCOMPLEX3
3198 case FFEINFO_kindtypeREAL3:
3199 error = ffetarget_add_complex3 (ffebld_cu_ptr_complex3 (u),
3200 ffebld_constant_complex3 (ffebld_conter (l)),
3201 ffebld_constant_complex3 (ffebld_conter (r)));
3202 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3203 (ffebld_cu_val_complex3 (u)), expr);
3204 break;
3205 #endif
3206
3207 default:
3208 assert ("bad complex kind type" == NULL);
3209 break;
3210 }
3211 break;
3212
3213 default:
3214 assert ("bad type" == NULL);
3215 return expr;
3216 }
3217
3218 ffebld_set_info (expr, ffeinfo_new
3219 (bt,
3220 kt,
3221 0,
3222 FFEINFO_kindENTITY,
3223 FFEINFO_whereCONSTANT,
3224 FFETARGET_charactersizeNONE));
3225
3226 if ((error != FFEBAD)
3227 && ffebad_start (error))
3228 {
3229 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
3230 ffebad_finish ();
3231 }
3232
3233 return expr;
3234 }
3235
3236 /* ffeexpr_collapse_subtract -- Collapse subtract expr
3237
3238 ffebld expr;
3239 ffelexToken token;
3240 expr = ffeexpr_collapse_subtract(expr,token);
3241
3242 If the result of the expr is a constant, replaces the expr with the
3243 computed constant. */
3244
3245 ffebld
3246 ffeexpr_collapse_subtract (ffebld expr, ffelexToken t)
3247 {
3248 ffebad error = FFEBAD;
3249 ffebld l;
3250 ffebld r;
3251 ffebldConstantUnion u;
3252 ffeinfoBasictype bt;
3253 ffeinfoKindtype kt;
3254
3255 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3256 return expr;
3257
3258 l = ffebld_left (expr);
3259 r = ffebld_right (expr);
3260
3261 if (ffebld_op (l) != FFEBLD_opCONTER)
3262 return expr;
3263 if (ffebld_op (r) != FFEBLD_opCONTER)
3264 return expr;
3265
3266 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
3267 {
3268 case FFEINFO_basictypeANY:
3269 return expr;
3270
3271 case FFEINFO_basictypeINTEGER:
3272 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3273 {
3274 #if FFETARGET_okINTEGER1
3275 case FFEINFO_kindtypeINTEGER1:
3276 error = ffetarget_subtract_integer1 (ffebld_cu_ptr_integer1 (u),
3277 ffebld_constant_integer1 (ffebld_conter (l)),
3278 ffebld_constant_integer1 (ffebld_conter (r)));
3279 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3280 (ffebld_cu_val_integer1 (u)), expr);
3281 break;
3282 #endif
3283
3284 #if FFETARGET_okINTEGER2
3285 case FFEINFO_kindtypeINTEGER2:
3286 error = ffetarget_subtract_integer2 (ffebld_cu_ptr_integer2 (u),
3287 ffebld_constant_integer2 (ffebld_conter (l)),
3288 ffebld_constant_integer2 (ffebld_conter (r)));
3289 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3290 (ffebld_cu_val_integer2 (u)), expr);
3291 break;
3292 #endif
3293
3294 #if FFETARGET_okINTEGER3
3295 case FFEINFO_kindtypeINTEGER3:
3296 error = ffetarget_subtract_integer3 (ffebld_cu_ptr_integer3 (u),
3297 ffebld_constant_integer3 (ffebld_conter (l)),
3298 ffebld_constant_integer3 (ffebld_conter (r)));
3299 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3300 (ffebld_cu_val_integer3 (u)), expr);
3301 break;
3302 #endif
3303
3304 #if FFETARGET_okINTEGER4
3305 case FFEINFO_kindtypeINTEGER4:
3306 error = ffetarget_subtract_integer4 (ffebld_cu_ptr_integer4 (u),
3307 ffebld_constant_integer4 (ffebld_conter (l)),
3308 ffebld_constant_integer4 (ffebld_conter (r)));
3309 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3310 (ffebld_cu_val_integer4 (u)), expr);
3311 break;
3312 #endif
3313
3314 default:
3315 assert ("bad integer kind type" == NULL);
3316 break;
3317 }
3318 break;
3319
3320 case FFEINFO_basictypeREAL:
3321 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3322 {
3323 #if FFETARGET_okREAL1
3324 case FFEINFO_kindtypeREAL1:
3325 error = ffetarget_subtract_real1 (ffebld_cu_ptr_real1 (u),
3326 ffebld_constant_real1 (ffebld_conter (l)),
3327 ffebld_constant_real1 (ffebld_conter (r)));
3328 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3329 (ffebld_cu_val_real1 (u)), expr);
3330 break;
3331 #endif
3332
3333 #if FFETARGET_okREAL2
3334 case FFEINFO_kindtypeREAL2:
3335 error = ffetarget_subtract_real2 (ffebld_cu_ptr_real2 (u),
3336 ffebld_constant_real2 (ffebld_conter (l)),
3337 ffebld_constant_real2 (ffebld_conter (r)));
3338 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3339 (ffebld_cu_val_real2 (u)), expr);
3340 break;
3341 #endif
3342
3343 #if FFETARGET_okREAL3
3344 case FFEINFO_kindtypeREAL3:
3345 error = ffetarget_subtract_real3 (ffebld_cu_ptr_real3 (u),
3346 ffebld_constant_real3 (ffebld_conter (l)),
3347 ffebld_constant_real3 (ffebld_conter (r)));
3348 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3349 (ffebld_cu_val_real3 (u)), expr);
3350 break;
3351 #endif
3352
3353 default:
3354 assert ("bad real kind type" == NULL);
3355 break;
3356 }
3357 break;
3358
3359 case FFEINFO_basictypeCOMPLEX:
3360 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3361 {
3362 #if FFETARGET_okCOMPLEX1
3363 case FFEINFO_kindtypeREAL1:
3364 error = ffetarget_subtract_complex1 (ffebld_cu_ptr_complex1 (u),
3365 ffebld_constant_complex1 (ffebld_conter (l)),
3366 ffebld_constant_complex1 (ffebld_conter (r)));
3367 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3368 (ffebld_cu_val_complex1 (u)), expr);
3369 break;
3370 #endif
3371
3372 #if FFETARGET_okCOMPLEX2
3373 case FFEINFO_kindtypeREAL2:
3374 error = ffetarget_subtract_complex2 (ffebld_cu_ptr_complex2 (u),
3375 ffebld_constant_complex2 (ffebld_conter (l)),
3376 ffebld_constant_complex2 (ffebld_conter (r)));
3377 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3378 (ffebld_cu_val_complex2 (u)), expr);
3379 break;
3380 #endif
3381
3382 #if FFETARGET_okCOMPLEX3
3383 case FFEINFO_kindtypeREAL3:
3384 error = ffetarget_subtract_complex3 (ffebld_cu_ptr_complex3 (u),
3385 ffebld_constant_complex3 (ffebld_conter (l)),
3386 ffebld_constant_complex3 (ffebld_conter (r)));
3387 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3388 (ffebld_cu_val_complex3 (u)), expr);
3389 break;
3390 #endif
3391
3392 default:
3393 assert ("bad complex kind type" == NULL);
3394 break;
3395 }
3396 break;
3397
3398 default:
3399 assert ("bad type" == NULL);
3400 return expr;
3401 }
3402
3403 ffebld_set_info (expr, ffeinfo_new
3404 (bt,
3405 kt,
3406 0,
3407 FFEINFO_kindENTITY,
3408 FFEINFO_whereCONSTANT,
3409 FFETARGET_charactersizeNONE));
3410
3411 if ((error != FFEBAD)
3412 && ffebad_start (error))
3413 {
3414 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
3415 ffebad_finish ();
3416 }
3417
3418 return expr;
3419 }
3420
3421 /* ffeexpr_collapse_multiply -- Collapse multiply expr
3422
3423 ffebld expr;
3424 ffelexToken token;
3425 expr = ffeexpr_collapse_multiply(expr,token);
3426
3427 If the result of the expr is a constant, replaces the expr with the
3428 computed constant. */
3429
3430 ffebld
3431 ffeexpr_collapse_multiply (ffebld expr, ffelexToken t)
3432 {
3433 ffebad error = FFEBAD;
3434 ffebld l;
3435 ffebld r;
3436 ffebldConstantUnion u;
3437 ffeinfoBasictype bt;
3438 ffeinfoKindtype kt;
3439
3440 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3441 return expr;
3442
3443 l = ffebld_left (expr);
3444 r = ffebld_right (expr);
3445
3446 if (ffebld_op (l) != FFEBLD_opCONTER)
3447 return expr;
3448 if (ffebld_op (r) != FFEBLD_opCONTER)
3449 return expr;
3450
3451 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
3452 {
3453 case FFEINFO_basictypeANY:
3454 return expr;
3455
3456 case FFEINFO_basictypeINTEGER:
3457 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3458 {
3459 #if FFETARGET_okINTEGER1
3460 case FFEINFO_kindtypeINTEGER1:
3461 error = ffetarget_multiply_integer1 (ffebld_cu_ptr_integer1 (u),
3462 ffebld_constant_integer1 (ffebld_conter (l)),
3463 ffebld_constant_integer1 (ffebld_conter (r)));
3464 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3465 (ffebld_cu_val_integer1 (u)), expr);
3466 break;
3467 #endif
3468
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
3479 #if FFETARGET_okINTEGER3
3480 case FFEINFO_kindtypeINTEGER3:
3481 error = ffetarget_multiply_integer3 (ffebld_cu_ptr_integer3 (u),
3482 ffebld_constant_integer3 (ffebld_conter (l)),
3483 ffebld_constant_integer3 (ffebld_conter (r)));
3484 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3485 (ffebld_cu_val_integer3 (u)), expr);
3486 break;
3487 #endif
3488
3489 #if FFETARGET_okINTEGER4
3490 case FFEINFO_kindtypeINTEGER4:
3491 error = ffetarget_multiply_integer4 (ffebld_cu_ptr_integer4 (u),
3492 ffebld_constant_integer4 (ffebld_conter (l)),
3493 ffebld_constant_integer4 (ffebld_conter (r)));
3494 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3495 (ffebld_cu_val_integer4 (u)), expr);
3496 break;
3497 #endif
3498
3499 default:
3500 assert ("bad integer kind type" == NULL);
3501 break;
3502 }
3503 break;
3504
3505 case FFEINFO_basictypeREAL:
3506 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3507 {
3508 #if FFETARGET_okREAL1
3509 case FFEINFO_kindtypeREAL1:
3510 error = ffetarget_multiply_real1 (ffebld_cu_ptr_real1 (u),
3511 ffebld_constant_real1 (ffebld_conter (l)),
3512 ffebld_constant_real1 (ffebld_conter (r)));
3513 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3514 (ffebld_cu_val_real1 (u)), expr);
3515 break;
3516 #endif
3517
3518 #if FFETARGET_okREAL2
3519 case FFEINFO_kindtypeREAL2:
3520 error = ffetarget_multiply_real2 (ffebld_cu_ptr_real2 (u),
3521 ffebld_constant_real2 (ffebld_conter (l)),
3522 ffebld_constant_real2 (ffebld_conter (r)));
3523 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3524 (ffebld_cu_val_real2 (u)), expr);
3525 break;
3526 #endif
3527
3528 #if FFETARGET_okREAL3
3529 case FFEINFO_kindtypeREAL3:
3530 error = ffetarget_multiply_real3 (ffebld_cu_ptr_real3 (u),
3531 ffebld_constant_real3 (ffebld_conter (l)),
3532 ffebld_constant_real3 (ffebld_conter (r)));
3533 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3534 (ffebld_cu_val_real3 (u)), expr);
3535 break;
3536 #endif
3537
3538 default:
3539 assert ("bad real kind type" == NULL);
3540 break;
3541 }
3542 break;
3543
3544 case FFEINFO_basictypeCOMPLEX:
3545 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3546 {
3547 #if FFETARGET_okCOMPLEX1
3548 case FFEINFO_kindtypeREAL1:
3549 error = ffetarget_multiply_complex1 (ffebld_cu_ptr_complex1 (u),
3550 ffebld_constant_complex1 (ffebld_conter (l)),
3551 ffebld_constant_complex1 (ffebld_conter (r)));
3552 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3553 (ffebld_cu_val_complex1 (u)), expr);
3554 break;
3555 #endif
3556
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
3567 #if FFETARGET_okCOMPLEX3
3568 case FFEINFO_kindtypeREAL3:
3569 error = ffetarget_multiply_complex3 (ffebld_cu_ptr_complex3 (u),
3570 ffebld_constant_complex3 (ffebld_conter (l)),
3571 ffebld_constant_complex3 (ffebld_conter (r)));
3572 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3573 (ffebld_cu_val_complex3 (u)), expr);
3574 break;
3575 #endif
3576
3577 default:
3578 assert ("bad complex kind type" == NULL);
3579 break;
3580 }
3581 break;
3582
3583 default:
3584 assert ("bad type" == NULL);
3585 return expr;
3586 }
3587
3588 ffebld_set_info (expr, ffeinfo_new
3589 (bt,
3590 kt,
3591 0,
3592 FFEINFO_kindENTITY,
3593 FFEINFO_whereCONSTANT,
3594 FFETARGET_charactersizeNONE));
3595
3596 if ((error != FFEBAD)
3597 && ffebad_start (error))
3598 {
3599 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
3600 ffebad_finish ();
3601 }
3602
3603 return expr;
3604 }
3605
3606 /* ffeexpr_collapse_divide -- Collapse divide expr
3607
3608 ffebld expr;
3609 ffelexToken token;
3610 expr = ffeexpr_collapse_divide(expr,token);
3611
3612 If the result of the expr is a constant, replaces the expr with the
3613 computed constant. */
3614
3615 ffebld
3616 ffeexpr_collapse_divide (ffebld expr, ffelexToken t)
3617 {
3618 ffebad error = FFEBAD;
3619 ffebld l;
3620 ffebld r;
3621 ffebldConstantUnion u;
3622 ffeinfoBasictype bt;
3623 ffeinfoKindtype kt;
3624
3625 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3626 return expr;
3627
3628 l = ffebld_left (expr);
3629 r = ffebld_right (expr);
3630
3631 if (ffebld_op (l) != FFEBLD_opCONTER)
3632 return expr;
3633 if (ffebld_op (r) != FFEBLD_opCONTER)
3634 return expr;
3635
3636 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
3637 {
3638 case FFEINFO_basictypeANY:
3639 return expr;
3640
3641 case FFEINFO_basictypeINTEGER:
3642 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3643 {
3644 #if FFETARGET_okINTEGER1
3645 case FFEINFO_kindtypeINTEGER1:
3646 error = ffetarget_divide_integer1 (ffebld_cu_ptr_integer1 (u),
3647 ffebld_constant_integer1 (ffebld_conter (l)),
3648 ffebld_constant_integer1 (ffebld_conter (r)));
3649 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3650 (ffebld_cu_val_integer1 (u)), expr);
3651 break;
3652 #endif
3653
3654 #if FFETARGET_okINTEGER2
3655 case FFEINFO_kindtypeINTEGER2:
3656 error = ffetarget_divide_integer2 (ffebld_cu_ptr_integer2 (u),
3657 ffebld_constant_integer2 (ffebld_conter (l)),
3658 ffebld_constant_integer2 (ffebld_conter (r)));
3659 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3660 (ffebld_cu_val_integer2 (u)), expr);
3661 break;
3662 #endif
3663
3664 #if FFETARGET_okINTEGER3
3665 case FFEINFO_kindtypeINTEGER3:
3666 error = ffetarget_divide_integer3 (ffebld_cu_ptr_integer3 (u),
3667 ffebld_constant_integer3 (ffebld_conter (l)),
3668 ffebld_constant_integer3 (ffebld_conter (r)));
3669 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3670 (ffebld_cu_val_integer3 (u)), expr);
3671 break;
3672 #endif
3673
3674 #if FFETARGET_okINTEGER4
3675 case FFEINFO_kindtypeINTEGER4:
3676 error = ffetarget_divide_integer4 (ffebld_cu_ptr_integer4 (u),
3677 ffebld_constant_integer4 (ffebld_conter (l)),
3678 ffebld_constant_integer4 (ffebld_conter (r)));
3679 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3680 (ffebld_cu_val_integer4 (u)), expr);
3681 break;
3682 #endif
3683
3684 default:
3685 assert ("bad integer kind type" == NULL);
3686 break;
3687 }
3688 break;
3689
3690 case FFEINFO_basictypeREAL:
3691 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3692 {
3693 #if FFETARGET_okREAL1
3694 case FFEINFO_kindtypeREAL1:
3695 error = ffetarget_divide_real1 (ffebld_cu_ptr_real1 (u),
3696 ffebld_constant_real1 (ffebld_conter (l)),
3697 ffebld_constant_real1 (ffebld_conter (r)));
3698 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3699 (ffebld_cu_val_real1 (u)), expr);
3700 break;
3701 #endif
3702
3703 #if FFETARGET_okREAL2
3704 case FFEINFO_kindtypeREAL2:
3705 error = ffetarget_divide_real2 (ffebld_cu_ptr_real2 (u),
3706 ffebld_constant_real2 (ffebld_conter (l)),
3707 ffebld_constant_real2 (ffebld_conter (r)));
3708 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3709 (ffebld_cu_val_real2 (u)), expr);
3710 break;
3711 #endif
3712
3713 #if FFETARGET_okREAL3
3714 case FFEINFO_kindtypeREAL3:
3715 error = ffetarget_divide_real3 (ffebld_cu_ptr_real3 (u),
3716 ffebld_constant_real3 (ffebld_conter (l)),
3717 ffebld_constant_real3 (ffebld_conter (r)));
3718 expr = ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3719 (ffebld_cu_val_real3 (u)), expr);
3720 break;
3721 #endif
3722
3723 default:
3724 assert ("bad real kind type" == NULL);
3725 break;
3726 }
3727 break;
3728
3729 case FFEINFO_basictypeCOMPLEX:
3730 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3731 {
3732 #if FFETARGET_okCOMPLEX1
3733 case FFEINFO_kindtypeREAL1:
3734 error = ffetarget_divide_complex1 (ffebld_cu_ptr_complex1 (u),
3735 ffebld_constant_complex1 (ffebld_conter (l)),
3736 ffebld_constant_complex1 (ffebld_conter (r)));
3737 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3738 (ffebld_cu_val_complex1 (u)), expr);
3739 break;
3740 #endif
3741
3742 #if FFETARGET_okCOMPLEX2
3743 case FFEINFO_kindtypeREAL2:
3744 error = ffetarget_divide_complex2 (ffebld_cu_ptr_complex2 (u),
3745 ffebld_constant_complex2 (ffebld_conter (l)),
3746 ffebld_constant_complex2 (ffebld_conter (r)));
3747 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3748 (ffebld_cu_val_complex2 (u)), expr);
3749 break;
3750 #endif
3751
3752 #if FFETARGET_okCOMPLEX3
3753 case FFEINFO_kindtypeREAL3:
3754 error = ffetarget_divide_complex3 (ffebld_cu_ptr_complex3 (u),
3755 ffebld_constant_complex3 (ffebld_conter (l)),
3756 ffebld_constant_complex3 (ffebld_conter (r)));
3757 expr = ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3758 (ffebld_cu_val_complex3 (u)), expr);
3759 break;
3760 #endif
3761
3762 default:
3763 assert ("bad complex kind type" == NULL);
3764 break;
3765 }
3766 break;
3767
3768 default:
3769 assert ("bad type" == NULL);
3770 return expr;
3771 }
3772
3773 ffebld_set_info (expr, ffeinfo_new
3774 (bt,
3775 kt,
3776 0,
3777 FFEINFO_kindENTITY,
3778 FFEINFO_whereCONSTANT,
3779 FFETARGET_charactersizeNONE));
3780
3781 if ((error != FFEBAD)
3782 && ffebad_start (error))
3783 {
3784 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
3785 ffebad_finish ();
3786 }
3787
3788 return expr;
3789 }
3790
3791 /* ffeexpr_collapse_power -- Collapse power expr
3792
3793 ffebld expr;
3794 ffelexToken token;
3795 expr = ffeexpr_collapse_power(expr,token);
3796
3797 If the result of the expr is a constant, replaces the expr with the
3798 computed constant. */
3799
3800 ffebld
3801 ffeexpr_collapse_power (ffebld expr, ffelexToken t)
3802 {
3803 ffebad error = FFEBAD;
3804 ffebld l;
3805 ffebld r;
3806 ffebldConstantUnion u;
3807 ffeinfoBasictype bt;
3808 ffeinfoKindtype kt;
3809
3810 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3811 return expr;
3812
3813 l = ffebld_left (expr);
3814 r = ffebld_right (expr);
3815
3816 if (ffebld_op (l) != FFEBLD_opCONTER)
3817 return expr;
3818 if (ffebld_op (r) != FFEBLD_opCONTER)
3819 return expr;
3820
3821 if ((ffeinfo_basictype (ffebld_info (r)) != FFEINFO_basictypeINTEGER)
3822 || (ffeinfo_kindtype (ffebld_info (r)) != FFEINFO_kindtypeINTEGERDEFAULT))
3823 return expr;
3824
3825 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
3826 {
3827 case FFEINFO_basictypeANY:
3828 return expr;
3829
3830 case FFEINFO_basictypeINTEGER:
3831 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3832 {
3833 case FFEINFO_kindtypeINTEGERDEFAULT:
3834 error = ffetarget_power_integerdefault_integerdefault
3835 (ffebld_cu_ptr_integerdefault (u),
3836 ffebld_constant_integerdefault (ffebld_conter (l)),
3837 ffebld_constant_integerdefault (ffebld_conter (r)));
3838 expr = ffebld_new_conter_with_orig
3839 (ffebld_constant_new_integerdefault_val
3840 (ffebld_cu_val_integerdefault (u)), expr);
3841 break;
3842
3843 default:
3844 assert ("bad integer kind type" == NULL);
3845 break;
3846 }
3847 break;
3848
3849 case FFEINFO_basictypeREAL:
3850 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3851 {
3852 case FFEINFO_kindtypeREALDEFAULT:
3853 error = ffetarget_power_realdefault_integerdefault
3854 (ffebld_cu_ptr_realdefault (u),
3855 ffebld_constant_realdefault (ffebld_conter (l)),
3856 ffebld_constant_integerdefault (ffebld_conter (r)));
3857 expr = ffebld_new_conter_with_orig
3858 (ffebld_constant_new_realdefault_val
3859 (ffebld_cu_val_realdefault (u)), expr);
3860 break;
3861
3862 case FFEINFO_kindtypeREALDOUBLE:
3863 error = ffetarget_power_realdouble_integerdefault
3864 (ffebld_cu_ptr_realdouble (u),
3865 ffebld_constant_realdouble (ffebld_conter (l)),
3866 ffebld_constant_integerdefault (ffebld_conter (r)));
3867 expr = ffebld_new_conter_with_orig
3868 (ffebld_constant_new_realdouble_val
3869 (ffebld_cu_val_realdouble (u)), expr);
3870 break;
3871
3872 #if FFETARGET_okREALQUAD
3873 case FFEINFO_kindtypeREALQUAD:
3874 error = ffetarget_power_realquad_integerdefault
3875 (ffebld_cu_ptr_realquad (u),
3876 ffebld_constant_realquad (ffebld_conter (l)),
3877 ffebld_constant_integerdefault (ffebld_conter (r)));
3878 expr = ffebld_new_conter_with_orig
3879 (ffebld_constant_new_realquad_val
3880 (ffebld_cu_val_realquad (u)), expr);
3881 break;
3882 #endif
3883 default:
3884 assert ("bad real kind type" == NULL);
3885 break;
3886 }
3887 break;
3888
3889 case FFEINFO_basictypeCOMPLEX:
3890 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3891 {
3892 case FFEINFO_kindtypeREALDEFAULT:
3893 error = ffetarget_power_complexdefault_integerdefault
3894 (ffebld_cu_ptr_complexdefault (u),
3895 ffebld_constant_complexdefault (ffebld_conter (l)),
3896 ffebld_constant_integerdefault (ffebld_conter (r)));
3897 expr = ffebld_new_conter_with_orig
3898 (ffebld_constant_new_complexdefault_val
3899 (ffebld_cu_val_complexdefault (u)), expr);
3900 break;
3901
3902 #if FFETARGET_okCOMPLEXDOUBLE
3903 case FFEINFO_kindtypeREALDOUBLE:
3904 error = ffetarget_power_complexdouble_integerdefault
3905 (ffebld_cu_ptr_complexdouble (u),
3906 ffebld_constant_complexdouble (ffebld_conter (l)),
3907 ffebld_constant_integerdefault (ffebld_conter (r)));
3908 expr = ffebld_new_conter_with_orig
3909 (ffebld_constant_new_complexdouble_val
3910 (ffebld_cu_val_complexdouble (u)), expr);
3911 break;
3912 #endif
3913
3914 #if FFETARGET_okCOMPLEXQUAD
3915 case FFEINFO_kindtypeREALQUAD:
3916 error = ffetarget_power_complexquad_integerdefault
3917 (ffebld_cu_ptr_complexquad (u),
3918 ffebld_constant_complexquad (ffebld_conter (l)),
3919 ffebld_constant_integerdefault (ffebld_conter (r)));
3920 expr = ffebld_new_conter_with_orig
3921 (ffebld_constant_new_complexquad_val
3922 (ffebld_cu_val_complexquad (u)), expr);
3923 break;
3924 #endif
3925
3926 default:
3927 assert ("bad complex kind type" == NULL);
3928 break;
3929 }
3930 break;
3931
3932 default:
3933 assert ("bad type" == NULL);
3934 return expr;
3935 }
3936
3937 ffebld_set_info (expr, ffeinfo_new
3938 (bt,
3939 kt,
3940 0,
3941 FFEINFO_kindENTITY,
3942 FFEINFO_whereCONSTANT,
3943 FFETARGET_charactersizeNONE));
3944
3945 if ((error != FFEBAD)
3946 && ffebad_start (error))
3947 {
3948 ffebad_here (0, ffelex_token_where_line (t),
3949 ffelex_token_where_column (t));
3950 ffebad_finish ();
3951 }
3952
3953 return expr;
3954 }
3955
3956 /* ffeexpr_collapse_concatenate -- Collapse concatenate expr
3957
3958 ffebld expr;
3959 ffelexToken token;
3960 expr = ffeexpr_collapse_concatenate(expr,token);
3961
3962 If the result of the expr is a constant, replaces the expr with the
3963 computed constant. */
3964
3965 ffebld
3966 ffeexpr_collapse_concatenate (ffebld expr, ffelexToken t)
3967 {
3968 ffebad error = FFEBAD;
3969 ffebld l;
3970 ffebld r;
3971 ffebldConstantUnion u;
3972 ffeinfoKindtype kt;
3973 ffetargetCharacterSize len;
3974
3975 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
3976 return expr;
3977
3978 l = ffebld_left (expr);
3979 r = ffebld_right (expr);
3980
3981 if (ffebld_op (l) != FFEBLD_opCONTER)
3982 return expr;
3983 if (ffebld_op (r) != FFEBLD_opCONTER)
3984 return expr;
3985
3986 switch (ffeinfo_basictype (ffebld_info (expr)))
3987 {
3988 case FFEINFO_basictypeANY:
3989 return expr;
3990
3991 case FFEINFO_basictypeCHARACTER:
3992 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
3993 {
3994 #if FFETARGET_okCHARACTER1
3995 case FFEINFO_kindtypeCHARACTER1:
3996 error = ffetarget_concatenate_character1 (ffebld_cu_ptr_character1 (u),
3997 ffebld_constant_character1 (ffebld_conter (l)),
3998 ffebld_constant_character1 (ffebld_conter (r)),
3999 ffebld_constant_pool (), &len);
4000 expr = ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
4001 (ffebld_cu_val_character1 (u)), expr);
4002 break;
4003 #endif
4004
4005 default:
4006 assert ("bad character kind type" == NULL);
4007 break;
4008 }
4009 break;
4010
4011 default:
4012 assert ("bad type" == NULL);
4013 return expr;
4014 }
4015
4016 ffebld_set_info (expr, ffeinfo_new
4017 (FFEINFO_basictypeCHARACTER,
4018 kt,
4019 0,
4020 FFEINFO_kindENTITY,
4021 FFEINFO_whereCONSTANT,
4022 len));
4023
4024 if ((error != FFEBAD)
4025 && ffebad_start (error))
4026 {
4027 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4028 ffebad_finish ();
4029 }
4030
4031 return expr;
4032 }
4033
4034 /* ffeexpr_collapse_eq -- Collapse eq expr
4035
4036 ffebld expr;
4037 ffelexToken token;
4038 expr = ffeexpr_collapse_eq(expr,token);
4039
4040 If the result of the expr is a constant, replaces the expr with the
4041 computed constant. */
4042
4043 ffebld
4044 ffeexpr_collapse_eq (ffebld expr, ffelexToken t)
4045 {
4046 ffebad error = FFEBAD;
4047 ffebld l;
4048 ffebld r;
4049 bool val;
4050
4051 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4052 return expr;
4053
4054 l = ffebld_left (expr);
4055 r = ffebld_right (expr);
4056
4057 if (ffebld_op (l) != FFEBLD_opCONTER)
4058 return expr;
4059 if (ffebld_op (r) != FFEBLD_opCONTER)
4060 return expr;
4061
4062 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4063 {
4064 case FFEINFO_basictypeANY:
4065 return expr;
4066
4067 case FFEINFO_basictypeINTEGER:
4068 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4069 {
4070 #if FFETARGET_okINTEGER1
4071 case FFEINFO_kindtypeINTEGER1:
4072 error = ffetarget_eq_integer1 (&val,
4073 ffebld_constant_integer1 (ffebld_conter (l)),
4074 ffebld_constant_integer1 (ffebld_conter (r)));
4075 expr = ffebld_new_conter_with_orig
4076 (ffebld_constant_new_logicaldefault (val), expr);
4077 break;
4078 #endif
4079
4080 #if FFETARGET_okINTEGER2
4081 case FFEINFO_kindtypeINTEGER2:
4082 error = ffetarget_eq_integer2 (&val,
4083 ffebld_constant_integer2 (ffebld_conter (l)),
4084 ffebld_constant_integer2 (ffebld_conter (r)));
4085 expr = ffebld_new_conter_with_orig
4086 (ffebld_constant_new_logicaldefault (val), expr);
4087 break;
4088 #endif
4089
4090 #if FFETARGET_okINTEGER3
4091 case FFEINFO_kindtypeINTEGER3:
4092 error = ffetarget_eq_integer3 (&val,
4093 ffebld_constant_integer3 (ffebld_conter (l)),
4094 ffebld_constant_integer3 (ffebld_conter (r)));
4095 expr = ffebld_new_conter_with_orig
4096 (ffebld_constant_new_logicaldefault (val), expr);
4097 break;
4098 #endif
4099
4100 #if FFETARGET_okINTEGER4
4101 case FFEINFO_kindtypeINTEGER4:
4102 error = ffetarget_eq_integer4 (&val,
4103 ffebld_constant_integer4 (ffebld_conter (l)),
4104 ffebld_constant_integer4 (ffebld_conter (r)));
4105 expr = ffebld_new_conter_with_orig
4106 (ffebld_constant_new_logicaldefault (val), expr);
4107 break;
4108 #endif
4109
4110 default:
4111 assert ("bad integer kind type" == NULL);
4112 break;
4113 }
4114 break;
4115
4116 case FFEINFO_basictypeREAL:
4117 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4118 {
4119 #if FFETARGET_okREAL1
4120 case FFEINFO_kindtypeREAL1:
4121 error = ffetarget_eq_real1 (&val,
4122 ffebld_constant_real1 (ffebld_conter (l)),
4123 ffebld_constant_real1 (ffebld_conter (r)));
4124 expr = ffebld_new_conter_with_orig
4125 (ffebld_constant_new_logicaldefault (val), expr);
4126 break;
4127 #endif
4128
4129 #if FFETARGET_okREAL2
4130 case FFEINFO_kindtypeREAL2:
4131 error = ffetarget_eq_real2 (&val,
4132 ffebld_constant_real2 (ffebld_conter (l)),
4133 ffebld_constant_real2 (ffebld_conter (r)));
4134 expr = ffebld_new_conter_with_orig
4135 (ffebld_constant_new_logicaldefault (val), expr);
4136 break;
4137 #endif
4138
4139 #if FFETARGET_okREAL3
4140 case FFEINFO_kindtypeREAL3:
4141 error = ffetarget_eq_real3 (&val,
4142 ffebld_constant_real3 (ffebld_conter (l)),
4143 ffebld_constant_real3 (ffebld_conter (r)));
4144 expr = ffebld_new_conter_with_orig
4145 (ffebld_constant_new_logicaldefault (val), expr);
4146 break;
4147 #endif
4148
4149 default:
4150 assert ("bad real kind type" == NULL);
4151 break;
4152 }
4153 break;
4154
4155 case FFEINFO_basictypeCOMPLEX:
4156 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4157 {
4158 #if FFETARGET_okCOMPLEX1
4159 case FFEINFO_kindtypeREAL1:
4160 error = ffetarget_eq_complex1 (&val,
4161 ffebld_constant_complex1 (ffebld_conter (l)),
4162 ffebld_constant_complex1 (ffebld_conter (r)));
4163 expr = ffebld_new_conter_with_orig
4164 (ffebld_constant_new_logicaldefault (val), expr);
4165 break;
4166 #endif
4167
4168 #if FFETARGET_okCOMPLEX2
4169 case FFEINFO_kindtypeREAL2:
4170 error = ffetarget_eq_complex2 (&val,
4171 ffebld_constant_complex2 (ffebld_conter (l)),
4172 ffebld_constant_complex2 (ffebld_conter (r)));
4173 expr = ffebld_new_conter_with_orig
4174 (ffebld_constant_new_logicaldefault (val), expr);
4175 break;
4176 #endif
4177
4178 #if FFETARGET_okCOMPLEX3
4179 case FFEINFO_kindtypeREAL3:
4180 error = ffetarget_eq_complex3 (&val,
4181 ffebld_constant_complex3 (ffebld_conter (l)),
4182 ffebld_constant_complex3 (ffebld_conter (r)));
4183 expr = ffebld_new_conter_with_orig
4184 (ffebld_constant_new_logicaldefault (val), expr);
4185 break;
4186 #endif
4187
4188 default:
4189 assert ("bad complex kind type" == NULL);
4190 break;
4191 }
4192 break;
4193
4194 case FFEINFO_basictypeCHARACTER:
4195 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4196 {
4197 #if FFETARGET_okCHARACTER1
4198 case FFEINFO_kindtypeCHARACTER1:
4199 error = ffetarget_eq_character1 (&val,
4200 ffebld_constant_character1 (ffebld_conter (l)),
4201 ffebld_constant_character1 (ffebld_conter (r)));
4202 expr = ffebld_new_conter_with_orig
4203 (ffebld_constant_new_logicaldefault (val), expr);
4204 break;
4205 #endif
4206
4207 default:
4208 assert ("bad character kind type" == NULL);
4209 break;
4210 }
4211 break;
4212
4213 default:
4214 assert ("bad type" == NULL);
4215 return expr;
4216 }
4217
4218 ffebld_set_info (expr, ffeinfo_new
4219 (FFEINFO_basictypeLOGICAL,
4220 FFEINFO_kindtypeLOGICALDEFAULT,
4221 0,
4222 FFEINFO_kindENTITY,
4223 FFEINFO_whereCONSTANT,
4224 FFETARGET_charactersizeNONE));
4225
4226 if ((error != FFEBAD)
4227 && ffebad_start (error))
4228 {
4229 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4230 ffebad_finish ();
4231 }
4232
4233 return expr;
4234 }
4235
4236 /* ffeexpr_collapse_ne -- Collapse ne expr
4237
4238 ffebld expr;
4239 ffelexToken token;
4240 expr = ffeexpr_collapse_ne(expr,token);
4241
4242 If the result of the expr is a constant, replaces the expr with the
4243 computed constant. */
4244
4245 ffebld
4246 ffeexpr_collapse_ne (ffebld expr, ffelexToken t)
4247 {
4248 ffebad error = FFEBAD;
4249 ffebld l;
4250 ffebld r;
4251 bool val;
4252
4253 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4254 return expr;
4255
4256 l = ffebld_left (expr);
4257 r = ffebld_right (expr);
4258
4259 if (ffebld_op (l) != FFEBLD_opCONTER)
4260 return expr;
4261 if (ffebld_op (r) != FFEBLD_opCONTER)
4262 return expr;
4263
4264 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4265 {
4266 case FFEINFO_basictypeANY:
4267 return expr;
4268
4269 case FFEINFO_basictypeINTEGER:
4270 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4271 {
4272 #if FFETARGET_okINTEGER1
4273 case FFEINFO_kindtypeINTEGER1:
4274 error = ffetarget_ne_integer1 (&val,
4275 ffebld_constant_integer1 (ffebld_conter (l)),
4276 ffebld_constant_integer1 (ffebld_conter (r)));
4277 expr = ffebld_new_conter_with_orig
4278 (ffebld_constant_new_logicaldefault (val), expr);
4279 break;
4280 #endif
4281
4282 #if FFETARGET_okINTEGER2
4283 case FFEINFO_kindtypeINTEGER2:
4284 error = ffetarget_ne_integer2 (&val,
4285 ffebld_constant_integer2 (ffebld_conter (l)),
4286 ffebld_constant_integer2 (ffebld_conter (r)));
4287 expr = ffebld_new_conter_with_orig
4288 (ffebld_constant_new_logicaldefault (val), expr);
4289 break;
4290 #endif
4291
4292 #if FFETARGET_okINTEGER3
4293 case FFEINFO_kindtypeINTEGER3:
4294 error = ffetarget_ne_integer3 (&val,
4295 ffebld_constant_integer3 (ffebld_conter (l)),
4296 ffebld_constant_integer3 (ffebld_conter (r)));
4297 expr = ffebld_new_conter_with_orig
4298 (ffebld_constant_new_logicaldefault (val), expr);
4299 break;
4300 #endif
4301
4302 #if FFETARGET_okINTEGER4
4303 case FFEINFO_kindtypeINTEGER4:
4304 error = ffetarget_ne_integer4 (&val,
4305 ffebld_constant_integer4 (ffebld_conter (l)),
4306 ffebld_constant_integer4 (ffebld_conter (r)));
4307 expr = ffebld_new_conter_with_orig
4308 (ffebld_constant_new_logicaldefault (val), expr);
4309 break;
4310 #endif
4311
4312 default:
4313 assert ("bad integer kind type" == NULL);
4314 break;
4315 }
4316 break;
4317
4318 case FFEINFO_basictypeREAL:
4319 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4320 {
4321 #if FFETARGET_okREAL1
4322 case FFEINFO_kindtypeREAL1:
4323 error = ffetarget_ne_real1 (&val,
4324 ffebld_constant_real1 (ffebld_conter (l)),
4325 ffebld_constant_real1 (ffebld_conter (r)));
4326 expr = ffebld_new_conter_with_orig
4327 (ffebld_constant_new_logicaldefault (val), expr);
4328 break;
4329 #endif
4330
4331 #if FFETARGET_okREAL2
4332 case FFEINFO_kindtypeREAL2:
4333 error = ffetarget_ne_real2 (&val,
4334 ffebld_constant_real2 (ffebld_conter (l)),
4335 ffebld_constant_real2 (ffebld_conter (r)));
4336 expr = ffebld_new_conter_with_orig
4337 (ffebld_constant_new_logicaldefault (val), expr);
4338 break;
4339 #endif
4340
4341 #if FFETARGET_okREAL3
4342 case FFEINFO_kindtypeREAL3:
4343 error = ffetarget_ne_real3 (&val,
4344 ffebld_constant_real3 (ffebld_conter (l)),
4345 ffebld_constant_real3 (ffebld_conter (r)));
4346 expr = ffebld_new_conter_with_orig
4347 (ffebld_constant_new_logicaldefault (val), expr);
4348 break;
4349 #endif
4350
4351 default:
4352 assert ("bad real kind type" == NULL);
4353 break;
4354 }
4355 break;
4356
4357 case FFEINFO_basictypeCOMPLEX:
4358 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4359 {
4360 #if FFETARGET_okCOMPLEX1
4361 case FFEINFO_kindtypeREAL1:
4362 error = ffetarget_ne_complex1 (&val,
4363 ffebld_constant_complex1 (ffebld_conter (l)),
4364 ffebld_constant_complex1 (ffebld_conter (r)));
4365 expr = ffebld_new_conter_with_orig
4366 (ffebld_constant_new_logicaldefault (val), expr);
4367 break;
4368 #endif
4369
4370 #if FFETARGET_okCOMPLEX2
4371 case FFEINFO_kindtypeREAL2:
4372 error = ffetarget_ne_complex2 (&val,
4373 ffebld_constant_complex2 (ffebld_conter (l)),
4374 ffebld_constant_complex2 (ffebld_conter (r)));
4375 expr = ffebld_new_conter_with_orig
4376 (ffebld_constant_new_logicaldefault (val), expr);
4377 break;
4378 #endif
4379
4380 #if FFETARGET_okCOMPLEX3
4381 case FFEINFO_kindtypeREAL3:
4382 error = ffetarget_ne_complex3 (&val,
4383 ffebld_constant_complex3 (ffebld_conter (l)),
4384 ffebld_constant_complex3 (ffebld_conter (r)));
4385 expr = ffebld_new_conter_with_orig
4386 (ffebld_constant_new_logicaldefault (val), expr);
4387 break;
4388 #endif
4389
4390 default:
4391 assert ("bad complex kind type" == NULL);
4392 break;
4393 }
4394 break;
4395
4396 case FFEINFO_basictypeCHARACTER:
4397 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4398 {
4399 #if FFETARGET_okCHARACTER1
4400 case FFEINFO_kindtypeCHARACTER1:
4401 error = ffetarget_ne_character1 (&val,
4402 ffebld_constant_character1 (ffebld_conter (l)),
4403 ffebld_constant_character1 (ffebld_conter (r)));
4404 expr = ffebld_new_conter_with_orig
4405 (ffebld_constant_new_logicaldefault (val), expr);
4406 break;
4407 #endif
4408
4409 default:
4410 assert ("bad character kind type" == NULL);
4411 break;
4412 }
4413 break;
4414
4415 default:
4416 assert ("bad type" == NULL);
4417 return expr;
4418 }
4419
4420 ffebld_set_info (expr, ffeinfo_new
4421 (FFEINFO_basictypeLOGICAL,
4422 FFEINFO_kindtypeLOGICALDEFAULT,
4423 0,
4424 FFEINFO_kindENTITY,
4425 FFEINFO_whereCONSTANT,
4426 FFETARGET_charactersizeNONE));
4427
4428 if ((error != FFEBAD)
4429 && ffebad_start (error))
4430 {
4431 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4432 ffebad_finish ();
4433 }
4434
4435 return expr;
4436 }
4437
4438 /* ffeexpr_collapse_ge -- Collapse ge expr
4439
4440 ffebld expr;
4441 ffelexToken token;
4442 expr = ffeexpr_collapse_ge(expr,token);
4443
4444 If the result of the expr is a constant, replaces the expr with the
4445 computed constant. */
4446
4447 ffebld
4448 ffeexpr_collapse_ge (ffebld expr, ffelexToken t)
4449 {
4450 ffebad error = FFEBAD;
4451 ffebld l;
4452 ffebld r;
4453 bool val;
4454
4455 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4456 return expr;
4457
4458 l = ffebld_left (expr);
4459 r = ffebld_right (expr);
4460
4461 if (ffebld_op (l) != FFEBLD_opCONTER)
4462 return expr;
4463 if (ffebld_op (r) != FFEBLD_opCONTER)
4464 return expr;
4465
4466 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4467 {
4468 case FFEINFO_basictypeANY:
4469 return expr;
4470
4471 case FFEINFO_basictypeINTEGER:
4472 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4473 {
4474 #if FFETARGET_okINTEGER1
4475 case FFEINFO_kindtypeINTEGER1:
4476 error = ffetarget_ge_integer1 (&val,
4477 ffebld_constant_integer1 (ffebld_conter (l)),
4478 ffebld_constant_integer1 (ffebld_conter (r)));
4479 expr = ffebld_new_conter_with_orig
4480 (ffebld_constant_new_logicaldefault (val), expr);
4481 break;
4482 #endif
4483
4484 #if FFETARGET_okINTEGER2
4485 case FFEINFO_kindtypeINTEGER2:
4486 error = ffetarget_ge_integer2 (&val,
4487 ffebld_constant_integer2 (ffebld_conter (l)),
4488 ffebld_constant_integer2 (ffebld_conter (r)));
4489 expr = ffebld_new_conter_with_orig
4490 (ffebld_constant_new_logicaldefault (val), expr);
4491 break;
4492 #endif
4493
4494 #if FFETARGET_okINTEGER3
4495 case FFEINFO_kindtypeINTEGER3:
4496 error = ffetarget_ge_integer3 (&val,
4497 ffebld_constant_integer3 (ffebld_conter (l)),
4498 ffebld_constant_integer3 (ffebld_conter (r)));
4499 expr = ffebld_new_conter_with_orig
4500 (ffebld_constant_new_logicaldefault (val), expr);
4501 break;
4502 #endif
4503
4504 #if FFETARGET_okINTEGER4
4505 case FFEINFO_kindtypeINTEGER4:
4506 error = ffetarget_ge_integer4 (&val,
4507 ffebld_constant_integer4 (ffebld_conter (l)),
4508 ffebld_constant_integer4 (ffebld_conter (r)));
4509 expr = ffebld_new_conter_with_orig
4510 (ffebld_constant_new_logicaldefault (val), expr);
4511 break;
4512 #endif
4513
4514 default:
4515 assert ("bad integer kind type" == NULL);
4516 break;
4517 }
4518 break;
4519
4520 case FFEINFO_basictypeREAL:
4521 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4522 {
4523 #if FFETARGET_okREAL1
4524 case FFEINFO_kindtypeREAL1:
4525 error = ffetarget_ge_real1 (&val,
4526 ffebld_constant_real1 (ffebld_conter (l)),
4527 ffebld_constant_real1 (ffebld_conter (r)));
4528 expr = ffebld_new_conter_with_orig
4529 (ffebld_constant_new_logicaldefault (val), expr);
4530 break;
4531 #endif
4532
4533 #if FFETARGET_okREAL2
4534 case FFEINFO_kindtypeREAL2:
4535 error = ffetarget_ge_real2 (&val,
4536 ffebld_constant_real2 (ffebld_conter (l)),
4537 ffebld_constant_real2 (ffebld_conter (r)));
4538 expr = ffebld_new_conter_with_orig
4539 (ffebld_constant_new_logicaldefault (val), expr);
4540 break;
4541 #endif
4542
4543 #if FFETARGET_okREAL3
4544 case FFEINFO_kindtypeREAL3:
4545 error = ffetarget_ge_real3 (&val,
4546 ffebld_constant_real3 (ffebld_conter (l)),
4547 ffebld_constant_real3 (ffebld_conter (r)));
4548 expr = ffebld_new_conter_with_orig
4549 (ffebld_constant_new_logicaldefault (val), expr);
4550 break;
4551 #endif
4552
4553 default:
4554 assert ("bad real kind type" == NULL);
4555 break;
4556 }
4557 break;
4558
4559 case FFEINFO_basictypeCHARACTER:
4560 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4561 {
4562 #if FFETARGET_okCHARACTER1
4563 case FFEINFO_kindtypeCHARACTER1:
4564 error = ffetarget_ge_character1 (&val,
4565 ffebld_constant_character1 (ffebld_conter (l)),
4566 ffebld_constant_character1 (ffebld_conter (r)));
4567 expr = ffebld_new_conter_with_orig
4568 (ffebld_constant_new_logicaldefault (val), expr);
4569 break;
4570 #endif
4571
4572 default:
4573 assert ("bad character kind type" == NULL);
4574 break;
4575 }
4576 break;
4577
4578 default:
4579 assert ("bad type" == NULL);
4580 return expr;
4581 }
4582
4583 ffebld_set_info (expr, ffeinfo_new
4584 (FFEINFO_basictypeLOGICAL,
4585 FFEINFO_kindtypeLOGICALDEFAULT,
4586 0,
4587 FFEINFO_kindENTITY,
4588 FFEINFO_whereCONSTANT,
4589 FFETARGET_charactersizeNONE));
4590
4591 if ((error != FFEBAD)
4592 && ffebad_start (error))
4593 {
4594 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4595 ffebad_finish ();
4596 }
4597
4598 return expr;
4599 }
4600
4601 /* ffeexpr_collapse_gt -- Collapse gt expr
4602
4603 ffebld expr;
4604 ffelexToken token;
4605 expr = ffeexpr_collapse_gt(expr,token);
4606
4607 If the result of the expr is a constant, replaces the expr with the
4608 computed constant. */
4609
4610 ffebld
4611 ffeexpr_collapse_gt (ffebld expr, ffelexToken t)
4612 {
4613 ffebad error = FFEBAD;
4614 ffebld l;
4615 ffebld r;
4616 bool val;
4617
4618 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4619 return expr;
4620
4621 l = ffebld_left (expr);
4622 r = ffebld_right (expr);
4623
4624 if (ffebld_op (l) != FFEBLD_opCONTER)
4625 return expr;
4626 if (ffebld_op (r) != FFEBLD_opCONTER)
4627 return expr;
4628
4629 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4630 {
4631 case FFEINFO_basictypeANY:
4632 return expr;
4633
4634 case FFEINFO_basictypeINTEGER:
4635 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4636 {
4637 #if FFETARGET_okINTEGER1
4638 case FFEINFO_kindtypeINTEGER1:
4639 error = ffetarget_gt_integer1 (&val,
4640 ffebld_constant_integer1 (ffebld_conter (l)),
4641 ffebld_constant_integer1 (ffebld_conter (r)));
4642 expr = ffebld_new_conter_with_orig
4643 (ffebld_constant_new_logicaldefault (val), expr);
4644 break;
4645 #endif
4646
4647 #if FFETARGET_okINTEGER2
4648 case FFEINFO_kindtypeINTEGER2:
4649 error = ffetarget_gt_integer2 (&val,
4650 ffebld_constant_integer2 (ffebld_conter (l)),
4651 ffebld_constant_integer2 (ffebld_conter (r)));
4652 expr = ffebld_new_conter_with_orig
4653 (ffebld_constant_new_logicaldefault (val), expr);
4654 break;
4655 #endif
4656
4657 #if FFETARGET_okINTEGER3
4658 case FFEINFO_kindtypeINTEGER3:
4659 error = ffetarget_gt_integer3 (&val,
4660 ffebld_constant_integer3 (ffebld_conter (l)),
4661 ffebld_constant_integer3 (ffebld_conter (r)));
4662 expr = ffebld_new_conter_with_orig
4663 (ffebld_constant_new_logicaldefault (val), expr);
4664 break;
4665 #endif
4666
4667 #if FFETARGET_okINTEGER4
4668 case FFEINFO_kindtypeINTEGER4:
4669 error = ffetarget_gt_integer4 (&val,
4670 ffebld_constant_integer4 (ffebld_conter (l)),
4671 ffebld_constant_integer4 (ffebld_conter (r)));
4672 expr = ffebld_new_conter_with_orig
4673 (ffebld_constant_new_logicaldefault (val), expr);
4674 break;
4675 #endif
4676
4677 default:
4678 assert ("bad integer kind type" == NULL);
4679 break;
4680 }
4681 break;
4682
4683 case FFEINFO_basictypeREAL:
4684 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4685 {
4686 #if FFETARGET_okREAL1
4687 case FFEINFO_kindtypeREAL1:
4688 error = ffetarget_gt_real1 (&val,
4689 ffebld_constant_real1 (ffebld_conter (l)),
4690 ffebld_constant_real1 (ffebld_conter (r)));
4691 expr = ffebld_new_conter_with_orig
4692 (ffebld_constant_new_logicaldefault (val), expr);
4693 break;
4694 #endif
4695
4696 #if FFETARGET_okREAL2
4697 case FFEINFO_kindtypeREAL2:
4698 error = ffetarget_gt_real2 (&val,
4699 ffebld_constant_real2 (ffebld_conter (l)),
4700 ffebld_constant_real2 (ffebld_conter (r)));
4701 expr = ffebld_new_conter_with_orig
4702 (ffebld_constant_new_logicaldefault (val), expr);
4703 break;
4704 #endif
4705
4706 #if FFETARGET_okREAL3
4707 case FFEINFO_kindtypeREAL3:
4708 error = ffetarget_gt_real3 (&val,
4709 ffebld_constant_real3 (ffebld_conter (l)),
4710 ffebld_constant_real3 (ffebld_conter (r)));
4711 expr = ffebld_new_conter_with_orig
4712 (ffebld_constant_new_logicaldefault (val), expr);
4713 break;
4714 #endif
4715
4716 default:
4717 assert ("bad real kind type" == NULL);
4718 break;
4719 }
4720 break;
4721
4722 case FFEINFO_basictypeCHARACTER:
4723 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4724 {
4725 #if FFETARGET_okCHARACTER1
4726 case FFEINFO_kindtypeCHARACTER1:
4727 error = ffetarget_gt_character1 (&val,
4728 ffebld_constant_character1 (ffebld_conter (l)),
4729 ffebld_constant_character1 (ffebld_conter (r)));
4730 expr = ffebld_new_conter_with_orig
4731 (ffebld_constant_new_logicaldefault (val), expr);
4732 break;
4733 #endif
4734
4735 default:
4736 assert ("bad character kind type" == NULL);
4737 break;
4738 }
4739 break;
4740
4741 default:
4742 assert ("bad type" == NULL);
4743 return expr;
4744 }
4745
4746 ffebld_set_info (expr, ffeinfo_new
4747 (FFEINFO_basictypeLOGICAL,
4748 FFEINFO_kindtypeLOGICALDEFAULT,
4749 0,
4750 FFEINFO_kindENTITY,
4751 FFEINFO_whereCONSTANT,
4752 FFETARGET_charactersizeNONE));
4753
4754 if ((error != FFEBAD)
4755 && ffebad_start (error))
4756 {
4757 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4758 ffebad_finish ();
4759 }
4760
4761 return expr;
4762 }
4763
4764 /* ffeexpr_collapse_le -- Collapse le expr
4765
4766 ffebld expr;
4767 ffelexToken token;
4768 expr = ffeexpr_collapse_le(expr,token);
4769
4770 If the result of the expr is a constant, replaces the expr with the
4771 computed constant. */
4772
4773 ffebld
4774 ffeexpr_collapse_le (ffebld expr, ffelexToken t)
4775 {
4776 ffebad error = FFEBAD;
4777 ffebld l;
4778 ffebld r;
4779 bool val;
4780
4781 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4782 return expr;
4783
4784 l = ffebld_left (expr);
4785 r = ffebld_right (expr);
4786
4787 if (ffebld_op (l) != FFEBLD_opCONTER)
4788 return expr;
4789 if (ffebld_op (r) != FFEBLD_opCONTER)
4790 return expr;
4791
4792 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4793 {
4794 case FFEINFO_basictypeANY:
4795 return expr;
4796
4797 case FFEINFO_basictypeINTEGER:
4798 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4799 {
4800 #if FFETARGET_okINTEGER1
4801 case FFEINFO_kindtypeINTEGER1:
4802 error = ffetarget_le_integer1 (&val,
4803 ffebld_constant_integer1 (ffebld_conter (l)),
4804 ffebld_constant_integer1 (ffebld_conter (r)));
4805 expr = ffebld_new_conter_with_orig
4806 (ffebld_constant_new_logicaldefault (val), expr);
4807 break;
4808 #endif
4809
4810 #if FFETARGET_okINTEGER2
4811 case FFEINFO_kindtypeINTEGER2:
4812 error = ffetarget_le_integer2 (&val,
4813 ffebld_constant_integer2 (ffebld_conter (l)),
4814 ffebld_constant_integer2 (ffebld_conter (r)));
4815 expr = ffebld_new_conter_with_orig
4816 (ffebld_constant_new_logicaldefault (val), expr);
4817 break;
4818 #endif
4819
4820 #if FFETARGET_okINTEGER3
4821 case FFEINFO_kindtypeINTEGER3:
4822 error = ffetarget_le_integer3 (&val,
4823 ffebld_constant_integer3 (ffebld_conter (l)),
4824 ffebld_constant_integer3 (ffebld_conter (r)));
4825 expr = ffebld_new_conter_with_orig
4826 (ffebld_constant_new_logicaldefault (val), expr);
4827 break;
4828 #endif
4829
4830 #if FFETARGET_okINTEGER4
4831 case FFEINFO_kindtypeINTEGER4:
4832 error = ffetarget_le_integer4 (&val,
4833 ffebld_constant_integer4 (ffebld_conter (l)),
4834 ffebld_constant_integer4 (ffebld_conter (r)));
4835 expr = ffebld_new_conter_with_orig
4836 (ffebld_constant_new_logicaldefault (val), expr);
4837 break;
4838 #endif
4839
4840 default:
4841 assert ("bad integer kind type" == NULL);
4842 break;
4843 }
4844 break;
4845
4846 case FFEINFO_basictypeREAL:
4847 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4848 {
4849 #if FFETARGET_okREAL1
4850 case FFEINFO_kindtypeREAL1:
4851 error = ffetarget_le_real1 (&val,
4852 ffebld_constant_real1 (ffebld_conter (l)),
4853 ffebld_constant_real1 (ffebld_conter (r)));
4854 expr = ffebld_new_conter_with_orig
4855 (ffebld_constant_new_logicaldefault (val), expr);
4856 break;
4857 #endif
4858
4859 #if FFETARGET_okREAL2
4860 case FFEINFO_kindtypeREAL2:
4861 error = ffetarget_le_real2 (&val,
4862 ffebld_constant_real2 (ffebld_conter (l)),
4863 ffebld_constant_real2 (ffebld_conter (r)));
4864 expr = ffebld_new_conter_with_orig
4865 (ffebld_constant_new_logicaldefault (val), expr);
4866 break;
4867 #endif
4868
4869 #if FFETARGET_okREAL3
4870 case FFEINFO_kindtypeREAL3:
4871 error = ffetarget_le_real3 (&val,
4872 ffebld_constant_real3 (ffebld_conter (l)),
4873 ffebld_constant_real3 (ffebld_conter (r)));
4874 expr = ffebld_new_conter_with_orig
4875 (ffebld_constant_new_logicaldefault (val), expr);
4876 break;
4877 #endif
4878
4879 default:
4880 assert ("bad real kind type" == NULL);
4881 break;
4882 }
4883 break;
4884
4885 case FFEINFO_basictypeCHARACTER:
4886 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4887 {
4888 #if FFETARGET_okCHARACTER1
4889 case FFEINFO_kindtypeCHARACTER1:
4890 error = ffetarget_le_character1 (&val,
4891 ffebld_constant_character1 (ffebld_conter (l)),
4892 ffebld_constant_character1 (ffebld_conter (r)));
4893 expr = ffebld_new_conter_with_orig
4894 (ffebld_constant_new_logicaldefault (val), expr);
4895 break;
4896 #endif
4897
4898 default:
4899 assert ("bad character kind type" == NULL);
4900 break;
4901 }
4902 break;
4903
4904 default:
4905 assert ("bad type" == NULL);
4906 return expr;
4907 }
4908
4909 ffebld_set_info (expr, ffeinfo_new
4910 (FFEINFO_basictypeLOGICAL,
4911 FFEINFO_kindtypeLOGICALDEFAULT,
4912 0,
4913 FFEINFO_kindENTITY,
4914 FFEINFO_whereCONSTANT,
4915 FFETARGET_charactersizeNONE));
4916
4917 if ((error != FFEBAD)
4918 && ffebad_start (error))
4919 {
4920 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
4921 ffebad_finish ();
4922 }
4923
4924 return expr;
4925 }
4926
4927 /* ffeexpr_collapse_lt -- Collapse lt expr
4928
4929 ffebld expr;
4930 ffelexToken token;
4931 expr = ffeexpr_collapse_lt(expr,token);
4932
4933 If the result of the expr is a constant, replaces the expr with the
4934 computed constant. */
4935
4936 ffebld
4937 ffeexpr_collapse_lt (ffebld expr, ffelexToken t)
4938 {
4939 ffebad error = FFEBAD;
4940 ffebld l;
4941 ffebld r;
4942 bool val;
4943
4944 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
4945 return expr;
4946
4947 l = ffebld_left (expr);
4948 r = ffebld_right (expr);
4949
4950 if (ffebld_op (l) != FFEBLD_opCONTER)
4951 return expr;
4952 if (ffebld_op (r) != FFEBLD_opCONTER)
4953 return expr;
4954
4955 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr))))
4956 {
4957 case FFEINFO_basictypeANY:
4958 return expr;
4959
4960 case FFEINFO_basictypeINTEGER:
4961 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
4962 {
4963 #if FFETARGET_okINTEGER1
4964 case FFEINFO_kindtypeINTEGER1:
4965 error = ffetarget_lt_integer1 (&val,
4966 ffebld_constant_integer1 (ffebld_conter (l)),
4967 ffebld_constant_integer1 (ffebld_conter (r)));
4968 expr = ffebld_new_conter_with_orig
4969 (ffebld_constant_new_logicaldefault (val), expr);
4970 break;
4971 #endif
4972
4973 #if FFETARGET_okINTEGER2
4974 case FFEINFO_kindtypeINTEGER2:
4975 error = ffetarget_lt_integer2 (&val,
4976 ffebld_constant_integer2 (ffebld_conter (l)),
4977 ffebld_constant_integer2 (ffebld_conter (r)));
4978 expr = ffebld_new_conter_with_orig
4979 (ffebld_constant_new_logicaldefault (val), expr);
4980 break;
4981 #endif
4982
4983 #if FFETARGET_okINTEGER3
4984 case FFEINFO_kindtypeINTEGER3:
4985 error = ffetarget_lt_integer3 (&val,
4986 ffebld_constant_integer3 (ffebld_conter (l)),
4987 ffebld_constant_integer3 (ffebld_conter (r)));
4988 expr = ffebld_new_conter_with_orig
4989 (ffebld_constant_new_logicaldefault (val), expr);
4990 break;
4991 #endif
4992
4993 #if FFETARGET_okINTEGER4
4994 case FFEINFO_kindtypeINTEGER4:
4995 error = ffetarget_lt_integer4 (&val,
4996 ffebld_constant_integer4 (ffebld_conter (l)),
4997 ffebld_constant_integer4 (ffebld_conter (r)));
4998 expr = ffebld_new_conter_with_orig
4999 (ffebld_constant_new_logicaldefault (val), expr);
5000 break;
5001 #endif
5002
5003 default:
5004 assert ("bad integer kind type" == NULL);
5005 break;
5006 }
5007 break;
5008
5009 case FFEINFO_basictypeREAL:
5010 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
5011 {
5012 #if FFETARGET_okREAL1
5013 case FFEINFO_kindtypeREAL1:
5014 error = ffetarget_lt_real1 (&val,
5015 ffebld_constant_real1 (ffebld_conter (l)),
5016 ffebld_constant_real1 (ffebld_conter (r)));
5017 expr = ffebld_new_conter_with_orig
5018 (ffebld_constant_new_logicaldefault (val), expr);
5019 break;
5020 #endif
5021
5022 #if FFETARGET_okREAL2
5023 case FFEINFO_kindtypeREAL2:
5024 error = ffetarget_lt_real2 (&val,
5025 ffebld_constant_real2 (ffebld_conter (l)),
5026 ffebld_constant_real2 (ffebld_conter (r)));
5027 expr = ffebld_new_conter_with_orig
5028 (ffebld_constant_new_logicaldefault (val), expr);
5029 break;
5030 #endif
5031
5032 #if FFETARGET_okREAL3
5033 case FFEINFO_kindtypeREAL3:
5034 error = ffetarget_lt_real3 (&val,
5035 ffebld_constant_real3 (ffebld_conter (l)),
5036 ffebld_constant_real3 (ffebld_conter (r)));
5037 expr = ffebld_new_conter_with_orig
5038 (ffebld_constant_new_logicaldefault (val), expr);
5039 break;
5040 #endif
5041
5042 default:
5043 assert ("bad real kind type" == NULL);
5044 break;
5045 }
5046 break;
5047
5048 case FFEINFO_basictypeCHARACTER:
5049 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr))))
5050 {
5051 #if FFETARGET_okCHARACTER1
5052 case FFEINFO_kindtypeCHARACTER1:
5053 error = ffetarget_lt_character1 (&val,
5054 ffebld_constant_character1 (ffebld_conter (l)),
5055 ffebld_constant_character1 (ffebld_conter (r)));
5056 expr = ffebld_new_conter_with_orig
5057 (ffebld_constant_new_logicaldefault (val), expr);
5058 break;
5059 #endif
5060
5061 default:
5062 assert ("bad character kind type" == NULL);
5063 break;
5064 }
5065 break;
5066
5067 default:
5068 assert ("bad type" == NULL);
5069 return expr;
5070 }
5071
5072 ffebld_set_info (expr, ffeinfo_new
5073 (FFEINFO_basictypeLOGICAL,
5074 FFEINFO_kindtypeLOGICALDEFAULT,
5075 0,
5076 FFEINFO_kindENTITY,
5077 FFEINFO_whereCONSTANT,
5078 FFETARGET_charactersizeNONE));
5079
5080 if ((error != FFEBAD)
5081 && ffebad_start (error))
5082 {
5083 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5084 ffebad_finish ();
5085 }
5086
5087 return expr;
5088 }
5089
5090 /* ffeexpr_collapse_and -- Collapse and expr
5091
5092 ffebld expr;
5093 ffelexToken token;
5094 expr = ffeexpr_collapse_and(expr,token);
5095
5096 If the result of the expr is a constant, replaces the expr with the
5097 computed constant. */
5098
5099 ffebld
5100 ffeexpr_collapse_and (ffebld expr, ffelexToken t)
5101 {
5102 ffebad error = FFEBAD;
5103 ffebld l;
5104 ffebld r;
5105 ffebldConstantUnion u;
5106 ffeinfoBasictype bt;
5107 ffeinfoKindtype kt;
5108
5109 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5110 return expr;
5111
5112 l = ffebld_left (expr);
5113 r = ffebld_right (expr);
5114
5115 if (ffebld_op (l) != FFEBLD_opCONTER)
5116 return expr;
5117 if (ffebld_op (r) != FFEBLD_opCONTER)
5118 return expr;
5119
5120 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
5121 {
5122 case FFEINFO_basictypeANY:
5123 return expr;
5124
5125 case FFEINFO_basictypeINTEGER:
5126 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5127 {
5128 #if FFETARGET_okINTEGER1
5129 case FFEINFO_kindtypeINTEGER1:
5130 error = ffetarget_and_integer1 (ffebld_cu_ptr_integer1 (u),
5131 ffebld_constant_integer1 (ffebld_conter (l)),
5132 ffebld_constant_integer1 (ffebld_conter (r)));
5133 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5134 (ffebld_cu_val_integer1 (u)), expr);
5135 break;
5136 #endif
5137
5138 #if FFETARGET_okINTEGER2
5139 case FFEINFO_kindtypeINTEGER2:
5140 error = ffetarget_and_integer2 (ffebld_cu_ptr_integer2 (u),
5141 ffebld_constant_integer2 (ffebld_conter (l)),
5142 ffebld_constant_integer2 (ffebld_conter (r)));
5143 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5144 (ffebld_cu_val_integer2 (u)), expr);
5145 break;
5146 #endif
5147
5148 #if FFETARGET_okINTEGER3
5149 case FFEINFO_kindtypeINTEGER3:
5150 error = ffetarget_and_integer3 (ffebld_cu_ptr_integer3 (u),
5151 ffebld_constant_integer3 (ffebld_conter (l)),
5152 ffebld_constant_integer3 (ffebld_conter (r)));
5153 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
5154 (ffebld_cu_val_integer3 (u)), expr);
5155 break;
5156 #endif
5157
5158 #if FFETARGET_okINTEGER4
5159 case FFEINFO_kindtypeINTEGER4:
5160 error = ffetarget_and_integer4 (ffebld_cu_ptr_integer4 (u),
5161 ffebld_constant_integer4 (ffebld_conter (l)),
5162 ffebld_constant_integer4 (ffebld_conter (r)));
5163 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
5164 (ffebld_cu_val_integer4 (u)), expr);
5165 break;
5166 #endif
5167
5168 default:
5169 assert ("bad integer kind type" == NULL);
5170 break;
5171 }
5172 break;
5173
5174 case FFEINFO_basictypeLOGICAL:
5175 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5176 {
5177 #if FFETARGET_okLOGICAL1
5178 case FFEINFO_kindtypeLOGICAL1:
5179 error = ffetarget_and_logical1 (ffebld_cu_ptr_logical1 (u),
5180 ffebld_constant_logical1 (ffebld_conter (l)),
5181 ffebld_constant_logical1 (ffebld_conter (r)));
5182 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
5183 (ffebld_cu_val_logical1 (u)), expr);
5184 break;
5185 #endif
5186
5187 #if FFETARGET_okLOGICAL2
5188 case FFEINFO_kindtypeLOGICAL2:
5189 error = ffetarget_and_logical2 (ffebld_cu_ptr_logical2 (u),
5190 ffebld_constant_logical2 (ffebld_conter (l)),
5191 ffebld_constant_logical2 (ffebld_conter (r)));
5192 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
5193 (ffebld_cu_val_logical2 (u)), expr);
5194 break;
5195 #endif
5196
5197 #if FFETARGET_okLOGICAL3
5198 case FFEINFO_kindtypeLOGICAL3:
5199 error = ffetarget_and_logical3 (ffebld_cu_ptr_logical3 (u),
5200 ffebld_constant_logical3 (ffebld_conter (l)),
5201 ffebld_constant_logical3 (ffebld_conter (r)));
5202 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
5203 (ffebld_cu_val_logical3 (u)), expr);
5204 break;
5205 #endif
5206
5207 #if FFETARGET_okLOGICAL4
5208 case FFEINFO_kindtypeLOGICAL4:
5209 error = ffetarget_and_logical4 (ffebld_cu_ptr_logical4 (u),
5210 ffebld_constant_logical4 (ffebld_conter (l)),
5211 ffebld_constant_logical4 (ffebld_conter (r)));
5212 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
5213 (ffebld_cu_val_logical4 (u)), expr);
5214 break;
5215 #endif
5216
5217 default:
5218 assert ("bad logical kind type" == NULL);
5219 break;
5220 }
5221 break;
5222
5223 default:
5224 assert ("bad type" == NULL);
5225 return expr;
5226 }
5227
5228 ffebld_set_info (expr, ffeinfo_new
5229 (bt,
5230 kt,
5231 0,
5232 FFEINFO_kindENTITY,
5233 FFEINFO_whereCONSTANT,
5234 FFETARGET_charactersizeNONE));
5235
5236 if ((error != FFEBAD)
5237 && ffebad_start (error))
5238 {
5239 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5240 ffebad_finish ();
5241 }
5242
5243 return expr;
5244 }
5245
5246 /* ffeexpr_collapse_or -- Collapse or expr
5247
5248 ffebld expr;
5249 ffelexToken token;
5250 expr = ffeexpr_collapse_or(expr,token);
5251
5252 If the result of the expr is a constant, replaces the expr with the
5253 computed constant. */
5254
5255 ffebld
5256 ffeexpr_collapse_or (ffebld expr, ffelexToken t)
5257 {
5258 ffebad error = FFEBAD;
5259 ffebld l;
5260 ffebld r;
5261 ffebldConstantUnion u;
5262 ffeinfoBasictype bt;
5263 ffeinfoKindtype kt;
5264
5265 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5266 return expr;
5267
5268 l = ffebld_left (expr);
5269 r = ffebld_right (expr);
5270
5271 if (ffebld_op (l) != FFEBLD_opCONTER)
5272 return expr;
5273 if (ffebld_op (r) != FFEBLD_opCONTER)
5274 return expr;
5275
5276 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
5277 {
5278 case FFEINFO_basictypeANY:
5279 return expr;
5280
5281 case FFEINFO_basictypeINTEGER:
5282 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5283 {
5284 #if FFETARGET_okINTEGER1
5285 case FFEINFO_kindtypeINTEGER1:
5286 error = ffetarget_or_integer1 (ffebld_cu_ptr_integer1 (u),
5287 ffebld_constant_integer1 (ffebld_conter (l)),
5288 ffebld_constant_integer1 (ffebld_conter (r)));
5289 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5290 (ffebld_cu_val_integer1 (u)), expr);
5291 break;
5292 #endif
5293
5294 #if FFETARGET_okINTEGER2
5295 case FFEINFO_kindtypeINTEGER2:
5296 error = ffetarget_or_integer2 (ffebld_cu_ptr_integer2 (u),
5297 ffebld_constant_integer2 (ffebld_conter (l)),
5298 ffebld_constant_integer2 (ffebld_conter (r)));
5299 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5300 (ffebld_cu_val_integer2 (u)), expr);
5301 break;
5302 #endif
5303
5304 #if FFETARGET_okINTEGER3
5305 case FFEINFO_kindtypeINTEGER3:
5306 error = ffetarget_or_integer3 (ffebld_cu_ptr_integer3 (u),
5307 ffebld_constant_integer3 (ffebld_conter (l)),
5308 ffebld_constant_integer3 (ffebld_conter (r)));
5309 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
5310 (ffebld_cu_val_integer3 (u)), expr);
5311 break;
5312 #endif
5313
5314 #if FFETARGET_okINTEGER4
5315 case FFEINFO_kindtypeINTEGER4:
5316 error = ffetarget_or_integer4 (ffebld_cu_ptr_integer4 (u),
5317 ffebld_constant_integer4 (ffebld_conter (l)),
5318 ffebld_constant_integer4 (ffebld_conter (r)));
5319 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
5320 (ffebld_cu_val_integer4 (u)), expr);
5321 break;
5322 #endif
5323
5324 default:
5325 assert ("bad integer kind type" == NULL);
5326 break;
5327 }
5328 break;
5329
5330 case FFEINFO_basictypeLOGICAL:
5331 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5332 {
5333 #if FFETARGET_okLOGICAL1
5334 case FFEINFO_kindtypeLOGICAL1:
5335 error = ffetarget_or_logical1 (ffebld_cu_ptr_logical1 (u),
5336 ffebld_constant_logical1 (ffebld_conter (l)),
5337 ffebld_constant_logical1 (ffebld_conter (r)));
5338 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
5339 (ffebld_cu_val_logical1 (u)), expr);
5340 break;
5341 #endif
5342
5343 #if FFETARGET_okLOGICAL2
5344 case FFEINFO_kindtypeLOGICAL2:
5345 error = ffetarget_or_logical2 (ffebld_cu_ptr_logical2 (u),
5346 ffebld_constant_logical2 (ffebld_conter (l)),
5347 ffebld_constant_logical2 (ffebld_conter (r)));
5348 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
5349 (ffebld_cu_val_logical2 (u)), expr);
5350 break;
5351 #endif
5352
5353 #if FFETARGET_okLOGICAL3
5354 case FFEINFO_kindtypeLOGICAL3:
5355 error = ffetarget_or_logical3 (ffebld_cu_ptr_logical3 (u),
5356 ffebld_constant_logical3 (ffebld_conter (l)),
5357 ffebld_constant_logical3 (ffebld_conter (r)));
5358 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
5359 (ffebld_cu_val_logical3 (u)), expr);
5360 break;
5361 #endif
5362
5363 #if FFETARGET_okLOGICAL4
5364 case FFEINFO_kindtypeLOGICAL4:
5365 error = ffetarget_or_logical4 (ffebld_cu_ptr_logical4 (u),
5366 ffebld_constant_logical4 (ffebld_conter (l)),
5367 ffebld_constant_logical4 (ffebld_conter (r)));
5368 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
5369 (ffebld_cu_val_logical4 (u)), expr);
5370 break;
5371 #endif
5372
5373 default:
5374 assert ("bad logical kind type" == NULL);
5375 break;
5376 }
5377 break;
5378
5379 default:
5380 assert ("bad type" == NULL);
5381 return expr;
5382 }
5383
5384 ffebld_set_info (expr, ffeinfo_new
5385 (bt,
5386 kt,
5387 0,
5388 FFEINFO_kindENTITY,
5389 FFEINFO_whereCONSTANT,
5390 FFETARGET_charactersizeNONE));
5391
5392 if ((error != FFEBAD)
5393 && ffebad_start (error))
5394 {
5395 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5396 ffebad_finish ();
5397 }
5398
5399 return expr;
5400 }
5401
5402 /* ffeexpr_collapse_xor -- Collapse xor expr
5403
5404 ffebld expr;
5405 ffelexToken token;
5406 expr = ffeexpr_collapse_xor(expr,token);
5407
5408 If the result of the expr is a constant, replaces the expr with the
5409 computed constant. */
5410
5411 ffebld
5412 ffeexpr_collapse_xor (ffebld expr, ffelexToken t)
5413 {
5414 ffebad error = FFEBAD;
5415 ffebld l;
5416 ffebld r;
5417 ffebldConstantUnion u;
5418 ffeinfoBasictype bt;
5419 ffeinfoKindtype kt;
5420
5421 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5422 return expr;
5423
5424 l = ffebld_left (expr);
5425 r = ffebld_right (expr);
5426
5427 if (ffebld_op (l) != FFEBLD_opCONTER)
5428 return expr;
5429 if (ffebld_op (r) != FFEBLD_opCONTER)
5430 return expr;
5431
5432 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
5433 {
5434 case FFEINFO_basictypeANY:
5435 return expr;
5436
5437 case FFEINFO_basictypeINTEGER:
5438 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5439 {
5440 #if FFETARGET_okINTEGER1
5441 case FFEINFO_kindtypeINTEGER1:
5442 error = ffetarget_xor_integer1 (ffebld_cu_ptr_integer1 (u),
5443 ffebld_constant_integer1 (ffebld_conter (l)),
5444 ffebld_constant_integer1 (ffebld_conter (r)));
5445 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5446 (ffebld_cu_val_integer1 (u)), expr);
5447 break;
5448 #endif
5449
5450 #if FFETARGET_okINTEGER2
5451 case FFEINFO_kindtypeINTEGER2:
5452 error = ffetarget_xor_integer2 (ffebld_cu_ptr_integer2 (u),
5453 ffebld_constant_integer2 (ffebld_conter (l)),
5454 ffebld_constant_integer2 (ffebld_conter (r)));
5455 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5456 (ffebld_cu_val_integer2 (u)), expr);
5457 break;
5458 #endif
5459
5460 #if FFETARGET_okINTEGER3
5461 case FFEINFO_kindtypeINTEGER3:
5462 error = ffetarget_xor_integer3 (ffebld_cu_ptr_integer3 (u),
5463 ffebld_constant_integer3 (ffebld_conter (l)),
5464 ffebld_constant_integer3 (ffebld_conter (r)));
5465 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
5466 (ffebld_cu_val_integer3 (u)), expr);
5467 break;
5468 #endif
5469
5470 #if FFETARGET_okINTEGER4
5471 case FFEINFO_kindtypeINTEGER4:
5472 error = ffetarget_xor_integer4 (ffebld_cu_ptr_integer4 (u),
5473 ffebld_constant_integer4 (ffebld_conter (l)),
5474 ffebld_constant_integer4 (ffebld_conter (r)));
5475 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
5476 (ffebld_cu_val_integer4 (u)), expr);
5477 break;
5478 #endif
5479
5480 default:
5481 assert ("bad integer kind type" == NULL);
5482 break;
5483 }
5484 break;
5485
5486 case FFEINFO_basictypeLOGICAL:
5487 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5488 {
5489 #if FFETARGET_okLOGICAL1
5490 case FFEINFO_kindtypeLOGICAL1:
5491 error = ffetarget_xor_logical1 (ffebld_cu_ptr_logical1 (u),
5492 ffebld_constant_logical1 (ffebld_conter (l)),
5493 ffebld_constant_logical1 (ffebld_conter (r)));
5494 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
5495 (ffebld_cu_val_logical1 (u)), expr);
5496 break;
5497 #endif
5498
5499 #if FFETARGET_okLOGICAL2
5500 case FFEINFO_kindtypeLOGICAL2:
5501 error = ffetarget_xor_logical2 (ffebld_cu_ptr_logical2 (u),
5502 ffebld_constant_logical2 (ffebld_conter (l)),
5503 ffebld_constant_logical2 (ffebld_conter (r)));
5504 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
5505 (ffebld_cu_val_logical2 (u)), expr);
5506 break;
5507 #endif
5508
5509 #if FFETARGET_okLOGICAL3
5510 case FFEINFO_kindtypeLOGICAL3:
5511 error = ffetarget_xor_logical3 (ffebld_cu_ptr_logical3 (u),
5512 ffebld_constant_logical3 (ffebld_conter (l)),
5513 ffebld_constant_logical3 (ffebld_conter (r)));
5514 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
5515 (ffebld_cu_val_logical3 (u)), expr);
5516 break;
5517 #endif
5518
5519 #if FFETARGET_okLOGICAL4
5520 case FFEINFO_kindtypeLOGICAL4:
5521 error = ffetarget_xor_logical4 (ffebld_cu_ptr_logical4 (u),
5522 ffebld_constant_logical4 (ffebld_conter (l)),
5523 ffebld_constant_logical4 (ffebld_conter (r)));
5524 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
5525 (ffebld_cu_val_logical4 (u)), expr);
5526 break;
5527 #endif
5528
5529 default:
5530 assert ("bad logical kind type" == NULL);
5531 break;
5532 }
5533 break;
5534
5535 default:
5536 assert ("bad type" == NULL);
5537 return expr;
5538 }
5539
5540 ffebld_set_info (expr, ffeinfo_new
5541 (bt,
5542 kt,
5543 0,
5544 FFEINFO_kindENTITY,
5545 FFEINFO_whereCONSTANT,
5546 FFETARGET_charactersizeNONE));
5547
5548 if ((error != FFEBAD)
5549 && ffebad_start (error))
5550 {
5551 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5552 ffebad_finish ();
5553 }
5554
5555 return expr;
5556 }
5557
5558 /* ffeexpr_collapse_eqv -- Collapse eqv expr
5559
5560 ffebld expr;
5561 ffelexToken token;
5562 expr = ffeexpr_collapse_eqv(expr,token);
5563
5564 If the result of the expr is a constant, replaces the expr with the
5565 computed constant. */
5566
5567 ffebld
5568 ffeexpr_collapse_eqv (ffebld expr, ffelexToken t)
5569 {
5570 ffebad error = FFEBAD;
5571 ffebld l;
5572 ffebld r;
5573 ffebldConstantUnion u;
5574 ffeinfoBasictype bt;
5575 ffeinfoKindtype kt;
5576
5577 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5578 return expr;
5579
5580 l = ffebld_left (expr);
5581 r = ffebld_right (expr);
5582
5583 if (ffebld_op (l) != FFEBLD_opCONTER)
5584 return expr;
5585 if (ffebld_op (r) != FFEBLD_opCONTER)
5586 return expr;
5587
5588 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
5589 {
5590 case FFEINFO_basictypeANY:
5591 return expr;
5592
5593 case FFEINFO_basictypeINTEGER:
5594 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5595 {
5596 #if FFETARGET_okINTEGER1
5597 case FFEINFO_kindtypeINTEGER1:
5598 error = ffetarget_eqv_integer1 (ffebld_cu_ptr_integer1 (u),
5599 ffebld_constant_integer1 (ffebld_conter (l)),
5600 ffebld_constant_integer1 (ffebld_conter (r)));
5601 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5602 (ffebld_cu_val_integer1 (u)), expr);
5603 break;
5604 #endif
5605
5606 #if FFETARGET_okINTEGER2
5607 case FFEINFO_kindtypeINTEGER2:
5608 error = ffetarget_eqv_integer2 (ffebld_cu_ptr_integer2 (u),
5609 ffebld_constant_integer2 (ffebld_conter (l)),
5610 ffebld_constant_integer2 (ffebld_conter (r)));
5611 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5612 (ffebld_cu_val_integer2 (u)), expr);
5613 break;
5614 #endif
5615
5616 #if FFETARGET_okINTEGER3
5617 case FFEINFO_kindtypeINTEGER3:
5618 error = ffetarget_eqv_integer3 (ffebld_cu_ptr_integer3 (u),
5619 ffebld_constant_integer3 (ffebld_conter (l)),
5620 ffebld_constant_integer3 (ffebld_conter (r)));
5621 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
5622 (ffebld_cu_val_integer3 (u)), expr);
5623 break;
5624 #endif
5625
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
5636 default:
5637 assert ("bad integer kind type" == NULL);
5638 break;
5639 }
5640 break;
5641
5642 case FFEINFO_basictypeLOGICAL:
5643 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5644 {
5645 #if FFETARGET_okLOGICAL1
5646 case FFEINFO_kindtypeLOGICAL1:
5647 error = ffetarget_eqv_logical1 (ffebld_cu_ptr_logical1 (u),
5648 ffebld_constant_logical1 (ffebld_conter (l)),
5649 ffebld_constant_logical1 (ffebld_conter (r)));
5650 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
5651 (ffebld_cu_val_logical1 (u)), expr);
5652 break;
5653 #endif
5654
5655 #if FFETARGET_okLOGICAL2
5656 case FFEINFO_kindtypeLOGICAL2:
5657 error = ffetarget_eqv_logical2 (ffebld_cu_ptr_logical2 (u),
5658 ffebld_constant_logical2 (ffebld_conter (l)),
5659 ffebld_constant_logical2 (ffebld_conter (r)));
5660 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
5661 (ffebld_cu_val_logical2 (u)), expr);
5662 break;
5663 #endif
5664
5665 #if FFETARGET_okLOGICAL3
5666 case FFEINFO_kindtypeLOGICAL3:
5667 error = ffetarget_eqv_logical3 (ffebld_cu_ptr_logical3 (u),
5668 ffebld_constant_logical3 (ffebld_conter (l)),
5669 ffebld_constant_logical3 (ffebld_conter (r)));
5670 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
5671 (ffebld_cu_val_logical3 (u)), expr);
5672 break;
5673 #endif
5674
5675 #if FFETARGET_okLOGICAL4
5676 case FFEINFO_kindtypeLOGICAL4:
5677 error = ffetarget_eqv_logical4 (ffebld_cu_ptr_logical4 (u),
5678 ffebld_constant_logical4 (ffebld_conter (l)),
5679 ffebld_constant_logical4 (ffebld_conter (r)));
5680 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
5681 (ffebld_cu_val_logical4 (u)), expr);
5682 break;
5683 #endif
5684
5685 default:
5686 assert ("bad logical kind type" == NULL);
5687 break;
5688 }
5689 break;
5690
5691 default:
5692 assert ("bad type" == NULL);
5693 return expr;
5694 }
5695
5696 ffebld_set_info (expr, ffeinfo_new
5697 (bt,
5698 kt,
5699 0,
5700 FFEINFO_kindENTITY,
5701 FFEINFO_whereCONSTANT,
5702 FFETARGET_charactersizeNONE));
5703
5704 if ((error != FFEBAD)
5705 && ffebad_start (error))
5706 {
5707 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5708 ffebad_finish ();
5709 }
5710
5711 return expr;
5712 }
5713
5714 /* ffeexpr_collapse_neqv -- Collapse neqv expr
5715
5716 ffebld expr;
5717 ffelexToken token;
5718 expr = ffeexpr_collapse_neqv(expr,token);
5719
5720 If the result of the expr is a constant, replaces the expr with the
5721 computed constant. */
5722
5723 ffebld
5724 ffeexpr_collapse_neqv (ffebld expr, ffelexToken t)
5725 {
5726 ffebad error = FFEBAD;
5727 ffebld l;
5728 ffebld r;
5729 ffebldConstantUnion u;
5730 ffeinfoBasictype bt;
5731 ffeinfoKindtype kt;
5732
5733 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5734 return expr;
5735
5736 l = ffebld_left (expr);
5737 r = ffebld_right (expr);
5738
5739 if (ffebld_op (l) != FFEBLD_opCONTER)
5740 return expr;
5741 if (ffebld_op (r) != FFEBLD_opCONTER)
5742 return expr;
5743
5744 switch (bt = ffeinfo_basictype (ffebld_info (expr)))
5745 {
5746 case FFEINFO_basictypeANY:
5747 return expr;
5748
5749 case FFEINFO_basictypeINTEGER:
5750 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5751 {
5752 #if FFETARGET_okINTEGER1
5753 case FFEINFO_kindtypeINTEGER1:
5754 error = ffetarget_neqv_integer1 (ffebld_cu_ptr_integer1 (u),
5755 ffebld_constant_integer1 (ffebld_conter (l)),
5756 ffebld_constant_integer1 (ffebld_conter (r)));
5757 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5758 (ffebld_cu_val_integer1 (u)), expr);
5759 break;
5760 #endif
5761
5762 #if FFETARGET_okINTEGER2
5763 case FFEINFO_kindtypeINTEGER2:
5764 error = ffetarget_neqv_integer2 (ffebld_cu_ptr_integer2 (u),
5765 ffebld_constant_integer2 (ffebld_conter (l)),
5766 ffebld_constant_integer2 (ffebld_conter (r)));
5767 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5768 (ffebld_cu_val_integer2 (u)), expr);
5769 break;
5770 #endif
5771
5772 #if FFETARGET_okINTEGER3
5773 case FFEINFO_kindtypeINTEGER3:
5774 error = ffetarget_neqv_integer3 (ffebld_cu_ptr_integer3 (u),
5775 ffebld_constant_integer3 (ffebld_conter (l)),
5776 ffebld_constant_integer3 (ffebld_conter (r)));
5777 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
5778 (ffebld_cu_val_integer3 (u)), expr);
5779 break;
5780 #endif
5781
5782 #if FFETARGET_okINTEGER4
5783 case FFEINFO_kindtypeINTEGER4:
5784 error = ffetarget_neqv_integer4 (ffebld_cu_ptr_integer4 (u),
5785 ffebld_constant_integer4 (ffebld_conter (l)),
5786 ffebld_constant_integer4 (ffebld_conter (r)));
5787 expr = ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
5788 (ffebld_cu_val_integer4 (u)), expr);
5789 break;
5790 #endif
5791
5792 default:
5793 assert ("bad integer kind type" == NULL);
5794 break;
5795 }
5796 break;
5797
5798 case FFEINFO_basictypeLOGICAL:
5799 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
5800 {
5801 #if FFETARGET_okLOGICAL1
5802 case FFEINFO_kindtypeLOGICAL1:
5803 error = ffetarget_neqv_logical1 (ffebld_cu_ptr_logical1 (u),
5804 ffebld_constant_logical1 (ffebld_conter (l)),
5805 ffebld_constant_logical1 (ffebld_conter (r)));
5806 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
5807 (ffebld_cu_val_logical1 (u)), expr);
5808 break;
5809 #endif
5810
5811 #if FFETARGET_okLOGICAL2
5812 case FFEINFO_kindtypeLOGICAL2:
5813 error = ffetarget_neqv_logical2 (ffebld_cu_ptr_logical2 (u),
5814 ffebld_constant_logical2 (ffebld_conter (l)),
5815 ffebld_constant_logical2 (ffebld_conter (r)));
5816 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
5817 (ffebld_cu_val_logical2 (u)), expr);
5818 break;
5819 #endif
5820
5821 #if FFETARGET_okLOGICAL3
5822 case FFEINFO_kindtypeLOGICAL3:
5823 error = ffetarget_neqv_logical3 (ffebld_cu_ptr_logical3 (u),
5824 ffebld_constant_logical3 (ffebld_conter (l)),
5825 ffebld_constant_logical3 (ffebld_conter (r)));
5826 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
5827 (ffebld_cu_val_logical3 (u)), expr);
5828 break;
5829 #endif
5830
5831 #if FFETARGET_okLOGICAL4
5832 case FFEINFO_kindtypeLOGICAL4:
5833 error = ffetarget_neqv_logical4 (ffebld_cu_ptr_logical4 (u),
5834 ffebld_constant_logical4 (ffebld_conter (l)),
5835 ffebld_constant_logical4 (ffebld_conter (r)));
5836 expr = ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
5837 (ffebld_cu_val_logical4 (u)), expr);
5838 break;
5839 #endif
5840
5841 default:
5842 assert ("bad logical kind type" == NULL);
5843 break;
5844 }
5845 break;
5846
5847 default:
5848 assert ("bad type" == NULL);
5849 return expr;
5850 }
5851
5852 ffebld_set_info (expr, ffeinfo_new
5853 (bt,
5854 kt,
5855 0,
5856 FFEINFO_kindENTITY,
5857 FFEINFO_whereCONSTANT,
5858 FFETARGET_charactersizeNONE));
5859
5860 if ((error != FFEBAD)
5861 && ffebad_start (error))
5862 {
5863 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
5864 ffebad_finish ();
5865 }
5866
5867 return expr;
5868 }
5869
5870 /* ffeexpr_collapse_symter -- Collapse symter expr
5871
5872 ffebld expr;
5873 ffelexToken token;
5874 expr = ffeexpr_collapse_symter(expr,token);
5875
5876 If the result of the expr is a constant, replaces the expr with the
5877 computed constant. */
5878
5879 ffebld
5880 ffeexpr_collapse_symter (ffebld expr, ffelexToken t UNUSED)
5881 {
5882 ffebld r;
5883 ffeinfoBasictype bt;
5884 ffeinfoKindtype kt;
5885 ffetargetCharacterSize len;
5886
5887 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5888 return expr;
5889
5890 if ((r = ffesymbol_init (ffebld_symter (expr))) == NULL)
5891 return expr; /* A PARAMETER lhs in progress. */
5892
5893 switch (ffebld_op (r))
5894 {
5895 case FFEBLD_opCONTER:
5896 break;
5897
5898 case FFEBLD_opANY:
5899 return r;
5900
5901 default:
5902 return expr;
5903 }
5904
5905 bt = ffeinfo_basictype (ffebld_info (r));
5906 kt = ffeinfo_kindtype (ffebld_info (r));
5907 len = ffebld_size (r);
5908
5909 expr = ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r)),
5910 expr);
5911
5912 ffebld_set_info (expr, ffeinfo_new
5913 (bt,
5914 kt,
5915 0,
5916 FFEINFO_kindENTITY,
5917 FFEINFO_whereCONSTANT,
5918 len));
5919
5920 return expr;
5921 }
5922
5923 /* ffeexpr_collapse_funcref -- Collapse funcref expr
5924
5925 ffebld expr;
5926 ffelexToken token;
5927 expr = ffeexpr_collapse_funcref(expr,token);
5928
5929 If the result of the expr is a constant, replaces the expr with the
5930 computed constant. */
5931
5932 ffebld
5933 ffeexpr_collapse_funcref (ffebld expr, ffelexToken t UNUSED)
5934 {
5935 return expr; /* ~~someday go ahead and collapse these,
5936 though not required */
5937 }
5938
5939 /* ffeexpr_collapse_arrayref -- Collapse arrayref expr
5940
5941 ffebld expr;
5942 ffelexToken token;
5943 expr = ffeexpr_collapse_arrayref(expr,token);
5944
5945 If the result of the expr is a constant, replaces the expr with the
5946 computed constant. */
5947
5948 ffebld
5949 ffeexpr_collapse_arrayref (ffebld expr, ffelexToken t UNUSED)
5950 {
5951 return expr;
5952 }
5953
5954 /* ffeexpr_collapse_substr -- Collapse substr expr
5955
5956 ffebld expr;
5957 ffelexToken token;
5958 expr = ffeexpr_collapse_substr(expr,token);
5959
5960 If the result of the expr is a constant, replaces the expr with the
5961 computed constant. */
5962
5963 ffebld
5964 ffeexpr_collapse_substr (ffebld expr, ffelexToken t)
5965 {
5966 ffebad error = FFEBAD;
5967 ffebld l;
5968 ffebld r;
5969 ffebld start;
5970 ffebld stop;
5971 ffebldConstantUnion u;
5972 ffeinfoKindtype kt;
5973 ffetargetCharacterSize len;
5974 ffetargetIntegerDefault first;
5975 ffetargetIntegerDefault last;
5976
5977 if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT)
5978 return expr;
5979
5980 l = ffebld_left (expr);
5981 r = ffebld_right (expr); /* opITEM. */
5982
5983 if (ffebld_op (l) != FFEBLD_opCONTER)
5984 return expr;
5985
5986 kt = ffeinfo_kindtype (ffebld_info (l));
5987 len = ffebld_size (l);
5988
5989 start = ffebld_head (r);
5990 stop = ffebld_head (ffebld_trail (r));
5991 if (start == NULL)
5992 first = 1;
5993 else
5994 {
5995 if ((ffebld_op (start) != FFEBLD_opCONTER)
5996 || (ffeinfo_basictype (ffebld_info (start)) != FFEINFO_basictypeINTEGER)
5997 || (ffeinfo_kindtype (ffebld_info (start))
5998 != FFEINFO_kindtypeINTEGERDEFAULT))
5999 return expr;
6000 first = ffebld_constant_integerdefault (ffebld_conter (start));
6001 }
6002 if (stop == NULL)
6003 last = len;
6004 else
6005 {
6006 if ((ffebld_op (stop) != FFEBLD_opCONTER)
6007 || (ffeinfo_basictype (ffebld_info (stop)) != FFEINFO_basictypeINTEGER)
6008 || (ffeinfo_kindtype (ffebld_info (stop))
6009 != FFEINFO_kindtypeINTEGERDEFAULT))
6010 return expr;
6011 last = ffebld_constant_integerdefault (ffebld_conter (stop));
6012 }
6013
6014 /* Handle problems that should have already been diagnosed, but
6015 left in the expression tree. */
6016
6017 if (first <= 0)
6018 first = 1;
6019 if (last < first)
6020 last = first + len - 1;
6021
6022 if ((first == 1) && (last == len))
6023 { /* Same as original. */
6024 expr = ffebld_new_conter_with_orig (ffebld_constant_copy
6025 (ffebld_conter (l)), expr);
6026 ffebld_set_info (expr, ffeinfo_new
6027 (FFEINFO_basictypeCHARACTER,
6028 kt,
6029 0,
6030 FFEINFO_kindENTITY,
6031 FFEINFO_whereCONSTANT,
6032 len));
6033
6034 return expr;
6035 }
6036
6037 switch (ffeinfo_basictype (ffebld_info (expr)))
6038 {
6039 case FFEINFO_basictypeANY:
6040 return expr;
6041
6042 case FFEINFO_basictypeCHARACTER:
6043 switch (kt = ffeinfo_kindtype (ffebld_info (expr)))
6044 {
6045 #if FFETARGET_okCHARACTER1
6046 case FFEINFO_kindtypeCHARACTER1:
6047 error = ffetarget_substr_character1 (ffebld_cu_ptr_character1 (u),
6048 ffebld_constant_character1 (ffebld_conter (l)), first, last,
6049 ffebld_constant_pool (), &len);
6050 expr = ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
6051 (ffebld_cu_val_character1 (u)), expr);
6052 break;
6053 #endif
6054
6055 default:
6056 assert ("bad character kind type" == NULL);
6057 break;
6058 }
6059 break;
6060
6061 default:
6062 assert ("bad type" == NULL);
6063 return expr;
6064 }
6065
6066 ffebld_set_info (expr, ffeinfo_new
6067 (FFEINFO_basictypeCHARACTER,
6068 kt,
6069 0,
6070 FFEINFO_kindENTITY,
6071 FFEINFO_whereCONSTANT,
6072 len));
6073
6074 if ((error != FFEBAD)
6075 && ffebad_start (error))
6076 {
6077 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
6078 ffebad_finish ();
6079 }
6080
6081 return expr;
6082 }
6083
6084 /* ffeexpr_convert -- Convert source expression to given type
6085
6086 ffebld source;
6087 ffelexToken source_token;
6088 ffelexToken dest_token; // Any appropriate token for "destination".
6089 ffeinfoBasictype bt;
6090 ffeinfoKindtype kt;
6091 ffetargetCharactersize sz;
6092 ffeexprContext context; // Mainly LET or DATA.
6093 source = ffeexpr_convert(source,source_token,dest_token,bt,kt,sz,context);
6094
6095 If the expression conforms, returns the source expression. Otherwise
6096 returns source wrapped in a convert node doing the conversion, or
6097 ANY wrapped in convert if there is a conversion error (and issues an
6098 error message). Be sensitive to the context for certain aspects of
6099 the conversion. */
6100
6101 ffebld
6102 ffeexpr_convert (ffebld source, ffelexToken source_token, ffelexToken dest_token,
6103 ffeinfoBasictype bt, ffeinfoKindtype kt, ffeinfoRank rk,
6104 ffetargetCharacterSize sz, ffeexprContext context)
6105 {
6106 bool bad;
6107 ffeinfo info;
6108 ffeinfoWhere wh;
6109
6110 info = ffebld_info (source);
6111 if ((bt != ffeinfo_basictype (info))
6112 || (kt != ffeinfo_kindtype (info))
6113 || (rk != 0) /* Can't convert from or to arrays yet. */
6114 || (ffeinfo_rank (info) != 0)
6115 || (sz != ffebld_size_known (source)))
6116 #if 0 /* Nobody seems to need this spurious CONVERT node. */
6117 || ((context != FFEEXPR_contextLET)
6118 && (bt == FFEINFO_basictypeCHARACTER)
6119 && (sz == FFETARGET_charactersizeNONE)))
6120 #endif
6121 {
6122 switch (ffeinfo_basictype (info))
6123 {
6124 case FFEINFO_basictypeLOGICAL:
6125 switch (bt)
6126 {
6127 case FFEINFO_basictypeLOGICAL:
6128 bad = FALSE;
6129 break;
6130
6131 case FFEINFO_basictypeINTEGER:
6132 bad = !ffe_is_ugly_logint ();
6133 break;
6134
6135 case FFEINFO_basictypeCHARACTER:
6136 bad = ffe_is_pedantic ()
6137 || !(ffe_is_ugly_init ()
6138 && (context == FFEEXPR_contextDATA));
6139 break;
6140
6141 default:
6142 bad = TRUE;
6143 break;
6144 }
6145 break;
6146
6147 case FFEINFO_basictypeINTEGER:
6148 switch (bt)
6149 {
6150 case FFEINFO_basictypeINTEGER:
6151 case FFEINFO_basictypeREAL:
6152 case FFEINFO_basictypeCOMPLEX:
6153 bad = FALSE;
6154 break;
6155
6156 case FFEINFO_basictypeLOGICAL:
6157 bad = !ffe_is_ugly_logint ();
6158 break;
6159
6160 case FFEINFO_basictypeCHARACTER:
6161 bad = ffe_is_pedantic ()
6162 || !(ffe_is_ugly_init ()
6163 && (context == FFEEXPR_contextDATA));
6164 break;
6165
6166 default:
6167 bad = TRUE;
6168 break;
6169 }
6170 break;
6171
6172 case FFEINFO_basictypeREAL:
6173 case FFEINFO_basictypeCOMPLEX:
6174 switch (bt)
6175 {
6176 case FFEINFO_basictypeINTEGER:
6177 case FFEINFO_basictypeREAL:
6178 case FFEINFO_basictypeCOMPLEX:
6179 bad = FALSE;
6180 break;
6181
6182 case FFEINFO_basictypeCHARACTER:
6183 bad = TRUE;
6184 break;
6185
6186 default:
6187 bad = TRUE;
6188 break;
6189 }
6190 break;
6191
6192 case FFEINFO_basictypeCHARACTER:
6193 bad = (bt != FFEINFO_basictypeCHARACTER)
6194 && (ffe_is_pedantic ()
6195 || (bt != FFEINFO_basictypeINTEGER)
6196 || !(ffe_is_ugly_init ()
6197 && (context == FFEEXPR_contextDATA)));
6198 break;
6199
6200 case FFEINFO_basictypeTYPELESS:
6201 case FFEINFO_basictypeHOLLERITH:
6202 bad = ffe_is_pedantic ()
6203 || !(ffe_is_ugly_init ()
6204 && ((context == FFEEXPR_contextDATA)
6205 || (context == FFEEXPR_contextLET)));
6206 break;
6207
6208 default:
6209 bad = TRUE;
6210 break;
6211 }
6212
6213 if (!bad && ((rk != 0) || (ffeinfo_rank (info) != 0)))
6214 bad = TRUE;
6215
6216 if (bad && (bt != FFEINFO_basictypeANY) && (kt != FFEINFO_kindtypeANY)
6217 && (ffeinfo_basictype (info) != FFEINFO_basictypeANY)
6218 && (ffeinfo_kindtype (info) != FFEINFO_kindtypeANY)
6219 && (ffeinfo_where (info) != FFEINFO_whereANY))
6220 {
6221 if (ffebad_start (FFEBAD_BAD_TYPES))
6222 {
6223 if (dest_token == NULL)
6224 ffebad_here (0, ffewhere_line_unknown (),
6225 ffewhere_column_unknown ());
6226 else
6227 ffebad_here (0, ffelex_token_where_line (dest_token),
6228 ffelex_token_where_column (dest_token));
6229 assert (source_token != NULL);
6230 ffebad_here (1, ffelex_token_where_line (source_token),
6231 ffelex_token_where_column (source_token));
6232 ffebad_finish ();
6233 }
6234
6235 source = ffebld_new_any ();
6236 ffebld_set_info (source, ffeinfo_new_any ());
6237 }
6238 else
6239 {
6240 switch (ffeinfo_where (info))
6241 {
6242 case FFEINFO_whereCONSTANT:
6243 wh = FFEINFO_whereCONSTANT;
6244 break;
6245
6246 case FFEINFO_whereIMMEDIATE:
6247 wh = FFEINFO_whereIMMEDIATE;
6248 break;
6249
6250 default:
6251 wh = FFEINFO_whereFLEETING;
6252 break;
6253 }
6254 source = ffebld_new_convert (source);
6255 ffebld_set_info (source, ffeinfo_new
6256 (bt,
6257 kt,
6258 0,
6259 FFEINFO_kindENTITY,
6260 wh,
6261 sz));
6262 source = ffeexpr_collapse_convert (source, source_token);
6263 }
6264 }
6265
6266 return source;
6267 }
6268
6269 /* ffeexpr_convert_expr -- Convert source expr to conform to dest expr
6270
6271 ffebld source;
6272 ffebld dest;
6273 ffelexToken source_token;
6274 ffelexToken dest_token;
6275 ffeexprContext context;
6276 source = ffeexpr_convert_expr(source,source_token,dest,dest_token,context);
6277
6278 If the expressions conform, returns the source expression. Otherwise
6279 returns source wrapped in a convert node doing the conversion, or
6280 ANY wrapped in convert if there is a conversion error (and issues an
6281 error message). Be sensitive to the context, such as LET or DATA. */
6282
6283 ffebld
6284 ffeexpr_convert_expr (ffebld source, ffelexToken source_token, ffebld dest,
6285 ffelexToken dest_token, ffeexprContext context)
6286 {
6287 ffeinfo info;
6288
6289 info = ffebld_info (dest);
6290 return ffeexpr_convert (source, source_token, dest_token,
6291 ffeinfo_basictype (info),
6292 ffeinfo_kindtype (info),
6293 ffeinfo_rank (info),
6294 ffebld_size_known (dest),
6295 context);
6296 }
6297
6298 /* ffeexpr_convert_to_sym -- Convert source expression to conform to symbol
6299
6300 ffebld source;
6301 ffesymbol dest;
6302 ffelexToken source_token;
6303 ffelexToken dest_token;
6304 source = ffeexpr_convert_to_sym(source,source_token,dest,dest_token);
6305
6306 If the expressions conform, returns the source expression. Otherwise
6307 returns source wrapped in a convert node doing the conversion, or
6308 ANY wrapped in convert if there is a conversion error (and issues an
6309 error message). */
6310
6311 ffebld
6312 ffeexpr_convert_to_sym (ffebld source, ffelexToken source_token,
6313 ffesymbol dest, ffelexToken dest_token)
6314 {
6315 return ffeexpr_convert (source, source_token, dest_token, ffesymbol_basictype (dest),
6316 ffesymbol_kindtype (dest), ffesymbol_rank (dest), ffesymbol_size (dest),
6317 FFEEXPR_contextLET);
6318 }
6319
6320 /* Initializes the module. */
6321
6322 void
6323 ffeexpr_init_2 (void)
6324 {
6325 ffeexpr_stack_ = NULL;
6326 ffeexpr_level_ = 0;
6327 }
6328
6329 /* ffeexpr_lhs -- Begin processing left-hand-side-context expression
6330
6331 Prepares cluster for delivery of lexer tokens representing an expression
6332 in a left-hand-side context (A in A=B, for example). ffebld is used
6333 to build expressions in the given pool. The appropriate lexer-token
6334 handling routine within ffeexpr is returned. When the end of the
6335 expression is detected, mycallbackroutine is called with the resulting
6336 single ffebld object specifying the entire expression and the first
6337 lexer token that is not considered part of the expression. This caller-
6338 supplied routine itself returns a lexer-token handling routine. Thus,
6339 if necessary, ffeexpr can return several tokens as end-of-expression
6340 tokens if it needs to scan forward more than one in any instance. */
6341
6342 ffelexHandler
6343 ffeexpr_lhs (mallocPool pool, ffeexprContext context, ffeexprCallback callback)
6344 {
6345 ffeexprStack_ s;
6346
6347 ffebld_pool_push (pool);
6348 s = malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s));
6349 s->previous = ffeexpr_stack_;
6350 s->pool = pool;
6351 s->context = context;
6352 s->callback = callback;
6353 s->first_token = NULL;
6354 s->exprstack = NULL;
6355 s->is_rhs = FALSE;
6356 ffeexpr_stack_ = s;
6357 return (ffelexHandler) ffeexpr_token_first_lhs_;
6358 }
6359
6360 /* ffeexpr_rhs -- Begin processing right-hand-side-context expression
6361
6362 return ffeexpr_rhs(malloc_pool_image(),mycallbackroutine); // to lexer.
6363
6364 Prepares cluster for delivery of lexer tokens representing an expression
6365 in a right-hand-side context (B in A=B, for example). ffebld is used
6366 to build expressions in the given pool. The appropriate lexer-token
6367 handling routine within ffeexpr is returned. When the end of the
6368 expression is detected, mycallbackroutine is called with the resulting
6369 single ffebld object specifying the entire expression and the first
6370 lexer token that is not considered part of the expression. This caller-
6371 supplied routine itself returns a lexer-token handling routine. Thus,
6372 if necessary, ffeexpr can return several tokens as end-of-expression
6373 tokens if it needs to scan forward more than one in any instance. */
6374
6375 ffelexHandler
6376 ffeexpr_rhs (mallocPool pool, ffeexprContext context, ffeexprCallback callback)
6377 {
6378 ffeexprStack_ s;
6379
6380 ffebld_pool_push (pool);
6381 s = malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s));
6382 s->previous = ffeexpr_stack_;
6383 s->pool = pool;
6384 s->context = context;
6385 s->callback = callback;
6386 s->first_token = NULL;
6387 s->exprstack = NULL;
6388 s->is_rhs = TRUE;
6389 ffeexpr_stack_ = s;
6390 return (ffelexHandler) ffeexpr_token_first_rhs_;
6391 }
6392
6393 /* ffeexpr_cb_close_paren_ -- OPEN_PAREN expr
6394
6395 Pass it to ffeexpr_rhs as the callback routine.
6396
6397 Makes sure the end token is close-paren and swallows it, else issues
6398 an error message and doesn't swallow the token (passing it along instead).
6399 In either case wraps up subexpression construction by enclosing the
6400 ffebld expression in a paren. */
6401
6402 static ffelexHandler
6403 ffeexpr_cb_close_paren_ (ffelexToken ft, ffebld expr, ffelexToken t)
6404 {
6405 ffeexprExpr_ e;
6406
6407 if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
6408 {
6409 /* Oops, naughty user didn't specify the close paren! */
6410
6411 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
6412 {
6413 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
6414 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
6415 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
6416 ffebad_finish ();
6417 }
6418
6419 e = ffeexpr_expr_new_ ();
6420 e->type = FFEEXPR_exprtypeOPERAND_;
6421 e->u.operand = ffebld_new_any ();
6422 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
6423 ffeexpr_exprstack_push_operand_ (e);
6424
6425 return
6426 (ffelexHandler) ffeexpr_find_close_paren_ (t,
6427 (ffelexHandler)
6428 ffeexpr_token_binary_);
6429 }
6430
6431 if (expr->op == FFEBLD_opIMPDO)
6432 {
6433 if (ffest_ffebad_start (FFEBAD_IMPDO_PAREN))
6434 {
6435 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
6436 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
6437 ffebad_finish ();
6438 }
6439 }
6440 else
6441 {
6442 expr = ffebld_new_paren (expr);
6443 ffebld_set_info (expr, ffeinfo_use (ffebld_info (ffebld_left (expr))));
6444 }
6445
6446 /* Now push the (parenthesized) expression as an operand onto the
6447 expression stack. */
6448
6449 e = ffeexpr_expr_new_ ();
6450 e->type = FFEEXPR_exprtypeOPERAND_;
6451 e->u.operand = expr;
6452 e->u.operand = ffeexpr_collapse_paren (e->u.operand, ft);
6453 e->token = ffeexpr_stack_->tokens[0];
6454 ffeexpr_exprstack_push_operand_ (e);
6455
6456 return (ffelexHandler) ffeexpr_token_binary_;
6457 }
6458
6459 /* ffeexpr_cb_close_paren_ambig_ -- OPEN_PAREN expr
6460
6461 Pass it to ffeexpr_rhs as the callback routine.
6462
6463 We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
6464 with the next token in t. If the next token is possibly a binary
6465 operator, continue processing the outer expression. If the next
6466 token is COMMA, then the expression is a unit specifier, and
6467 parentheses should not be added to it because it surrounds the
6468 I/O control list that starts with the unit specifier (and continues
6469 on from here -- we haven't seen the CLOSE_PAREN that matches the
6470 OPEN_PAREN, it is up to the callback function to expect to see it
6471 at some point). In this case, we notify the callback function that
6472 the COMMA is inside, not outside, the parens by wrapping the expression
6473 in an opITEM (with a NULL trail) -- the callback function presumably
6474 unwraps it after seeing this kludgey indicator.
6475
6476 If the next token is CLOSE_PAREN, then we go to the _1_ state to
6477 decide what to do with the token after that.
6478
6479 15-Feb-91 JCB 1.1
6480 Use an extra state for the CLOSE_PAREN case to make READ &co really
6481 work right. */
6482
6483 static ffelexHandler
6484 ffeexpr_cb_close_paren_ambig_ (ffelexToken ft, ffebld expr, ffelexToken t)
6485 {
6486 ffeexprCallback callback;
6487 ffeexprStack_ s;
6488
6489 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
6490 { /* Need to see the next token before we
6491 decide anything. */
6492 ffeexpr_stack_->expr = expr;
6493 ffeexpr_tokens_[0] = ffelex_token_use (ft);
6494 ffeexpr_tokens_[1] = ffelex_token_use (t);
6495 return (ffelexHandler) ffeexpr_cb_close_paren_ambig_1_;
6496 }
6497
6498 expr = ffeexpr_finished_ambig_ (ft, expr);
6499
6500 /* Let the callback function handle the case where t isn't COMMA. */
6501
6502 /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
6503 that preceded the expression starts a list of expressions, and the expr
6504 hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
6505 node. The callback function should extract the real expr from the head
6506 of this opITEM node after testing it. */
6507
6508 expr = ffebld_new_item (expr, NULL);
6509
6510 ffebld_pool_pop ();
6511 callback = ffeexpr_stack_->callback;
6512 ffelex_token_kill (ffeexpr_stack_->first_token);
6513 s = ffeexpr_stack_->previous;
6514 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
6515 ffeexpr_stack_ = s;
6516 return (ffelexHandler) (*callback) (ft, expr, t);
6517 }
6518
6519 /* ffeexpr_cb_close_paren_ambig_1_ -- OPEN_PAREN expr CLOSE_PAREN
6520
6521 See ffeexpr_cb_close_paren_ambig_.
6522
6523 We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
6524 with the next token in t. If the next token is possibly a binary
6525 operator, continue processing the outer expression. If the next
6526 token is COMMA, the expression is a parenthesized format specifier.
6527 If the next token is not EOS or SEMICOLON, then because it is not a
6528 binary operator (it is NAME, OPEN_PAREN, &c), the expression is
6529 a unit specifier, and parentheses should not be added to it because
6530 they surround the I/O control list that consists of only the unit
6531 specifier. If the next token is EOS or SEMICOLON, the statement
6532 must be disambiguated by looking at the type of the expression -- a
6533 character expression is a parenthesized format specifier, while a
6534 non-character expression is a unit specifier.
6535
6536 Another issue is how to do the callback so the recipient of the
6537 next token knows how to handle it if it is a COMMA. In all other
6538 cases, disambiguation is straightforward: the same approach as the
6539 above is used.
6540
6541 EXTENSION: in COMMA case, if not pedantic, use same disambiguation
6542 as for EOS/SEMICOLON case; f2c allows "READ (cilist) [[,]iolist]"
6543 and apparently other compilers do, as well, and some code out there
6544 uses this "feature".
6545
6546 19-Feb-91 JCB 1.1
6547 Extend to allow COMMA as nondisambiguating by itself. Remember
6548 to not try and check info field for opSTAR, since that expr doesn't
6549 have a valid info field. */
6550
6551 static ffelexHandler
6552 ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t)
6553 {
6554 ffeexprCallback callback;
6555 ffeexprStack_ s;
6556 ffelexHandler next;
6557 ffelexToken orig_ft = ffeexpr_tokens_[0]; /* In case callback clobbers
6558 these. */
6559 ffelexToken orig_t = ffeexpr_tokens_[1];
6560 ffebld expr = ffeexpr_stack_->expr;
6561
6562 switch (ffelex_token_type (t))
6563 {
6564 case FFELEX_typeCOMMA: /* Subexpr is parenthesized format specifier. */
6565 if (ffe_is_pedantic ())
6566 goto pedantic_comma; /* :::::::::::::::::::: */
6567 /* Fall through. */
6568 case FFELEX_typeEOS: /* Ambiguous; use type of expr to
6569 disambiguate. */
6570 case FFELEX_typeSEMICOLON:
6571 if ((expr == NULL) || (ffebld_op (expr) == FFEBLD_opANY)
6572 || (ffebld_op (expr) == FFEBLD_opSTAR)
6573 || (ffeinfo_basictype (ffebld_info (expr))
6574 != FFEINFO_basictypeCHARACTER))
6575 break; /* Not a valid CHARACTER entity, can't be a
6576 format spec. */
6577 /* Fall through. */
6578 default: /* Binary op (we assume; error otherwise);
6579 format specifier. */
6580
6581 pedantic_comma: /* :::::::::::::::::::: */
6582
6583 switch (ffeexpr_stack_->context)
6584 {
6585 case FFEEXPR_contextFILENUMAMBIG:
6586 ffeexpr_stack_->context = FFEEXPR_contextFILENUM;
6587 break;
6588
6589 case FFEEXPR_contextFILEUNITAMBIG:
6590 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
6591 break;
6592
6593 default:
6594 assert ("bad context" == NULL);
6595 break;
6596 }
6597
6598 ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
6599 next = (ffelexHandler) ffeexpr_cb_close_paren_ (orig_ft, expr, orig_t);
6600 ffelex_token_kill (orig_ft);
6601 ffelex_token_kill (orig_t);
6602 return (ffelexHandler) (*next) (t);
6603
6604 case FFELEX_typeOPEN_PAREN:/* Non-binary op; beginning of I/O list. */
6605 case FFELEX_typeNAME:
6606 break;
6607 }
6608
6609 expr = ffeexpr_finished_ambig_ (orig_ft, expr);
6610
6611 /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
6612 that preceded the expression starts a list of expressions, and the expr
6613 hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
6614 node. The callback function should extract the real expr from the head
6615 of this opITEM node after testing it. */
6616
6617 expr = ffebld_new_item (expr, NULL);
6618
6619 ffebld_pool_pop ();
6620 callback = ffeexpr_stack_->callback;
6621 ffelex_token_kill (ffeexpr_stack_->first_token);
6622 s = ffeexpr_stack_->previous;
6623 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
6624 ffeexpr_stack_ = s;
6625 next = (ffelexHandler) (*callback) (orig_ft, expr, orig_t);
6626 ffelex_token_kill (orig_ft);
6627 ffelex_token_kill (orig_t);
6628 return (ffelexHandler) (*next) (t);
6629 }
6630
6631 /* ffeexpr_cb_close_paren_c_ -- OPEN_PAREN expr (possible complex)
6632
6633 Pass it to ffeexpr_rhs as the callback routine.
6634
6635 Makes sure the end token is close-paren and swallows it, or a comma
6636 and handles complex/implied-do possibilities, else issues
6637 an error message and doesn't swallow the token (passing it along instead). */
6638
6639 static ffelexHandler
6640 ffeexpr_cb_close_paren_c_ (ffelexToken ft, ffebld expr, ffelexToken t)
6641 {
6642 /* First check to see if this is a possible complex entity. It is if the
6643 token is a comma. */
6644
6645 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
6646 {
6647 ffeexpr_stack_->tokens[1] = ffelex_token_use (ft);
6648 ffeexpr_stack_->expr = expr;
6649 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
6650 FFEEXPR_contextPAREN_, ffeexpr_cb_comma_c_);
6651 }
6652
6653 return (ffelexHandler) ffeexpr_cb_close_paren_ (ft, expr, t);
6654 }
6655
6656 /* ffeexpr_cb_comma_c_ -- OPEN_PAREN expr COMMA expr
6657
6658 Pass it to ffeexpr_rhs as the callback routine.
6659
6660 If this token is not a comma, we have a complex constant (or an attempt
6661 at one), so handle it accordingly, displaying error messages if the token
6662 is not a close-paren. */
6663
6664 static ffelexHandler
6665 ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr, ffelexToken t)
6666 {
6667 ffeexprExpr_ e;
6668 ffeinfoBasictype lty = (ffeexpr_stack_->expr == NULL)
6669 ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (ffeexpr_stack_->expr));
6670 ffeinfoBasictype rty = (expr == NULL)
6671 ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (expr));
6672 ffeinfoKindtype lkt;
6673 ffeinfoKindtype rkt;
6674 ffeinfoKindtype nkt;
6675 bool ok = TRUE;
6676 ffebld orig;
6677
6678 if ((ffeexpr_stack_->expr == NULL)
6679 || (ffebld_op (ffeexpr_stack_->expr) != FFEBLD_opCONTER)
6680 || (((orig = ffebld_conter_orig (ffeexpr_stack_->expr)) != NULL)
6681 && (((ffebld_op (orig) != FFEBLD_opUMINUS)
6682 && (ffebld_op (orig) != FFEBLD_opUPLUS))
6683 || (ffebld_conter_orig (ffebld_left (orig)) != NULL)))
6684 || ((lty != FFEINFO_basictypeINTEGER)
6685 && (lty != FFEINFO_basictypeREAL)))
6686 {
6687 if ((lty != FFEINFO_basictypeANY)
6688 && ffebad_start (FFEBAD_INVALID_COMPLEX_PART))
6689 {
6690 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
6691 ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
6692 ffebad_string ("Real");
6693 ffebad_finish ();
6694 }
6695 ok = FALSE;
6696 }
6697 if ((expr == NULL)
6698 || (ffebld_op (expr) != FFEBLD_opCONTER)
6699 || (((orig = ffebld_conter_orig (expr)) != NULL)
6700 && (((ffebld_op (orig) != FFEBLD_opUMINUS)
6701 && (ffebld_op (orig) != FFEBLD_opUPLUS))
6702 || (ffebld_conter_orig (ffebld_left (orig)) != NULL)))
6703 || ((rty != FFEINFO_basictypeINTEGER)
6704 && (rty != FFEINFO_basictypeREAL)))
6705 {
6706 if ((rty != FFEINFO_basictypeANY)
6707 && ffebad_start (FFEBAD_INVALID_COMPLEX_PART))
6708 {
6709 ffebad_here (0, ffelex_token_where_line (ft),
6710 ffelex_token_where_column (ft));
6711 ffebad_string ("Imaginary");
6712 ffebad_finish ();
6713 }
6714 ok = FALSE;
6715 }
6716
6717 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
6718
6719 /* Push the (parenthesized) expression as an operand onto the expression
6720 stack. */
6721
6722 e = ffeexpr_expr_new_ ();
6723 e->type = FFEEXPR_exprtypeOPERAND_;
6724 e->token = ffeexpr_stack_->tokens[0];
6725
6726 if (ok)
6727 {
6728 if (lty == FFEINFO_basictypeINTEGER)
6729 lkt = FFEINFO_kindtypeREALDEFAULT;
6730 else
6731 lkt = ffeinfo_kindtype (ffebld_info (ffeexpr_stack_->expr));
6732 if (rty == FFEINFO_basictypeINTEGER)
6733 rkt = FFEINFO_kindtypeREALDEFAULT;
6734 else
6735 rkt = ffeinfo_kindtype (ffebld_info (expr));
6736
6737 nkt = ffeinfo_kindtype_max (FFEINFO_basictypeCOMPLEX, lkt, rkt);
6738 ffeexpr_stack_->expr = ffeexpr_convert (ffeexpr_stack_->expr,
6739 ffeexpr_stack_->tokens[1], ffeexpr_stack_->tokens[0],
6740 FFEINFO_basictypeREAL, nkt, 0, FFETARGET_charactersizeNONE,
6741 FFEEXPR_contextLET);
6742 expr = ffeexpr_convert (expr,
6743 ffeexpr_stack_->tokens[1], ffeexpr_stack_->tokens[0],
6744 FFEINFO_basictypeREAL, nkt, 0, FFETARGET_charactersizeNONE,
6745 FFEEXPR_contextLET);
6746 }
6747 else
6748 nkt = FFEINFO_kindtypeANY;
6749
6750 switch (nkt)
6751 {
6752 #if FFETARGET_okCOMPLEX1
6753 case FFEINFO_kindtypeREAL1:
6754 e->u.operand = ffebld_new_conter (ffebld_constant_new_complex1
6755 (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
6756 ffebld_set_info (e->u.operand,
6757 ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
6758 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
6759 FFETARGET_charactersizeNONE));
6760 break;
6761 #endif
6762
6763 #if FFETARGET_okCOMPLEX2
6764 case FFEINFO_kindtypeREAL2:
6765 e->u.operand = ffebld_new_conter (ffebld_constant_new_complex2
6766 (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
6767 ffebld_set_info (e->u.operand,
6768 ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
6769 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
6770 FFETARGET_charactersizeNONE));
6771 break;
6772 #endif
6773
6774 #if FFETARGET_okCOMPLEX3
6775 case FFEINFO_kindtypeREAL3:
6776 e->u.operand = ffebld_new_conter (ffebld_constant_new_complex3
6777 (ffebld_conter (ffeexpr_stack_->expr), ffebld_conter (expr)));
6778 ffebld_set_info (e->u.operand,
6779 ffeinfo_new (FFEINFO_basictypeCOMPLEX, nkt, 0,
6780 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
6781 FFETARGET_charactersizeNONE));
6782 break;
6783 #endif
6784
6785 default:
6786 if (ffebad_start ((nkt == FFEINFO_kindtypeREALDOUBLE)
6787 ? FFEBAD_BAD_DBLCMPLX : FFEBAD_BAD_COMPLEX))
6788 {
6789 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
6790 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
6791 ffebad_finish ();
6792 }
6793 /* Fall through. */
6794 case FFEINFO_kindtypeANY:
6795 e->u.operand = ffebld_new_any ();
6796 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
6797 break;
6798 }
6799 ffeexpr_exprstack_push_operand_ (e);
6800
6801 /* Now, if the token is a close parenthese, we're in great shape so return
6802 the next handler. */
6803
6804 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
6805 return (ffelexHandler) ffeexpr_token_binary_;
6806
6807 /* Oops, naughty user didn't specify the close paren! */
6808
6809 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
6810 {
6811 ffebad_here (0, ffelex_token_where_line (t),
6812 ffelex_token_where_column (t));
6813 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
6814 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
6815 ffebad_finish ();
6816 }
6817
6818 return
6819 (ffelexHandler) ffeexpr_find_close_paren_ (t,
6820 (ffelexHandler)
6821 ffeexpr_token_binary_);
6822 }
6823
6824 /* ffeexpr_cb_close_paren_ci_ -- OPEN_PAREN expr (possible complex or
6825 implied-DO construct)
6826
6827 Pass it to ffeexpr_rhs as the callback routine.
6828
6829 Makes sure the end token is close-paren and swallows it, or a comma
6830 and handles complex/implied-do possibilities, else issues
6831 an error message and doesn't swallow the token (passing it along instead). */
6832
6833 static ffelexHandler
6834 ffeexpr_cb_close_paren_ci_ (ffelexToken ft, ffebld expr, ffelexToken t)
6835 {
6836 ffeexprContext ctx;
6837
6838 /* First check to see if this is a possible complex or implied-DO entity.
6839 It is if the token is a comma. */
6840
6841 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
6842 {
6843 switch (ffeexpr_stack_->context)
6844 {
6845 case FFEEXPR_contextIOLIST:
6846 case FFEEXPR_contextIMPDOITEM_:
6847 ctx = FFEEXPR_contextIMPDOITEM_;
6848 break;
6849
6850 case FFEEXPR_contextIOLISTDF:
6851 case FFEEXPR_contextIMPDOITEMDF_:
6852 ctx = FFEEXPR_contextIMPDOITEMDF_;
6853 break;
6854
6855 default:
6856 assert ("bad context" == NULL);
6857 ctx = FFEEXPR_contextIMPDOITEM_;
6858 break;
6859 }
6860
6861 ffeexpr_stack_->tokens[0] = ffelex_token_use (ft);
6862 ffeexpr_stack_->expr = expr;
6863 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
6864 ctx, ffeexpr_cb_comma_ci_);
6865 }
6866
6867 ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
6868 return (ffelexHandler) ffeexpr_cb_close_paren_ (ft, expr, t);
6869 }
6870
6871 /* ffeexpr_cb_comma_ci_ -- OPEN_PAREN expr COMMA expr
6872
6873 Pass it to ffeexpr_rhs as the callback routine.
6874
6875 If this token is not a comma, we have a complex constant (or an attempt
6876 at one), so handle it accordingly, displaying error messages if the token
6877 is not a close-paren. If we have a comma here, it is an attempt at an
6878 implied-DO, so start making a list accordingly. Oh, it might be an
6879 equal sign also, meaning an implied-DO with only one item in its list. */
6880
6881 static ffelexHandler
6882 ffeexpr_cb_comma_ci_ (ffelexToken ft, ffebld expr, ffelexToken t)
6883 {
6884 ffebld fexpr;
6885
6886 /* First check to see if this is a possible complex constant. It is if the
6887 token is not a comma or an equals sign, in which case it should be a
6888 close-paren. */
6889
6890 if ((ffelex_token_type (t) != FFELEX_typeCOMMA)
6891 && (ffelex_token_type (t) != FFELEX_typeEQUALS))
6892 {
6893 ffeexpr_stack_->tokens[1] = ffeexpr_stack_->tokens[0];
6894 ffeexpr_stack_->tokens[0] = ffelex_token_use (ffeexpr_stack_->first_token);
6895 return (ffelexHandler) ffeexpr_cb_comma_c_ (ft, expr, t);
6896 }
6897
6898 /* Here we have either EQUALS or COMMA, meaning we are in an implied-DO
6899 construct. Make a list and handle accordingly. */
6900
6901 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
6902 fexpr = ffeexpr_stack_->expr;
6903 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
6904 ffebld_append_item (&ffeexpr_stack_->bottom, fexpr);
6905 return (ffelexHandler) ffeexpr_cb_comma_i_1_ (ft, expr, t);
6906 }
6907
6908 /* ffeexpr_cb_comma_i_ -- OPEN_PAREN expr
6909
6910 Pass it to ffeexpr_rhs as the callback routine.
6911
6912 Handle first item in an implied-DO construct. */
6913
6914 static ffelexHandler
6915 ffeexpr_cb_comma_i_ (ffelexToken ft, ffebld expr, ffelexToken t)
6916 {
6917 if (ffelex_token_type (t) != FFELEX_typeCOMMA)
6918 {
6919 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
6920 {
6921 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
6922 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
6923 ffelex_token_where_column (ffeexpr_stack_->first_token));
6924 ffebad_finish ();
6925 }
6926 ffebld_end_list (&ffeexpr_stack_->bottom);
6927 ffeexpr_stack_->expr = ffebld_new_any ();
6928 ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
6929 if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
6930 return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
6931 return (ffelexHandler) ffeexpr_cb_comma_i_5_;
6932 }
6933
6934 return (ffelexHandler) ffeexpr_cb_comma_i_1_ (ft, expr, t);
6935 }
6936
6937 /* ffeexpr_cb_comma_i_1_ -- OPEN_PAREN expr
6938
6939 Pass it to ffeexpr_rhs as the callback routine.
6940
6941 Handle first item in an implied-DO construct. */
6942
6943 static ffelexHandler
6944 ffeexpr_cb_comma_i_1_ (ffelexToken ft, ffebld expr, ffelexToken t)
6945 {
6946 ffeexprContext ctxi;
6947 ffeexprContext ctxc;
6948
6949 switch (ffeexpr_stack_->context)
6950 {
6951 case FFEEXPR_contextDATA:
6952 case FFEEXPR_contextDATAIMPDOITEM_:
6953 ctxi = FFEEXPR_contextDATAIMPDOITEM_;
6954 ctxc = FFEEXPR_contextDATAIMPDOCTRL_;
6955 break;
6956
6957 case FFEEXPR_contextIOLIST:
6958 case FFEEXPR_contextIMPDOITEM_:
6959 ctxi = FFEEXPR_contextIMPDOITEM_;
6960 ctxc = FFEEXPR_contextIMPDOCTRL_;
6961 break;
6962
6963 case FFEEXPR_contextIOLISTDF:
6964 case FFEEXPR_contextIMPDOITEMDF_:
6965 ctxi = FFEEXPR_contextIMPDOITEMDF_;
6966 ctxc = FFEEXPR_contextIMPDOCTRL_;
6967 break;
6968
6969 default:
6970 assert ("bad context" == NULL);
6971 ctxi = FFEEXPR_context;
6972 ctxc = FFEEXPR_context;
6973 break;
6974 }
6975
6976 switch (ffelex_token_type (t))
6977 {
6978 case FFELEX_typeCOMMA:
6979 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
6980 if (ffeexpr_stack_->is_rhs)
6981 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
6982 ctxi, ffeexpr_cb_comma_i_1_);
6983 return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
6984 ctxi, ffeexpr_cb_comma_i_1_);
6985
6986 case FFELEX_typeEQUALS:
6987 ffebld_end_list (&ffeexpr_stack_->bottom);
6988
6989 /* Complain if implied-DO variable in list of items to be read. */
6990
6991 if ((ctxc == FFEEXPR_contextIMPDOCTRL_) && !ffeexpr_stack_->is_rhs)
6992 ffeexpr_check_impdo_ (ffeexpr_stack_->expr,
6993 ffeexpr_stack_->first_token, expr, ft);
6994
6995 /* Set doiter flag for all appropriate SYMTERs. */
6996
6997 ffeexpr_update_impdo_ (ffeexpr_stack_->expr, expr);
6998
6999 ffeexpr_stack_->expr = ffebld_new_impdo (ffeexpr_stack_->expr, NULL);
7000 ffebld_set_info (ffeexpr_stack_->expr,
7001 ffeinfo_new (FFEINFO_basictypeNONE,
7002 FFEINFO_kindtypeNONE,
7003 0,
7004 FFEINFO_kindNONE,
7005 FFEINFO_whereNONE,
7006 FFETARGET_charactersizeNONE));
7007 ffebld_init_list (&(ffebld_right (ffeexpr_stack_->expr)),
7008 &ffeexpr_stack_->bottom);
7009 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
7010 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
7011 ctxc, ffeexpr_cb_comma_i_2_);
7012
7013 default:
7014 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
7015 {
7016 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7017 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
7018 ffelex_token_where_column (ffeexpr_stack_->first_token));
7019 ffebad_finish ();
7020 }
7021 ffebld_end_list (&ffeexpr_stack_->bottom);
7022 ffeexpr_stack_->expr = ffebld_new_any ();
7023 ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
7024 if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
7025 return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
7026 return (ffelexHandler) ffeexpr_cb_comma_i_5_;
7027 }
7028 }
7029
7030 /* ffeexpr_cb_comma_i_2_ -- OPEN_PAREN expr-list EQUALS expr
7031
7032 Pass it to ffeexpr_rhs as the callback routine.
7033
7034 Handle start-value in an implied-DO construct. */
7035
7036 static ffelexHandler
7037 ffeexpr_cb_comma_i_2_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
7038 {
7039 ffeexprContext ctx;
7040
7041 switch (ffeexpr_stack_->context)
7042 {
7043 case FFEEXPR_contextDATA:
7044 case FFEEXPR_contextDATAIMPDOITEM_:
7045 ctx = FFEEXPR_contextDATAIMPDOCTRL_;
7046 break;
7047
7048 case FFEEXPR_contextIOLIST:
7049 case FFEEXPR_contextIOLISTDF:
7050 case FFEEXPR_contextIMPDOITEM_:
7051 case FFEEXPR_contextIMPDOITEMDF_:
7052 ctx = FFEEXPR_contextIMPDOCTRL_;
7053 break;
7054
7055 default:
7056 assert ("bad context" == NULL);
7057 ctx = FFEEXPR_context;
7058 break;
7059 }
7060
7061 switch (ffelex_token_type (t))
7062 {
7063 case FFELEX_typeCOMMA:
7064 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
7065 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
7066 ctx, ffeexpr_cb_comma_i_3_);
7067 break;
7068
7069 default:
7070 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
7071 {
7072 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7073 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
7074 ffelex_token_where_column (ffeexpr_stack_->first_token));
7075 ffebad_finish ();
7076 }
7077 ffebld_end_list (&ffeexpr_stack_->bottom);
7078 ffeexpr_stack_->expr = ffebld_new_any ();
7079 ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
7080 if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
7081 return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
7082 return (ffelexHandler) ffeexpr_cb_comma_i_5_;
7083 }
7084 }
7085
7086 /* ffeexpr_cb_comma_i_3_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
7087
7088 Pass it to ffeexpr_rhs as the callback routine.
7089
7090 Handle end-value in an implied-DO construct. */
7091
7092 static ffelexHandler
7093 ffeexpr_cb_comma_i_3_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
7094 {
7095 ffeexprContext ctx;
7096
7097 switch (ffeexpr_stack_->context)
7098 {
7099 case FFEEXPR_contextDATA:
7100 case FFEEXPR_contextDATAIMPDOITEM_:
7101 ctx = FFEEXPR_contextDATAIMPDOCTRL_;
7102 break;
7103
7104 case FFEEXPR_contextIOLIST:
7105 case FFEEXPR_contextIOLISTDF:
7106 case FFEEXPR_contextIMPDOITEM_:
7107 case FFEEXPR_contextIMPDOITEMDF_:
7108 ctx = FFEEXPR_contextIMPDOCTRL_;
7109 break;
7110
7111 default:
7112 assert ("bad context" == NULL);
7113 ctx = FFEEXPR_context;
7114 break;
7115 }
7116
7117 switch (ffelex_token_type (t))
7118 {
7119 case FFELEX_typeCOMMA:
7120 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
7121 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
7122 ctx, ffeexpr_cb_comma_i_4_);
7123 break;
7124
7125 case FFELEX_typeCLOSE_PAREN:
7126 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
7127 return (ffelexHandler) ffeexpr_cb_comma_i_4_ (NULL, NULL, t);
7128 break;
7129
7130 default:
7131 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
7132 {
7133 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7134 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
7135 ffelex_token_where_column (ffeexpr_stack_->first_token));
7136 ffebad_finish ();
7137 }
7138 ffebld_end_list (&ffeexpr_stack_->bottom);
7139 ffeexpr_stack_->expr = ffebld_new_any ();
7140 ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
7141 if (ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
7142 return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
7143 return (ffelexHandler) ffeexpr_cb_comma_i_5_;
7144 }
7145 }
7146
7147 /* ffeexpr_cb_comma_i_4_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
7148 [COMMA expr]
7149
7150 Pass it to ffeexpr_rhs as the callback routine.
7151
7152 Handle incr-value in an implied-DO construct. */
7153
7154 static ffelexHandler
7155 ffeexpr_cb_comma_i_4_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
7156 {
7157 switch (ffelex_token_type (t))
7158 {
7159 case FFELEX_typeCLOSE_PAREN:
7160 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
7161 ffebld_end_list (&ffeexpr_stack_->bottom);
7162 {
7163 ffebld item;
7164
7165 for (item = ffebld_left (ffeexpr_stack_->expr);
7166 item != NULL;
7167 item = ffebld_trail (item))
7168 if (ffebld_op (ffebld_head (item)) == FFEBLD_opANY)
7169 goto replace_with_any; /* :::::::::::::::::::: */
7170
7171 for (item = ffebld_right (ffeexpr_stack_->expr);
7172 item != NULL;
7173 item = ffebld_trail (item))
7174 if ((ffebld_head (item) != NULL) /* Increment may be NULL. */
7175 && (ffebld_op (ffebld_head (item)) == FFEBLD_opANY))
7176 goto replace_with_any; /* :::::::::::::::::::: */
7177 }
7178 break;
7179
7180 default:
7181 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO))
7182 {
7183 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7184 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
7185 ffelex_token_where_column (ffeexpr_stack_->first_token));
7186 ffebad_finish ();
7187 }
7188 ffebld_end_list (&ffeexpr_stack_->bottom);
7189
7190 replace_with_any: /* :::::::::::::::::::: */
7191
7192 ffeexpr_stack_->expr = ffebld_new_any ();
7193 ffebld_set_info (ffeexpr_stack_->expr, ffeinfo_new_any ());
7194 break;
7195 }
7196
7197 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
7198 return (ffelexHandler) ffeexpr_cb_comma_i_5_;
7199 return (ffelexHandler) ffeexpr_cb_comma_i_5_ (t);
7200 }
7201
7202 /* ffeexpr_cb_comma_i_5_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
7203 [COMMA expr] CLOSE_PAREN
7204
7205 Pass it to ffeexpr_rhs as the callback routine.
7206
7207 Collects token following implied-DO construct for callback function. */
7208
7209 static ffelexHandler
7210 ffeexpr_cb_comma_i_5_ (ffelexToken t)
7211 {
7212 ffeexprCallback callback;
7213 ffeexprStack_ s;
7214 ffelexHandler next;
7215 ffelexToken ft;
7216 ffebld expr;
7217 bool terminate;
7218
7219 switch (ffeexpr_stack_->context)
7220 {
7221 case FFEEXPR_contextDATA:
7222 case FFEEXPR_contextDATAIMPDOITEM_:
7223 terminate = TRUE;
7224 break;
7225
7226 case FFEEXPR_contextIOLIST:
7227 case FFEEXPR_contextIOLISTDF:
7228 case FFEEXPR_contextIMPDOITEM_:
7229 case FFEEXPR_contextIMPDOITEMDF_:
7230 terminate = FALSE;
7231 break;
7232
7233 default:
7234 assert ("bad context" == NULL);
7235 terminate = FALSE;
7236 break;
7237 }
7238
7239 ffebld_pool_pop ();
7240 callback = ffeexpr_stack_->callback;
7241 ft = ffeexpr_stack_->first_token;
7242 expr = ffeexpr_stack_->expr;
7243 s = ffeexpr_stack_->previous;
7244 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
7245 sizeof (*ffeexpr_stack_));
7246 ffeexpr_stack_ = s;
7247 next = (ffelexHandler) (*callback) (ft, expr, t);
7248 ffelex_token_kill (ft);
7249 if (terminate)
7250 {
7251 ffesymbol_drive_sfnames (ffeexpr_check_impctrl_);
7252 --ffeexpr_level_;
7253 if (ffeexpr_level_ == 0)
7254 ffe_terminate_4 ();
7255 }
7256 return (ffelexHandler) next;
7257 }
7258
7259 /* ffeexpr_cb_end_loc_ -- Handle end of %LOC subexpression
7260
7261 Makes sure the end token is close-paren and swallows it, else issues
7262 an error message and doesn't swallow the token (passing it along instead).
7263 In either case wraps up subexpression construction by enclosing the
7264 ffebld expression in a %LOC. */
7265
7266 static ffelexHandler
7267 ffeexpr_cb_end_loc_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
7268 {
7269 ffeexprExpr_ e;
7270
7271 /* First push the (%LOC) expression as an operand onto the expression
7272 stack. */
7273
7274 e = ffeexpr_expr_new_ ();
7275 e->type = FFEEXPR_exprtypeOPERAND_;
7276 e->token = ffeexpr_stack_->tokens[0];
7277 e->u.operand = ffebld_new_percent_loc (expr);
7278 ffebld_set_info (e->u.operand,
7279 ffeinfo_new (FFEINFO_basictypeINTEGER,
7280 ffecom_pointer_kind (),
7281 0,
7282 FFEINFO_kindENTITY,
7283 FFEINFO_whereFLEETING,
7284 FFETARGET_charactersizeNONE));
7285 #if 0 /* ~~ */
7286 e->u.operand = ffeexpr_collapse_percent_loc (e->u.operand, ft);
7287 #endif
7288 ffeexpr_exprstack_push_operand_ (e);
7289
7290 /* Now, if the token is a close parenthese, we're in great shape so return
7291 the next handler. */
7292
7293 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
7294 {
7295 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
7296 return (ffelexHandler) ffeexpr_token_binary_;
7297 }
7298
7299 /* Oops, naughty user didn't specify the close paren! */
7300
7301 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
7302 {
7303 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7304 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
7305 ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
7306 ffebad_finish ();
7307 }
7308
7309 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
7310 return
7311 (ffelexHandler) ffeexpr_find_close_paren_ (t,
7312 (ffelexHandler)
7313 ffeexpr_token_binary_);
7314 }
7315
7316 /* ffeexpr_cb_end_notloc_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
7317
7318 Should be CLOSE_PAREN, and make sure expr isn't a %(VAL,REF,DESCR). */
7319
7320 static ffelexHandler
7321 ffeexpr_cb_end_notloc_ (ffelexToken ft, ffebld expr, ffelexToken t)
7322 {
7323 ffeexprExpr_ e;
7324 ffebldOp op;
7325
7326 /* If expression is itself a %(VAL,REF,DESCR), complain and strip off all
7327 such things until the lowest-level expression is reached. */
7328
7329 op = ffebld_op (expr);
7330 if ((op == FFEBLD_opPERCENT_VAL) || (op == FFEBLD_opPERCENT_REF)
7331 || (op == FFEBLD_opPERCENT_DESCR))
7332 {
7333 if (ffebad_start (FFEBAD_NESTED_PERCENT))
7334 {
7335 ffebad_here (0, ffelex_token_where_line (ft),
7336 ffelex_token_where_column (ft));
7337 ffebad_finish ();
7338 }
7339
7340 do
7341 {
7342 expr = ffebld_left (expr);
7343 op = ffebld_op (expr);
7344 }
7345 while ((op == FFEBLD_opPERCENT_VAL) || (op == FFEBLD_opPERCENT_REF)
7346 || (op == FFEBLD_opPERCENT_DESCR));
7347 }
7348
7349 /* Push the expression as an operand onto the expression stack. */
7350
7351 e = ffeexpr_expr_new_ ();
7352 e->type = FFEEXPR_exprtypeOPERAND_;
7353 e->token = ffeexpr_stack_->tokens[0];
7354 switch (ffeexpr_stack_->percent)
7355 {
7356 case FFEEXPR_percentVAL_:
7357 e->u.operand = ffebld_new_percent_val (expr);
7358 break;
7359
7360 case FFEEXPR_percentREF_:
7361 e->u.operand = ffebld_new_percent_ref (expr);
7362 break;
7363
7364 case FFEEXPR_percentDESCR_:
7365 e->u.operand = ffebld_new_percent_descr (expr);
7366 break;
7367
7368 default:
7369 assert ("%lossage" == NULL);
7370 e->u.operand = expr;
7371 break;
7372 }
7373 ffebld_set_info (e->u.operand, ffebld_info (expr));
7374 #if 0 /* ~~ */
7375 e->u.operand = ffeexpr_collapse_percent_ ? ? ? (e->u.operand, ft);
7376 #endif
7377 ffeexpr_exprstack_push_operand_ (e);
7378
7379 /* Now, if the token is a close parenthese, we're in great shape so return
7380 the next handler. */
7381
7382 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
7383 return (ffelexHandler) ffeexpr_cb_end_notloc_1_;
7384
7385 /* Oops, naughty user didn't specify the close paren! */
7386
7387 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN))
7388 {
7389 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7390 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
7391 ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
7392 ffebad_finish ();
7393 }
7394
7395 ffebld_set_op (e->u.operand, FFEBLD_opPERCENT_LOC);
7396
7397 switch (ffeexpr_stack_->context)
7398 {
7399 case FFEEXPR_contextACTUALARG_:
7400 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
7401 break;
7402
7403 case FFEEXPR_contextINDEXORACTUALARG_:
7404 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
7405 break;
7406
7407 case FFEEXPR_contextSFUNCDEFACTUALARG_:
7408 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
7409 break;
7410
7411 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
7412 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
7413 break;
7414
7415 default:
7416 assert ("bad context?!?!" == NULL);
7417 break;
7418 }
7419
7420 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
7421 return
7422 (ffelexHandler) ffeexpr_find_close_paren_ (t,
7423 (ffelexHandler)
7424 ffeexpr_cb_end_notloc_1_);
7425 }
7426
7427 /* ffeexpr_cb_end_notloc_1_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
7428 CLOSE_PAREN
7429
7430 Should be COMMA or CLOSE_PAREN, else change back to %LOC. */
7431
7432 static ffelexHandler
7433 ffeexpr_cb_end_notloc_1_ (ffelexToken t)
7434 {
7435 switch (ffelex_token_type (t))
7436 {
7437 case FFELEX_typeCOMMA:
7438 case FFELEX_typeCLOSE_PAREN:
7439 switch (ffeexpr_stack_->context)
7440 {
7441 case FFEEXPR_contextACTUALARG_:
7442 case FFEEXPR_contextSFUNCDEFACTUALARG_:
7443 break;
7444
7445 case FFEEXPR_contextINDEXORACTUALARG_:
7446 ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
7447 break;
7448
7449 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
7450 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
7451 break;
7452
7453 default:
7454 assert ("bad context?!?!" == NULL);
7455 break;
7456 }
7457 break;
7458
7459 default:
7460 if (ffebad_start (FFEBAD_INVALID_PERCENT))
7461 {
7462 ffebad_here (0,
7463 ffelex_token_where_line (ffeexpr_stack_->first_token),
7464 ffelex_token_where_column (ffeexpr_stack_->first_token));
7465 ffebad_string (ffelex_token_text (ffeexpr_stack_->tokens[1]));
7466 ffebad_finish ();
7467 }
7468
7469 ffebld_set_op (ffeexpr_stack_->exprstack->u.operand,
7470 FFEBLD_opPERCENT_LOC);
7471
7472 switch (ffeexpr_stack_->context)
7473 {
7474 case FFEEXPR_contextACTUALARG_:
7475 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
7476 break;
7477
7478 case FFEEXPR_contextINDEXORACTUALARG_:
7479 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
7480 break;
7481
7482 case FFEEXPR_contextSFUNCDEFACTUALARG_:
7483 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
7484 break;
7485
7486 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
7487 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
7488 break;
7489
7490 default:
7491 assert ("bad context?!?!" == NULL);
7492 break;
7493 }
7494 }
7495
7496 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
7497 return
7498 (ffelexHandler) ffeexpr_token_binary_ (t);
7499 }
7500
7501 /* Process DATA implied-DO iterator variables as this implied-DO level
7502 terminates. At this point, ffeexpr_level_ == 1 when we see the
7503 last right-paren in "DATA (A(I),I=1,10)/.../". */
7504
7505 static ffesymbol
7506 ffeexpr_check_impctrl_ (ffesymbol s)
7507 {
7508 assert (s != NULL);
7509 assert (ffesymbol_sfdummyparent (s) != NULL);
7510
7511 switch (ffesymbol_state (s))
7512 {
7513 case FFESYMBOL_stateNONE: /* Used as iterator already. Now let symbol
7514 be used as iterator at any level at or
7515 innermore than the outermost of the
7516 current level and the symbol's current
7517 level. */
7518 if (ffeexpr_level_ < ffesymbol_maxentrynum (s))
7519 {
7520 ffesymbol_signal_change (s);
7521 ffesymbol_set_maxentrynum (s, ffeexpr_level_);
7522 ffesymbol_signal_unreported (s);
7523 }
7524 break;
7525
7526 case FFESYMBOL_stateSEEN: /* Seen already in this or other implied-DO.
7527 Error if at outermost level, else it can
7528 still become an iterator. */
7529 if ((ffeexpr_level_ == 1)
7530 && ffebad_start (FFEBAD_BAD_IMPDCL))
7531 {
7532 ffebad_string (ffesymbol_text (s));
7533 ffebad_here (0, ffesymbol_where_line (s), ffesymbol_where_column (s));
7534 ffebad_finish ();
7535 }
7536 break;
7537
7538 case FFESYMBOL_stateUNCERTAIN: /* Iterator. */
7539 assert (ffeexpr_level_ <= ffesymbol_maxentrynum (s));
7540 ffesymbol_signal_change (s);
7541 ffesymbol_set_state (s, FFESYMBOL_stateNONE);
7542 ffesymbol_signal_unreported (s);
7543 break;
7544
7545 case FFESYMBOL_stateUNDERSTOOD:
7546 break; /* ANY. */
7547
7548 default:
7549 assert ("Sasha Foo!!" == NULL);
7550 break;
7551 }
7552
7553 return s;
7554 }
7555
7556 /* Issue diagnostic if implied-DO variable appears in list of lhs
7557 expressions (as in "READ *, (I,I=1,10)"). */
7558
7559 static void
7560 ffeexpr_check_impdo_ (ffebld list, ffelexToken list_t,
7561 ffebld dovar, ffelexToken dovar_t)
7562 {
7563 ffebld item;
7564 ffesymbol dovar_sym;
7565 int itemnum;
7566
7567 if (ffebld_op (dovar) != FFEBLD_opSYMTER)
7568 return; /* Presumably opANY. */
7569
7570 dovar_sym = ffebld_symter (dovar);
7571
7572 for (itemnum = 1; list != NULL; list = ffebld_trail (list), ++itemnum)
7573 {
7574 if (((item = ffebld_head (list)) != NULL)
7575 && (ffebld_op (item) == FFEBLD_opSYMTER)
7576 && (ffebld_symter (item) == dovar_sym))
7577 {
7578 char itemno[20];
7579
7580 sprintf (&itemno[0], "%d", itemnum);
7581 if (ffebad_start (FFEBAD_DOITER_IMPDO))
7582 {
7583 ffebad_here (0, ffelex_token_where_line (list_t),
7584 ffelex_token_where_column (list_t));
7585 ffebad_here (1, ffelex_token_where_line (dovar_t),
7586 ffelex_token_where_column (dovar_t));
7587 ffebad_string (ffesymbol_text (dovar_sym));
7588 ffebad_string (itemno);
7589 ffebad_finish ();
7590 }
7591 }
7592 }
7593 }
7594
7595 /* Decorate any SYMTERs referencing the DO variable with the "doiter"
7596 flag. */
7597
7598 static void
7599 ffeexpr_update_impdo_ (ffebld list, ffebld dovar)
7600 {
7601 ffesymbol dovar_sym;
7602
7603 if (ffebld_op (dovar) != FFEBLD_opSYMTER)
7604 return; /* Presumably opANY. */
7605
7606 dovar_sym = ffebld_symter (dovar);
7607
7608 ffeexpr_update_impdo_sym_ (list, dovar_sym); /* Recurse! */
7609 }
7610
7611 /* Recursive function to update any expr so SYMTERs have "doiter" flag
7612 if they refer to the given variable. */
7613
7614 static void
7615 ffeexpr_update_impdo_sym_ (ffebld expr, ffesymbol dovar)
7616 {
7617 tail_recurse: /* :::::::::::::::::::: */
7618
7619 if (expr == NULL)
7620 return;
7621
7622 switch (ffebld_op (expr))
7623 {
7624 case FFEBLD_opSYMTER:
7625 if (ffebld_symter (expr) == dovar)
7626 ffebld_symter_set_is_doiter (expr, TRUE);
7627 break;
7628
7629 case FFEBLD_opITEM:
7630 ffeexpr_update_impdo_sym_ (ffebld_head (expr), dovar);
7631 expr = ffebld_trail (expr);
7632 goto tail_recurse; /* :::::::::::::::::::: */
7633
7634 default:
7635 break;
7636 }
7637
7638 switch (ffebld_arity (expr))
7639 {
7640 case 2:
7641 ffeexpr_update_impdo_sym_ (ffebld_left (expr), dovar);
7642 expr = ffebld_right (expr);
7643 goto tail_recurse; /* :::::::::::::::::::: */
7644
7645 case 1:
7646 expr = ffebld_left (expr);
7647 goto tail_recurse; /* :::::::::::::::::::: */
7648
7649 default:
7650 break;
7651 }
7652
7653 return;
7654 }
7655
7656 /* ffeexpr_context_outer_ -- Determine context of stack entry, skipping PARENs
7657
7658 if (ffeexpr_context_outer_(ffeexpr_stack_) == FFEEXPR_contextIF)
7659 // After zero or more PAREN_ contexts, an IF context exists */
7660
7661 static ffeexprContext
7662 ffeexpr_context_outer_ (ffeexprStack_ s)
7663 {
7664 assert (s != NULL);
7665
7666 for (;;)
7667 {
7668 switch (s->context)
7669 {
7670 case FFEEXPR_contextPAREN_:
7671 case FFEEXPR_contextPARENFILENUM_:
7672 case FFEEXPR_contextPARENFILEUNIT_:
7673 break;
7674
7675 default:
7676 return s->context;
7677 }
7678 s = s->previous;
7679 assert (s != NULL);
7680 }
7681 }
7682
7683 /* ffeexpr_percent_ -- Look up name in list of %FOO possibilities
7684
7685 ffeexprPercent_ p;
7686 ffelexToken t;
7687 p = ffeexpr_percent_(t);
7688
7689 Returns the identifier for the name, or the NONE identifier. */
7690
7691 static ffeexprPercent_
7692 ffeexpr_percent_ (ffelexToken t)
7693 {
7694 const char *p;
7695
7696 switch (ffelex_token_length (t))
7697 {
7698 case 3:
7699 switch (*(p = ffelex_token_text (t)))
7700 {
7701 case FFESRC_CASE_MATCH_INIT ('L', 'l', match_3l, no_match_3):
7702 if ((ffesrc_char_match_noninit (*++p, 'O', 'o'))
7703 && (ffesrc_char_match_noninit (*++p, 'C', 'c')))
7704 return FFEEXPR_percentLOC_;
7705 return FFEEXPR_percentNONE_;
7706
7707 case FFESRC_CASE_MATCH_INIT ('R', 'r', match_3r, no_match_3):
7708 if ((ffesrc_char_match_noninit (*++p, 'E', 'e'))
7709 && (ffesrc_char_match_noninit (*++p, 'F', 'f')))
7710 return FFEEXPR_percentREF_;
7711 return FFEEXPR_percentNONE_;
7712
7713 case FFESRC_CASE_MATCH_INIT ('V', 'v', match_3v, no_match_3):
7714 if ((ffesrc_char_match_noninit (*++p, 'A', 'a'))
7715 && (ffesrc_char_match_noninit (*++p, 'L', 'l')))
7716 return FFEEXPR_percentVAL_;
7717 return FFEEXPR_percentNONE_;
7718
7719 default:
7720 no_match_3: /* :::::::::::::::::::: */
7721 return FFEEXPR_percentNONE_;
7722 }
7723
7724 case 5:
7725 if (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "DESCR",
7726 "descr", "Descr") == 0)
7727 return FFEEXPR_percentDESCR_;
7728 return FFEEXPR_percentNONE_;
7729
7730 default:
7731 return FFEEXPR_percentNONE_;
7732 }
7733 }
7734
7735 /* ffeexpr_type_combine -- Binop combine types, check for mythical new COMPLEX
7736
7737 See prototype.
7738
7739 If combining the two basictype/kindtype pairs produces a COMPLEX with an
7740 unsupported kind type, complain and use the default kind type for
7741 COMPLEX. */
7742
7743 void
7744 ffeexpr_type_combine (ffeinfoBasictype *xnbt, ffeinfoKindtype *xnkt,
7745 ffeinfoBasictype lbt, ffeinfoKindtype lkt,
7746 ffeinfoBasictype rbt, ffeinfoKindtype rkt,
7747 ffelexToken t)
7748 {
7749 ffeinfoBasictype nbt;
7750 ffeinfoKindtype nkt;
7751
7752 nbt = ffeinfo_basictype_combine (lbt, rbt);
7753 if ((nbt == FFEINFO_basictypeCOMPLEX)
7754 && ((lbt == nbt) || (lbt == FFEINFO_basictypeREAL))
7755 && ((rbt == nbt) || (rbt == FFEINFO_basictypeREAL)))
7756 {
7757 nkt = ffeinfo_kindtype_max (nbt, lkt, rkt);
7758 if (ffe_is_pedantic_not_90 () && (nkt == FFEINFO_kindtypeREALDOUBLE))
7759 nkt = FFEINFO_kindtypeNONE; /* Force error. */
7760 switch (nkt)
7761 {
7762 #if FFETARGET_okCOMPLEX1
7763 case FFEINFO_kindtypeREAL1:
7764 #endif
7765 #if FFETARGET_okCOMPLEX2
7766 case FFEINFO_kindtypeREAL2:
7767 #endif
7768 #if FFETARGET_okCOMPLEX3
7769 case FFEINFO_kindtypeREAL3:
7770 #endif
7771 break; /* Fine and dandy. */
7772
7773 default:
7774 if (t != NULL)
7775 {
7776 ffebad_start ((nkt == FFEINFO_kindtypeREALDOUBLE)
7777 ? FFEBAD_BAD_DBLCMPLX : FFEBAD_BAD_COMPLEX);
7778 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
7779 ffebad_finish ();
7780 }
7781 nbt = FFEINFO_basictypeNONE;
7782 nkt = FFEINFO_kindtypeNONE;
7783 break;
7784
7785 case FFEINFO_kindtypeANY:
7786 nkt = FFEINFO_kindtypeREALDEFAULT;
7787 break;
7788 }
7789 }
7790 else
7791 { /* The normal stuff. */
7792 if (nbt == lbt)
7793 {
7794 if (nbt == rbt)
7795 nkt = ffeinfo_kindtype_max (nbt, lkt, rkt);
7796 else
7797 nkt = lkt;
7798 }
7799 else if (nbt == rbt)
7800 nkt = rkt;
7801 else
7802 { /* Let the caller do the complaining. */
7803 nbt = FFEINFO_basictypeNONE;
7804 nkt = FFEINFO_kindtypeNONE;
7805 }
7806 }
7807
7808 /* Always a good idea to avoid aliasing problems. */
7809
7810 *xnbt = nbt;
7811 *xnkt = nkt;
7812 }
7813
7814 /* ffeexpr_token_first_lhs_ -- First state for lhs expression
7815
7816 Return a pointer to this function to the lexer (ffelex), which will
7817 invoke it for the next token.
7818
7819 Record line and column of first token in expression, then invoke the
7820 initial-state lhs handler. */
7821
7822 static ffelexHandler
7823 ffeexpr_token_first_lhs_ (ffelexToken t)
7824 {
7825 ffeexpr_stack_->first_token = ffelex_token_use (t);
7826
7827 /* When changing the list of valid initial lhs tokens, check whether to
7828 update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
7829 READ (expr) <token> case -- it assumes it knows which tokens <token> can
7830 be to indicate an lhs (or implied DO), which right now is the set
7831 {NAME,OPEN_PAREN}.
7832
7833 This comment also appears in ffeexpr_token_lhs_. */
7834
7835 switch (ffelex_token_type (t))
7836 {
7837 case FFELEX_typeOPEN_PAREN:
7838 switch (ffeexpr_stack_->context)
7839 {
7840 case FFEEXPR_contextDATA:
7841 ffe_init_4 ();
7842 ffeexpr_level_ = 1; /* Level of DATA implied-DO construct. */
7843 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
7844 return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
7845 FFEEXPR_contextDATAIMPDOITEM_, ffeexpr_cb_comma_i_);
7846
7847 case FFEEXPR_contextDATAIMPDOITEM_:
7848 ++ffeexpr_level_; /* Level of DATA implied-DO construct. */
7849 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
7850 return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
7851 FFEEXPR_contextDATAIMPDOITEM_, ffeexpr_cb_comma_i_);
7852
7853 case FFEEXPR_contextIOLIST:
7854 case FFEEXPR_contextIMPDOITEM_:
7855 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
7856 return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
7857 FFEEXPR_contextIMPDOITEM_, ffeexpr_cb_comma_i_);
7858
7859 case FFEEXPR_contextIOLISTDF:
7860 case FFEEXPR_contextIMPDOITEMDF_:
7861 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
7862 return (ffelexHandler) ffeexpr_lhs (ffeexpr_stack_->pool,
7863 FFEEXPR_contextIMPDOITEMDF_, ffeexpr_cb_comma_i_);
7864
7865 case FFEEXPR_contextFILEEXTFUNC:
7866 assert (ffeexpr_stack_->exprstack == NULL);
7867 return (ffelexHandler) ffeexpr_token_first_lhs_1_;
7868
7869 default:
7870 break;
7871 }
7872 break;
7873
7874 case FFELEX_typeNAME:
7875 switch (ffeexpr_stack_->context)
7876 {
7877 case FFEEXPR_contextFILENAMELIST:
7878 assert (ffeexpr_stack_->exprstack == NULL);
7879 return (ffelexHandler) ffeexpr_token_namelist_;
7880
7881 case FFEEXPR_contextFILEEXTFUNC:
7882 assert (ffeexpr_stack_->exprstack == NULL);
7883 return (ffelexHandler) ffeexpr_token_first_lhs_1_;
7884
7885 default:
7886 break;
7887 }
7888 break;
7889
7890 default:
7891 switch (ffeexpr_stack_->context)
7892 {
7893 case FFEEXPR_contextFILEEXTFUNC:
7894 assert (ffeexpr_stack_->exprstack == NULL);
7895 return (ffelexHandler) ffeexpr_token_first_lhs_1_;
7896
7897 default:
7898 break;
7899 }
7900 break;
7901 }
7902
7903 return (ffelexHandler) ffeexpr_token_lhs_ (t);
7904 }
7905
7906 /* ffeexpr_token_first_lhs_1_ -- NAME
7907
7908 return ffeexpr_token_first_lhs_1_; // to lexer
7909
7910 Handle NAME as an external function (USEROPEN= VXT extension to OPEN
7911 statement). */
7912
7913 static ffelexHandler
7914 ffeexpr_token_first_lhs_1_ (ffelexToken t)
7915 {
7916 ffeexprCallback callback;
7917 ffeexprStack_ s;
7918 ffelexHandler next;
7919 ffelexToken ft;
7920 ffesymbol sy = NULL;
7921 ffebld expr;
7922
7923 ffebld_pool_pop ();
7924 callback = ffeexpr_stack_->callback;
7925 ft = ffeexpr_stack_->first_token;
7926 s = ffeexpr_stack_->previous;
7927
7928 if ((ffelex_token_type (ft) != FFELEX_typeNAME)
7929 || (ffesymbol_attrs (sy = ffeexpr_declare_unadorned_ (ft, FALSE))
7930 & FFESYMBOL_attrANY))
7931 {
7932 if ((ffelex_token_type (ft) != FFELEX_typeNAME)
7933 || !(ffesymbol_attrs (sy) & FFESYMBOL_attrsANY))
7934 {
7935 ffebad_start (FFEBAD_EXPR_WRONG);
7936 ffebad_here (0, ffelex_token_where_line (ft),
7937 ffelex_token_where_column (ft));
7938 ffebad_finish ();
7939 }
7940 expr = ffebld_new_any ();
7941 ffebld_set_info (expr, ffeinfo_new_any ());
7942 }
7943 else
7944 {
7945 expr = ffebld_new_symter (sy, FFEINTRIN_genNONE, FFEINTRIN_specNONE,
7946 FFEINTRIN_impNONE);
7947 ffebld_set_info (expr, ffesymbol_info (sy));
7948 }
7949
7950 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
7951 sizeof (*ffeexpr_stack_));
7952 ffeexpr_stack_ = s;
7953
7954 next = (ffelexHandler) (*callback) (ft, expr, t);
7955 ffelex_token_kill (ft);
7956 return (ffelexHandler) next;
7957 }
7958
7959 /* ffeexpr_token_first_rhs_ -- First state for rhs expression
7960
7961 Record line and column of first token in expression, then invoke the
7962 initial-state rhs handler.
7963
7964 19-Feb-91 JCB 1.1
7965 Allow ASTERISK in PARENFILEUNIT_ case, but only on second level only
7966 (i.e. only as in READ(*), not READ((*))). */
7967
7968 static ffelexHandler
7969 ffeexpr_token_first_rhs_ (ffelexToken t)
7970 {
7971 ffesymbol s;
7972
7973 ffeexpr_stack_->first_token = ffelex_token_use (t);
7974
7975 switch (ffelex_token_type (t))
7976 {
7977 case FFELEX_typeASTERISK:
7978 switch (ffeexpr_stack_->context)
7979 {
7980 case FFEEXPR_contextFILEFORMATNML:
7981 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
7982 /* Fall through. */
7983 case FFEEXPR_contextFILEUNIT:
7984 case FFEEXPR_contextDIMLIST:
7985 case FFEEXPR_contextFILEFORMAT:
7986 case FFEEXPR_contextCHARACTERSIZE:
7987 if (ffeexpr_stack_->previous != NULL)
7988 break; /* Valid only on first level. */
7989 assert (ffeexpr_stack_->exprstack == NULL);
7990 return (ffelexHandler) ffeexpr_token_first_rhs_1_;
7991
7992 case FFEEXPR_contextPARENFILEUNIT_:
7993 if (ffeexpr_stack_->previous->previous != NULL)
7994 break; /* Valid only on second level. */
7995 assert (ffeexpr_stack_->exprstack == NULL);
7996 return (ffelexHandler) ffeexpr_token_first_rhs_1_;
7997
7998 case FFEEXPR_contextACTUALARG_:
7999 if (ffeexpr_stack_->previous->context
8000 != FFEEXPR_contextSUBROUTINEREF)
8001 {
8002 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8003 break;
8004 }
8005 assert (ffeexpr_stack_->exprstack == NULL);
8006 return (ffelexHandler) ffeexpr_token_first_rhs_3_;
8007
8008 case FFEEXPR_contextINDEXORACTUALARG_:
8009 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8010 break;
8011
8012 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8013 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8014 break;
8015
8016 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8017 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8018 break;
8019
8020 default:
8021 break;
8022 }
8023 break;
8024
8025 case FFELEX_typeOPEN_PAREN:
8026 switch (ffeexpr_stack_->context)
8027 {
8028 case FFEEXPR_contextFILENUMAMBIG:
8029 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
8030 FFEEXPR_contextPARENFILENUM_,
8031 ffeexpr_cb_close_paren_ambig_);
8032
8033 case FFEEXPR_contextFILEUNITAMBIG:
8034 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
8035 FFEEXPR_contextPARENFILEUNIT_,
8036 ffeexpr_cb_close_paren_ambig_);
8037
8038 case FFEEXPR_contextIOLIST:
8039 case FFEEXPR_contextIMPDOITEM_:
8040 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
8041 FFEEXPR_contextIMPDOITEM_,
8042 ffeexpr_cb_close_paren_ci_);
8043
8044 case FFEEXPR_contextIOLISTDF:
8045 case FFEEXPR_contextIMPDOITEMDF_:
8046 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
8047 FFEEXPR_contextIMPDOITEMDF_,
8048 ffeexpr_cb_close_paren_ci_);
8049
8050 case FFEEXPR_contextFILEFORMATNML:
8051 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
8052 break;
8053
8054 case FFEEXPR_contextACTUALARG_:
8055 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8056 break;
8057
8058 case FFEEXPR_contextINDEXORACTUALARG_:
8059 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8060 break;
8061
8062 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8063 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8064 break;
8065
8066 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8067 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8068 break;
8069
8070 default:
8071 break;
8072 }
8073 break;
8074
8075 case FFELEX_typeNUMBER:
8076 switch (ffeexpr_stack_->context)
8077 {
8078 case FFEEXPR_contextFILEFORMATNML:
8079 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
8080 /* Fall through. */
8081 case FFEEXPR_contextFILEFORMAT:
8082 if (ffeexpr_stack_->previous != NULL)
8083 break; /* Valid only on first level. */
8084 assert (ffeexpr_stack_->exprstack == NULL);
8085 return (ffelexHandler) ffeexpr_token_first_rhs_2_;
8086
8087 case FFEEXPR_contextACTUALARG_:
8088 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8089 break;
8090
8091 case FFEEXPR_contextINDEXORACTUALARG_:
8092 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8093 break;
8094
8095 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8096 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8097 break;
8098
8099 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8100 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8101 break;
8102
8103 default:
8104 break;
8105 }
8106 break;
8107
8108 case FFELEX_typeNAME:
8109 switch (ffeexpr_stack_->context)
8110 {
8111 case FFEEXPR_contextFILEFORMATNML:
8112 assert (ffeexpr_stack_->exprstack == NULL);
8113 s = ffesymbol_lookup_local (t);
8114 if ((s != NULL) && (ffesymbol_kind (s) == FFEINFO_kindNAMELIST))
8115 return (ffelexHandler) ffeexpr_token_namelist_;
8116 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
8117 break;
8118
8119 default:
8120 break;
8121 }
8122 break;
8123
8124 case FFELEX_typePERCENT:
8125 switch (ffeexpr_stack_->context)
8126 {
8127 case FFEEXPR_contextACTUALARG_:
8128 case FFEEXPR_contextINDEXORACTUALARG_:
8129 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8130 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8131 return (ffelexHandler) ffeexpr_token_first_rhs_5_;
8132
8133 case FFEEXPR_contextFILEFORMATNML:
8134 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
8135 break;
8136
8137 default:
8138 break;
8139 }
8140
8141 default:
8142 switch (ffeexpr_stack_->context)
8143 {
8144 case FFEEXPR_contextACTUALARG_:
8145 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8146 break;
8147
8148 case FFEEXPR_contextINDEXORACTUALARG_:
8149 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8150 break;
8151
8152 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8153 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8154 break;
8155
8156 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8157 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8158 break;
8159
8160 case FFEEXPR_contextFILEFORMATNML:
8161 ffeexpr_stack_->context = FFEEXPR_contextFILEFORMAT;
8162 break;
8163
8164 default:
8165 break;
8166 }
8167 break;
8168 }
8169
8170 return (ffelexHandler) ffeexpr_token_rhs_ (t);
8171 }
8172
8173 /* ffeexpr_token_first_rhs_1_ -- ASTERISK
8174
8175 return ffeexpr_token_first_rhs_1_; // to lexer
8176
8177 Return STAR as expression. */
8178
8179 static ffelexHandler
8180 ffeexpr_token_first_rhs_1_ (ffelexToken t)
8181 {
8182 ffebld expr;
8183 ffeexprCallback callback;
8184 ffeexprStack_ s;
8185 ffelexHandler next;
8186 ffelexToken ft;
8187
8188 expr = ffebld_new_star ();
8189 ffebld_pool_pop ();
8190 callback = ffeexpr_stack_->callback;
8191 ft = ffeexpr_stack_->first_token;
8192 s = ffeexpr_stack_->previous;
8193 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
8194 ffeexpr_stack_ = s;
8195 next = (ffelexHandler) (*callback) (ft, expr, t);
8196 ffelex_token_kill (ft);
8197 return (ffelexHandler) next;
8198 }
8199
8200 /* ffeexpr_token_first_rhs_2_ -- NUMBER
8201
8202 return ffeexpr_token_first_rhs_2_; // to lexer
8203
8204 Return NULL as expression; NUMBER as first (and only) token, unless the
8205 current token is not a terminating token, in which case run normal
8206 expression handling. */
8207
8208 static ffelexHandler
8209 ffeexpr_token_first_rhs_2_ (ffelexToken t)
8210 {
8211 ffeexprCallback callback;
8212 ffeexprStack_ s;
8213 ffelexHandler next;
8214 ffelexToken ft;
8215
8216 switch (ffelex_token_type (t))
8217 {
8218 case FFELEX_typeCLOSE_PAREN:
8219 case FFELEX_typeCOMMA:
8220 case FFELEX_typeEOS:
8221 case FFELEX_typeSEMICOLON:
8222 break;
8223
8224 default:
8225 next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
8226 return (ffelexHandler) (*next) (t);
8227 }
8228
8229 ffebld_pool_pop ();
8230 callback = ffeexpr_stack_->callback;
8231 ft = ffeexpr_stack_->first_token;
8232 s = ffeexpr_stack_->previous;
8233 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
8234 sizeof (*ffeexpr_stack_));
8235 ffeexpr_stack_ = s;
8236 next = (ffelexHandler) (*callback) (ft, NULL, t);
8237 ffelex_token_kill (ft);
8238 return (ffelexHandler) next;
8239 }
8240
8241 /* ffeexpr_token_first_rhs_3_ -- ASTERISK
8242
8243 return ffeexpr_token_first_rhs_3_; // to lexer
8244
8245 Expect NUMBER, make LABTOK (with copy of token if not inhibited after
8246 confirming, else NULL). */
8247
8248 static ffelexHandler
8249 ffeexpr_token_first_rhs_3_ (ffelexToken t)
8250 {
8251 ffelexHandler next;
8252
8253 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
8254 { /* An error, but let normal processing handle
8255 it. */
8256 next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
8257 return (ffelexHandler) (*next) (t);
8258 }
8259
8260 /* Special case: when we see "*10" as an argument to a subroutine
8261 reference, we confirm the current statement and, if not inhibited at
8262 this point, put a copy of the token into a LABTOK node. We do this
8263 instead of just resolving the label directly via ffelab and putting it
8264 into a LABTER simply to improve error reporting and consistency in
8265 ffestc. We put NULL in the LABTOK if we're still inhibited, so ffestb
8266 doesn't have to worry about killing off any tokens when retracting. */
8267
8268 ffest_confirmed ();
8269 if (ffest_is_inhibited ())
8270 ffeexpr_stack_->expr = ffebld_new_labtok (NULL);
8271 else
8272 ffeexpr_stack_->expr = ffebld_new_labtok (ffelex_token_use (t));
8273 ffebld_set_info (ffeexpr_stack_->expr,
8274 ffeinfo_new (FFEINFO_basictypeNONE,
8275 FFEINFO_kindtypeNONE,
8276 0,
8277 FFEINFO_kindNONE,
8278 FFEINFO_whereNONE,
8279 FFETARGET_charactersizeNONE));
8280
8281 return (ffelexHandler) ffeexpr_token_first_rhs_4_;
8282 }
8283
8284 /* ffeexpr_token_first_rhs_4_ -- ASTERISK NUMBER
8285
8286 return ffeexpr_token_first_rhs_4_; // to lexer
8287
8288 Collect/flush appropriate stuff, send token to callback function. */
8289
8290 static ffelexHandler
8291 ffeexpr_token_first_rhs_4_ (ffelexToken t)
8292 {
8293 ffebld expr;
8294 ffeexprCallback callback;
8295 ffeexprStack_ s;
8296 ffelexHandler next;
8297 ffelexToken ft;
8298
8299 expr = ffeexpr_stack_->expr;
8300 ffebld_pool_pop ();
8301 callback = ffeexpr_stack_->callback;
8302 ft = ffeexpr_stack_->first_token;
8303 s = ffeexpr_stack_->previous;
8304 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
8305 ffeexpr_stack_ = s;
8306 next = (ffelexHandler) (*callback) (ft, expr, t);
8307 ffelex_token_kill (ft);
8308 return (ffelexHandler) next;
8309 }
8310
8311 /* ffeexpr_token_first_rhs_5_ -- PERCENT
8312
8313 Should be NAME, or pass through original mechanism. If NAME is LOC,
8314 pass through original mechanism, otherwise must be VAL, REF, or DESCR,
8315 in which case handle the argument (in parentheses), etc. */
8316
8317 static ffelexHandler
8318 ffeexpr_token_first_rhs_5_ (ffelexToken t)
8319 {
8320 ffelexHandler next;
8321
8322 if (ffelex_token_type (t) == FFELEX_typeNAME)
8323 {
8324 ffeexprPercent_ p = ffeexpr_percent_ (t);
8325
8326 switch (p)
8327 {
8328 case FFEEXPR_percentNONE_:
8329 case FFEEXPR_percentLOC_:
8330 break; /* Treat %LOC as any other expression. */
8331
8332 case FFEEXPR_percentVAL_:
8333 case FFEEXPR_percentREF_:
8334 case FFEEXPR_percentDESCR_:
8335 ffeexpr_stack_->percent = p;
8336 ffeexpr_stack_->tokens[0] = ffelex_token_use (t);
8337 return (ffelexHandler) ffeexpr_token_first_rhs_6_;
8338
8339 default:
8340 assert ("bad percent?!?" == NULL);
8341 break;
8342 }
8343 }
8344
8345 switch (ffeexpr_stack_->context)
8346 {
8347 case FFEEXPR_contextACTUALARG_:
8348 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8349 break;
8350
8351 case FFEEXPR_contextINDEXORACTUALARG_:
8352 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8353 break;
8354
8355 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8356 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8357 break;
8358
8359 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8360 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8361 break;
8362
8363 default:
8364 assert ("bad context?!?!" == NULL);
8365 break;
8366 }
8367
8368 next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
8369 return (ffelexHandler) (*next) (t);
8370 }
8371
8372 /* ffeexpr_token_first_rhs_6_ -- PERCENT NAME(VAL,REF,DESCR)
8373
8374 Should be OPEN_PAREN, or pass through original mechanism. */
8375
8376 static ffelexHandler
8377 ffeexpr_token_first_rhs_6_ (ffelexToken t)
8378 {
8379 ffelexHandler next;
8380 ffelexToken ft;
8381
8382 if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
8383 {
8384 ffeexpr_stack_->tokens[1] = ffelex_token_use (t);
8385 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
8386 ffeexpr_stack_->context,
8387 ffeexpr_cb_end_notloc_);
8388 }
8389
8390 switch (ffeexpr_stack_->context)
8391 {
8392 case FFEEXPR_contextACTUALARG_:
8393 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
8394 break;
8395
8396 case FFEEXPR_contextINDEXORACTUALARG_:
8397 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
8398 break;
8399
8400 case FFEEXPR_contextSFUNCDEFACTUALARG_:
8401 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
8402 break;
8403
8404 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
8405 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
8406 break;
8407
8408 default:
8409 assert ("bad context?!?!" == NULL);
8410 break;
8411 }
8412
8413 ft = ffeexpr_stack_->tokens[0];
8414 next = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_stack_->first_token);
8415 next = (ffelexHandler) (*next) (ft);
8416 ffelex_token_kill (ft);
8417 return (ffelexHandler) (*next) (t);
8418 }
8419
8420 /* ffeexpr_token_namelist_ -- NAME
8421
8422 return ffeexpr_token_namelist_; // to lexer
8423
8424 Make sure NAME was a valid namelist object, wrap it in a SYMTER and
8425 return. */
8426
8427 static ffelexHandler
8428 ffeexpr_token_namelist_ (ffelexToken t)
8429 {
8430 ffeexprCallback callback;
8431 ffeexprStack_ s;
8432 ffelexHandler next;
8433 ffelexToken ft;
8434 ffesymbol sy;
8435 ffebld expr;
8436
8437 ffebld_pool_pop ();
8438 callback = ffeexpr_stack_->callback;
8439 ft = ffeexpr_stack_->first_token;
8440 s = ffeexpr_stack_->previous;
8441 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_, sizeof (*ffeexpr_stack_));
8442 ffeexpr_stack_ = s;
8443
8444 sy = ffesymbol_lookup_local (ft);
8445 if ((sy == NULL) || (ffesymbol_kind (sy) != FFEINFO_kindNAMELIST))
8446 {
8447 ffebad_start (FFEBAD_EXPR_WRONG);
8448 ffebad_here (0, ffelex_token_where_line (ft),
8449 ffelex_token_where_column (ft));
8450 ffebad_finish ();
8451 expr = ffebld_new_any ();
8452 ffebld_set_info (expr, ffeinfo_new_any ());
8453 }
8454 else
8455 {
8456 expr = ffebld_new_symter (sy, FFEINTRIN_genNONE, FFEINTRIN_specNONE,
8457 FFEINTRIN_impNONE);
8458 ffebld_set_info (expr, ffesymbol_info (sy));
8459 }
8460 next = (ffelexHandler) (*callback) (ft, expr, t);
8461 ffelex_token_kill (ft);
8462 return (ffelexHandler) next;
8463 }
8464
8465 /* ffeexpr_expr_kill_ -- Kill an existing internal expression object
8466
8467 ffeexprExpr_ e;
8468 ffeexpr_expr_kill_(e);
8469
8470 Kills the ffewhere info, if necessary, then kills the object. */
8471
8472 static void
8473 ffeexpr_expr_kill_ (ffeexprExpr_ e)
8474 {
8475 if (e->token != NULL)
8476 ffelex_token_kill (e->token);
8477 malloc_kill_ks (ffe_pool_program_unit (), e, sizeof (*e));
8478 }
8479
8480 /* ffeexpr_expr_new_ -- Make a new internal expression object
8481
8482 ffeexprExpr_ e;
8483 e = ffeexpr_expr_new_();
8484
8485 Allocates and initializes a new expression object, returns it. */
8486
8487 static ffeexprExpr_
8488 ffeexpr_expr_new_ (void)
8489 {
8490 ffeexprExpr_ e;
8491
8492 e = malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR expr", sizeof (*e));
8493 e->previous = NULL;
8494 e->type = FFEEXPR_exprtypeUNKNOWN_;
8495 e->token = NULL;
8496 return e;
8497 }
8498
8499 /* Verify that call to global is valid, and register whatever
8500 new information about a global might be discoverable by looking
8501 at the call. */
8502
8503 static void
8504 ffeexpr_fulfill_call_ (ffebld *expr, ffelexToken t)
8505 {
8506 int n_args;
8507 ffebld list;
8508 ffebld item;
8509 ffesymbol s;
8510
8511 assert ((ffebld_op (*expr) == FFEBLD_opSUBRREF)
8512 || (ffebld_op (*expr) == FFEBLD_opFUNCREF));
8513
8514 if (ffebld_op (ffebld_left (*expr)) != FFEBLD_opSYMTER)
8515 return;
8516
8517 if (ffesymbol_retractable ())
8518 return;
8519
8520 s = ffebld_symter (ffebld_left (*expr));
8521 if (ffesymbol_global (s) == NULL)
8522 return;
8523
8524 for (n_args = 0, list = ffebld_right (*expr);
8525 list != NULL;
8526 list = ffebld_trail (list), ++n_args)
8527 ;
8528
8529 if (ffeglobal_proc_ref_nargs (s, n_args, t))
8530 {
8531 ffeglobalArgSummary as;
8532 ffeinfoBasictype bt;
8533 ffeinfoKindtype kt;
8534 bool array;
8535 bool fail = FALSE;
8536
8537 for (n_args = 0, list = ffebld_right (*expr);
8538 list != NULL;
8539 list = ffebld_trail (list), ++n_args)
8540 {
8541 item = ffebld_head (list);
8542 if (item != NULL)
8543 {
8544 bt = ffeinfo_basictype (ffebld_info (item));
8545 kt = ffeinfo_kindtype (ffebld_info (item));
8546 array = (ffeinfo_rank (ffebld_info (item)) > 0);
8547 switch (ffebld_op (item))
8548 {
8549 case FFEBLD_opLABTOK:
8550 case FFEBLD_opLABTER:
8551 as = FFEGLOBAL_argsummaryALTRTN;
8552 break;
8553
8554 #if 0
8555 /* No, %LOC(foo) is just like any INTEGER(KIND=7)
8556 expression, so don't treat it specially. */
8557 case FFEBLD_opPERCENT_LOC:
8558 as = FFEGLOBAL_argsummaryPTR;
8559 break;
8560 #endif
8561
8562 case FFEBLD_opPERCENT_VAL:
8563 as = FFEGLOBAL_argsummaryVAL;
8564 break;
8565
8566 case FFEBLD_opPERCENT_REF:
8567 as = FFEGLOBAL_argsummaryREF;
8568 break;
8569
8570 case FFEBLD_opPERCENT_DESCR:
8571 as = FFEGLOBAL_argsummaryDESCR;
8572 break;
8573
8574 case FFEBLD_opFUNCREF:
8575 #if 0
8576 /* No, LOC(foo) is just like any INTEGER(KIND=7)
8577 expression, so don't treat it specially. */
8578 if ((ffebld_op (ffebld_left (item)) == FFEBLD_opSYMTER)
8579 && (ffesymbol_specific (ffebld_symter (ffebld_left (item)))
8580 == FFEINTRIN_specLOC))
8581 {
8582 as = FFEGLOBAL_argsummaryPTR;
8583 break;
8584 }
8585 #endif
8586 /* Fall through. */
8587 default:
8588 if (ffebld_op (item) == FFEBLD_opSYMTER)
8589 {
8590 as = FFEGLOBAL_argsummaryNONE;
8591
8592 switch (ffeinfo_kind (ffebld_info (item)))
8593 {
8594 case FFEINFO_kindFUNCTION:
8595 as = FFEGLOBAL_argsummaryFUNC;
8596 break;
8597
8598 case FFEINFO_kindSUBROUTINE:
8599 as = FFEGLOBAL_argsummarySUBR;
8600 break;
8601
8602 case FFEINFO_kindNONE:
8603 as = FFEGLOBAL_argsummaryPROC;
8604 break;
8605
8606 default:
8607 break;
8608 }
8609
8610 if (as != FFEGLOBAL_argsummaryNONE)
8611 break;
8612 }
8613
8614 if (bt == FFEINFO_basictypeCHARACTER)
8615 as = FFEGLOBAL_argsummaryDESCR;
8616 else
8617 as = FFEGLOBAL_argsummaryREF;
8618 break;
8619 }
8620 }
8621 else
8622 {
8623 array = FALSE;
8624 as = FFEGLOBAL_argsummaryNONE;
8625 bt = FFEINFO_basictypeNONE;
8626 kt = FFEINFO_kindtypeNONE;
8627 }
8628
8629 if (! ffeglobal_proc_ref_arg (s, n_args, as, bt, kt, array, t))
8630 fail = TRUE;
8631 }
8632 if (! fail)
8633 return;
8634 }
8635
8636 *expr = ffebld_new_any ();
8637 ffebld_set_info (*expr, ffeinfo_new_any ());
8638 }
8639
8640 /* Check whether rest of string is all decimal digits. */
8641
8642 static bool
8643 ffeexpr_isdigits_ (const char *p)
8644 {
8645 for (; *p != '\0'; ++p)
8646 if (! ISDIGIT (*p))
8647 return FALSE;
8648 return TRUE;
8649 }
8650
8651 /* ffeexpr_exprstack_push_ -- Push an arbitrary expression object onto the stack
8652
8653 ffeexprExpr_ e;
8654 ffeexpr_exprstack_push_(e);
8655
8656 Pushes the expression onto the stack without any analysis of the existing
8657 contents of the stack. */
8658
8659 static void
8660 ffeexpr_exprstack_push_ (ffeexprExpr_ e)
8661 {
8662 e->previous = ffeexpr_stack_->exprstack;
8663 ffeexpr_stack_->exprstack = e;
8664 }
8665
8666 /* ffeexpr_exprstack_push_operand_ -- Push an operand onto the stack, reduce?
8667
8668 ffeexprExpr_ e;
8669 ffeexpr_exprstack_push_operand_(e);
8670
8671 Pushes the expression already containing an operand (a constant, variable,
8672 or more complicated expression that has already been fully resolved) after
8673 analyzing the stack and checking for possible reduction (which will never
8674 happen here since the highest precedence operator is ** and it has right-
8675 to-left associativity). */
8676
8677 static void
8678 ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e)
8679 {
8680 ffeexpr_exprstack_push_ (e);
8681 }
8682
8683 /* ffeexpr_exprstack_push_unary_ -- Push a unary operator onto the stack
8684
8685 ffeexprExpr_ e;
8686 ffeexpr_exprstack_push_unary_(e);
8687
8688 Pushes the expression already containing a unary operator. Reduction can
8689 never happen since unary operators are themselves always R-L; that is, the
8690 top of the expression stack is not an operand, in that it is either empty,
8691 has a binary operator at the top, or a unary operator at the top. In any
8692 of these cases, reduction is impossible. */
8693
8694 static void
8695 ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e)
8696 {
8697 if ((ffe_is_pedantic ()
8698 || ffe_is_warn_surprising ())
8699 && (ffeexpr_stack_->exprstack != NULL)
8700 && (ffeexpr_stack_->exprstack->type != FFEEXPR_exprtypeOPERAND_)
8701 && (ffeexpr_stack_->exprstack->u.operator.prec
8702 <= FFEEXPR_operatorprecedenceLOWARITH_)
8703 && (e->u.operator.prec <= FFEEXPR_operatorprecedenceLOWARITH_))
8704 {
8705 /* xgettext:no-c-format */
8706 ffebad_start_msg ("Two arithmetic operators in a row at %0 and %1 -- use parentheses",
8707 ffe_is_pedantic ()
8708 ? FFEBAD_severityPEDANTIC
8709 : FFEBAD_severityWARNING);
8710 ffebad_here (0,
8711 ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
8712 ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
8713 ffebad_here (1,
8714 ffelex_token_where_line (e->token),
8715 ffelex_token_where_column (e->token));
8716 ffebad_finish ();
8717 }
8718
8719 ffeexpr_exprstack_push_ (e);
8720 }
8721
8722 /* ffeexpr_exprstack_push_binary_ -- Push a binary operator onto the stack, reduce?
8723
8724 ffeexprExpr_ e;
8725 ffeexpr_exprstack_push_binary_(e);
8726
8727 Pushes the expression already containing a binary operator after checking
8728 whether reduction is possible. If the stack is not empty, the top of the
8729 stack must be an operand or syntactic analysis has failed somehow. If
8730 the operand is preceded by a unary operator of higher (or equal and L-R
8731 associativity) precedence than the new binary operator, then reduce that
8732 preceding operator and its operand(s) before pushing the new binary
8733 operator. */
8734
8735 static void
8736 ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e)
8737 {
8738 ffeexprExpr_ ce;
8739
8740 if (ffe_is_warn_surprising ()
8741 /* These next two are always true (see assertions below). */
8742 && (ffeexpr_stack_->exprstack != NULL)
8743 && (ffeexpr_stack_->exprstack->type == FFEEXPR_exprtypeOPERAND_)
8744 /* If the previous operator is a unary minus, and the binary op
8745 is of higher precedence, might not do what user expects,
8746 e.g. "-2**2" is "-(2**2)", i.e. "-4", not "(-2)**2", which would
8747 yield "4". */
8748 && (ffeexpr_stack_->exprstack->previous != NULL)
8749 && (ffeexpr_stack_->exprstack->previous->type == FFEEXPR_exprtypeUNARY_)
8750 && (ffeexpr_stack_->exprstack->previous->u.operator.op
8751 == FFEEXPR_operatorSUBTRACT_)
8752 && (e->u.operator.prec
8753 < ffeexpr_stack_->exprstack->previous->u.operator.prec))
8754 {
8755 /* xgettext:no-c-format */
8756 ffebad_start_msg ("Operator at %0 has lower precedence than that at %1 -- use parentheses", FFEBAD_severityWARNING);
8757 ffebad_here (0,
8758 ffelex_token_where_line (ffeexpr_stack_->exprstack->previous->token),
8759 ffelex_token_where_column (ffeexpr_stack_->exprstack->previous->token));
8760 ffebad_here (1,
8761 ffelex_token_where_line (e->token),
8762 ffelex_token_where_column (e->token));
8763 ffebad_finish ();
8764 }
8765
8766 again:
8767 assert (ffeexpr_stack_->exprstack != NULL);
8768 assert (ffeexpr_stack_->exprstack->type == FFEEXPR_exprtypeOPERAND_);
8769 if ((ce = ffeexpr_stack_->exprstack->previous) != NULL)
8770 {
8771 assert (ce->type != FFEEXPR_exprtypeOPERAND_);
8772 if ((ce->u.operator.prec < e->u.operator.prec)
8773 || ((ce->u.operator.prec == e->u.operator.prec)
8774 && (e->u.operator.as == FFEEXPR_operatorassociativityL2R_)))
8775 {
8776 ffeexpr_reduce_ ();
8777 goto again; /* :::::::::::::::::::: */
8778 }
8779 }
8780
8781 ffeexpr_exprstack_push_ (e);
8782 }
8783
8784 /* ffeexpr_reduce_ -- Reduce highest operator w/operands on stack
8785
8786 ffeexpr_reduce_();
8787
8788 Converts operand binop operand or unop operand at top of stack to a
8789 single operand having the appropriate ffebld expression, and makes
8790 sure that the expression is proper (like not trying to add two character
8791 variables, not trying to concatenate two numbers). Also does the
8792 requisite type-assignment. */
8793
8794 static void
8795 ffeexpr_reduce_ (void)
8796 {
8797 ffeexprExpr_ operand; /* This is B in -B or A+B. */
8798 ffeexprExpr_ left_operand; /* When operator is binary, this is A in A+B. */
8799 ffeexprExpr_ operator; /* This is + in A+B. */
8800 ffebld reduced; /* This is +(A,B) in A+B or u-(B) in -B. */
8801 ffebldConstant constnode; /* For checking magical numbers (where mag ==
8802 -mag). */
8803 ffebld expr;
8804 ffebld left_expr;
8805 bool submag = FALSE;
8806 bool bothlogical;
8807
8808 operand = ffeexpr_stack_->exprstack;
8809 assert (operand != NULL);
8810 assert (operand->type == FFEEXPR_exprtypeOPERAND_);
8811 operator = operand->previous;
8812 assert (operator != NULL);
8813 assert (operator->type != FFEEXPR_exprtypeOPERAND_);
8814 if (operator->type == FFEEXPR_exprtypeUNARY_)
8815 {
8816 expr = operand->u.operand;
8817 switch (operator->u.operator.op)
8818 {
8819 case FFEEXPR_operatorADD_:
8820 reduced = ffebld_new_uplus (expr);
8821 if (ffe_is_ugly_logint ())
8822 reduced = ffeexpr_reduced_ugly1_ (reduced, operator, operand);
8823 reduced = ffeexpr_reduced_math1_ (reduced, operator, operand);
8824 reduced = ffeexpr_collapse_uplus (reduced, operator->token);
8825 break;
8826
8827 case FFEEXPR_operatorSUBTRACT_:
8828 submag = TRUE; /* Ok to negate a magic number. */
8829 reduced = ffebld_new_uminus (expr);
8830 if (ffe_is_ugly_logint ())
8831 reduced = ffeexpr_reduced_ugly1_ (reduced, operator, operand);
8832 reduced = ffeexpr_reduced_math1_ (reduced, operator, operand);
8833 reduced = ffeexpr_collapse_uminus (reduced, operator->token);
8834 break;
8835
8836 case FFEEXPR_operatorNOT_:
8837 reduced = ffebld_new_not (expr);
8838 if (ffe_is_ugly_logint ())
8839 reduced = ffeexpr_reduced_ugly1log_ (reduced, operator, operand);
8840 reduced = ffeexpr_reduced_bool1_ (reduced, operator, operand);
8841 reduced = ffeexpr_collapse_not (reduced, operator->token);
8842 break;
8843
8844 default:
8845 assert ("unexpected unary op" != NULL);
8846 reduced = NULL;
8847 break;
8848 }
8849 if (!submag
8850 && (ffebld_op (expr) == FFEBLD_opCONTER)
8851 && (ffebld_conter_orig (expr) == NULL)
8852 && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
8853 {
8854 ffetarget_integer_bad_magical (operand->token);
8855 }
8856 ffeexpr_stack_->exprstack = operator->previous; /* Pops unary-op operand
8857 off stack. */
8858 ffeexpr_expr_kill_ (operand);
8859 operator->type = FFEEXPR_exprtypeOPERAND_; /* Convert operator, but
8860 save */
8861 operator->u.operand = reduced; /* the line/column ffewhere info. */
8862 ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
8863 stack. */
8864 }
8865 else
8866 {
8867 assert (operator->type == FFEEXPR_exprtypeBINARY_);
8868 left_operand = operator->previous;
8869 assert (left_operand != NULL);
8870 assert (left_operand->type == FFEEXPR_exprtypeOPERAND_);
8871 expr = operand->u.operand;
8872 left_expr = left_operand->u.operand;
8873 switch (operator->u.operator.op)
8874 {
8875 case FFEEXPR_operatorADD_:
8876 reduced = ffebld_new_add (left_expr, expr);
8877 if (ffe_is_ugly_logint ())
8878 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8879 operand);
8880 reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
8881 operand);
8882 reduced = ffeexpr_collapse_add (reduced, operator->token);
8883 break;
8884
8885 case FFEEXPR_operatorSUBTRACT_:
8886 submag = TRUE; /* Just to pick the right error if magic
8887 number. */
8888 reduced = ffebld_new_subtract (left_expr, expr);
8889 if (ffe_is_ugly_logint ())
8890 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8891 operand);
8892 reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
8893 operand);
8894 reduced = ffeexpr_collapse_subtract (reduced, operator->token);
8895 break;
8896
8897 case FFEEXPR_operatorMULTIPLY_:
8898 reduced = ffebld_new_multiply (left_expr, expr);
8899 if (ffe_is_ugly_logint ())
8900 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8901 operand);
8902 reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
8903 operand);
8904 reduced = ffeexpr_collapse_multiply (reduced, operator->token);
8905 break;
8906
8907 case FFEEXPR_operatorDIVIDE_:
8908 reduced = ffebld_new_divide (left_expr, expr);
8909 if (ffe_is_ugly_logint ())
8910 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8911 operand);
8912 reduced = ffeexpr_reduced_math2_ (reduced, left_operand, operator,
8913 operand);
8914 reduced = ffeexpr_collapse_divide (reduced, operator->token);
8915 break;
8916
8917 case FFEEXPR_operatorPOWER_:
8918 reduced = ffebld_new_power (left_expr, expr);
8919 if (ffe_is_ugly_logint ())
8920 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8921 operand);
8922 reduced = ffeexpr_reduced_power_ (reduced, left_operand, operator,
8923 operand);
8924 reduced = ffeexpr_collapse_power (reduced, operator->token);
8925 break;
8926
8927 case FFEEXPR_operatorCONCATENATE_:
8928 reduced = ffebld_new_concatenate (left_expr, expr);
8929 reduced = ffeexpr_reduced_concatenate_ (reduced, left_operand, operator,
8930 operand);
8931 reduced = ffeexpr_collapse_concatenate (reduced, operator->token);
8932 break;
8933
8934 case FFEEXPR_operatorLT_:
8935 reduced = ffebld_new_lt (left_expr, expr);
8936 if (ffe_is_ugly_logint ())
8937 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8938 operand);
8939 reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
8940 operand);
8941 reduced = ffeexpr_collapse_lt (reduced, operator->token);
8942 break;
8943
8944 case FFEEXPR_operatorLE_:
8945 reduced = ffebld_new_le (left_expr, expr);
8946 if (ffe_is_ugly_logint ())
8947 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8948 operand);
8949 reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
8950 operand);
8951 reduced = ffeexpr_collapse_le (reduced, operator->token);
8952 break;
8953
8954 case FFEEXPR_operatorEQ_:
8955 reduced = ffebld_new_eq (left_expr, expr);
8956 if (ffe_is_ugly_logint ())
8957 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8958 operand);
8959 reduced = ffeexpr_reduced_eqop2_ (reduced, left_operand, operator,
8960 operand);
8961 reduced = ffeexpr_collapse_eq (reduced, operator->token);
8962 break;
8963
8964 case FFEEXPR_operatorNE_:
8965 reduced = ffebld_new_ne (left_expr, expr);
8966 if (ffe_is_ugly_logint ())
8967 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8968 operand);
8969 reduced = ffeexpr_reduced_eqop2_ (reduced, left_operand, operator,
8970 operand);
8971 reduced = ffeexpr_collapse_ne (reduced, operator->token);
8972 break;
8973
8974 case FFEEXPR_operatorGT_:
8975 reduced = ffebld_new_gt (left_expr, expr);
8976 if (ffe_is_ugly_logint ())
8977 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8978 operand);
8979 reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
8980 operand);
8981 reduced = ffeexpr_collapse_gt (reduced, operator->token);
8982 break;
8983
8984 case FFEEXPR_operatorGE_:
8985 reduced = ffebld_new_ge (left_expr, expr);
8986 if (ffe_is_ugly_logint ())
8987 reduced = ffeexpr_reduced_ugly2_ (reduced, left_operand, operator,
8988 operand);
8989 reduced = ffeexpr_reduced_relop2_ (reduced, left_operand, operator,
8990 operand);
8991 reduced = ffeexpr_collapse_ge (reduced, operator->token);
8992 break;
8993
8994 case FFEEXPR_operatorAND_:
8995 reduced = ffebld_new_and (left_expr, expr);
8996 if (ffe_is_ugly_logint ())
8997 reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
8998 operand, &bothlogical);
8999 reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
9000 operand);
9001 reduced = ffeexpr_collapse_and (reduced, operator->token);
9002 if (ffe_is_ugly_logint() && bothlogical)
9003 reduced = ffeexpr_convert (reduced, left_operand->token,
9004 operator->token,
9005 FFEINFO_basictypeLOGICAL,
9006 FFEINFO_kindtypeLOGICALDEFAULT, 0,
9007 FFETARGET_charactersizeNONE,
9008 FFEEXPR_contextLET);
9009 break;
9010
9011 case FFEEXPR_operatorOR_:
9012 reduced = ffebld_new_or (left_expr, expr);
9013 if (ffe_is_ugly_logint ())
9014 reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
9015 operand, &bothlogical);
9016 reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
9017 operand);
9018 reduced = ffeexpr_collapse_or (reduced, operator->token);
9019 if (ffe_is_ugly_logint() && bothlogical)
9020 reduced = ffeexpr_convert (reduced, left_operand->token,
9021 operator->token,
9022 FFEINFO_basictypeLOGICAL,
9023 FFEINFO_kindtypeLOGICALDEFAULT, 0,
9024 FFETARGET_charactersizeNONE,
9025 FFEEXPR_contextLET);
9026 break;
9027
9028 case FFEEXPR_operatorXOR_:
9029 reduced = ffebld_new_xor (left_expr, expr);
9030 if (ffe_is_ugly_logint ())
9031 reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
9032 operand, &bothlogical);
9033 reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
9034 operand);
9035 reduced = ffeexpr_collapse_xor (reduced, operator->token);
9036 if (ffe_is_ugly_logint() && bothlogical)
9037 reduced = ffeexpr_convert (reduced, left_operand->token,
9038 operator->token,
9039 FFEINFO_basictypeLOGICAL,
9040 FFEINFO_kindtypeLOGICALDEFAULT, 0,
9041 FFETARGET_charactersizeNONE,
9042 FFEEXPR_contextLET);
9043 break;
9044
9045 case FFEEXPR_operatorEQV_:
9046 reduced = ffebld_new_eqv (left_expr, expr);
9047 if (ffe_is_ugly_logint ())
9048 reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
9049 operand, NULL);
9050 reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
9051 operand);
9052 reduced = ffeexpr_collapse_eqv (reduced, operator->token);
9053 break;
9054
9055 case FFEEXPR_operatorNEQV_:
9056 reduced = ffebld_new_neqv (left_expr, expr);
9057 if (ffe_is_ugly_logint ())
9058 reduced = ffeexpr_reduced_ugly2log_ (reduced, left_operand, operator,
9059 operand, NULL);
9060 reduced = ffeexpr_reduced_bool2_ (reduced, left_operand, operator,
9061 operand);
9062 reduced = ffeexpr_collapse_neqv (reduced, operator->token);
9063 break;
9064
9065 default:
9066 assert ("bad bin op" == NULL);
9067 reduced = expr;
9068 break;
9069 }
9070 if ((ffebld_op (left_expr) == FFEBLD_opCONTER)
9071 && (ffebld_conter_orig (expr) == NULL)
9072 && ffebld_constant_is_magical (constnode = ffebld_conter (left_expr)))
9073 {
9074 if ((left_operand->previous != NULL)
9075 && (left_operand->previous->type != FFEEXPR_exprtypeOPERAND_)
9076 && (left_operand->previous->u.operator.op
9077 == FFEEXPR_operatorSUBTRACT_))
9078 {
9079 if (left_operand->previous->type == FFEEXPR_exprtypeUNARY_)
9080 ffetarget_integer_bad_magical_precedence (left_operand->token,
9081 left_operand->previous->token,
9082 operator->token);
9083 else
9084 ffetarget_integer_bad_magical_precedence_binary
9085 (left_operand->token,
9086 left_operand->previous->token,
9087 operator->token);
9088 }
9089 else
9090 ffetarget_integer_bad_magical (left_operand->token);
9091 }
9092 if ((ffebld_op (expr) == FFEBLD_opCONTER)
9093 && (ffebld_conter_orig (expr) == NULL)
9094 && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
9095 {
9096 if (submag)
9097 ffetarget_integer_bad_magical_binary (operand->token,
9098 operator->token);
9099 else
9100 ffetarget_integer_bad_magical (operand->token);
9101 }
9102 ffeexpr_stack_->exprstack = left_operand->previous; /* Pops binary-op
9103 operands off stack. */
9104 ffeexpr_expr_kill_ (left_operand);
9105 ffeexpr_expr_kill_ (operand);
9106 operator->type = FFEEXPR_exprtypeOPERAND_; /* Convert operator, but
9107 save */
9108 operator->u.operand = reduced; /* the line/column ffewhere info. */
9109 ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
9110 stack. */
9111 }
9112 }
9113
9114 /* ffeexpr_reduced_bool1_ -- Wrap up reduction of NOT operator
9115
9116 reduced = ffeexpr_reduced_bool1_(reduced,op,r);
9117
9118 Makes sure the argument for reduced has basictype of
9119 LOGICAL or (ugly) INTEGER. If
9120 argument has where of CONSTANT, assign where CONSTANT to
9121 reduced, else assign where FLEETING.
9122
9123 If these requirements cannot be met, generate error message. */
9124
9125 static ffebld
9126 ffeexpr_reduced_bool1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
9127 {
9128 ffeinfo rinfo, ninfo;
9129 ffeinfoBasictype rbt;
9130 ffeinfoKindtype rkt;
9131 ffeinfoRank rrk;
9132 ffeinfoKind rkd;
9133 ffeinfoWhere rwh, nwh;
9134
9135 rinfo = ffebld_info (ffebld_left (reduced));
9136 rbt = ffeinfo_basictype (rinfo);
9137 rkt = ffeinfo_kindtype (rinfo);
9138 rrk = ffeinfo_rank (rinfo);
9139 rkd = ffeinfo_kind (rinfo);
9140 rwh = ffeinfo_where (rinfo);
9141
9142 if (((rbt == FFEINFO_basictypeLOGICAL)
9143 || (ffe_is_ugly_logint () && (rbt == FFEINFO_basictypeINTEGER)))
9144 && (rrk == 0))
9145 {
9146 switch (rwh)
9147 {
9148 case FFEINFO_whereCONSTANT:
9149 nwh = FFEINFO_whereCONSTANT;
9150 break;
9151
9152 case FFEINFO_whereIMMEDIATE:
9153 nwh = FFEINFO_whereIMMEDIATE;
9154 break;
9155
9156 default:
9157 nwh = FFEINFO_whereFLEETING;
9158 break;
9159 }
9160
9161 ninfo = ffeinfo_new (rbt, rkt, 0, FFEINFO_kindENTITY, nwh,
9162 FFETARGET_charactersizeNONE);
9163 ffebld_set_info (reduced, ninfo);
9164 return reduced;
9165 }
9166
9167 if ((rbt != FFEINFO_basictypeLOGICAL)
9168 && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
9169 {
9170 if ((rbt != FFEINFO_basictypeANY)
9171 && ffebad_start (FFEBAD_NOT_ARG_TYPE))
9172 {
9173 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9174 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9175 ffebad_finish ();
9176 }
9177 }
9178 else
9179 {
9180 if ((rkd != FFEINFO_kindANY)
9181 && ffebad_start (FFEBAD_NOT_ARG_KIND))
9182 {
9183 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9184 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9185 ffebad_string ("an array");
9186 ffebad_finish ();
9187 }
9188 }
9189
9190 reduced = ffebld_new_any ();
9191 ffebld_set_info (reduced, ffeinfo_new_any ());
9192 return reduced;
9193 }
9194
9195 /* ffeexpr_reduced_bool2_ -- Wrap up reduction of boolean operators
9196
9197 reduced = ffeexpr_reduced_bool2_(reduced,l,op,r);
9198
9199 Makes sure the left and right arguments for reduced have basictype of
9200 LOGICAL or (ugly) INTEGER. Determine common basictype and
9201 size for reduction (flag expression for combined hollerith/typeless
9202 situations for later determination of effective basictype). If both left
9203 and right arguments have where of CONSTANT, assign where CONSTANT to
9204 reduced, else assign where FLEETING. Create CONVERT ops for args where
9205 needed. Convert typeless
9206 constants to the desired type/size explicitly.
9207
9208 If these requirements cannot be met, generate error message. */
9209
9210 static ffebld
9211 ffeexpr_reduced_bool2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
9212 ffeexprExpr_ r)
9213 {
9214 ffeinfo linfo, rinfo, ninfo;
9215 ffeinfoBasictype lbt, rbt, nbt;
9216 ffeinfoKindtype lkt, rkt, nkt;
9217 ffeinfoRank lrk, rrk;
9218 ffeinfoKind lkd, rkd;
9219 ffeinfoWhere lwh, rwh, nwh;
9220
9221 linfo = ffebld_info (ffebld_left (reduced));
9222 lbt = ffeinfo_basictype (linfo);
9223 lkt = ffeinfo_kindtype (linfo);
9224 lrk = ffeinfo_rank (linfo);
9225 lkd = ffeinfo_kind (linfo);
9226 lwh = ffeinfo_where (linfo);
9227
9228 rinfo = ffebld_info (ffebld_right (reduced));
9229 rbt = ffeinfo_basictype (rinfo);
9230 rkt = ffeinfo_kindtype (rinfo);
9231 rrk = ffeinfo_rank (rinfo);
9232 rkd = ffeinfo_kind (rinfo);
9233 rwh = ffeinfo_where (rinfo);
9234
9235 ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
9236
9237 if (((nbt == FFEINFO_basictypeLOGICAL)
9238 || (ffe_is_ugly_logint () && (nbt == FFEINFO_basictypeINTEGER)))
9239 && (lrk == 0) && (rrk == 0))
9240 {
9241 switch (lwh)
9242 {
9243 case FFEINFO_whereCONSTANT:
9244 switch (rwh)
9245 {
9246 case FFEINFO_whereCONSTANT:
9247 nwh = FFEINFO_whereCONSTANT;
9248 break;
9249
9250 case FFEINFO_whereIMMEDIATE:
9251 nwh = FFEINFO_whereIMMEDIATE;
9252 break;
9253
9254 default:
9255 nwh = FFEINFO_whereFLEETING;
9256 break;
9257 }
9258 break;
9259
9260 case FFEINFO_whereIMMEDIATE:
9261 switch (rwh)
9262 {
9263 case FFEINFO_whereCONSTANT:
9264 case FFEINFO_whereIMMEDIATE:
9265 nwh = FFEINFO_whereIMMEDIATE;
9266 break;
9267
9268 default:
9269 nwh = FFEINFO_whereFLEETING;
9270 break;
9271 }
9272 break;
9273
9274 default:
9275 nwh = FFEINFO_whereFLEETING;
9276 break;
9277 }
9278
9279 ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
9280 FFETARGET_charactersizeNONE);
9281 ffebld_set_info (reduced, ninfo);
9282 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
9283 l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
9284 FFEEXPR_contextLET));
9285 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
9286 r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
9287 FFEEXPR_contextLET));
9288 return reduced;
9289 }
9290
9291 if ((lbt != FFEINFO_basictypeLOGICAL)
9292 && (!ffe_is_ugly_logint () || (lbt != FFEINFO_basictypeINTEGER)))
9293 {
9294 if ((rbt != FFEINFO_basictypeLOGICAL)
9295 && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
9296 {
9297 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
9298 && ffebad_start (FFEBAD_BOOL_ARGS_TYPE))
9299 {
9300 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9301 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9302 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9303 ffebad_finish ();
9304 }
9305 }
9306 else
9307 {
9308 if ((lbt != FFEINFO_basictypeANY)
9309 && ffebad_start (FFEBAD_BOOL_ARG_TYPE))
9310 {
9311 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9312 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9313 ffebad_finish ();
9314 }
9315 }
9316 }
9317 else if ((rbt != FFEINFO_basictypeLOGICAL)
9318 && (!ffe_is_ugly_logint () || (rbt != FFEINFO_basictypeINTEGER)))
9319 {
9320 if ((rbt != FFEINFO_basictypeANY)
9321 && ffebad_start (FFEBAD_BOOL_ARG_TYPE))
9322 {
9323 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9324 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9325 ffebad_finish ();
9326 }
9327 }
9328 else if (lrk != 0)
9329 {
9330 if ((lkd != FFEINFO_kindANY)
9331 && ffebad_start (FFEBAD_BOOL_ARG_KIND))
9332 {
9333 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9334 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9335 ffebad_string ("an array");
9336 ffebad_finish ();
9337 }
9338 }
9339 else
9340 {
9341 if ((rkd != FFEINFO_kindANY)
9342 && ffebad_start (FFEBAD_BOOL_ARG_KIND))
9343 {
9344 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9345 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9346 ffebad_string ("an array");
9347 ffebad_finish ();
9348 }
9349 }
9350
9351 reduced = ffebld_new_any ();
9352 ffebld_set_info (reduced, ffeinfo_new_any ());
9353 return reduced;
9354 }
9355
9356 /* ffeexpr_reduced_concatenate_ -- Wrap up reduction of concatenate operator
9357
9358 reduced = ffeexpr_reduced_concatenate_(reduced,l,op,r);
9359
9360 Makes sure the left and right arguments for reduced have basictype of
9361 CHARACTER and kind of SCALAR, FUNCTION, or STATEMENT FUNCTION. Assign
9362 basictype of CHARACTER and kind of SCALAR to reduced. Calculate effective
9363 size of concatenation and assign that size to reduced. If both left and
9364 right arguments have where of CONSTANT, assign where CONSTANT to reduced,
9365 else assign where FLEETING.
9366
9367 If these requirements cannot be met, generate error message using the
9368 info in l, op, and r arguments and assign basictype, size, kind, and where
9369 of ANY. */
9370
9371 static ffebld
9372 ffeexpr_reduced_concatenate_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
9373 ffeexprExpr_ r)
9374 {
9375 ffeinfo linfo, rinfo, ninfo;
9376 ffeinfoBasictype lbt, rbt, nbt;
9377 ffeinfoKindtype lkt, rkt, nkt;
9378 ffeinfoRank lrk, rrk;
9379 ffeinfoKind lkd, rkd, nkd;
9380 ffeinfoWhere lwh, rwh, nwh;
9381 ffetargetCharacterSize lszm, lszk, rszm, rszk, nszk;
9382
9383 linfo = ffebld_info (ffebld_left (reduced));
9384 lbt = ffeinfo_basictype (linfo);
9385 lkt = ffeinfo_kindtype (linfo);
9386 lrk = ffeinfo_rank (linfo);
9387 lkd = ffeinfo_kind (linfo);
9388 lwh = ffeinfo_where (linfo);
9389 lszk = ffeinfo_size (linfo); /* Known size. */
9390 lszm = ffebld_size_max (ffebld_left (reduced));
9391
9392 rinfo = ffebld_info (ffebld_right (reduced));
9393 rbt = ffeinfo_basictype (rinfo);
9394 rkt = ffeinfo_kindtype (rinfo);
9395 rrk = ffeinfo_rank (rinfo);
9396 rkd = ffeinfo_kind (rinfo);
9397 rwh = ffeinfo_where (rinfo);
9398 rszk = ffeinfo_size (rinfo); /* Known size. */
9399 rszm = ffebld_size_max (ffebld_right (reduced));
9400
9401 if ((lbt == FFEINFO_basictypeCHARACTER) && (rbt == FFEINFO_basictypeCHARACTER)
9402 && (lkt == rkt) && (lrk == 0) && (rrk == 0)
9403 && (((lszm != FFETARGET_charactersizeNONE)
9404 && (rszm != FFETARGET_charactersizeNONE))
9405 || (ffeexpr_context_outer_ (ffeexpr_stack_)
9406 == FFEEXPR_contextLET)
9407 || (ffeexpr_context_outer_ (ffeexpr_stack_)
9408 == FFEEXPR_contextSFUNCDEF)))
9409 {
9410 nbt = FFEINFO_basictypeCHARACTER;
9411 nkd = FFEINFO_kindENTITY;
9412 if ((lszk == FFETARGET_charactersizeNONE)
9413 || (rszk == FFETARGET_charactersizeNONE))
9414 nszk = FFETARGET_charactersizeNONE; /* Ok only in rhs of LET
9415 stmt. */
9416 else
9417 nszk = lszk + rszk;
9418
9419 switch (lwh)
9420 {
9421 case FFEINFO_whereCONSTANT:
9422 switch (rwh)
9423 {
9424 case FFEINFO_whereCONSTANT:
9425 nwh = FFEINFO_whereCONSTANT;
9426 break;
9427
9428 case FFEINFO_whereIMMEDIATE:
9429 nwh = FFEINFO_whereIMMEDIATE;
9430 break;
9431
9432 default:
9433 nwh = FFEINFO_whereFLEETING;
9434 break;
9435 }
9436 break;
9437
9438 case FFEINFO_whereIMMEDIATE:
9439 switch (rwh)
9440 {
9441 case FFEINFO_whereCONSTANT:
9442 case FFEINFO_whereIMMEDIATE:
9443 nwh = FFEINFO_whereIMMEDIATE;
9444 break;
9445
9446 default:
9447 nwh = FFEINFO_whereFLEETING;
9448 break;
9449 }
9450 break;
9451
9452 default:
9453 nwh = FFEINFO_whereFLEETING;
9454 break;
9455 }
9456
9457 nkt = lkt;
9458 ninfo = ffeinfo_new (nbt, nkt, 0, nkd, nwh, nszk);
9459 ffebld_set_info (reduced, ninfo);
9460 return reduced;
9461 }
9462
9463 if ((lbt != FFEINFO_basictypeCHARACTER) && (rbt != FFEINFO_basictypeCHARACTER))
9464 {
9465 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
9466 && ffebad_start (FFEBAD_CONCAT_ARGS_TYPE))
9467 {
9468 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9469 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9470 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9471 ffebad_finish ();
9472 }
9473 }
9474 else if (lbt != FFEINFO_basictypeCHARACTER)
9475 {
9476 if ((lbt != FFEINFO_basictypeANY)
9477 && ffebad_start (FFEBAD_CONCAT_ARG_TYPE))
9478 {
9479 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9480 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9481 ffebad_finish ();
9482 }
9483 }
9484 else if (rbt != FFEINFO_basictypeCHARACTER)
9485 {
9486 if ((rbt != FFEINFO_basictypeANY)
9487 && ffebad_start (FFEBAD_CONCAT_ARG_TYPE))
9488 {
9489 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9490 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9491 ffebad_finish ();
9492 }
9493 }
9494 else if ((lrk != 0) || (lszm == FFETARGET_charactersizeNONE))
9495 {
9496 if ((lkd != FFEINFO_kindANY)
9497 && ffebad_start (FFEBAD_CONCAT_ARG_KIND))
9498 {
9499 const char *what;
9500
9501 if (lrk != 0)
9502 what = "an array";
9503 else
9504 what = "of indeterminate length";
9505 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9506 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9507 ffebad_string (what);
9508 ffebad_finish ();
9509 }
9510 }
9511 else
9512 {
9513 if (ffebad_start (FFEBAD_CONCAT_ARG_KIND))
9514 {
9515 const char *what;
9516
9517 if (rrk != 0)
9518 what = "an array";
9519 else
9520 what = "of indeterminate length";
9521 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9522 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9523 ffebad_string (what);
9524 ffebad_finish ();
9525 }
9526 }
9527
9528 reduced = ffebld_new_any ();
9529 ffebld_set_info (reduced, ffeinfo_new_any ());
9530 return reduced;
9531 }
9532
9533 /* ffeexpr_reduced_eqop2_ -- Wrap up reduction of EQ and NE operators
9534
9535 reduced = ffeexpr_reduced_eqop2_(reduced,l,op,r);
9536
9537 Makes sure the left and right arguments for reduced have basictype of
9538 INTEGER, REAL, COMPLEX, or CHARACTER. Determine common basictype and
9539 size for reduction. If both left
9540 and right arguments have where of CONSTANT, assign where CONSTANT to
9541 reduced, else assign where FLEETING. Create CONVERT ops for args where
9542 needed. Convert typeless
9543 constants to the desired type/size explicitly.
9544
9545 If these requirements cannot be met, generate error message. */
9546
9547 static ffebld
9548 ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
9549 ffeexprExpr_ r)
9550 {
9551 ffeinfo linfo, rinfo, ninfo;
9552 ffeinfoBasictype lbt, rbt, nbt;
9553 ffeinfoKindtype lkt, rkt, nkt;
9554 ffeinfoRank lrk, rrk;
9555 ffeinfoKind lkd, rkd;
9556 ffeinfoWhere lwh, rwh, nwh;
9557 ffetargetCharacterSize lsz, rsz;
9558
9559 linfo = ffebld_info (ffebld_left (reduced));
9560 lbt = ffeinfo_basictype (linfo);
9561 lkt = ffeinfo_kindtype (linfo);
9562 lrk = ffeinfo_rank (linfo);
9563 lkd = ffeinfo_kind (linfo);
9564 lwh = ffeinfo_where (linfo);
9565 lsz = ffebld_size_known (ffebld_left (reduced));
9566
9567 rinfo = ffebld_info (ffebld_right (reduced));
9568 rbt = ffeinfo_basictype (rinfo);
9569 rkt = ffeinfo_kindtype (rinfo);
9570 rrk = ffeinfo_rank (rinfo);
9571 rkd = ffeinfo_kind (rinfo);
9572 rwh = ffeinfo_where (rinfo);
9573 rsz = ffebld_size_known (ffebld_right (reduced));
9574
9575 ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
9576
9577 if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
9578 || (nbt == FFEINFO_basictypeCOMPLEX) || (nbt == FFEINFO_basictypeCHARACTER))
9579 && (lrk == 0) && (rrk == 0))
9580 {
9581 switch (lwh)
9582 {
9583 case FFEINFO_whereCONSTANT:
9584 switch (rwh)
9585 {
9586 case FFEINFO_whereCONSTANT:
9587 nwh = FFEINFO_whereCONSTANT;
9588 break;
9589
9590 case FFEINFO_whereIMMEDIATE:
9591 nwh = FFEINFO_whereIMMEDIATE;
9592 break;
9593
9594 default:
9595 nwh = FFEINFO_whereFLEETING;
9596 break;
9597 }
9598 break;
9599
9600 case FFEINFO_whereIMMEDIATE:
9601 switch (rwh)
9602 {
9603 case FFEINFO_whereCONSTANT:
9604 case FFEINFO_whereIMMEDIATE:
9605 nwh = FFEINFO_whereIMMEDIATE;
9606 break;
9607
9608 default:
9609 nwh = FFEINFO_whereFLEETING;
9610 break;
9611 }
9612 break;
9613
9614 default:
9615 nwh = FFEINFO_whereFLEETING;
9616 break;
9617 }
9618
9619 if ((lsz != FFETARGET_charactersizeNONE)
9620 && (rsz != FFETARGET_charactersizeNONE))
9621 lsz = rsz = (lsz > rsz) ? lsz : rsz;
9622
9623 ninfo = ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
9624 0, FFEINFO_kindENTITY, nwh, FFETARGET_charactersizeNONE);
9625 ffebld_set_info (reduced, ninfo);
9626 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
9627 l->token, op->token, nbt, nkt, 0, lsz,
9628 FFEEXPR_contextLET));
9629 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
9630 r->token, op->token, nbt, nkt, 0, rsz,
9631 FFEEXPR_contextLET));
9632 return reduced;
9633 }
9634
9635 if ((lbt == FFEINFO_basictypeLOGICAL)
9636 && (rbt == FFEINFO_basictypeLOGICAL))
9637 {
9638 /* xgettext:no-c-format */
9639 if (ffebad_start_msg ("Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2",
9640 FFEBAD_severityFATAL))
9641 {
9642 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9643 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9644 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9645 ffebad_finish ();
9646 }
9647 }
9648 else if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
9649 && (lbt != FFEINFO_basictypeCOMPLEX) && (lbt != FFEINFO_basictypeCHARACTER))
9650 {
9651 if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
9652 && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER))
9653 {
9654 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
9655 && ffebad_start (FFEBAD_EQOP_ARGS_TYPE))
9656 {
9657 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9658 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9659 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9660 ffebad_finish ();
9661 }
9662 }
9663 else
9664 {
9665 if ((lbt != FFEINFO_basictypeANY)
9666 && ffebad_start (FFEBAD_EQOP_ARG_TYPE))
9667 {
9668 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9669 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9670 ffebad_finish ();
9671 }
9672 }
9673 }
9674 else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
9675 && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER))
9676 {
9677 if ((rbt != FFEINFO_basictypeANY)
9678 && ffebad_start (FFEBAD_EQOP_ARG_TYPE))
9679 {
9680 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9681 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9682 ffebad_finish ();
9683 }
9684 }
9685 else if (lrk != 0)
9686 {
9687 if ((lkd != FFEINFO_kindANY)
9688 && ffebad_start (FFEBAD_EQOP_ARG_KIND))
9689 {
9690 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9691 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9692 ffebad_string ("an array");
9693 ffebad_finish ();
9694 }
9695 }
9696 else
9697 {
9698 if ((rkd != FFEINFO_kindANY)
9699 && ffebad_start (FFEBAD_EQOP_ARG_KIND))
9700 {
9701 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9702 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9703 ffebad_string ("an array");
9704 ffebad_finish ();
9705 }
9706 }
9707
9708 reduced = ffebld_new_any ();
9709 ffebld_set_info (reduced, ffeinfo_new_any ());
9710 return reduced;
9711 }
9712
9713 /* ffeexpr_reduced_math1_ -- Wrap up reduction of + - unary operators
9714
9715 reduced = ffeexpr_reduced_math1_(reduced,op,r);
9716
9717 Makes sure the argument for reduced has basictype of
9718 INTEGER, REAL, or COMPLEX. If the argument has where of CONSTANT,
9719 assign where CONSTANT to
9720 reduced, else assign where FLEETING.
9721
9722 If these requirements cannot be met, generate error message. */
9723
9724 static ffebld
9725 ffeexpr_reduced_math1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
9726 {
9727 ffeinfo rinfo, ninfo;
9728 ffeinfoBasictype rbt;
9729 ffeinfoKindtype rkt;
9730 ffeinfoRank rrk;
9731 ffeinfoKind rkd;
9732 ffeinfoWhere rwh, nwh;
9733
9734 rinfo = ffebld_info (ffebld_left (reduced));
9735 rbt = ffeinfo_basictype (rinfo);
9736 rkt = ffeinfo_kindtype (rinfo);
9737 rrk = ffeinfo_rank (rinfo);
9738 rkd = ffeinfo_kind (rinfo);
9739 rwh = ffeinfo_where (rinfo);
9740
9741 if (((rbt == FFEINFO_basictypeINTEGER) || (rbt == FFEINFO_basictypeREAL)
9742 || (rbt == FFEINFO_basictypeCOMPLEX)) && (rrk == 0))
9743 {
9744 switch (rwh)
9745 {
9746 case FFEINFO_whereCONSTANT:
9747 nwh = FFEINFO_whereCONSTANT;
9748 break;
9749
9750 case FFEINFO_whereIMMEDIATE:
9751 nwh = FFEINFO_whereIMMEDIATE;
9752 break;
9753
9754 default:
9755 nwh = FFEINFO_whereFLEETING;
9756 break;
9757 }
9758
9759 ninfo = ffeinfo_new (rbt, rkt, 0, FFEINFO_kindENTITY, nwh,
9760 FFETARGET_charactersizeNONE);
9761 ffebld_set_info (reduced, ninfo);
9762 return reduced;
9763 }
9764
9765 if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
9766 && (rbt != FFEINFO_basictypeCOMPLEX))
9767 {
9768 if ((rbt != FFEINFO_basictypeANY)
9769 && ffebad_start (FFEBAD_MATH_ARG_TYPE))
9770 {
9771 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9772 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9773 ffebad_finish ();
9774 }
9775 }
9776 else
9777 {
9778 if ((rkd != FFEINFO_kindANY)
9779 && ffebad_start (FFEBAD_MATH_ARG_KIND))
9780 {
9781 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9782 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9783 ffebad_string ("an array");
9784 ffebad_finish ();
9785 }
9786 }
9787
9788 reduced = ffebld_new_any ();
9789 ffebld_set_info (reduced, ffeinfo_new_any ());
9790 return reduced;
9791 }
9792
9793 /* ffeexpr_reduced_math2_ -- Wrap up reduction of + - * / operators
9794
9795 reduced = ffeexpr_reduced_math2_(reduced,l,op,r);
9796
9797 Makes sure the left and right arguments for reduced have basictype of
9798 INTEGER, REAL, or COMPLEX. Determine common basictype and
9799 size for reduction (flag expression for combined hollerith/typeless
9800 situations for later determination of effective basictype). If both left
9801 and right arguments have where of CONSTANT, assign where CONSTANT to
9802 reduced, else assign where FLEETING. Create CONVERT ops for args where
9803 needed. Convert typeless
9804 constants to the desired type/size explicitly.
9805
9806 If these requirements cannot be met, generate error message. */
9807
9808 static ffebld
9809 ffeexpr_reduced_math2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
9810 ffeexprExpr_ r)
9811 {
9812 ffeinfo linfo, rinfo, ninfo;
9813 ffeinfoBasictype lbt, rbt, nbt;
9814 ffeinfoKindtype lkt, rkt, nkt;
9815 ffeinfoRank lrk, rrk;
9816 ffeinfoKind lkd, rkd;
9817 ffeinfoWhere lwh, rwh, nwh;
9818
9819 linfo = ffebld_info (ffebld_left (reduced));
9820 lbt = ffeinfo_basictype (linfo);
9821 lkt = ffeinfo_kindtype (linfo);
9822 lrk = ffeinfo_rank (linfo);
9823 lkd = ffeinfo_kind (linfo);
9824 lwh = ffeinfo_where (linfo);
9825
9826 rinfo = ffebld_info (ffebld_right (reduced));
9827 rbt = ffeinfo_basictype (rinfo);
9828 rkt = ffeinfo_kindtype (rinfo);
9829 rrk = ffeinfo_rank (rinfo);
9830 rkd = ffeinfo_kind (rinfo);
9831 rwh = ffeinfo_where (rinfo);
9832
9833 ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
9834
9835 if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
9836 || (nbt == FFEINFO_basictypeCOMPLEX)) && (lrk == 0) && (rrk == 0))
9837 {
9838 switch (lwh)
9839 {
9840 case FFEINFO_whereCONSTANT:
9841 switch (rwh)
9842 {
9843 case FFEINFO_whereCONSTANT:
9844 nwh = FFEINFO_whereCONSTANT;
9845 break;
9846
9847 case FFEINFO_whereIMMEDIATE:
9848 nwh = FFEINFO_whereIMMEDIATE;
9849 break;
9850
9851 default:
9852 nwh = FFEINFO_whereFLEETING;
9853 break;
9854 }
9855 break;
9856
9857 case FFEINFO_whereIMMEDIATE:
9858 switch (rwh)
9859 {
9860 case FFEINFO_whereCONSTANT:
9861 case FFEINFO_whereIMMEDIATE:
9862 nwh = FFEINFO_whereIMMEDIATE;
9863 break;
9864
9865 default:
9866 nwh = FFEINFO_whereFLEETING;
9867 break;
9868 }
9869 break;
9870
9871 default:
9872 nwh = FFEINFO_whereFLEETING;
9873 break;
9874 }
9875
9876 ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
9877 FFETARGET_charactersizeNONE);
9878 ffebld_set_info (reduced, ninfo);
9879 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
9880 l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
9881 FFEEXPR_contextLET));
9882 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
9883 r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
9884 FFEEXPR_contextLET));
9885 return reduced;
9886 }
9887
9888 if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
9889 && (lbt != FFEINFO_basictypeCOMPLEX))
9890 {
9891 if ((rbt != FFEINFO_basictypeINTEGER)
9892 && (rbt != FFEINFO_basictypeREAL) && (rbt != FFEINFO_basictypeCOMPLEX))
9893 {
9894 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
9895 && ffebad_start (FFEBAD_MATH_ARGS_TYPE))
9896 {
9897 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9898 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9899 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9900 ffebad_finish ();
9901 }
9902 }
9903 else
9904 {
9905 if ((lbt != FFEINFO_basictypeANY)
9906 && ffebad_start (FFEBAD_MATH_ARG_TYPE))
9907 {
9908 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9909 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9910 ffebad_finish ();
9911 }
9912 }
9913 }
9914 else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
9915 && (rbt != FFEINFO_basictypeCOMPLEX))
9916 {
9917 if ((rbt != FFEINFO_basictypeANY)
9918 && ffebad_start (FFEBAD_MATH_ARG_TYPE))
9919 {
9920 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9921 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9922 ffebad_finish ();
9923 }
9924 }
9925 else if (lrk != 0)
9926 {
9927 if ((lkd != FFEINFO_kindANY)
9928 && ffebad_start (FFEBAD_MATH_ARG_KIND))
9929 {
9930 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9931 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
9932 ffebad_string ("an array");
9933 ffebad_finish ();
9934 }
9935 }
9936 else
9937 {
9938 if ((rkd != FFEINFO_kindANY)
9939 && ffebad_start (FFEBAD_MATH_ARG_KIND))
9940 {
9941 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
9942 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
9943 ffebad_string ("an array");
9944 ffebad_finish ();
9945 }
9946 }
9947
9948 reduced = ffebld_new_any ();
9949 ffebld_set_info (reduced, ffeinfo_new_any ());
9950 return reduced;
9951 }
9952
9953 /* ffeexpr_reduced_power_ -- Wrap up reduction of ** operator
9954
9955 reduced = ffeexpr_reduced_power_(reduced,l,op,r);
9956
9957 Makes sure the left and right arguments for reduced have basictype of
9958 INTEGER, REAL, or COMPLEX. Determine common basictype and
9959 size for reduction (flag expression for combined hollerith/typeless
9960 situations for later determination of effective basictype). If both left
9961 and right arguments have where of CONSTANT, assign where CONSTANT to
9962 reduced, else assign where FLEETING. Create CONVERT ops for args where
9963 needed. Note that real**int or complex**int
9964 comes out as int = real**int etc with no conversions.
9965
9966 If these requirements cannot be met, generate error message using the
9967 info in l, op, and r arguments and assign basictype, size, kind, and where
9968 of ANY. */
9969
9970 static ffebld
9971 ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
9972 ffeexprExpr_ r)
9973 {
9974 ffeinfo linfo, rinfo, ninfo;
9975 ffeinfoBasictype lbt, rbt, nbt;
9976 ffeinfoKindtype lkt, rkt, nkt;
9977 ffeinfoRank lrk, rrk;
9978 ffeinfoKind lkd, rkd;
9979 ffeinfoWhere lwh, rwh, nwh;
9980
9981 linfo = ffebld_info (ffebld_left (reduced));
9982 lbt = ffeinfo_basictype (linfo);
9983 lkt = ffeinfo_kindtype (linfo);
9984 lrk = ffeinfo_rank (linfo);
9985 lkd = ffeinfo_kind (linfo);
9986 lwh = ffeinfo_where (linfo);
9987
9988 rinfo = ffebld_info (ffebld_right (reduced));
9989 rbt = ffeinfo_basictype (rinfo);
9990 rkt = ffeinfo_kindtype (rinfo);
9991 rrk = ffeinfo_rank (rinfo);
9992 rkd = ffeinfo_kind (rinfo);
9993 rwh = ffeinfo_where (rinfo);
9994
9995 if ((rbt == FFEINFO_basictypeINTEGER)
9996 && ((lbt == FFEINFO_basictypeREAL)
9997 || (lbt == FFEINFO_basictypeCOMPLEX)))
9998 {
9999 nbt = lbt;
10000 nkt = ffeinfo_kindtype_max (nbt, lkt, FFEINFO_kindtypeREALDEFAULT);
10001 if (nkt != FFEINFO_kindtypeREALDEFAULT)
10002 {
10003 nkt = ffeinfo_kindtype_max (nbt, lkt, FFEINFO_kindtypeREALDOUBLE);
10004 if (nkt != FFEINFO_kindtypeREALDOUBLE)
10005 nkt = FFEINFO_kindtypeREALDOUBLE; /* Highest kt we can power! */
10006 }
10007 if (rkt == FFEINFO_kindtypeINTEGER4)
10008 {
10009 /* xgettext:no-c-format */
10010 ffebad_start_msg ("Unsupported operand for ** at %1 -- converting to default INTEGER",
10011 FFEBAD_severityWARNING);
10012 ffebad_here (0, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10013 ffebad_finish ();
10014 }
10015 if (rkt != FFEINFO_kindtypeINTEGERDEFAULT)
10016 {
10017 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10018 r->token, op->token,
10019 FFEINFO_basictypeINTEGER, FFEINFO_kindtypeINTEGERDEFAULT, 0,
10020 FFETARGET_charactersizeNONE,
10021 FFEEXPR_contextLET));
10022 rkt = FFEINFO_kindtypeINTEGERDEFAULT;
10023 }
10024 }
10025 else
10026 {
10027 ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
10028
10029 #if 0 /* INTEGER4**INTEGER4 works now. */
10030 if ((nbt == FFEINFO_basictypeINTEGER)
10031 && (nkt != FFEINFO_kindtypeINTEGERDEFAULT))
10032 nkt = FFEINFO_kindtypeINTEGERDEFAULT; /* Highest kt we can power! */
10033 #endif
10034 if (((nbt == FFEINFO_basictypeREAL)
10035 || (nbt == FFEINFO_basictypeCOMPLEX))
10036 && (nkt != FFEINFO_kindtypeREALDEFAULT))
10037 {
10038 nkt = ffeinfo_kindtype_max (nbt, nkt, FFEINFO_kindtypeREALDOUBLE);
10039 if (nkt != FFEINFO_kindtypeREALDOUBLE)
10040 nkt = FFEINFO_kindtypeREALDOUBLE; /* Highest kt we can power! */
10041 }
10042 /* else Gonna turn into an error below. */
10043 }
10044
10045 if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
10046 || (nbt == FFEINFO_basictypeCOMPLEX)) && (lrk == 0) && (rrk == 0))
10047 {
10048 switch (lwh)
10049 {
10050 case FFEINFO_whereCONSTANT:
10051 switch (rwh)
10052 {
10053 case FFEINFO_whereCONSTANT:
10054 nwh = FFEINFO_whereCONSTANT;
10055 break;
10056
10057 case FFEINFO_whereIMMEDIATE:
10058 nwh = FFEINFO_whereIMMEDIATE;
10059 break;
10060
10061 default:
10062 nwh = FFEINFO_whereFLEETING;
10063 break;
10064 }
10065 break;
10066
10067 case FFEINFO_whereIMMEDIATE:
10068 switch (rwh)
10069 {
10070 case FFEINFO_whereCONSTANT:
10071 case FFEINFO_whereIMMEDIATE:
10072 nwh = FFEINFO_whereIMMEDIATE;
10073 break;
10074
10075 default:
10076 nwh = FFEINFO_whereFLEETING;
10077 break;
10078 }
10079 break;
10080
10081 default:
10082 nwh = FFEINFO_whereFLEETING;
10083 break;
10084 }
10085
10086 ninfo = ffeinfo_new (nbt, nkt, 0, FFEINFO_kindENTITY, nwh,
10087 FFETARGET_charactersizeNONE);
10088 ffebld_set_info (reduced, ninfo);
10089 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10090 l->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
10091 FFEEXPR_contextLET));
10092 if (rbt != FFEINFO_basictypeINTEGER)
10093 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10094 r->token, op->token, nbt, nkt, 0, FFETARGET_charactersizeNONE,
10095 FFEEXPR_contextLET));
10096 return reduced;
10097 }
10098
10099 if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
10100 && (lbt != FFEINFO_basictypeCOMPLEX))
10101 {
10102 if ((rbt != FFEINFO_basictypeINTEGER)
10103 && (rbt != FFEINFO_basictypeREAL) && (rbt != FFEINFO_basictypeCOMPLEX))
10104 {
10105 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
10106 && ffebad_start (FFEBAD_MATH_ARGS_TYPE))
10107 {
10108 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10109 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10110 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10111 ffebad_finish ();
10112 }
10113 }
10114 else
10115 {
10116 if ((lbt != FFEINFO_basictypeANY)
10117 && ffebad_start (FFEBAD_MATH_ARG_TYPE))
10118 {
10119 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10120 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10121 ffebad_finish ();
10122 }
10123 }
10124 }
10125 else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
10126 && (rbt != FFEINFO_basictypeCOMPLEX))
10127 {
10128 if ((rbt != FFEINFO_basictypeANY)
10129 && ffebad_start (FFEBAD_MATH_ARG_TYPE))
10130 {
10131 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10132 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10133 ffebad_finish ();
10134 }
10135 }
10136 else if (lrk != 0)
10137 {
10138 if ((lkd != FFEINFO_kindANY)
10139 && ffebad_start (FFEBAD_MATH_ARG_KIND))
10140 {
10141 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10142 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10143 ffebad_string ("an array");
10144 ffebad_finish ();
10145 }
10146 }
10147 else
10148 {
10149 if ((rkd != FFEINFO_kindANY)
10150 && ffebad_start (FFEBAD_MATH_ARG_KIND))
10151 {
10152 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10153 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10154 ffebad_string ("an array");
10155 ffebad_finish ();
10156 }
10157 }
10158
10159 reduced = ffebld_new_any ();
10160 ffebld_set_info (reduced, ffeinfo_new_any ());
10161 return reduced;
10162 }
10163
10164 /* ffeexpr_reduced_relop2_ -- Wrap up reduction of LT, LE, GE, and GT operators
10165
10166 reduced = ffeexpr_reduced_relop2_(reduced,l,op,r);
10167
10168 Makes sure the left and right arguments for reduced have basictype of
10169 INTEGER, REAL, or CHARACTER. Determine common basictype and
10170 size for reduction. If both left
10171 and right arguments have where of CONSTANT, assign where CONSTANT to
10172 reduced, else assign where FLEETING. Create CONVERT ops for args where
10173 needed. Convert typeless
10174 constants to the desired type/size explicitly.
10175
10176 If these requirements cannot be met, generate error message. */
10177
10178 static ffebld
10179 ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
10180 ffeexprExpr_ r)
10181 {
10182 ffeinfo linfo, rinfo, ninfo;
10183 ffeinfoBasictype lbt, rbt, nbt;
10184 ffeinfoKindtype lkt, rkt, nkt;
10185 ffeinfoRank lrk, rrk;
10186 ffeinfoKind lkd, rkd;
10187 ffeinfoWhere lwh, rwh, nwh;
10188 ffetargetCharacterSize lsz, rsz;
10189
10190 linfo = ffebld_info (ffebld_left (reduced));
10191 lbt = ffeinfo_basictype (linfo);
10192 lkt = ffeinfo_kindtype (linfo);
10193 lrk = ffeinfo_rank (linfo);
10194 lkd = ffeinfo_kind (linfo);
10195 lwh = ffeinfo_where (linfo);
10196 lsz = ffebld_size_known (ffebld_left (reduced));
10197
10198 rinfo = ffebld_info (ffebld_right (reduced));
10199 rbt = ffeinfo_basictype (rinfo);
10200 rkt = ffeinfo_kindtype (rinfo);
10201 rrk = ffeinfo_rank (rinfo);
10202 rkd = ffeinfo_kind (rinfo);
10203 rwh = ffeinfo_where (rinfo);
10204 rsz = ffebld_size_known (ffebld_right (reduced));
10205
10206 ffeexpr_type_combine (&nbt, &nkt, lbt, lkt, rbt, rkt, op->token);
10207
10208 if (((nbt == FFEINFO_basictypeINTEGER) || (nbt == FFEINFO_basictypeREAL)
10209 || (nbt == FFEINFO_basictypeCHARACTER))
10210 && (lrk == 0) && (rrk == 0))
10211 {
10212 switch (lwh)
10213 {
10214 case FFEINFO_whereCONSTANT:
10215 switch (rwh)
10216 {
10217 case FFEINFO_whereCONSTANT:
10218 nwh = FFEINFO_whereCONSTANT;
10219 break;
10220
10221 case FFEINFO_whereIMMEDIATE:
10222 nwh = FFEINFO_whereIMMEDIATE;
10223 break;
10224
10225 default:
10226 nwh = FFEINFO_whereFLEETING;
10227 break;
10228 }
10229 break;
10230
10231 case FFEINFO_whereIMMEDIATE:
10232 switch (rwh)
10233 {
10234 case FFEINFO_whereCONSTANT:
10235 case FFEINFO_whereIMMEDIATE:
10236 nwh = FFEINFO_whereIMMEDIATE;
10237 break;
10238
10239 default:
10240 nwh = FFEINFO_whereFLEETING;
10241 break;
10242 }
10243 break;
10244
10245 default:
10246 nwh = FFEINFO_whereFLEETING;
10247 break;
10248 }
10249
10250 if ((lsz != FFETARGET_charactersizeNONE)
10251 && (rsz != FFETARGET_charactersizeNONE))
10252 lsz = rsz = (lsz > rsz) ? lsz : rsz;
10253
10254 ninfo = ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
10255 0, FFEINFO_kindENTITY, nwh, FFETARGET_charactersizeNONE);
10256 ffebld_set_info (reduced, ninfo);
10257 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10258 l->token, op->token, nbt, nkt, 0, lsz,
10259 FFEEXPR_contextLET));
10260 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10261 r->token, op->token, nbt, nkt, 0, rsz,
10262 FFEEXPR_contextLET));
10263 return reduced;
10264 }
10265
10266 if ((lbt != FFEINFO_basictypeINTEGER) && (lbt != FFEINFO_basictypeREAL)
10267 && (lbt != FFEINFO_basictypeCHARACTER))
10268 {
10269 if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
10270 && (rbt != FFEINFO_basictypeCHARACTER))
10271 {
10272 if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
10273 && ffebad_start (FFEBAD_RELOP_ARGS_TYPE))
10274 {
10275 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10276 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10277 ffebad_here (2, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10278 ffebad_finish ();
10279 }
10280 }
10281 else
10282 {
10283 if ((lbt != FFEINFO_basictypeANY)
10284 && ffebad_start (FFEBAD_RELOP_ARG_TYPE))
10285 {
10286 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10287 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10288 ffebad_finish ();
10289 }
10290 }
10291 }
10292 else if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
10293 && (rbt != FFEINFO_basictypeCHARACTER))
10294 {
10295 if ((rbt != FFEINFO_basictypeANY)
10296 && ffebad_start (FFEBAD_RELOP_ARG_TYPE))
10297 {
10298 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10299 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10300 ffebad_finish ();
10301 }
10302 }
10303 else if (lrk != 0)
10304 {
10305 if ((lkd != FFEINFO_kindANY)
10306 && ffebad_start (FFEBAD_RELOP_ARG_KIND))
10307 {
10308 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10309 ffebad_here (1, ffelex_token_where_line (l->token), ffelex_token_where_column (l->token));
10310 ffebad_string ("an array");
10311 ffebad_finish ();
10312 }
10313 }
10314 else
10315 {
10316 if ((rkd != FFEINFO_kindANY)
10317 && ffebad_start (FFEBAD_RELOP_ARG_KIND))
10318 {
10319 ffebad_here (0, ffelex_token_where_line (op->token), ffelex_token_where_column (op->token));
10320 ffebad_here (1, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
10321 ffebad_string ("an array");
10322 ffebad_finish ();
10323 }
10324 }
10325
10326 reduced = ffebld_new_any ();
10327 ffebld_set_info (reduced, ffeinfo_new_any ());
10328 return reduced;
10329 }
10330
10331 /* ffeexpr_reduced_ugly1_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
10332
10333 reduced = ffeexpr_reduced_ugly1_(reduced,op,r);
10334
10335 Sigh. */
10336
10337 static ffebld
10338 ffeexpr_reduced_ugly1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
10339 {
10340 ffeinfo rinfo;
10341 ffeinfoBasictype rbt;
10342 ffeinfoKindtype rkt;
10343 ffeinfoRank rrk;
10344 ffeinfoKind rkd;
10345 ffeinfoWhere rwh;
10346
10347 rinfo = ffebld_info (ffebld_left (reduced));
10348 rbt = ffeinfo_basictype (rinfo);
10349 rkt = ffeinfo_kindtype (rinfo);
10350 rrk = ffeinfo_rank (rinfo);
10351 rkd = ffeinfo_kind (rinfo);
10352 rwh = ffeinfo_where (rinfo);
10353
10354 if ((rbt == FFEINFO_basictypeTYPELESS)
10355 || (rbt == FFEINFO_basictypeHOLLERITH))
10356 {
10357 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10358 r->token, op->token, FFEINFO_basictypeINTEGER,
10359 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10360 FFETARGET_charactersizeNONE,
10361 FFEEXPR_contextLET));
10362 rinfo = ffebld_info (ffebld_left (reduced));
10363 rbt = FFEINFO_basictypeINTEGER;
10364 rkt = FFEINFO_kindtypeINTEGERDEFAULT;
10365 rrk = 0;
10366 rkd = FFEINFO_kindENTITY;
10367 rwh = ffeinfo_where (rinfo);
10368 }
10369
10370 if (rbt == FFEINFO_basictypeLOGICAL)
10371 {
10372 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10373 r->token, op->token, FFEINFO_basictypeINTEGER,
10374 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10375 FFETARGET_charactersizeNONE,
10376 FFEEXPR_contextLET));
10377 }
10378
10379 return reduced;
10380 }
10381
10382 /* ffeexpr_reduced_ugly1log_ -- Deal with TYPELESS and HOLLERITH
10383
10384 reduced = ffeexpr_reduced_ugly1log_(reduced,op,r);
10385
10386 Sigh. */
10387
10388 static ffebld
10389 ffeexpr_reduced_ugly1log_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r)
10390 {
10391 ffeinfo rinfo;
10392 ffeinfoBasictype rbt;
10393 ffeinfoKindtype rkt;
10394 ffeinfoRank rrk;
10395 ffeinfoKind rkd;
10396 ffeinfoWhere rwh;
10397
10398 rinfo = ffebld_info (ffebld_left (reduced));
10399 rbt = ffeinfo_basictype (rinfo);
10400 rkt = ffeinfo_kindtype (rinfo);
10401 rrk = ffeinfo_rank (rinfo);
10402 rkd = ffeinfo_kind (rinfo);
10403 rwh = ffeinfo_where (rinfo);
10404
10405 if ((rbt == FFEINFO_basictypeTYPELESS)
10406 || (rbt == FFEINFO_basictypeHOLLERITH))
10407 {
10408 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10409 r->token, op->token, FFEINFO_basictypeLOGICAL, 0,
10410 FFEINFO_kindtypeLOGICALDEFAULT,
10411 FFETARGET_charactersizeNONE,
10412 FFEEXPR_contextLET));
10413 rinfo = ffebld_info (ffebld_left (reduced));
10414 rbt = FFEINFO_basictypeLOGICAL;
10415 rkt = FFEINFO_kindtypeLOGICALDEFAULT;
10416 rrk = 0;
10417 rkd = FFEINFO_kindENTITY;
10418 rwh = ffeinfo_where (rinfo);
10419 }
10420
10421 return reduced;
10422 }
10423
10424 /* ffeexpr_reduced_ugly2_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
10425
10426 reduced = ffeexpr_reduced_ugly2_(reduced,l,op,r);
10427
10428 Sigh. */
10429
10430 static ffebld
10431 ffeexpr_reduced_ugly2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
10432 ffeexprExpr_ r)
10433 {
10434 ffeinfo linfo, rinfo;
10435 ffeinfoBasictype lbt, rbt;
10436 ffeinfoKindtype lkt, rkt;
10437 ffeinfoRank lrk, rrk;
10438 ffeinfoKind lkd, rkd;
10439 ffeinfoWhere lwh, rwh;
10440
10441 linfo = ffebld_info (ffebld_left (reduced));
10442 lbt = ffeinfo_basictype (linfo);
10443 lkt = ffeinfo_kindtype (linfo);
10444 lrk = ffeinfo_rank (linfo);
10445 lkd = ffeinfo_kind (linfo);
10446 lwh = ffeinfo_where (linfo);
10447
10448 rinfo = ffebld_info (ffebld_right (reduced));
10449 rbt = ffeinfo_basictype (rinfo);
10450 rkt = ffeinfo_kindtype (rinfo);
10451 rrk = ffeinfo_rank (rinfo);
10452 rkd = ffeinfo_kind (rinfo);
10453 rwh = ffeinfo_where (rinfo);
10454
10455 if ((lbt == FFEINFO_basictypeTYPELESS)
10456 || (lbt == FFEINFO_basictypeHOLLERITH))
10457 {
10458 if ((rbt == FFEINFO_basictypeTYPELESS)
10459 || (rbt == FFEINFO_basictypeHOLLERITH))
10460 {
10461 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10462 l->token, op->token, FFEINFO_basictypeINTEGER,
10463 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10464 FFETARGET_charactersizeNONE,
10465 FFEEXPR_contextLET));
10466 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10467 r->token, op->token, FFEINFO_basictypeINTEGER, 0,
10468 FFEINFO_kindtypeINTEGERDEFAULT,
10469 FFETARGET_charactersizeNONE,
10470 FFEEXPR_contextLET));
10471 linfo = ffebld_info (ffebld_left (reduced));
10472 rinfo = ffebld_info (ffebld_right (reduced));
10473 lbt = rbt = FFEINFO_basictypeINTEGER;
10474 lkt = rkt = FFEINFO_kindtypeINTEGERDEFAULT;
10475 lrk = rrk = 0;
10476 lkd = rkd = FFEINFO_kindENTITY;
10477 lwh = ffeinfo_where (linfo);
10478 rwh = ffeinfo_where (rinfo);
10479 }
10480 else
10481 {
10482 ffebld_set_left (reduced, ffeexpr_convert_expr (ffebld_left (reduced),
10483 l->token, ffebld_right (reduced), r->token,
10484 FFEEXPR_contextLET));
10485 linfo = ffebld_info (ffebld_left (reduced));
10486 lbt = ffeinfo_basictype (linfo);
10487 lkt = ffeinfo_kindtype (linfo);
10488 lrk = ffeinfo_rank (linfo);
10489 lkd = ffeinfo_kind (linfo);
10490 lwh = ffeinfo_where (linfo);
10491 }
10492 }
10493 else
10494 {
10495 if ((rbt == FFEINFO_basictypeTYPELESS)
10496 || (rbt == FFEINFO_basictypeHOLLERITH))
10497 {
10498 ffebld_set_right (reduced, ffeexpr_convert_expr (ffebld_right (reduced),
10499 r->token, ffebld_left (reduced), l->token,
10500 FFEEXPR_contextLET));
10501 rinfo = ffebld_info (ffebld_right (reduced));
10502 rbt = ffeinfo_basictype (rinfo);
10503 rkt = ffeinfo_kindtype (rinfo);
10504 rrk = ffeinfo_rank (rinfo);
10505 rkd = ffeinfo_kind (rinfo);
10506 rwh = ffeinfo_where (rinfo);
10507 }
10508 /* else Leave it alone. */
10509 }
10510
10511 if (lbt == FFEINFO_basictypeLOGICAL)
10512 {
10513 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10514 l->token, op->token, FFEINFO_basictypeINTEGER,
10515 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10516 FFETARGET_charactersizeNONE,
10517 FFEEXPR_contextLET));
10518 }
10519
10520 if (rbt == FFEINFO_basictypeLOGICAL)
10521 {
10522 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10523 r->token, op->token, FFEINFO_basictypeINTEGER,
10524 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10525 FFETARGET_charactersizeNONE,
10526 FFEEXPR_contextLET));
10527 }
10528
10529 return reduced;
10530 }
10531
10532 /* ffeexpr_reduced_ugly2log_ -- Deal with TYPELESS and HOLLERITH
10533
10534 reduced = ffeexpr_reduced_ugly2log_(reduced,l,op,r);
10535
10536 Sigh. */
10537
10538 static ffebld
10539 ffeexpr_reduced_ugly2log_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
10540 ffeexprExpr_ r, bool *bothlogical)
10541 {
10542 ffeinfo linfo, rinfo;
10543 ffeinfoBasictype lbt, rbt;
10544 ffeinfoKindtype lkt, rkt;
10545 ffeinfoRank lrk, rrk;
10546 ffeinfoKind lkd, rkd;
10547 ffeinfoWhere lwh, rwh;
10548
10549 linfo = ffebld_info (ffebld_left (reduced));
10550 lbt = ffeinfo_basictype (linfo);
10551 lkt = ffeinfo_kindtype (linfo);
10552 lrk = ffeinfo_rank (linfo);
10553 lkd = ffeinfo_kind (linfo);
10554 lwh = ffeinfo_where (linfo);
10555
10556 rinfo = ffebld_info (ffebld_right (reduced));
10557 rbt = ffeinfo_basictype (rinfo);
10558 rkt = ffeinfo_kindtype (rinfo);
10559 rrk = ffeinfo_rank (rinfo);
10560 rkd = ffeinfo_kind (rinfo);
10561 rwh = ffeinfo_where (rinfo);
10562
10563 if ((lbt == FFEINFO_basictypeTYPELESS)
10564 || (lbt == FFEINFO_basictypeHOLLERITH))
10565 {
10566 if ((rbt == FFEINFO_basictypeTYPELESS)
10567 || (rbt == FFEINFO_basictypeHOLLERITH))
10568 {
10569 ffebld_set_left (reduced, ffeexpr_convert (ffebld_left (reduced),
10570 l->token, op->token, FFEINFO_basictypeLOGICAL,
10571 FFEINFO_kindtypeLOGICALDEFAULT, 0,
10572 FFETARGET_charactersizeNONE,
10573 FFEEXPR_contextLET));
10574 ffebld_set_right (reduced, ffeexpr_convert (ffebld_right (reduced),
10575 r->token, op->token, FFEINFO_basictypeLOGICAL,
10576 FFEINFO_kindtypeLOGICALDEFAULT, 0,
10577 FFETARGET_charactersizeNONE,
10578 FFEEXPR_contextLET));
10579 linfo = ffebld_info (ffebld_left (reduced));
10580 rinfo = ffebld_info (ffebld_right (reduced));
10581 lbt = rbt = FFEINFO_basictypeLOGICAL;
10582 lkt = rkt = FFEINFO_kindtypeLOGICALDEFAULT;
10583 lrk = rrk = 0;
10584 lkd = rkd = FFEINFO_kindENTITY;
10585 lwh = ffeinfo_where (linfo);
10586 rwh = ffeinfo_where (rinfo);
10587 }
10588 else
10589 {
10590 ffebld_set_left (reduced, ffeexpr_convert_expr (ffebld_left (reduced),
10591 l->token, ffebld_right (reduced), r->token,
10592 FFEEXPR_contextLET));
10593 linfo = ffebld_info (ffebld_left (reduced));
10594 lbt = ffeinfo_basictype (linfo);
10595 lkt = ffeinfo_kindtype (linfo);
10596 lrk = ffeinfo_rank (linfo);
10597 lkd = ffeinfo_kind (linfo);
10598 lwh = ffeinfo_where (linfo);
10599 }
10600 }
10601 else
10602 {
10603 if ((rbt == FFEINFO_basictypeTYPELESS)
10604 || (rbt == FFEINFO_basictypeHOLLERITH))
10605 {
10606 ffebld_set_right (reduced, ffeexpr_convert_expr (ffebld_right (reduced),
10607 r->token, ffebld_left (reduced), l->token,
10608 FFEEXPR_contextLET));
10609 rinfo = ffebld_info (ffebld_right (reduced));
10610 rbt = ffeinfo_basictype (rinfo);
10611 rkt = ffeinfo_kindtype (rinfo);
10612 rrk = ffeinfo_rank (rinfo);
10613 rkd = ffeinfo_kind (rinfo);
10614 rwh = ffeinfo_where (rinfo);
10615 }
10616 /* else Leave it alone. */
10617 }
10618
10619 if (lbt == FFEINFO_basictypeLOGICAL)
10620 {
10621 ffebld_set_left (reduced,
10622 ffeexpr_convert (ffebld_left (reduced),
10623 l->token, op->token,
10624 FFEINFO_basictypeINTEGER,
10625 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10626 FFETARGET_charactersizeNONE,
10627 FFEEXPR_contextLET));
10628 }
10629
10630 if (rbt == FFEINFO_basictypeLOGICAL)
10631 {
10632 ffebld_set_right (reduced,
10633 ffeexpr_convert (ffebld_right (reduced),
10634 r->token, op->token,
10635 FFEINFO_basictypeINTEGER,
10636 FFEINFO_kindtypeINTEGERDEFAULT, 0,
10637 FFETARGET_charactersizeNONE,
10638 FFEEXPR_contextLET));
10639 }
10640
10641 if (bothlogical != NULL)
10642 *bothlogical = (lbt == FFEINFO_basictypeLOGICAL
10643 && rbt == FFEINFO_basictypeLOGICAL);
10644
10645 return reduced;
10646 }
10647
10648 /* Fumble through tokens until a nonmatching CLOSE_PAREN, EOS, or SEMICOLON
10649 is found.
10650
10651 The idea is to process the tokens as they would be done by normal
10652 expression processing, with the key things being telling the lexer
10653 when hollerith/character constants are about to happen, until the
10654 true closing token is found. */
10655
10656 static ffelexHandler
10657 ffeexpr_find_close_paren_ (ffelexToken t,
10658 ffelexHandler after)
10659 {
10660 ffeexpr_find_.after = after;
10661 ffeexpr_find_.level = 1;
10662 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10663 }
10664
10665 static ffelexHandler
10666 ffeexpr_nil_finished_ (ffelexToken t)
10667 {
10668 switch (ffelex_token_type (t))
10669 {
10670 case FFELEX_typeCLOSE_PAREN:
10671 if (--ffeexpr_find_.level == 0)
10672 return (ffelexHandler) ffeexpr_find_.after;
10673 return (ffelexHandler) ffeexpr_nil_binary_;
10674
10675 case FFELEX_typeCOMMA:
10676 case FFELEX_typeCOLON:
10677 case FFELEX_typeEQUALS:
10678 case FFELEX_typePOINTS:
10679 return (ffelexHandler) ffeexpr_nil_rhs_;
10680
10681 default:
10682 if (--ffeexpr_find_.level == 0)
10683 return (ffelexHandler) ffeexpr_find_.after (t);
10684 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10685 }
10686 }
10687
10688 static ffelexHandler
10689 ffeexpr_nil_rhs_ (ffelexToken t)
10690 {
10691 switch (ffelex_token_type (t))
10692 {
10693 case FFELEX_typeQUOTE:
10694 if (ffe_is_vxt ())
10695 return (ffelexHandler) ffeexpr_nil_quote_;
10696 ffelex_set_expecting_hollerith (-1, '\"',
10697 ffelex_token_where_line (t),
10698 ffelex_token_where_column (t));
10699 return (ffelexHandler) ffeexpr_nil_apostrophe_;
10700
10701 case FFELEX_typeAPOSTROPHE:
10702 ffelex_set_expecting_hollerith (-1, '\'',
10703 ffelex_token_where_line (t),
10704 ffelex_token_where_column (t));
10705 return (ffelexHandler) ffeexpr_nil_apostrophe_;
10706
10707 case FFELEX_typePERCENT:
10708 return (ffelexHandler) ffeexpr_nil_percent_;
10709
10710 case FFELEX_typeOPEN_PAREN:
10711 ++ffeexpr_find_.level;
10712 return (ffelexHandler) ffeexpr_nil_rhs_;
10713
10714 case FFELEX_typePLUS:
10715 case FFELEX_typeMINUS:
10716 return (ffelexHandler) ffeexpr_nil_rhs_;
10717
10718 case FFELEX_typePERIOD:
10719 return (ffelexHandler) ffeexpr_nil_period_;
10720
10721 case FFELEX_typeNUMBER:
10722 ffeexpr_hollerith_count_ = atol (ffelex_token_text (t));
10723 if (ffeexpr_hollerith_count_ > 0)
10724 ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_,
10725 '\0',
10726 ffelex_token_where_line (t),
10727 ffelex_token_where_column (t));
10728 return (ffelexHandler) ffeexpr_nil_number_;
10729
10730 case FFELEX_typeNAME:
10731 case FFELEX_typeNAMES:
10732 return (ffelexHandler) ffeexpr_nil_name_rhs_;
10733
10734 case FFELEX_typeASTERISK:
10735 case FFELEX_typeSLASH:
10736 case FFELEX_typePOWER:
10737 case FFELEX_typeCONCAT:
10738 case FFELEX_typeREL_EQ:
10739 case FFELEX_typeREL_NE:
10740 case FFELEX_typeREL_LE:
10741 case FFELEX_typeREL_GE:
10742 return (ffelexHandler) ffeexpr_nil_rhs_;
10743
10744 default:
10745 return (ffelexHandler) ffeexpr_nil_finished_ (t);
10746 }
10747 }
10748
10749 static ffelexHandler
10750 ffeexpr_nil_period_ (ffelexToken t)
10751 {
10752 switch (ffelex_token_type (t))
10753 {
10754 case FFELEX_typeNAME:
10755 case FFELEX_typeNAMES:
10756 ffeexpr_current_dotdot_ = ffestr_other (t);
10757 switch (ffeexpr_current_dotdot_)
10758 {
10759 case FFESTR_otherNone:
10760 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10761
10762 case FFESTR_otherTRUE:
10763 case FFESTR_otherFALSE:
10764 case FFESTR_otherNOT:
10765 return (ffelexHandler) ffeexpr_nil_end_period_;
10766
10767 default:
10768 return (ffelexHandler) ffeexpr_nil_swallow_period_;
10769 }
10770 break; /* Nothing really reaches here. */
10771
10772 case FFELEX_typeNUMBER:
10773 return (ffelexHandler) ffeexpr_nil_real_;
10774
10775 default:
10776 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10777 }
10778 }
10779
10780 static ffelexHandler
10781 ffeexpr_nil_end_period_ (ffelexToken t)
10782 {
10783 switch (ffeexpr_current_dotdot_)
10784 {
10785 case FFESTR_otherNOT:
10786 if (ffelex_token_type (t) != FFELEX_typePERIOD)
10787 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10788 return (ffelexHandler) ffeexpr_nil_rhs_;
10789
10790 case FFESTR_otherTRUE:
10791 case FFESTR_otherFALSE:
10792 if (ffelex_token_type (t) != FFELEX_typePERIOD)
10793 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10794 return (ffelexHandler) ffeexpr_nil_binary_;
10795
10796 default:
10797 assert ("Bad [nil] unary dotdot in ffeexpr_current_dotdot_" == NULL);
10798 exit (0);
10799 return NULL;
10800 }
10801 }
10802
10803 static ffelexHandler
10804 ffeexpr_nil_swallow_period_ (ffelexToken t)
10805 {
10806 if (ffelex_token_type (t) != FFELEX_typePERIOD)
10807 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
10808 return (ffelexHandler) ffeexpr_nil_rhs_;
10809 }
10810
10811 static ffelexHandler
10812 ffeexpr_nil_real_ (ffelexToken t)
10813 {
10814 char d;
10815 const char *p;
10816
10817 if (((ffelex_token_type (t) != FFELEX_typeNAME)
10818 && (ffelex_token_type (t) != FFELEX_typeNAMES))
10819 || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
10820 'D', 'd')
10821 || ffesrc_char_match_init (d, 'E', 'e')
10822 || ffesrc_char_match_init (d, 'Q', 'q')))
10823 && ffeexpr_isdigits_ (++p)))
10824 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10825
10826 if (*p == '\0')
10827 return (ffelexHandler) ffeexpr_nil_real_exponent_;
10828 return (ffelexHandler) ffeexpr_nil_binary_;
10829 }
10830
10831 static ffelexHandler
10832 ffeexpr_nil_real_exponent_ (ffelexToken t)
10833 {
10834 if ((ffelex_token_type (t) != FFELEX_typePLUS)
10835 && (ffelex_token_type (t) != FFELEX_typeMINUS))
10836 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10837
10838 return (ffelexHandler) ffeexpr_nil_real_exp_sign_;
10839 }
10840
10841 static ffelexHandler
10842 ffeexpr_nil_real_exp_sign_ (ffelexToken t)
10843 {
10844 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
10845 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10846 return (ffelexHandler) ffeexpr_nil_binary_;
10847 }
10848
10849 static ffelexHandler
10850 ffeexpr_nil_number_ (ffelexToken t)
10851 {
10852 char d;
10853 const char *p;
10854
10855 if (ffeexpr_hollerith_count_ > 0)
10856 ffelex_set_expecting_hollerith (0, '\0',
10857 ffewhere_line_unknown (),
10858 ffewhere_column_unknown ());
10859
10860 switch (ffelex_token_type (t))
10861 {
10862 case FFELEX_typeNAME:
10863 case FFELEX_typeNAMES:
10864 if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
10865 'D', 'd')
10866 || ffesrc_char_match_init (d, 'E', 'e')
10867 || ffesrc_char_match_init (d, 'Q', 'q'))
10868 && ffeexpr_isdigits_ (++p))
10869 {
10870 if (*p == '\0')
10871 {
10872 ffeexpr_find_.t = ffelex_token_use (t);
10873 return (ffelexHandler) ffeexpr_nil_number_exponent_;
10874 }
10875 return (ffelexHandler) ffeexpr_nil_binary_;
10876 }
10877 break;
10878
10879 case FFELEX_typePERIOD:
10880 ffeexpr_find_.t = ffelex_token_use (t);
10881 return (ffelexHandler) ffeexpr_nil_number_period_;
10882
10883 case FFELEX_typeHOLLERITH:
10884 return (ffelexHandler) ffeexpr_nil_binary_;
10885
10886 default:
10887 break;
10888 }
10889 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10890 }
10891
10892 /* Expects ffeexpr_find_.t. */
10893
10894 static ffelexHandler
10895 ffeexpr_nil_number_exponent_ (ffelexToken t)
10896 {
10897 ffelexHandler nexthandler;
10898
10899 if ((ffelex_token_type (t) != FFELEX_typePLUS)
10900 && (ffelex_token_type (t) != FFELEX_typeMINUS))
10901 {
10902 nexthandler
10903 = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
10904 ffelex_token_kill (ffeexpr_find_.t);
10905 return (ffelexHandler) (*nexthandler) (t);
10906 }
10907
10908 ffelex_token_kill (ffeexpr_find_.t);
10909 return (ffelexHandler) ffeexpr_nil_number_exp_sign_;
10910 }
10911
10912 static ffelexHandler
10913 ffeexpr_nil_number_exp_sign_ (ffelexToken t)
10914 {
10915 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
10916 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10917
10918 return (ffelexHandler) ffeexpr_nil_binary_;
10919 }
10920
10921 /* Expects ffeexpr_find_.t. */
10922
10923 static ffelexHandler
10924 ffeexpr_nil_number_period_ (ffelexToken t)
10925 {
10926 ffelexHandler nexthandler;
10927 char d;
10928 const char *p;
10929
10930 switch (ffelex_token_type (t))
10931 {
10932 case FFELEX_typeNAME:
10933 case FFELEX_typeNAMES:
10934 if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
10935 'D', 'd')
10936 || ffesrc_char_match_init (d, 'E', 'e')
10937 || ffesrc_char_match_init (d, 'Q', 'q'))
10938 && ffeexpr_isdigits_ (++p))
10939 {
10940 if (*p == '\0')
10941 return (ffelexHandler) ffeexpr_nil_number_per_exp_;
10942 ffelex_token_kill (ffeexpr_find_.t);
10943 return (ffelexHandler) ffeexpr_nil_binary_;
10944 }
10945 nexthandler
10946 = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
10947 ffelex_token_kill (ffeexpr_find_.t);
10948 return (ffelexHandler) (*nexthandler) (t);
10949
10950 case FFELEX_typeNUMBER:
10951 ffelex_token_kill (ffeexpr_find_.t);
10952 return (ffelexHandler) ffeexpr_nil_number_real_;
10953
10954 default:
10955 break;
10956 }
10957 ffelex_token_kill (ffeexpr_find_.t);
10958 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10959 }
10960
10961 /* Expects ffeexpr_find_.t. */
10962
10963 static ffelexHandler
10964 ffeexpr_nil_number_per_exp_ (ffelexToken t)
10965 {
10966 if ((ffelex_token_type (t) != FFELEX_typePLUS)
10967 && (ffelex_token_type (t) != FFELEX_typeMINUS))
10968 {
10969 ffelexHandler nexthandler;
10970
10971 nexthandler
10972 = (ffelexHandler) ffeexpr_nil_binary_ (ffeexpr_find_.t);
10973 ffelex_token_kill (ffeexpr_find_.t);
10974 return (ffelexHandler) (*nexthandler) (t);
10975 }
10976
10977 ffelex_token_kill (ffeexpr_find_.t);
10978 return (ffelexHandler) ffeexpr_nil_num_per_exp_sign_;
10979 }
10980
10981 static ffelexHandler
10982 ffeexpr_nil_number_real_ (ffelexToken t)
10983 {
10984 char d;
10985 const char *p;
10986
10987 if (((ffelex_token_type (t) != FFELEX_typeNAME)
10988 && (ffelex_token_type (t) != FFELEX_typeNAMES))
10989 || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
10990 'D', 'd')
10991 || ffesrc_char_match_init (d, 'E', 'e')
10992 || ffesrc_char_match_init (d, 'Q', 'q')))
10993 && ffeexpr_isdigits_ (++p)))
10994 return (ffelexHandler) ffeexpr_nil_binary_ (t);
10995
10996 if (*p == '\0')
10997 return (ffelexHandler) ffeexpr_nil_number_real_exp_;
10998
10999 return (ffelexHandler) ffeexpr_nil_binary_;
11000 }
11001
11002 static ffelexHandler
11003 ffeexpr_nil_num_per_exp_sign_ (ffelexToken t)
11004 {
11005 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
11006 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11007 return (ffelexHandler) ffeexpr_nil_binary_;
11008 }
11009
11010 static ffelexHandler
11011 ffeexpr_nil_number_real_exp_ (ffelexToken t)
11012 {
11013 if ((ffelex_token_type (t) != FFELEX_typePLUS)
11014 && (ffelex_token_type (t) != FFELEX_typeMINUS))
11015 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11016 return (ffelexHandler) ffeexpr_nil_num_real_exp_sn_;
11017 }
11018
11019 static ffelexHandler
11020 ffeexpr_nil_num_real_exp_sn_ (ffelexToken t)
11021 {
11022 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
11023 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11024 return (ffelexHandler) ffeexpr_nil_binary_;
11025 }
11026
11027 static ffelexHandler
11028 ffeexpr_nil_binary_ (ffelexToken t)
11029 {
11030 switch (ffelex_token_type (t))
11031 {
11032 case FFELEX_typePLUS:
11033 case FFELEX_typeMINUS:
11034 case FFELEX_typeASTERISK:
11035 case FFELEX_typeSLASH:
11036 case FFELEX_typePOWER:
11037 case FFELEX_typeCONCAT:
11038 case FFELEX_typeOPEN_ANGLE:
11039 case FFELEX_typeCLOSE_ANGLE:
11040 case FFELEX_typeREL_EQ:
11041 case FFELEX_typeREL_NE:
11042 case FFELEX_typeREL_GE:
11043 case FFELEX_typeREL_LE:
11044 return (ffelexHandler) ffeexpr_nil_rhs_;
11045
11046 case FFELEX_typePERIOD:
11047 return (ffelexHandler) ffeexpr_nil_binary_period_;
11048
11049 default:
11050 return (ffelexHandler) ffeexpr_nil_finished_ (t);
11051 }
11052 }
11053
11054 static ffelexHandler
11055 ffeexpr_nil_binary_period_ (ffelexToken t)
11056 {
11057 switch (ffelex_token_type (t))
11058 {
11059 case FFELEX_typeNAME:
11060 case FFELEX_typeNAMES:
11061 ffeexpr_current_dotdot_ = ffestr_other (t);
11062 switch (ffeexpr_current_dotdot_)
11063 {
11064 case FFESTR_otherTRUE:
11065 case FFESTR_otherFALSE:
11066 case FFESTR_otherNOT:
11067 return (ffelexHandler) ffeexpr_nil_binary_sw_per_;
11068
11069 default:
11070 return (ffelexHandler) ffeexpr_nil_binary_end_per_;
11071 }
11072 break; /* Nothing really reaches here. */
11073
11074 default:
11075 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11076 }
11077 }
11078
11079 static ffelexHandler
11080 ffeexpr_nil_binary_end_per_ (ffelexToken t)
11081 {
11082 if (ffelex_token_type (t) != FFELEX_typePERIOD)
11083 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
11084 return (ffelexHandler) ffeexpr_nil_rhs_;
11085 }
11086
11087 static ffelexHandler
11088 ffeexpr_nil_binary_sw_per_ (ffelexToken t)
11089 {
11090 if (ffelex_token_type (t) != FFELEX_typePERIOD)
11091 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11092 return (ffelexHandler) ffeexpr_nil_binary_;
11093 }
11094
11095 static ffelexHandler
11096 ffeexpr_nil_quote_ (ffelexToken t)
11097 {
11098 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
11099 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
11100 return (ffelexHandler) ffeexpr_nil_binary_;
11101 }
11102
11103 static ffelexHandler
11104 ffeexpr_nil_apostrophe_ (ffelexToken t)
11105 {
11106 assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
11107 return (ffelexHandler) ffeexpr_nil_apos_char_;
11108 }
11109
11110 static ffelexHandler
11111 ffeexpr_nil_apos_char_ (ffelexToken t)
11112 {
11113 char c;
11114
11115 if ((ffelex_token_type (t) == FFELEX_typeNAME)
11116 || (ffelex_token_type (t) == FFELEX_typeNAMES))
11117 {
11118 if ((ffelex_token_length (t) == 1)
11119 && (ffesrc_char_match_init ((c = ffelex_token_text (t)[0]),
11120 'B', 'b')
11121 || ffesrc_char_match_init (c, 'O', 'o')
11122 || ffesrc_char_match_init (c, 'X', 'x')
11123 || ffesrc_char_match_init (c, 'Z', 'z')))
11124 return (ffelexHandler) ffeexpr_nil_binary_;
11125 }
11126 if ((ffelex_token_type (t) == FFELEX_typeNAME)
11127 || (ffelex_token_type (t) == FFELEX_typeNAMES))
11128 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
11129 return (ffelexHandler) ffeexpr_nil_substrp_ (t);
11130 }
11131
11132 static ffelexHandler
11133 ffeexpr_nil_name_rhs_ (ffelexToken t)
11134 {
11135 switch (ffelex_token_type (t))
11136 {
11137 case FFELEX_typeQUOTE:
11138 case FFELEX_typeAPOSTROPHE:
11139 ffelex_set_hexnum (TRUE);
11140 return (ffelexHandler) ffeexpr_nil_name_apos_;
11141
11142 case FFELEX_typeOPEN_PAREN:
11143 ++ffeexpr_find_.level;
11144 return (ffelexHandler) ffeexpr_nil_rhs_;
11145
11146 default:
11147 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11148 }
11149 }
11150
11151 static ffelexHandler
11152 ffeexpr_nil_name_apos_ (ffelexToken t)
11153 {
11154 if (ffelex_token_type (t) == FFELEX_typeNAME)
11155 return (ffelexHandler) ffeexpr_nil_name_apos_name_;
11156 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11157 }
11158
11159 static ffelexHandler
11160 ffeexpr_nil_name_apos_name_ (ffelexToken t)
11161 {
11162 switch (ffelex_token_type (t))
11163 {
11164 case FFELEX_typeAPOSTROPHE:
11165 case FFELEX_typeQUOTE:
11166 return (ffelexHandler) ffeexpr_nil_finished_;
11167
11168 default:
11169 return (ffelexHandler) ffeexpr_nil_finished_ (t);
11170 }
11171 }
11172
11173 static ffelexHandler
11174 ffeexpr_nil_percent_ (ffelexToken t)
11175 {
11176 switch (ffelex_token_type (t))
11177 {
11178 case FFELEX_typeNAME:
11179 case FFELEX_typeNAMES:
11180 ffeexpr_stack_->percent = ffeexpr_percent_ (t);
11181 ffeexpr_find_.t = ffelex_token_use (t);
11182 return (ffelexHandler) ffeexpr_nil_percent_name_;
11183
11184 default:
11185 return (ffelexHandler) ffeexpr_nil_rhs_ (t);
11186 }
11187 }
11188
11189 /* Expects ffeexpr_find_.t. */
11190
11191 static ffelexHandler
11192 ffeexpr_nil_percent_name_ (ffelexToken t)
11193 {
11194 ffelexHandler nexthandler;
11195
11196 if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
11197 {
11198 nexthandler
11199 = (ffelexHandler) ffeexpr_nil_rhs_ (ffeexpr_find_.t);
11200 ffelex_token_kill (ffeexpr_find_.t);
11201 return (ffelexHandler) (*nexthandler) (t);
11202 }
11203
11204 ffelex_token_kill (ffeexpr_find_.t);
11205 ++ffeexpr_find_.level;
11206 return (ffelexHandler) ffeexpr_nil_rhs_;
11207 }
11208
11209 static ffelexHandler
11210 ffeexpr_nil_substrp_ (ffelexToken t)
11211 {
11212 if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
11213 return (ffelexHandler) ffeexpr_nil_binary_ (t);
11214
11215 ++ffeexpr_find_.level;
11216 return (ffelexHandler) ffeexpr_nil_rhs_;
11217 }
11218
11219 /* ffeexpr_finished_ -- Reduce expression stack to one expr, finish
11220
11221 ffelexToken t;
11222 return ffeexpr_finished_(t);
11223
11224 Reduces expression stack to one (or zero) elements by repeatedly reducing
11225 the top operator on the stack (or, if the top element on the stack is
11226 itself an operator, issuing an error message and discarding it). Calls
11227 finishing routine with the expression, returning the ffelexHandler it
11228 returns to the caller. */
11229
11230 static ffelexHandler
11231 ffeexpr_finished_ (ffelexToken t)
11232 {
11233 ffeexprExpr_ operand; /* This is B in -B or A+B. */
11234 ffebld expr;
11235 ffeexprCallback callback;
11236 ffeexprStack_ s;
11237 ffebldConstant constnode; /* For detecting magical number. */
11238 ffelexToken ft; /* Temporary copy of first token in
11239 expression. */
11240 ffelexHandler next;
11241 ffeinfo info;
11242 bool error = FALSE;
11243
11244 while (((operand = ffeexpr_stack_->exprstack) != NULL)
11245 && ((operand->previous != NULL) || (operand->type != FFEEXPR_exprtypeOPERAND_)))
11246 {
11247 if (operand->type == FFEEXPR_exprtypeOPERAND_)
11248 ffeexpr_reduce_ ();
11249 else
11250 {
11251 if (ffest_ffebad_start (FFEBAD_MISSING_OPERAND_FOR_OPERATOR))
11252 {
11253 ffebad_here (0, ffelex_token_where_line (t),
11254 ffelex_token_where_column (t));
11255 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
11256 ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
11257 ffebad_finish ();
11258 }
11259 ffeexpr_stack_->exprstack = operand->previous; /* Pop the useless
11260 operator. */
11261 ffeexpr_expr_kill_ (operand);
11262 }
11263 }
11264
11265 assert ((operand == NULL) || (operand->previous == NULL));
11266
11267 ffebld_pool_pop ();
11268 if (operand == NULL)
11269 expr = NULL;
11270 else
11271 {
11272 expr = operand->u.operand;
11273 info = ffebld_info (expr);
11274 if ((ffebld_op (expr) == FFEBLD_opCONTER)
11275 && (ffebld_conter_orig (expr) == NULL)
11276 && ffebld_constant_is_magical (constnode = ffebld_conter (expr)))
11277 {
11278 ffetarget_integer_bad_magical (operand->token);
11279 }
11280 ffeexpr_expr_kill_ (operand);
11281 ffeexpr_stack_->exprstack = NULL;
11282 }
11283
11284 ft = ffeexpr_stack_->first_token;
11285
11286 again: /* :::::::::::::::::::: */
11287 switch (ffeexpr_stack_->context)
11288 {
11289 case FFEEXPR_contextLET:
11290 case FFEEXPR_contextSFUNCDEF:
11291 error = (expr == NULL)
11292 || (ffeinfo_rank (info) != 0);
11293 break;
11294
11295 case FFEEXPR_contextPAREN_:
11296 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11297 break;
11298 switch (ffeinfo_basictype (info))
11299 {
11300 case FFEINFO_basictypeHOLLERITH:
11301 case FFEINFO_basictypeTYPELESS:
11302 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11303 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11304 FFEEXPR_contextLET);
11305 break;
11306
11307 default:
11308 break;
11309 }
11310 break;
11311
11312 case FFEEXPR_contextPARENFILENUM_:
11313 if (ffelex_token_type (t) != FFELEX_typeCOMMA)
11314 ffeexpr_stack_->context = FFEEXPR_contextPAREN_;
11315 else
11316 ffeexpr_stack_->context = FFEEXPR_contextFILENUM;
11317 goto again; /* :::::::::::::::::::: */
11318
11319 case FFEEXPR_contextPARENFILEUNIT_:
11320 if (ffelex_token_type (t) != FFELEX_typeCOMMA)
11321 ffeexpr_stack_->context = FFEEXPR_contextPAREN_;
11322 else
11323 ffeexpr_stack_->context = FFEEXPR_contextFILEUNIT;
11324 goto again; /* :::::::::::::::::::: */
11325
11326 case FFEEXPR_contextACTUALARGEXPR_:
11327 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
11328 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11329 : ffeinfo_basictype (info))
11330 {
11331 case FFEINFO_basictypeHOLLERITH:
11332 case FFEINFO_basictypeTYPELESS:
11333 if (!ffe_is_ugly_args ()
11334 && ffebad_start (FFEBAD_ACTUALARG))
11335 {
11336 ffebad_here (0, ffelex_token_where_line (ft),
11337 ffelex_token_where_column (ft));
11338 ffebad_finish ();
11339 }
11340 break;
11341
11342 default:
11343 break;
11344 }
11345 error = (expr != NULL) && (ffeinfo_rank (info) != 0);
11346 break;
11347
11348 case FFEEXPR_contextACTUALARG_:
11349 case FFEEXPR_contextSFUNCDEFACTUALARG_:
11350 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11351 : ffeinfo_basictype (info))
11352 {
11353 case FFEINFO_basictypeHOLLERITH:
11354 case FFEINFO_basictypeTYPELESS:
11355 #if 0 /* Should never get here. */
11356 expr = ffeexpr_convert (expr, ft, ft,
11357 FFEINFO_basictypeINTEGER,
11358 FFEINFO_kindtypeINTEGERDEFAULT,
11359 0,
11360 FFETARGET_charactersizeNONE,
11361 FFEEXPR_contextLET);
11362 #else
11363 assert ("why hollerith/typeless in actualarg_?" == NULL);
11364 #endif
11365 break;
11366
11367 default:
11368 break;
11369 }
11370 switch ((expr == NULL) ? FFEBLD_opANY : ffebld_op (expr))
11371 {
11372 case FFEBLD_opSYMTER:
11373 case FFEBLD_opPERCENT_LOC:
11374 case FFEBLD_opPERCENT_VAL:
11375 case FFEBLD_opPERCENT_REF:
11376 case FFEBLD_opPERCENT_DESCR:
11377 error = FALSE;
11378 break;
11379
11380 default:
11381 error = (expr != NULL) && (ffeinfo_rank (info) != 0);
11382 break;
11383 }
11384 {
11385 ffesymbol s;
11386 ffeinfoWhere where;
11387 ffeinfoKind kind;
11388
11389 if (!error
11390 && (expr != NULL)
11391 && (ffebld_op (expr) == FFEBLD_opSYMTER)
11392 && ((s = ffebld_symter (expr)), (where = ffesymbol_where (s)),
11393 (where == FFEINFO_whereINTRINSIC)
11394 || (where == FFEINFO_whereGLOBAL)
11395 || ((where == FFEINFO_whereDUMMY)
11396 && ((kind = ffesymbol_kind (s)),
11397 (kind == FFEINFO_kindFUNCTION)
11398 || (kind == FFEINFO_kindSUBROUTINE))))
11399 && !ffesymbol_explicitwhere (s))
11400 {
11401 ffebad_start (where == FFEINFO_whereINTRINSIC
11402 ? FFEBAD_NEED_INTRINSIC : FFEBAD_NEED_EXTERNAL);
11403 ffebad_here (0, ffelex_token_where_line (ft),
11404 ffelex_token_where_column (ft));
11405 ffebad_string (ffesymbol_text (s));
11406 ffebad_finish ();
11407 ffesymbol_signal_change (s);
11408 ffesymbol_set_explicitwhere (s, TRUE);
11409 ffesymbol_signal_unreported (s);
11410 }
11411 }
11412 break;
11413
11414 case FFEEXPR_contextINDEX_:
11415 case FFEEXPR_contextSFUNCDEFINDEX_:
11416 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11417 break;
11418 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11419 : ffeinfo_basictype (info))
11420 {
11421 case FFEINFO_basictypeNONE:
11422 error = FALSE;
11423 break;
11424
11425 case FFEINFO_basictypeLOGICAL:
11426 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11427 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11428 FFEEXPR_contextLET);
11429 /* Fall through. */
11430 case FFEINFO_basictypeREAL:
11431 case FFEINFO_basictypeCOMPLEX:
11432 if (ffe_is_pedantic ())
11433 {
11434 error = TRUE;
11435 break;
11436 }
11437 /* Fall through. */
11438 case FFEINFO_basictypeHOLLERITH:
11439 case FFEINFO_basictypeTYPELESS:
11440 error = FALSE;
11441 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11442 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11443 FFEEXPR_contextLET);
11444 break;
11445
11446 case FFEINFO_basictypeINTEGER:
11447 /* Specifically, allow INTEGER(KIND=2), aka INTEGER*8, through
11448 unmolested. Leave it to downstream to handle kinds. */
11449 break;
11450
11451 default:
11452 error = TRUE;
11453 break;
11454 }
11455 break; /* expr==NULL ok for substring; element case
11456 caught by callback. */
11457
11458 case FFEEXPR_contextRETURN:
11459 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11460 break;
11461 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11462 : ffeinfo_basictype (info))
11463 {
11464 case FFEINFO_basictypeNONE:
11465 error = FALSE;
11466 break;
11467
11468 case FFEINFO_basictypeLOGICAL:
11469 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11470 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11471 FFEEXPR_contextLET);
11472 /* Fall through. */
11473 case FFEINFO_basictypeREAL:
11474 case FFEINFO_basictypeCOMPLEX:
11475 if (ffe_is_pedantic ())
11476 {
11477 error = TRUE;
11478 break;
11479 }
11480 /* Fall through. */
11481 case FFEINFO_basictypeINTEGER:
11482 case FFEINFO_basictypeHOLLERITH:
11483 case FFEINFO_basictypeTYPELESS:
11484 error = FALSE;
11485 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11486 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11487 FFEEXPR_contextLET);
11488 break;
11489
11490 default:
11491 error = TRUE;
11492 break;
11493 }
11494 break;
11495
11496 case FFEEXPR_contextDO:
11497 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11498 break;
11499 switch (ffeinfo_basictype (info))
11500 {
11501 case FFEINFO_basictypeLOGICAL:
11502 error = !ffe_is_ugly_logint ();
11503 if (!ffeexpr_stack_->is_rhs)
11504 break; /* Don't convert lhs variable. */
11505 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11506 ffeinfo_kindtype (ffebld_info (expr)), 0,
11507 FFETARGET_charactersizeNONE,
11508 FFEEXPR_contextLET);
11509 break;
11510
11511 case FFEINFO_basictypeHOLLERITH:
11512 case FFEINFO_basictypeTYPELESS:
11513 if (!ffeexpr_stack_->is_rhs)
11514 {
11515 error = TRUE;
11516 break; /* Don't convert lhs variable. */
11517 }
11518 break;
11519
11520 case FFEINFO_basictypeINTEGER:
11521 case FFEINFO_basictypeREAL:
11522 break;
11523
11524 default:
11525 error = TRUE;
11526 break;
11527 }
11528 if (!ffeexpr_stack_->is_rhs
11529 && (ffebld_op (expr) != FFEBLD_opSYMTER))
11530 error = TRUE;
11531 break;
11532
11533 case FFEEXPR_contextDOWHILE:
11534 case FFEEXPR_contextIF:
11535 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11536 break;
11537 switch (ffeinfo_basictype (info))
11538 {
11539 case FFEINFO_basictypeINTEGER:
11540 error = FALSE;
11541 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11542 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11543 FFEEXPR_contextLET);
11544 /* Fall through. */
11545 case FFEINFO_basictypeLOGICAL:
11546 case FFEINFO_basictypeHOLLERITH:
11547 case FFEINFO_basictypeTYPELESS:
11548 error = FALSE;
11549 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11550 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11551 FFEEXPR_contextLET);
11552 break;
11553
11554 default:
11555 error = TRUE;
11556 break;
11557 }
11558 break;
11559
11560 case FFEEXPR_contextASSIGN:
11561 case FFEEXPR_contextAGOTO:
11562 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11563 : ffeinfo_basictype (info))
11564 {
11565 case FFEINFO_basictypeINTEGER:
11566 error = (ffeinfo_kindtype (info) != ffecom_label_kind ());
11567 break;
11568
11569 case FFEINFO_basictypeLOGICAL:
11570 error = !ffe_is_ugly_logint ()
11571 || (ffeinfo_kindtype (info) != ffecom_label_kind ());
11572 break;
11573
11574 default:
11575 error = TRUE;
11576 break;
11577 }
11578 if ((expr == NULL) || (ffeinfo_rank (info) != 0)
11579 || (ffebld_op (expr) != FFEBLD_opSYMTER))
11580 error = TRUE;
11581 break;
11582
11583 case FFEEXPR_contextCGOTO:
11584 case FFEEXPR_contextFORMAT:
11585 case FFEEXPR_contextDIMLIST:
11586 case FFEEXPR_contextFILENUM: /* See equiv code in _ambig_. */
11587 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11588 break;
11589 switch (ffeinfo_basictype (info))
11590 {
11591 case FFEINFO_basictypeLOGICAL:
11592 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11593 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11594 FFEEXPR_contextLET);
11595 /* Fall through. */
11596 case FFEINFO_basictypeREAL:
11597 case FFEINFO_basictypeCOMPLEX:
11598 if (ffe_is_pedantic ())
11599 {
11600 error = TRUE;
11601 break;
11602 }
11603 /* Fall through. */
11604 case FFEINFO_basictypeINTEGER:
11605 case FFEINFO_basictypeHOLLERITH:
11606 case FFEINFO_basictypeTYPELESS:
11607 error = FALSE;
11608 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11609 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11610 FFEEXPR_contextLET);
11611 break;
11612
11613 default:
11614 error = TRUE;
11615 break;
11616 }
11617 break;
11618
11619 case FFEEXPR_contextARITHIF:
11620 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11621 break;
11622 switch (ffeinfo_basictype (info))
11623 {
11624 case FFEINFO_basictypeLOGICAL:
11625 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11626 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11627 FFEEXPR_contextLET);
11628 if (ffe_is_pedantic ())
11629 {
11630 error = TRUE;
11631 break;
11632 }
11633 /* Fall through. */
11634 case FFEINFO_basictypeHOLLERITH:
11635 case FFEINFO_basictypeTYPELESS:
11636 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11637 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11638 FFEEXPR_contextLET);
11639 /* Fall through. */
11640 case FFEINFO_basictypeINTEGER:
11641 case FFEINFO_basictypeREAL:
11642 error = FALSE;
11643 break;
11644
11645 default:
11646 error = TRUE;
11647 break;
11648 }
11649 break;
11650
11651 case FFEEXPR_contextSTOP:
11652 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11653 break;
11654 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11655 : ffeinfo_basictype (info))
11656 {
11657 case FFEINFO_basictypeINTEGER:
11658 error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
11659 break;
11660
11661 case FFEINFO_basictypeCHARACTER:
11662 error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT);
11663 break;
11664
11665 case FFEINFO_basictypeHOLLERITH:
11666 case FFEINFO_basictypeTYPELESS:
11667 error = FALSE;
11668 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11669 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11670 FFEEXPR_contextLET);
11671 break;
11672
11673 case FFEINFO_basictypeNONE:
11674 error = FALSE;
11675 break;
11676
11677 default:
11678 error = TRUE;
11679 break;
11680 }
11681 if ((expr != NULL) && ((ffebld_op (expr) != FFEBLD_opCONTER)
11682 || (ffebld_conter_orig (expr) != NULL)))
11683 error = TRUE;
11684 break;
11685
11686 case FFEEXPR_contextINCLUDE:
11687 error = (expr == NULL) || (ffeinfo_rank (info) != 0)
11688 || (ffeinfo_basictype (info) != FFEINFO_basictypeCHARACTER)
11689 || (ffebld_op (expr) != FFEBLD_opCONTER)
11690 || (ffebld_conter_orig (expr) != NULL);
11691 break;
11692
11693 case FFEEXPR_contextSELECTCASE:
11694 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11695 break;
11696 switch (ffeinfo_basictype (info))
11697 {
11698 case FFEINFO_basictypeINTEGER:
11699 case FFEINFO_basictypeCHARACTER:
11700 case FFEINFO_basictypeLOGICAL:
11701 error = FALSE;
11702 break;
11703
11704 case FFEINFO_basictypeHOLLERITH:
11705 case FFEINFO_basictypeTYPELESS:
11706 error = FALSE;
11707 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11708 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11709 FFEEXPR_contextLET);
11710 break;
11711
11712 default:
11713 error = TRUE;
11714 break;
11715 }
11716 break;
11717
11718 case FFEEXPR_contextCASE:
11719 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11720 break;
11721 switch ((expr == NULL) ? FFEINFO_basictypeINTEGER
11722 : ffeinfo_basictype (info))
11723 {
11724 case FFEINFO_basictypeINTEGER:
11725 case FFEINFO_basictypeCHARACTER:
11726 case FFEINFO_basictypeLOGICAL:
11727 error = FALSE;
11728 break;
11729
11730 case FFEINFO_basictypeHOLLERITH:
11731 case FFEINFO_basictypeTYPELESS:
11732 error = FALSE;
11733 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11734 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11735 FFEEXPR_contextLET);
11736 break;
11737
11738 default:
11739 error = TRUE;
11740 break;
11741 }
11742 if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
11743 error = TRUE;
11744 break;
11745
11746 case FFEEXPR_contextCHARACTERSIZE:
11747 case FFEEXPR_contextKINDTYPE:
11748 case FFEEXPR_contextDIMLISTCOMMON:
11749 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11750 break;
11751 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11752 : ffeinfo_basictype (info))
11753 {
11754 case FFEINFO_basictypeLOGICAL:
11755 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11756 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11757 FFEEXPR_contextLET);
11758 /* Fall through. */
11759 case FFEINFO_basictypeREAL:
11760 case FFEINFO_basictypeCOMPLEX:
11761 if (ffe_is_pedantic ())
11762 {
11763 error = TRUE;
11764 break;
11765 }
11766 /* Fall through. */
11767 case FFEINFO_basictypeINTEGER:
11768 case FFEINFO_basictypeHOLLERITH:
11769 case FFEINFO_basictypeTYPELESS:
11770 error = FALSE;
11771 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11772 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11773 FFEEXPR_contextLET);
11774 break;
11775
11776 default:
11777 error = TRUE;
11778 break;
11779 }
11780 if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
11781 error = TRUE;
11782 break;
11783
11784 case FFEEXPR_contextEQVINDEX_:
11785 if ((error = (expr != NULL) && (ffeinfo_rank (info) != 0)))
11786 break;
11787 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11788 : ffeinfo_basictype (info))
11789 {
11790 case FFEINFO_basictypeNONE:
11791 error = FALSE;
11792 break;
11793
11794 case FFEINFO_basictypeLOGICAL:
11795 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
11796 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
11797 FFEEXPR_contextLET);
11798 /* Fall through. */
11799 case FFEINFO_basictypeREAL:
11800 case FFEINFO_basictypeCOMPLEX:
11801 if (ffe_is_pedantic ())
11802 {
11803 error = TRUE;
11804 break;
11805 }
11806 /* Fall through. */
11807 case FFEINFO_basictypeINTEGER:
11808 case FFEINFO_basictypeHOLLERITH:
11809 case FFEINFO_basictypeTYPELESS:
11810 error = FALSE;
11811 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11812 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11813 FFEEXPR_contextLET);
11814 break;
11815
11816 default:
11817 error = TRUE;
11818 break;
11819 }
11820 if ((expr != NULL) && (ffebld_op (expr) != FFEBLD_opCONTER))
11821 error = TRUE;
11822 break;
11823
11824 case FFEEXPR_contextPARAMETER:
11825 if (ffeexpr_stack_->is_rhs)
11826 error = (expr == NULL) || (ffeinfo_rank (info) != 0)
11827 || (ffebld_op (expr) != FFEBLD_opCONTER);
11828 else
11829 error = (expr == NULL) || (ffeinfo_rank (info) != 0)
11830 || (ffebld_op (expr) != FFEBLD_opSYMTER);
11831 break;
11832
11833 case FFEEXPR_contextINDEXORACTUALARG_:
11834 if (ffelex_token_type (t) == FFELEX_typeCOLON)
11835 ffeexpr_stack_->context = FFEEXPR_contextINDEX_;
11836 else
11837 ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
11838 goto again; /* :::::::::::::::::::: */
11839
11840 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
11841 if (ffelex_token_type (t) == FFELEX_typeCOLON)
11842 ffeexpr_stack_->context = FFEEXPR_contextINDEX_;
11843 else
11844 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
11845 goto again; /* :::::::::::::::::::: */
11846
11847 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
11848 if (ffelex_token_type (t) == FFELEX_typeCOLON)
11849 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEX_;
11850 else
11851 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
11852 goto again; /* :::::::::::::::::::: */
11853
11854 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
11855 if (ffelex_token_type (t) == FFELEX_typeCOLON)
11856 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFINDEX_;
11857 else
11858 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
11859 goto again; /* :::::::::::::::::::: */
11860
11861 case FFEEXPR_contextIMPDOCTRL_:
11862 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11863 break;
11864 if (!ffeexpr_stack_->is_rhs
11865 && (ffebld_op (expr) != FFEBLD_opSYMTER))
11866 error = TRUE;
11867 switch (ffeinfo_basictype (info))
11868 {
11869 case FFEINFO_basictypeLOGICAL:
11870 if (! ffe_is_ugly_logint ())
11871 error = TRUE;
11872 if (! ffeexpr_stack_->is_rhs)
11873 break;
11874 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11875 ffeinfo_kindtype (info), 0,
11876 FFETARGET_charactersizeNONE,
11877 FFEEXPR_contextLET);
11878 break;
11879
11880 case FFEINFO_basictypeINTEGER:
11881 case FFEINFO_basictypeHOLLERITH:
11882 case FFEINFO_basictypeTYPELESS:
11883 break;
11884
11885 case FFEINFO_basictypeREAL:
11886 if (!ffeexpr_stack_->is_rhs
11887 && ffe_is_warn_surprising ()
11888 && !error)
11889 {
11890 ffebad_start (FFEBAD_DO_REAL); /* See error message!!! */
11891 ffebad_here (0, ffelex_token_where_line (ft),
11892 ffelex_token_where_column (ft));
11893 ffebad_string (ffelex_token_text (ft));
11894 ffebad_finish ();
11895 }
11896 break;
11897
11898 default:
11899 error = TRUE;
11900 break;
11901 }
11902 break;
11903
11904 case FFEEXPR_contextDATAIMPDOCTRL_:
11905 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
11906 break;
11907 if (ffeexpr_stack_->is_rhs)
11908 {
11909 if ((ffebld_op (expr) != FFEBLD_opCONTER)
11910 && (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
11911 error = TRUE;
11912 }
11913 else if ((ffebld_op (expr) != FFEBLD_opSYMTER)
11914 || (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
11915 error = TRUE;
11916 switch (ffeinfo_basictype (info))
11917 {
11918 case FFEINFO_basictypeLOGICAL:
11919 if (! ffeexpr_stack_->is_rhs)
11920 break;
11921 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11922 ffeinfo_kindtype (info), 0,
11923 FFETARGET_charactersizeNONE,
11924 FFEEXPR_contextLET);
11925 /* Fall through. */
11926 case FFEINFO_basictypeINTEGER:
11927 if (ffeexpr_stack_->is_rhs
11928 && (ffeinfo_kindtype (ffebld_info (expr))
11929 != FFEINFO_kindtypeINTEGERDEFAULT))
11930 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11931 FFEINFO_kindtypeINTEGERDEFAULT, 0,
11932 FFETARGET_charactersizeNONE,
11933 FFEEXPR_contextLET);
11934 break;
11935
11936 case FFEINFO_basictypeHOLLERITH:
11937 case FFEINFO_basictypeTYPELESS:
11938 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11939 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11940 FFEEXPR_contextLET);
11941 break;
11942
11943 case FFEINFO_basictypeREAL:
11944 if (!ffeexpr_stack_->is_rhs
11945 && ffe_is_warn_surprising ()
11946 && !error)
11947 {
11948 ffebad_start (FFEBAD_DO_REAL); /* See error message!!! */
11949 ffebad_here (0, ffelex_token_where_line (ft),
11950 ffelex_token_where_column (ft));
11951 ffebad_string (ffelex_token_text (ft));
11952 ffebad_finish ();
11953 }
11954 break;
11955
11956 default:
11957 error = TRUE;
11958 break;
11959 }
11960 break;
11961
11962 case FFEEXPR_contextIMPDOITEM_:
11963 if (ffelex_token_type (t) == FFELEX_typeEQUALS)
11964 {
11965 ffeexpr_stack_->is_rhs = FALSE;
11966 ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
11967 goto again; /* :::::::::::::::::::: */
11968 }
11969 /* Fall through. */
11970 case FFEEXPR_contextIOLIST:
11971 case FFEEXPR_contextFILEVXTCODE:
11972 switch ((expr == NULL) ? FFEINFO_basictypeNONE
11973 : ffeinfo_basictype (info))
11974 {
11975 case FFEINFO_basictypeHOLLERITH:
11976 case FFEINFO_basictypeTYPELESS:
11977 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
11978 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
11979 FFEEXPR_contextLET);
11980 break;
11981
11982 default:
11983 break;
11984 }
11985 error = (expr == NULL)
11986 || ((ffeinfo_rank (info) != 0)
11987 && ((ffebld_op (expr) != FFEBLD_opSYMTER)
11988 || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
11989 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
11990 == FFEBLD_opSTAR))); /* Bad if null expr, or if
11991 array that is not a SYMTER
11992 (can't happen yet, I
11993 think) or has a NULL or
11994 STAR (assumed) array
11995 size. */
11996 break;
11997
11998 case FFEEXPR_contextIMPDOITEMDF_:
11999 if (ffelex_token_type (t) == FFELEX_typeEQUALS)
12000 {
12001 ffeexpr_stack_->is_rhs = FALSE;
12002 ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
12003 goto again; /* :::::::::::::::::::: */
12004 }
12005 /* Fall through. */
12006 case FFEEXPR_contextIOLISTDF:
12007 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12008 : ffeinfo_basictype (info))
12009 {
12010 case FFEINFO_basictypeHOLLERITH:
12011 case FFEINFO_basictypeTYPELESS:
12012 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12013 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12014 FFEEXPR_contextLET);
12015 break;
12016
12017 default:
12018 break;
12019 }
12020 error
12021 = (expr == NULL)
12022 || ((ffeinfo_basictype (info) == FFEINFO_basictypeCHARACTER)
12023 && (ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT))
12024 || ((ffeinfo_rank (info) != 0)
12025 && ((ffebld_op (expr) != FFEBLD_opSYMTER)
12026 || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
12027 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
12028 == FFEBLD_opSTAR))); /* Bad if null expr,
12029 non-default-kindtype
12030 character expr, or if
12031 array that is not a SYMTER
12032 (can't happen yet, I
12033 think) or has a NULL or
12034 STAR (assumed) array
12035 size. */
12036 break;
12037
12038 case FFEEXPR_contextDATAIMPDOITEM_:
12039 error = (expr == NULL)
12040 || (ffebld_op (expr) != FFEBLD_opARRAYREF)
12041 || ((ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR)
12042 && (ffeinfo_where (info) != FFEINFO_whereFLEETING_IADDR));
12043 break;
12044
12045 case FFEEXPR_contextDATAIMPDOINDEX_:
12046 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
12047 break;
12048 switch (ffeinfo_basictype (info))
12049 {
12050 case FFEINFO_basictypeLOGICAL:
12051 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
12052 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
12053 FFEEXPR_contextLET);
12054 /* Fall through. */
12055 case FFEINFO_basictypeREAL:
12056 case FFEINFO_basictypeCOMPLEX:
12057 if (ffe_is_pedantic ())
12058 {
12059 error = TRUE;
12060 break;
12061 }
12062 /* Fall through. */
12063 case FFEINFO_basictypeINTEGER:
12064 case FFEINFO_basictypeHOLLERITH:
12065 case FFEINFO_basictypeTYPELESS:
12066 error = FALSE;
12067 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12068 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12069 FFEEXPR_contextLET);
12070 break;
12071
12072 default:
12073 error = TRUE;
12074 break;
12075 }
12076 if ((ffeinfo_where (info) != FFEINFO_whereCONSTANT)
12077 && (ffeinfo_where (info) != FFEINFO_whereIMMEDIATE))
12078 error = TRUE;
12079 break;
12080
12081 case FFEEXPR_contextDATA:
12082 if (expr == NULL)
12083 error = TRUE;
12084 else if (ffeexpr_stack_->is_rhs)
12085 error = (ffebld_op (expr) != FFEBLD_opCONTER);
12086 else if (ffebld_op (expr) == FFEBLD_opSYMTER)
12087 error = FALSE;
12088 else
12089 error = (ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR);
12090 break;
12091
12092 case FFEEXPR_contextINITVAL:
12093 error = (expr == NULL) || (ffebld_op (expr) != FFEBLD_opCONTER);
12094 break;
12095
12096 case FFEEXPR_contextEQUIVALENCE:
12097 if (expr == NULL)
12098 error = TRUE;
12099 else if (ffebld_op (expr) == FFEBLD_opSYMTER)
12100 error = FALSE;
12101 else
12102 error = (ffeinfo_where (info) != FFEINFO_whereFLEETING_CADDR);
12103 break;
12104
12105 case FFEEXPR_contextFILEASSOC:
12106 case FFEEXPR_contextFILEINT:
12107 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12108 : ffeinfo_basictype (info))
12109 {
12110 case FFEINFO_basictypeINTEGER:
12111 /* Maybe this should be supported someday, but, right now,
12112 g77 can't generate a call to libf2c to write to an
12113 integer other than the default size. */
12114 error = ((! ffeexpr_stack_->is_rhs)
12115 && ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
12116 break;
12117
12118 default:
12119 error = TRUE;
12120 break;
12121 }
12122 if ((expr == NULL) || (ffeinfo_rank (info) != 0))
12123 error = TRUE;
12124 break;
12125
12126 case FFEEXPR_contextFILEDFINT:
12127 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12128 : ffeinfo_basictype (info))
12129 {
12130 case FFEINFO_basictypeINTEGER:
12131 error = (ffeinfo_kindtype (info) != FFEINFO_kindtypeINTEGERDEFAULT);
12132 break;
12133
12134 default:
12135 error = TRUE;
12136 break;
12137 }
12138 if ((expr == NULL) || (ffeinfo_rank (info) != 0))
12139 error = TRUE;
12140 break;
12141
12142 case FFEEXPR_contextFILELOG:
12143 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12144 : ffeinfo_basictype (info))
12145 {
12146 case FFEINFO_basictypeLOGICAL:
12147 error = FALSE;
12148 break;
12149
12150 default:
12151 error = TRUE;
12152 break;
12153 }
12154 if ((expr == NULL) || (ffeinfo_rank (info) != 0))
12155 error = TRUE;
12156 break;
12157
12158 case FFEEXPR_contextFILECHAR:
12159 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12160 : ffeinfo_basictype (info))
12161 {
12162 case FFEINFO_basictypeCHARACTER:
12163 error = FALSE;
12164 break;
12165
12166 default:
12167 error = TRUE;
12168 break;
12169 }
12170 if ((expr == NULL) || (ffeinfo_rank (info) != 0))
12171 error = TRUE;
12172 break;
12173
12174 case FFEEXPR_contextFILENUMCHAR:
12175 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
12176 break;
12177 switch (ffeinfo_basictype (info))
12178 {
12179 case FFEINFO_basictypeLOGICAL:
12180 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
12181 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
12182 FFEEXPR_contextLET);
12183 /* Fall through. */
12184 case FFEINFO_basictypeREAL:
12185 case FFEINFO_basictypeCOMPLEX:
12186 if (ffe_is_pedantic ())
12187 {
12188 error = TRUE;
12189 break;
12190 }
12191 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12192 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12193 FFEEXPR_contextLET);
12194 break;
12195
12196 case FFEINFO_basictypeINTEGER:
12197 case FFEINFO_basictypeCHARACTER:
12198 error = FALSE;
12199 break;
12200
12201 default:
12202 error = TRUE;
12203 break;
12204 }
12205 break;
12206
12207 case FFEEXPR_contextFILEDFCHAR:
12208 if ((error = (expr == NULL) || (ffeinfo_rank (info) != 0)))
12209 break;
12210 switch (ffeinfo_basictype (info))
12211 {
12212 case FFEINFO_basictypeCHARACTER:
12213 error
12214 = (ffeinfo_kindtype (info)
12215 != FFEINFO_kindtypeCHARACTERDEFAULT);
12216 break;
12217
12218 default:
12219 error = TRUE;
12220 break;
12221 }
12222 if (!ffeexpr_stack_->is_rhs
12223 && (ffebld_op (expr) == FFEBLD_opSUBSTR))
12224 error = TRUE;
12225 break;
12226
12227 case FFEEXPR_contextFILEUNIT: /* See equiv code in _ambig_. */
12228 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12229 : ffeinfo_basictype (info))
12230 {
12231 case FFEINFO_basictypeLOGICAL:
12232 if ((error = (ffeinfo_rank (info) != 0)))
12233 break;
12234 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
12235 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
12236 FFEEXPR_contextLET);
12237 /* Fall through. */
12238 case FFEINFO_basictypeREAL:
12239 case FFEINFO_basictypeCOMPLEX:
12240 if ((error = (ffeinfo_rank (info) != 0)))
12241 break;
12242 if (ffe_is_pedantic ())
12243 {
12244 error = TRUE;
12245 break;
12246 }
12247 /* Fall through. */
12248 case FFEINFO_basictypeINTEGER:
12249 case FFEINFO_basictypeHOLLERITH:
12250 case FFEINFO_basictypeTYPELESS:
12251 if ((error = (ffeinfo_rank (info) != 0)))
12252 break;
12253 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12254 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12255 FFEEXPR_contextLET);
12256 break;
12257
12258 case FFEINFO_basictypeCHARACTER:
12259 switch (ffebld_op (expr))
12260 { /* As if _lhs had been called instead of
12261 _rhs. */
12262 case FFEBLD_opSYMTER:
12263 error
12264 = (ffeinfo_where (ffebld_info (expr)) == FFEINFO_whereCONSTANT);
12265 break;
12266
12267 case FFEBLD_opSUBSTR:
12268 error = (ffeinfo_where (ffebld_info (expr))
12269 == FFEINFO_whereCONSTANT_SUBOBJECT);
12270 break;
12271
12272 case FFEBLD_opARRAYREF:
12273 error = FALSE;
12274 break;
12275
12276 default:
12277 error = TRUE;
12278 break;
12279 }
12280 if (!error
12281 && ((ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT)
12282 || ((ffeinfo_rank (info) != 0)
12283 && ((ffebld_op (expr) != FFEBLD_opSYMTER)
12284 || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
12285 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
12286 == FFEBLD_opSTAR))))) /* Bad if
12287 non-default-kindtype
12288 character expr, or if
12289 array that is not a SYMTER
12290 (can't happen yet, I
12291 think), or has a NULL or
12292 STAR (assumed) array
12293 size. */
12294 error = TRUE;
12295 break;
12296
12297 default:
12298 error = TRUE;
12299 break;
12300 }
12301 break;
12302
12303 case FFEEXPR_contextFILEFORMAT:
12304 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12305 : ffeinfo_basictype (info))
12306 {
12307 case FFEINFO_basictypeINTEGER:
12308 error = (expr == NULL)
12309 || ((ffeinfo_rank (info) != 0) ?
12310 ffe_is_pedantic () /* F77 C5. */
12311 : (bool) (ffeinfo_kindtype (info) != ffecom_label_kind ()))
12312 || (ffebld_op (expr) != FFEBLD_opSYMTER);
12313 break;
12314
12315 case FFEINFO_basictypeLOGICAL:
12316 case FFEINFO_basictypeREAL:
12317 case FFEINFO_basictypeCOMPLEX:
12318 /* F77 C5 -- must be an array of hollerith. */
12319 error
12320 = ffe_is_pedantic ()
12321 || (ffeinfo_rank (info) == 0);
12322 break;
12323
12324 case FFEINFO_basictypeCHARACTER:
12325 if ((ffeinfo_kindtype (info) != FFEINFO_kindtypeCHARACTERDEFAULT)
12326 || ((ffeinfo_rank (info) != 0)
12327 && ((ffebld_op (expr) != FFEBLD_opSYMTER)
12328 || (ffesymbol_arraysize (ffebld_symter (expr)) == NULL)
12329 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr)))
12330 == FFEBLD_opSTAR)))) /* Bad if
12331 non-default-kindtype
12332 character expr, or if
12333 array that is not a SYMTER
12334 (can't happen yet, I
12335 think), or has a NULL or
12336 STAR (assumed) array
12337 size. */
12338 error = TRUE;
12339 else
12340 error = FALSE;
12341 break;
12342
12343 default:
12344 error = TRUE;
12345 break;
12346 }
12347 break;
12348
12349 case FFEEXPR_contextLOC_:
12350 /* See also ffeintrin_check_loc_. */
12351 if ((expr == NULL)
12352 || (ffeinfo_kind (info) != FFEINFO_kindENTITY)
12353 || ((ffebld_op (expr) != FFEBLD_opSYMTER)
12354 && (ffebld_op (expr) != FFEBLD_opSUBSTR)
12355 && (ffebld_op (expr) != FFEBLD_opARRAYREF)))
12356 error = TRUE;
12357 break;
12358
12359 default:
12360 error = FALSE;
12361 break;
12362 }
12363
12364 if (error && ((expr == NULL) || (ffebld_op (expr) != FFEBLD_opANY)))
12365 {
12366 ffebad_start (FFEBAD_EXPR_WRONG);
12367 ffebad_here (0, ffelex_token_where_line (ft),
12368 ffelex_token_where_column (ft));
12369 ffebad_finish ();
12370 expr = ffebld_new_any ();
12371 ffebld_set_info (expr, ffeinfo_new_any ());
12372 }
12373
12374 callback = ffeexpr_stack_->callback;
12375 s = ffeexpr_stack_->previous;
12376 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_,
12377 sizeof (*ffeexpr_stack_));
12378 ffeexpr_stack_ = s;
12379 next = (ffelexHandler) (*callback) (ft, expr, t);
12380 ffelex_token_kill (ft);
12381 return (ffelexHandler) next;
12382 }
12383
12384 /* ffeexpr_finished_ambig_ -- Check validity of ambiguous unit/form spec
12385
12386 ffebld expr;
12387 expr = ffeexpr_finished_ambig_(expr);
12388
12389 Replicates a bit of ffeexpr_finished_'s task when in a context
12390 of UNIT or FORMAT. */
12391
12392 static ffebld
12393 ffeexpr_finished_ambig_ (ffelexToken ft, ffebld expr)
12394 {
12395 ffeinfo info = ffebld_info (expr);
12396 bool error;
12397
12398 switch (ffeexpr_stack_->context)
12399 {
12400 case FFEEXPR_contextFILENUMAMBIG: /* Same as FILENUM in _finished_. */
12401 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12402 : ffeinfo_basictype (info))
12403 {
12404 case FFEINFO_basictypeLOGICAL:
12405 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
12406 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
12407 FFEEXPR_contextLET);
12408 /* Fall through. */
12409 case FFEINFO_basictypeREAL:
12410 case FFEINFO_basictypeCOMPLEX:
12411 if (ffe_is_pedantic ())
12412 {
12413 error = TRUE;
12414 break;
12415 }
12416 /* Fall through. */
12417 case FFEINFO_basictypeINTEGER:
12418 case FFEINFO_basictypeHOLLERITH:
12419 case FFEINFO_basictypeTYPELESS:
12420 error = FALSE;
12421 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12422 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12423 FFEEXPR_contextLET);
12424 break;
12425
12426 default:
12427 error = TRUE;
12428 break;
12429 }
12430 if ((expr == NULL) || (ffeinfo_rank (info) != 0))
12431 error = TRUE;
12432 break;
12433
12434 case FFEEXPR_contextFILEUNITAMBIG: /* Same as FILEUNIT in _finished_. */
12435 if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
12436 {
12437 error = FALSE;
12438 break;
12439 }
12440 switch ((expr == NULL) ? FFEINFO_basictypeNONE
12441 : ffeinfo_basictype (info))
12442 {
12443 case FFEINFO_basictypeLOGICAL:
12444 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeLOGICAL,
12445 FFEINFO_kindtypeLOGICALDEFAULT, 0, FFETARGET_charactersizeNONE,
12446 FFEEXPR_contextLET);
12447 /* Fall through. */
12448 case FFEINFO_basictypeREAL:
12449 case FFEINFO_basictypeCOMPLEX:
12450 if (ffe_is_pedantic ())
12451 {
12452 error = TRUE;
12453 break;
12454 }
12455 /* Fall through. */
12456 case FFEINFO_basictypeINTEGER:
12457 case FFEINFO_basictypeHOLLERITH:
12458 case FFEINFO_basictypeTYPELESS:
12459 error = (ffeinfo_rank (info) != 0);
12460 expr = ffeexpr_convert (expr, ft, ft, FFEINFO_basictypeINTEGER,
12461 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFETARGET_charactersizeNONE,
12462 FFEEXPR_contextLET);
12463 break;
12464
12465 case FFEINFO_basictypeCHARACTER:
12466 switch (ffebld_op (expr))
12467 { /* As if _lhs had been called instead of
12468 _rhs. */
12469 case FFEBLD_opSYMTER:
12470 error
12471 = (ffeinfo_where (ffebld_info (expr)) == FFEINFO_whereCONSTANT);
12472 break;
12473
12474 case FFEBLD_opSUBSTR:
12475 error = (ffeinfo_where (ffebld_info (expr))
12476 == FFEINFO_whereCONSTANT_SUBOBJECT);
12477 break;
12478
12479 case FFEBLD_opARRAYREF:
12480 error = FALSE;
12481 break;
12482
12483 default:
12484 error = TRUE;
12485 break;
12486 }
12487 break;
12488
12489 default:
12490 error = TRUE;
12491 break;
12492 }
12493 break;
12494
12495 default:
12496 assert ("bad context" == NULL);
12497 error = TRUE;
12498 break;
12499 }
12500
12501 if (error && ((expr == NULL) || (ffebld_op (expr) != FFEBLD_opANY)))
12502 {
12503 ffebad_start (FFEBAD_EXPR_WRONG);
12504 ffebad_here (0, ffelex_token_where_line (ft),
12505 ffelex_token_where_column (ft));
12506 ffebad_finish ();
12507 expr = ffebld_new_any ();
12508 ffebld_set_info (expr, ffeinfo_new_any ());
12509 }
12510
12511 return expr;
12512 }
12513
12514 /* ffeexpr_token_lhs_ -- Initial state for lhs expression
12515
12516 Return a pointer to this function to the lexer (ffelex), which will
12517 invoke it for the next token.
12518
12519 Basically a smaller version of _rhs_; keep them both in sync, of course. */
12520
12521 static ffelexHandler
12522 ffeexpr_token_lhs_ (ffelexToken t)
12523 {
12524
12525 /* When changing the list of valid initial lhs tokens, check whether to
12526 update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
12527 READ (expr) <token> case -- it assumes it knows which tokens <token> can
12528 be to indicate an lhs (or implied DO), which right now is the set
12529 {NAME,OPEN_PAREN}.
12530
12531 This comment also appears in ffeexpr_token_first_lhs_. */
12532
12533 switch (ffelex_token_type (t))
12534 {
12535 case FFELEX_typeNAME:
12536 case FFELEX_typeNAMES:
12537 ffeexpr_tokens_[0] = ffelex_token_use (t);
12538 return (ffelexHandler) ffeexpr_token_name_lhs_;
12539
12540 default:
12541 return (ffelexHandler) ffeexpr_finished_ (t);
12542 }
12543 }
12544
12545 /* ffeexpr_token_rhs_ -- Initial state for rhs expression
12546
12547 Return a pointer to this function to the lexer (ffelex), which will
12548 invoke it for the next token.
12549
12550 The initial state and the post-binary-operator state are the same and
12551 both handled here, with the expression stack used to distinguish
12552 between them. Binary operators are invalid here; unary operators,
12553 constants, subexpressions, and name references are valid. */
12554
12555 static ffelexHandler
12556 ffeexpr_token_rhs_ (ffelexToken t)
12557 {
12558 ffeexprExpr_ e;
12559
12560 switch (ffelex_token_type (t))
12561 {
12562 case FFELEX_typeQUOTE:
12563 if (ffe_is_vxt ())
12564 {
12565 ffeexpr_tokens_[0] = ffelex_token_use (t);
12566 return (ffelexHandler) ffeexpr_token_quote_;
12567 }
12568 ffeexpr_tokens_[0] = ffelex_token_use (t);
12569 ffelex_set_expecting_hollerith (-1, '\"',
12570 ffelex_token_where_line (t),
12571 ffelex_token_where_column (t));
12572 /* Don't have to unset this one. */
12573 return (ffelexHandler) ffeexpr_token_apostrophe_;
12574
12575 case FFELEX_typeAPOSTROPHE:
12576 ffeexpr_tokens_[0] = ffelex_token_use (t);
12577 ffelex_set_expecting_hollerith (-1, '\'',
12578 ffelex_token_where_line (t),
12579 ffelex_token_where_column (t));
12580 /* Don't have to unset this one. */
12581 return (ffelexHandler) ffeexpr_token_apostrophe_;
12582
12583 case FFELEX_typePERCENT:
12584 ffeexpr_tokens_[0] = ffelex_token_use (t);
12585 return (ffelexHandler) ffeexpr_token_percent_;
12586
12587 case FFELEX_typeOPEN_PAREN:
12588 ffeexpr_stack_->tokens[0] = ffelex_token_use (t);
12589 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
12590 FFEEXPR_contextPAREN_,
12591 ffeexpr_cb_close_paren_c_);
12592
12593 case FFELEX_typePLUS:
12594 e = ffeexpr_expr_new_ ();
12595 e->type = FFEEXPR_exprtypeUNARY_;
12596 e->token = ffelex_token_use (t);
12597 e->u.operator.op = FFEEXPR_operatorADD_;
12598 e->u.operator.prec = FFEEXPR_operatorprecedenceADD_;
12599 e->u.operator.as = FFEEXPR_operatorassociativityADD_;
12600 ffeexpr_exprstack_push_unary_ (e);
12601 return (ffelexHandler) ffeexpr_token_rhs_;
12602
12603 case FFELEX_typeMINUS:
12604 e = ffeexpr_expr_new_ ();
12605 e->type = FFEEXPR_exprtypeUNARY_;
12606 e->token = ffelex_token_use (t);
12607 e->u.operator.op = FFEEXPR_operatorSUBTRACT_;
12608 e->u.operator.prec = FFEEXPR_operatorprecedenceSUBTRACT_;
12609 e->u.operator.as = FFEEXPR_operatorassociativitySUBTRACT_;
12610 ffeexpr_exprstack_push_unary_ (e);
12611 return (ffelexHandler) ffeexpr_token_rhs_;
12612
12613 case FFELEX_typePERIOD:
12614 ffeexpr_tokens_[0] = ffelex_token_use (t);
12615 return (ffelexHandler) ffeexpr_token_period_;
12616
12617 case FFELEX_typeNUMBER:
12618 ffeexpr_tokens_[0] = ffelex_token_use (t);
12619 ffeexpr_hollerith_count_ = atol (ffelex_token_text (t));
12620 if (ffeexpr_hollerith_count_ > 0)
12621 ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_,
12622 '\0',
12623 ffelex_token_where_line (t),
12624 ffelex_token_where_column (t));
12625 return (ffelexHandler) ffeexpr_token_number_;
12626
12627 case FFELEX_typeNAME:
12628 case FFELEX_typeNAMES:
12629 ffeexpr_tokens_[0] = ffelex_token_use (t);
12630 switch (ffeexpr_stack_->context)
12631 {
12632 case FFEEXPR_contextACTUALARG_:
12633 case FFEEXPR_contextINDEXORACTUALARG_:
12634 case FFEEXPR_contextSFUNCDEFACTUALARG_:
12635 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
12636 return (ffelexHandler) ffeexpr_token_name_arg_;
12637
12638 default:
12639 return (ffelexHandler) ffeexpr_token_name_rhs_;
12640 }
12641
12642 case FFELEX_typeASTERISK:
12643 case FFELEX_typeSLASH:
12644 case FFELEX_typePOWER:
12645 case FFELEX_typeCONCAT:
12646 case FFELEX_typeREL_EQ:
12647 case FFELEX_typeREL_NE:
12648 case FFELEX_typeREL_LE:
12649 case FFELEX_typeREL_GE:
12650 if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND))
12651 {
12652 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
12653 ffebad_finish ();
12654 }
12655 return (ffelexHandler) ffeexpr_token_rhs_;
12656
12657 #if 0
12658 case FFELEX_typeEQUALS:
12659 case FFELEX_typePOINTS:
12660 case FFELEX_typeCLOSE_ANGLE:
12661 case FFELEX_typeCLOSE_PAREN:
12662 case FFELEX_typeCOMMA:
12663 case FFELEX_typeCOLON:
12664 case FFELEX_typeEOS:
12665 case FFELEX_typeSEMICOLON:
12666 #endif
12667 default:
12668 return (ffelexHandler) ffeexpr_finished_ (t);
12669 }
12670 }
12671
12672 /* ffeexpr_token_period_ -- Rhs PERIOD
12673
12674 Return a pointer to this function to the lexer (ffelex), which will
12675 invoke it for the next token.
12676
12677 Handle a period detected at rhs (expecting unary op or operand) state.
12678 Must begin a floating-point value (as in .12) or a dot-dot name, of
12679 which only .NOT., .TRUE., and .FALSE. are truly valid. Other sort-of-
12680 valid names represent binary operators, which are invalid here because
12681 there isn't an operand at the top of the stack. */
12682
12683 static ffelexHandler
12684 ffeexpr_token_period_ (ffelexToken t)
12685 {
12686 switch (ffelex_token_type (t))
12687 {
12688 case FFELEX_typeNAME:
12689 case FFELEX_typeNAMES:
12690 ffeexpr_current_dotdot_ = ffestr_other (t);
12691 switch (ffeexpr_current_dotdot_)
12692 {
12693 case FFESTR_otherNone:
12694 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
12695 {
12696 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
12697 ffelex_token_where_column (ffeexpr_tokens_[0]));
12698 ffebad_finish ();
12699 }
12700 ffelex_token_kill (ffeexpr_tokens_[0]);
12701 return (ffelexHandler) ffeexpr_token_rhs_ (t);
12702
12703 case FFESTR_otherTRUE:
12704 case FFESTR_otherFALSE:
12705 case FFESTR_otherNOT:
12706 ffeexpr_tokens_[1] = ffelex_token_use (t);
12707 return (ffelexHandler) ffeexpr_token_end_period_;
12708
12709 default:
12710 if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND))
12711 {
12712 ffebad_here (0, ffelex_token_where_line (t),
12713 ffelex_token_where_column (t));
12714 ffebad_finish ();
12715 }
12716 ffelex_token_kill (ffeexpr_tokens_[0]);
12717 return (ffelexHandler) ffeexpr_token_swallow_period_;
12718 }
12719 break; /* Nothing really reaches here. */
12720
12721 case FFELEX_typeNUMBER:
12722 ffeexpr_tokens_[1] = ffelex_token_use (t);
12723 return (ffelexHandler) ffeexpr_token_real_;
12724
12725 default:
12726 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
12727 {
12728 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
12729 ffelex_token_where_column (ffeexpr_tokens_[0]));
12730 ffebad_finish ();
12731 }
12732 ffelex_token_kill (ffeexpr_tokens_[0]);
12733 return (ffelexHandler) ffeexpr_token_rhs_ (t);
12734 }
12735 }
12736
12737 /* ffeexpr_token_end_period_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
12738
12739 Return a pointer to this function to the lexer (ffelex), which will
12740 invoke it for the next token.
12741
12742 Expecting a period to close a .NOT, .TRUE, or .FALSE at rhs (unary op
12743 or operator) state. If period isn't found, issue a diagnostic but
12744 pretend we saw one. ffeexpr_current_dotdot_ must already contained the
12745 dotdot representation of the name in between the two PERIOD tokens. */
12746
12747 static ffelexHandler
12748 ffeexpr_token_end_period_ (ffelexToken t)
12749 {
12750 ffeexprExpr_ e;
12751
12752 if (ffelex_token_type (t) != FFELEX_typePERIOD)
12753 {
12754 if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD))
12755 {
12756 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
12757 ffelex_token_where_column (ffeexpr_tokens_[0]));
12758 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
12759 ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
12760 ffebad_finish ();
12761 }
12762 }
12763
12764 ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill "NOT"/"TRUE"/"FALSE"
12765 token. */
12766
12767 e = ffeexpr_expr_new_ ();
12768 e->token = ffeexpr_tokens_[0];
12769
12770 switch (ffeexpr_current_dotdot_)
12771 {
12772 case FFESTR_otherNOT:
12773 e->type = FFEEXPR_exprtypeUNARY_;
12774 e->u.operator.op = FFEEXPR_operatorNOT_;
12775 e->u.operator.prec = FFEEXPR_operatorprecedenceNOT_;
12776 e->u.operator.as = FFEEXPR_operatorassociativityNOT_;
12777 ffeexpr_exprstack_push_unary_ (e);
12778 if (ffelex_token_type (t) != FFELEX_typePERIOD)
12779 return (ffelexHandler) ffeexpr_token_rhs_ (t);
12780 return (ffelexHandler) ffeexpr_token_rhs_;
12781
12782 case FFESTR_otherTRUE:
12783 e->type = FFEEXPR_exprtypeOPERAND_;
12784 e->u.operand
12785 = ffebld_new_conter (ffebld_constant_new_logicaldefault (TRUE));
12786 ffebld_set_info (e->u.operand,
12787 ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
12788 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
12789 ffeexpr_exprstack_push_operand_ (e);
12790 if (ffelex_token_type (t) != FFELEX_typePERIOD)
12791 return (ffelexHandler) ffeexpr_token_binary_ (t);
12792 return (ffelexHandler) ffeexpr_token_binary_;
12793
12794 case FFESTR_otherFALSE:
12795 e->type = FFEEXPR_exprtypeOPERAND_;
12796 e->u.operand
12797 = ffebld_new_conter (ffebld_constant_new_logicaldefault (FALSE));
12798 ffebld_set_info (e->u.operand,
12799 ffeinfo_new (FFEINFO_basictypeLOGICAL, FFEINFO_kindtypeLOGICALDEFAULT,
12800 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
12801 ffeexpr_exprstack_push_operand_ (e);
12802 if (ffelex_token_type (t) != FFELEX_typePERIOD)
12803 return (ffelexHandler) ffeexpr_token_binary_ (t);
12804 return (ffelexHandler) ffeexpr_token_binary_;
12805
12806 default:
12807 assert ("Bad unary dotdot in ffeexpr_current_dotdot_" == NULL);
12808 exit (0);
12809 return NULL;
12810 }
12811 }
12812
12813 /* ffeexpr_token_swallow_period_ -- Rhs PERIOD NAME(not NOT, TRUE, or FALSE)
12814
12815 Return a pointer to this function to the lexer (ffelex), which will
12816 invoke it for the next token.
12817
12818 A diagnostic has already been issued; just swallow a period if there is
12819 one, then continue with ffeexpr_token_rhs_. */
12820
12821 static ffelexHandler
12822 ffeexpr_token_swallow_period_ (ffelexToken t)
12823 {
12824 if (ffelex_token_type (t) != FFELEX_typePERIOD)
12825 return (ffelexHandler) ffeexpr_token_rhs_ (t);
12826
12827 return (ffelexHandler) ffeexpr_token_rhs_;
12828 }
12829
12830 /* ffeexpr_token_real_ -- Rhs PERIOD NUMBER
12831
12832 Return a pointer to this function to the lexer (ffelex), which will
12833 invoke it for the next token.
12834
12835 After a period and a string of digits, check next token for possible
12836 exponent designation (D, E, or Q as first/only character) and continue
12837 real-number handling accordingly. Else form basic real constant, push
12838 onto expression stack, and enter binary state using current token (which,
12839 if it is a name not beginning with D, E, or Q, will certainly result
12840 in an error, but that's not for this routine to deal with). */
12841
12842 static ffelexHandler
12843 ffeexpr_token_real_ (ffelexToken t)
12844 {
12845 char d;
12846 const char *p;
12847
12848 if (((ffelex_token_type (t) != FFELEX_typeNAME)
12849 && (ffelex_token_type (t) != FFELEX_typeNAMES))
12850 || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
12851 'D', 'd')
12852 || ffesrc_char_match_init (d, 'E', 'e')
12853 || ffesrc_char_match_init (d, 'Q', 'q')))
12854 && ffeexpr_isdigits_ (++p)))
12855 {
12856 #if 0
12857 /* This code has been removed because it seems inconsistent to
12858 produce a diagnostic in this case, but not all of the other
12859 ones that look for an exponent and cannot recognize one. */
12860 if (((ffelex_token_type (t) == FFELEX_typeNAME)
12861 || (ffelex_token_type (t) == FFELEX_typeNAMES))
12862 && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT))
12863 {
12864 char bad[2];
12865
12866 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
12867 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
12868 ffelex_token_where_column (ffeexpr_tokens_[0]));
12869 bad[0] = *(p - 1);
12870 bad[1] = '\0';
12871 ffebad_string (bad);
12872 ffebad_finish ();
12873 }
12874 #endif
12875 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
12876 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
12877 NULL, NULL, NULL);
12878
12879 ffelex_token_kill (ffeexpr_tokens_[0]);
12880 ffelex_token_kill (ffeexpr_tokens_[1]);
12881 return (ffelexHandler) ffeexpr_token_binary_ (t);
12882 }
12883
12884 /* Just exponent character by itself? In which case, PLUS or MINUS must
12885 surely be next, followed by a NUMBER token. */
12886
12887 if (*p == '\0')
12888 {
12889 ffeexpr_tokens_[2] = ffelex_token_use (t);
12890 return (ffelexHandler) ffeexpr_token_real_exponent_;
12891 }
12892
12893 ffeexpr_make_float_const_ (d, NULL, ffeexpr_tokens_[0], ffeexpr_tokens_[1],
12894 t, NULL, NULL);
12895
12896 ffelex_token_kill (ffeexpr_tokens_[0]);
12897 ffelex_token_kill (ffeexpr_tokens_[1]);
12898 return (ffelexHandler) ffeexpr_token_binary_;
12899 }
12900
12901 /* ffeexpr_token_real_exponent_ -- Rhs PERIOD NUMBER NAME(D, E, or Q)
12902
12903 Return a pointer to this function to the lexer (ffelex), which will
12904 invoke it for the next token.
12905
12906 Ensures this token is PLUS or MINUS, preserves it, goes to final state
12907 for real number (exponent digits). Else issues diagnostic, assumes a
12908 zero exponent field for number, passes token on to binary state as if
12909 previous token had been "E0" instead of "E", for example. */
12910
12911 static ffelexHandler
12912 ffeexpr_token_real_exponent_ (ffelexToken t)
12913 {
12914 if ((ffelex_token_type (t) != FFELEX_typePLUS)
12915 && (ffelex_token_type (t) != FFELEX_typeMINUS))
12916 {
12917 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
12918 {
12919 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
12920 ffelex_token_where_column (ffeexpr_tokens_[2]));
12921 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
12922 ffebad_finish ();
12923 }
12924
12925 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
12926 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
12927 NULL, NULL, NULL);
12928
12929 ffelex_token_kill (ffeexpr_tokens_[0]);
12930 ffelex_token_kill (ffeexpr_tokens_[1]);
12931 ffelex_token_kill (ffeexpr_tokens_[2]);
12932 return (ffelexHandler) ffeexpr_token_binary_ (t);
12933 }
12934
12935 ffeexpr_tokens_[3] = ffelex_token_use (t);
12936 return (ffelexHandler) ffeexpr_token_real_exp_sign_;
12937 }
12938
12939 /* ffeexpr_token_real_exp_sign_ -- Rhs PERIOD NUMBER NAME(D,E,Q) PLUS/MINUS
12940
12941 Return a pointer to this function to the lexer (ffelex), which will
12942 invoke it for the next token.
12943
12944 Make sure token is a NUMBER, make a real constant out of all we have and
12945 push it onto the expression stack. Else issue diagnostic and pretend
12946 exponent field was a zero. */
12947
12948 static ffelexHandler
12949 ffeexpr_token_real_exp_sign_ (ffelexToken t)
12950 {
12951 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
12952 {
12953 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
12954 {
12955 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
12956 ffelex_token_where_column (ffeexpr_tokens_[2]));
12957 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
12958 ffebad_finish ();
12959 }
12960
12961 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL,
12962 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
12963 NULL, NULL, NULL);
12964
12965 ffelex_token_kill (ffeexpr_tokens_[0]);
12966 ffelex_token_kill (ffeexpr_tokens_[1]);
12967 ffelex_token_kill (ffeexpr_tokens_[2]);
12968 ffelex_token_kill (ffeexpr_tokens_[3]);
12969 return (ffelexHandler) ffeexpr_token_binary_ (t);
12970 }
12971
12972 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[2])[0], NULL,
12973 ffeexpr_tokens_[0], ffeexpr_tokens_[1], ffeexpr_tokens_[2],
12974 ffeexpr_tokens_[3], t);
12975
12976 ffelex_token_kill (ffeexpr_tokens_[0]);
12977 ffelex_token_kill (ffeexpr_tokens_[1]);
12978 ffelex_token_kill (ffeexpr_tokens_[2]);
12979 ffelex_token_kill (ffeexpr_tokens_[3]);
12980 return (ffelexHandler) ffeexpr_token_binary_;
12981 }
12982
12983 /* ffeexpr_token_number_ -- Rhs NUMBER
12984
12985 Return a pointer to this function to the lexer (ffelex), which will
12986 invoke it for the next token.
12987
12988 If the token is a period, we may have a floating-point number, or an
12989 integer followed by a dotdot binary operator. If the token is a name
12990 beginning with D, E, or Q, we definitely have a floating-point number.
12991 If the token is a hollerith constant, that's what we've got, so push
12992 it onto the expression stack and continue with the binary state.
12993
12994 Otherwise, we have an integer followed by something the binary state
12995 should be able to swallow. */
12996
12997 static ffelexHandler
12998 ffeexpr_token_number_ (ffelexToken t)
12999 {
13000 ffeexprExpr_ e;
13001 ffeinfo ni;
13002 char d;
13003 const char *p;
13004
13005 if (ffeexpr_hollerith_count_ > 0)
13006 ffelex_set_expecting_hollerith (0, '\0',
13007 ffewhere_line_unknown (),
13008 ffewhere_column_unknown ());
13009
13010 /* See if we've got a floating-point number here. */
13011
13012 switch (ffelex_token_type (t))
13013 {
13014 case FFELEX_typeNAME:
13015 case FFELEX_typeNAMES:
13016 if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
13017 'D', 'd')
13018 || ffesrc_char_match_init (d, 'E', 'e')
13019 || ffesrc_char_match_init (d, 'Q', 'q'))
13020 && ffeexpr_isdigits_ (++p))
13021 {
13022
13023 /* Just exponent character by itself? In which case, PLUS or MINUS
13024 must surely be next, followed by a NUMBER token. */
13025
13026 if (*p == '\0')
13027 {
13028 ffeexpr_tokens_[1] = ffelex_token_use (t);
13029 return (ffelexHandler) ffeexpr_token_number_exponent_;
13030 }
13031 ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0], NULL, NULL, t,
13032 NULL, NULL);
13033
13034 ffelex_token_kill (ffeexpr_tokens_[0]);
13035 return (ffelexHandler) ffeexpr_token_binary_;
13036 }
13037 break;
13038
13039 case FFELEX_typePERIOD:
13040 ffeexpr_tokens_[1] = ffelex_token_use (t);
13041 return (ffelexHandler) ffeexpr_token_number_period_;
13042
13043 case FFELEX_typeHOLLERITH:
13044 e = ffeexpr_expr_new_ ();
13045 e->type = FFEEXPR_exprtypeOPERAND_;
13046 e->token = ffeexpr_tokens_[0];
13047 e->u.operand = ffebld_new_conter (ffebld_constant_new_hollerith (t));
13048 ni = ffeinfo_new (FFEINFO_basictypeHOLLERITH, FFEINFO_kindtypeNONE,
13049 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
13050 ffelex_token_length (t));
13051 ffebld_set_info (e->u.operand, ni);
13052 ffeexpr_exprstack_push_operand_ (e);
13053 return (ffelexHandler) ffeexpr_token_binary_;
13054
13055 default:
13056 break;
13057 }
13058
13059 /* Nothing specific we were looking for, so make an integer and pass the
13060 current token to the binary state. */
13061
13062 ffeexpr_make_float_const_ ('I', ffeexpr_tokens_[0], NULL, NULL,
13063 NULL, NULL, NULL);
13064 return (ffelexHandler) ffeexpr_token_binary_ (t);
13065 }
13066
13067 /* ffeexpr_token_number_exponent_ -- Rhs NUMBER NAME(D, E, or Q)
13068
13069 Return a pointer to this function to the lexer (ffelex), which will
13070 invoke it for the next token.
13071
13072 Ensures this token is PLUS or MINUS, preserves it, goes to final state
13073 for real number (exponent digits). Else treats number as integer, passes
13074 name to binary, passes current token to subsequent handler. */
13075
13076 static ffelexHandler
13077 ffeexpr_token_number_exponent_ (ffelexToken t)
13078 {
13079 if ((ffelex_token_type (t) != FFELEX_typePLUS)
13080 && (ffelex_token_type (t) != FFELEX_typeMINUS))
13081 {
13082 ffeexprExpr_ e;
13083 ffelexHandler nexthandler;
13084
13085 e = ffeexpr_expr_new_ ();
13086 e->type = FFEEXPR_exprtypeOPERAND_;
13087 e->token = ffeexpr_tokens_[0];
13088 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
13089 (ffeexpr_tokens_[0]));
13090 ffebld_set_info (e->u.operand,
13091 ffeinfo_new (FFEINFO_basictypeINTEGER, FFEINFO_kindtypeINTEGERDEFAULT,
13092 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
13093 ffeexpr_exprstack_push_operand_ (e);
13094 nexthandler = (ffelexHandler) ffeexpr_token_binary_ (ffeexpr_tokens_[1]);
13095 ffelex_token_kill (ffeexpr_tokens_[1]);
13096 return (ffelexHandler) (*nexthandler) (t);
13097 }
13098
13099 ffeexpr_tokens_[2] = ffelex_token_use (t);
13100 return (ffelexHandler) ffeexpr_token_number_exp_sign_;
13101 }
13102
13103 /* ffeexpr_token_number_exp_sign_ -- Rhs NUMBER NAME(D,E,Q) PLUS/MINUS
13104
13105 Return a pointer to this function to the lexer (ffelex), which will
13106 invoke it for the next token.
13107
13108 Make sure token is a NUMBER, make a real constant out of all we have and
13109 push it onto the expression stack. Else issue diagnostic and pretend
13110 exponent field was a zero. */
13111
13112 static ffelexHandler
13113 ffeexpr_token_number_exp_sign_ (ffelexToken t)
13114 {
13115 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
13116 {
13117 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
13118 {
13119 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[1]),
13120 ffelex_token_where_column (ffeexpr_tokens_[1]));
13121 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13122 ffebad_finish ();
13123 }
13124
13125 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[1])[0],
13126 ffeexpr_tokens_[0], NULL, NULL,
13127 ffeexpr_tokens_[1], ffeexpr_tokens_[2],
13128 NULL);
13129
13130 ffelex_token_kill (ffeexpr_tokens_[0]);
13131 ffelex_token_kill (ffeexpr_tokens_[1]);
13132 ffelex_token_kill (ffeexpr_tokens_[2]);
13133 return (ffelexHandler) ffeexpr_token_binary_ (t);
13134 }
13135
13136 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[1])[0],
13137 ffeexpr_tokens_[0], NULL, NULL,
13138 ffeexpr_tokens_[1], ffeexpr_tokens_[2], t);
13139
13140 ffelex_token_kill (ffeexpr_tokens_[0]);
13141 ffelex_token_kill (ffeexpr_tokens_[1]);
13142 ffelex_token_kill (ffeexpr_tokens_[2]);
13143 return (ffelexHandler) ffeexpr_token_binary_;
13144 }
13145
13146 /* ffeexpr_token_number_period_ -- Rhs NUMBER PERIOD
13147
13148 Return a pointer to this function to the lexer (ffelex), which will
13149 invoke it for the next token.
13150
13151 Handle a period detected following a number at rhs state. Must begin a
13152 floating-point value (as in 1., 1.2, 1.E3, or 1.E+3) or a dot-dot name. */
13153
13154 static ffelexHandler
13155 ffeexpr_token_number_period_ (ffelexToken t)
13156 {
13157 ffeexprExpr_ e;
13158 ffelexHandler nexthandler;
13159 const char *p;
13160 char d;
13161
13162 switch (ffelex_token_type (t))
13163 {
13164 case FFELEX_typeNAME:
13165 case FFELEX_typeNAMES:
13166 if ((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
13167 'D', 'd')
13168 || ffesrc_char_match_init (d, 'E', 'e')
13169 || ffesrc_char_match_init (d, 'Q', 'q'))
13170 && ffeexpr_isdigits_ (++p))
13171 {
13172
13173 /* Just exponent character by itself? In which case, PLUS or MINUS
13174 must surely be next, followed by a NUMBER token. */
13175
13176 if (*p == '\0')
13177 {
13178 ffeexpr_tokens_[2] = ffelex_token_use (t);
13179 return (ffelexHandler) ffeexpr_token_number_per_exp_;
13180 }
13181 ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0],
13182 ffeexpr_tokens_[1], NULL, t, NULL,
13183 NULL);
13184
13185 ffelex_token_kill (ffeexpr_tokens_[0]);
13186 ffelex_token_kill (ffeexpr_tokens_[1]);
13187 return (ffelexHandler) ffeexpr_token_binary_;
13188 }
13189 /* A name not representing an exponent, so assume it will be something
13190 like EQ, make an integer from the number, pass the period to binary
13191 state and the current token to the resulting state. */
13192
13193 e = ffeexpr_expr_new_ ();
13194 e->type = FFEEXPR_exprtypeOPERAND_;
13195 e->token = ffeexpr_tokens_[0];
13196 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
13197 (ffeexpr_tokens_[0]));
13198 ffebld_set_info (e->u.operand,
13199 ffeinfo_new (FFEINFO_basictypeINTEGER,
13200 FFEINFO_kindtypeINTEGERDEFAULT, 0,
13201 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
13202 FFETARGET_charactersizeNONE));
13203 ffeexpr_exprstack_push_operand_ (e);
13204 nexthandler = (ffelexHandler) ffeexpr_token_binary_
13205 (ffeexpr_tokens_[1]);
13206 ffelex_token_kill (ffeexpr_tokens_[1]);
13207 return (ffelexHandler) (*nexthandler) (t);
13208
13209 case FFELEX_typeNUMBER:
13210 ffeexpr_tokens_[2] = ffelex_token_use (t);
13211 return (ffelexHandler) ffeexpr_token_number_real_;
13212
13213 default:
13214 break;
13215 }
13216
13217 /* Nothing specific we were looking for, so make a real number and pass the
13218 period and then the current token to the binary state. */
13219
13220 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13221 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13222 NULL, NULL, NULL, NULL);
13223
13224 ffelex_token_kill (ffeexpr_tokens_[0]);
13225 ffelex_token_kill (ffeexpr_tokens_[1]);
13226 return (ffelexHandler) ffeexpr_token_binary_ (t);
13227 }
13228
13229 /* ffeexpr_token_number_per_exp_ -- Rhs NUMBER PERIOD NAME(D, E, or Q)
13230
13231 Return a pointer to this function to the lexer (ffelex), which will
13232 invoke it for the next token.
13233
13234 Ensures this token is PLUS or MINUS, preserves it, goes to final state
13235 for real number (exponent digits). Else treats number as real, passes
13236 name to binary, passes current token to subsequent handler. */
13237
13238 static ffelexHandler
13239 ffeexpr_token_number_per_exp_ (ffelexToken t)
13240 {
13241 if ((ffelex_token_type (t) != FFELEX_typePLUS)
13242 && (ffelex_token_type (t) != FFELEX_typeMINUS))
13243 {
13244 ffelexHandler nexthandler;
13245
13246 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13247 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13248 NULL, NULL, NULL, NULL);
13249
13250 ffelex_token_kill (ffeexpr_tokens_[0]);
13251 ffelex_token_kill (ffeexpr_tokens_[1]);
13252 nexthandler = (ffelexHandler) ffeexpr_token_binary_ (ffeexpr_tokens_[2]);
13253 ffelex_token_kill (ffeexpr_tokens_[2]);
13254 return (ffelexHandler) (*nexthandler) (t);
13255 }
13256
13257 ffeexpr_tokens_[3] = ffelex_token_use (t);
13258 return (ffelexHandler) ffeexpr_token_num_per_exp_sign_;
13259 }
13260
13261 /* ffeexpr_token_number_real_ -- Rhs NUMBER PERIOD NUMBER
13262
13263 Return a pointer to this function to the lexer (ffelex), which will
13264 invoke it for the next token.
13265
13266 After a number, period, and number, check next token for possible
13267 exponent designation (D, E, or Q as first/only character) and continue
13268 real-number handling accordingly. Else form basic real constant, push
13269 onto expression stack, and enter binary state using current token (which,
13270 if it is a name not beginning with D, E, or Q, will certainly result
13271 in an error, but that's not for this routine to deal with). */
13272
13273 static ffelexHandler
13274 ffeexpr_token_number_real_ (ffelexToken t)
13275 {
13276 char d;
13277 const char *p;
13278
13279 if (((ffelex_token_type (t) != FFELEX_typeNAME)
13280 && (ffelex_token_type (t) != FFELEX_typeNAMES))
13281 || !(((ffesrc_char_match_init ((d = *(p = ffelex_token_text (t))),
13282 'D', 'd')
13283 || ffesrc_char_match_init (d, 'E', 'e')
13284 || ffesrc_char_match_init (d, 'Q', 'q')))
13285 && ffeexpr_isdigits_ (++p)))
13286 {
13287 #if 0
13288 /* This code has been removed because it seems inconsistent to
13289 produce a diagnostic in this case, but not all of the other
13290 ones that look for an exponent and cannot recognize one. */
13291 if (((ffelex_token_type (t) == FFELEX_typeNAME)
13292 || (ffelex_token_type (t) == FFELEX_typeNAMES))
13293 && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT))
13294 {
13295 char bad[2];
13296
13297 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13298 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
13299 ffelex_token_where_column (ffeexpr_tokens_[0]));
13300 bad[0] = *(p - 1);
13301 bad[1] = '\0';
13302 ffebad_string (bad);
13303 ffebad_finish ();
13304 }
13305 #endif
13306 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13307 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13308 ffeexpr_tokens_[2], NULL, NULL, NULL);
13309
13310 ffelex_token_kill (ffeexpr_tokens_[0]);
13311 ffelex_token_kill (ffeexpr_tokens_[1]);
13312 ffelex_token_kill (ffeexpr_tokens_[2]);
13313 return (ffelexHandler) ffeexpr_token_binary_ (t);
13314 }
13315
13316 /* Just exponent character by itself? In which case, PLUS or MINUS must
13317 surely be next, followed by a NUMBER token. */
13318
13319 if (*p == '\0')
13320 {
13321 ffeexpr_tokens_[3] = ffelex_token_use (t);
13322 return (ffelexHandler) ffeexpr_token_number_real_exp_;
13323 }
13324
13325 ffeexpr_make_float_const_ (d, ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13326 ffeexpr_tokens_[2], t, NULL, NULL);
13327
13328 ffelex_token_kill (ffeexpr_tokens_[0]);
13329 ffelex_token_kill (ffeexpr_tokens_[1]);
13330 ffelex_token_kill (ffeexpr_tokens_[2]);
13331 return (ffelexHandler) ffeexpr_token_binary_;
13332 }
13333
13334 /* ffeexpr_token_num_per_exp_sign_ -- Rhs NUMBER PERIOD NAME(D,E,Q) PLUS/MINUS
13335
13336 Return a pointer to this function to the lexer (ffelex), which will
13337 invoke it for the next token.
13338
13339 Make sure token is a NUMBER, make a real constant out of all we have and
13340 push it onto the expression stack. Else issue diagnostic and pretend
13341 exponent field was a zero. */
13342
13343 static ffelexHandler
13344 ffeexpr_token_num_per_exp_sign_ (ffelexToken t)
13345 {
13346 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
13347 {
13348 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
13349 {
13350 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[2]),
13351 ffelex_token_where_column (ffeexpr_tokens_[2]));
13352 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13353 ffebad_finish ();
13354 }
13355
13356 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13357 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13358 NULL, NULL, NULL, NULL);
13359
13360 ffelex_token_kill (ffeexpr_tokens_[0]);
13361 ffelex_token_kill (ffeexpr_tokens_[1]);
13362 ffelex_token_kill (ffeexpr_tokens_[2]);
13363 ffelex_token_kill (ffeexpr_tokens_[3]);
13364 return (ffelexHandler) ffeexpr_token_binary_ (t);
13365 }
13366
13367 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[2])[0],
13368 ffeexpr_tokens_[0], ffeexpr_tokens_[1], NULL,
13369 ffeexpr_tokens_[2], ffeexpr_tokens_[3], t);
13370
13371 ffelex_token_kill (ffeexpr_tokens_[0]);
13372 ffelex_token_kill (ffeexpr_tokens_[1]);
13373 ffelex_token_kill (ffeexpr_tokens_[2]);
13374 ffelex_token_kill (ffeexpr_tokens_[3]);
13375 return (ffelexHandler) ffeexpr_token_binary_;
13376 }
13377
13378 /* ffeexpr_token_number_real_exp_ -- Rhs NUMBER PERIOD NUMBER NAME(D, E, or Q)
13379
13380 Return a pointer to this function to the lexer (ffelex), which will
13381 invoke it for the next token.
13382
13383 Ensures this token is PLUS or MINUS, preserves it, goes to final state
13384 for real number (exponent digits). Else issues diagnostic, assumes a
13385 zero exponent field for number, passes token on to binary state as if
13386 previous token had been "E0" instead of "E", for example. */
13387
13388 static ffelexHandler
13389 ffeexpr_token_number_real_exp_ (ffelexToken t)
13390 {
13391 if ((ffelex_token_type (t) != FFELEX_typePLUS)
13392 && (ffelex_token_type (t) != FFELEX_typeMINUS))
13393 {
13394 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
13395 {
13396 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[3]),
13397 ffelex_token_where_column (ffeexpr_tokens_[3]));
13398 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13399 ffebad_finish ();
13400 }
13401
13402 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13403 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13404 ffeexpr_tokens_[2], NULL, NULL, NULL);
13405
13406 ffelex_token_kill (ffeexpr_tokens_[0]);
13407 ffelex_token_kill (ffeexpr_tokens_[1]);
13408 ffelex_token_kill (ffeexpr_tokens_[2]);
13409 ffelex_token_kill (ffeexpr_tokens_[3]);
13410 return (ffelexHandler) ffeexpr_token_binary_ (t);
13411 }
13412
13413 ffeexpr_tokens_[4] = ffelex_token_use (t);
13414 return (ffelexHandler) ffeexpr_token_num_real_exp_sn_;
13415 }
13416
13417 /* ffeexpr_token_num_real_exp_sn_ -- Rhs NUMBER PERIOD NUMBER NAME(D,E,Q)
13418 PLUS/MINUS
13419
13420 Return a pointer to this function to the lexer (ffelex), which will
13421 invoke it for the next token.
13422
13423 Make sure token is a NUMBER, make a real constant out of all we have and
13424 push it onto the expression stack. Else issue diagnostic and pretend
13425 exponent field was a zero. */
13426
13427 static ffelexHandler
13428 ffeexpr_token_num_real_exp_sn_ (ffelexToken t)
13429 {
13430 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
13431 {
13432 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE))
13433 {
13434 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[3]),
13435 ffelex_token_where_column (ffeexpr_tokens_[3]));
13436 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13437 ffebad_finish ();
13438 }
13439
13440 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
13441 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13442 ffeexpr_tokens_[2], NULL, NULL, NULL);
13443
13444 ffelex_token_kill (ffeexpr_tokens_[0]);
13445 ffelex_token_kill (ffeexpr_tokens_[1]);
13446 ffelex_token_kill (ffeexpr_tokens_[2]);
13447 ffelex_token_kill (ffeexpr_tokens_[3]);
13448 ffelex_token_kill (ffeexpr_tokens_[4]);
13449 return (ffelexHandler) ffeexpr_token_binary_ (t);
13450 }
13451
13452 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_[3])[0],
13453 ffeexpr_tokens_[0], ffeexpr_tokens_[1],
13454 ffeexpr_tokens_[2], ffeexpr_tokens_[3],
13455 ffeexpr_tokens_[4], t);
13456
13457 ffelex_token_kill (ffeexpr_tokens_[0]);
13458 ffelex_token_kill (ffeexpr_tokens_[1]);
13459 ffelex_token_kill (ffeexpr_tokens_[2]);
13460 ffelex_token_kill (ffeexpr_tokens_[3]);
13461 ffelex_token_kill (ffeexpr_tokens_[4]);
13462 return (ffelexHandler) ffeexpr_token_binary_;
13463 }
13464
13465 /* ffeexpr_token_binary_ -- Handle binary operator possibility
13466
13467 Return a pointer to this function to the lexer (ffelex), which will
13468 invoke it for the next token.
13469
13470 The possibility of a binary operator is handled here, meaning the previous
13471 token was an operand. */
13472
13473 static ffelexHandler
13474 ffeexpr_token_binary_ (ffelexToken t)
13475 {
13476 ffeexprExpr_ e;
13477
13478 if (!ffeexpr_stack_->is_rhs)
13479 return (ffelexHandler) ffeexpr_finished_ (t); /* For now. */
13480
13481 switch (ffelex_token_type (t))
13482 {
13483 case FFELEX_typePLUS:
13484 e = ffeexpr_expr_new_ ();
13485 e->type = FFEEXPR_exprtypeBINARY_;
13486 e->token = ffelex_token_use (t);
13487 e->u.operator.op = FFEEXPR_operatorADD_;
13488 e->u.operator.prec = FFEEXPR_operatorprecedenceADD_;
13489 e->u.operator.as = FFEEXPR_operatorassociativityADD_;
13490 ffeexpr_exprstack_push_binary_ (e);
13491 return (ffelexHandler) ffeexpr_token_rhs_;
13492
13493 case FFELEX_typeMINUS:
13494 e = ffeexpr_expr_new_ ();
13495 e->type = FFEEXPR_exprtypeBINARY_;
13496 e->token = ffelex_token_use (t);
13497 e->u.operator.op = FFEEXPR_operatorSUBTRACT_;
13498 e->u.operator.prec = FFEEXPR_operatorprecedenceSUBTRACT_;
13499 e->u.operator.as = FFEEXPR_operatorassociativitySUBTRACT_;
13500 ffeexpr_exprstack_push_binary_ (e);
13501 return (ffelexHandler) ffeexpr_token_rhs_;
13502
13503 case FFELEX_typeASTERISK:
13504 switch (ffeexpr_stack_->context)
13505 {
13506 case FFEEXPR_contextDATA:
13507 return (ffelexHandler) ffeexpr_finished_ (t);
13508
13509 default:
13510 break;
13511 }
13512 e = ffeexpr_expr_new_ ();
13513 e->type = FFEEXPR_exprtypeBINARY_;
13514 e->token = ffelex_token_use (t);
13515 e->u.operator.op = FFEEXPR_operatorMULTIPLY_;
13516 e->u.operator.prec = FFEEXPR_operatorprecedenceMULTIPLY_;
13517 e->u.operator.as = FFEEXPR_operatorassociativityMULTIPLY_;
13518 ffeexpr_exprstack_push_binary_ (e);
13519 return (ffelexHandler) ffeexpr_token_rhs_;
13520
13521 case FFELEX_typeSLASH:
13522 switch (ffeexpr_stack_->context)
13523 {
13524 case FFEEXPR_contextDATA:
13525 return (ffelexHandler) ffeexpr_finished_ (t);
13526
13527 default:
13528 break;
13529 }
13530 e = ffeexpr_expr_new_ ();
13531 e->type = FFEEXPR_exprtypeBINARY_;
13532 e->token = ffelex_token_use (t);
13533 e->u.operator.op = FFEEXPR_operatorDIVIDE_;
13534 e->u.operator.prec = FFEEXPR_operatorprecedenceDIVIDE_;
13535 e->u.operator.as = FFEEXPR_operatorassociativityDIVIDE_;
13536 ffeexpr_exprstack_push_binary_ (e);
13537 return (ffelexHandler) ffeexpr_token_rhs_;
13538
13539 case FFELEX_typePOWER:
13540 e = ffeexpr_expr_new_ ();
13541 e->type = FFEEXPR_exprtypeBINARY_;
13542 e->token = ffelex_token_use (t);
13543 e->u.operator.op = FFEEXPR_operatorPOWER_;
13544 e->u.operator.prec = FFEEXPR_operatorprecedencePOWER_;
13545 e->u.operator.as = FFEEXPR_operatorassociativityPOWER_;
13546 ffeexpr_exprstack_push_binary_ (e);
13547 return (ffelexHandler) ffeexpr_token_rhs_;
13548
13549 case FFELEX_typeCONCAT:
13550 e = ffeexpr_expr_new_ ();
13551 e->type = FFEEXPR_exprtypeBINARY_;
13552 e->token = ffelex_token_use (t);
13553 e->u.operator.op = FFEEXPR_operatorCONCATENATE_;
13554 e->u.operator.prec = FFEEXPR_operatorprecedenceCONCATENATE_;
13555 e->u.operator.as = FFEEXPR_operatorassociativityCONCATENATE_;
13556 ffeexpr_exprstack_push_binary_ (e);
13557 return (ffelexHandler) ffeexpr_token_rhs_;
13558
13559 case FFELEX_typeOPEN_ANGLE:
13560 switch (ffeexpr_stack_->context)
13561 {
13562 case FFEEXPR_contextFORMAT:
13563 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
13564 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13565 ffebad_finish ();
13566 break;
13567
13568 default:
13569 break;
13570 }
13571 e = ffeexpr_expr_new_ ();
13572 e->type = FFEEXPR_exprtypeBINARY_;
13573 e->token = ffelex_token_use (t);
13574 e->u.operator.op = FFEEXPR_operatorLT_;
13575 e->u.operator.prec = FFEEXPR_operatorprecedenceLT_;
13576 e->u.operator.as = FFEEXPR_operatorassociativityLT_;
13577 ffeexpr_exprstack_push_binary_ (e);
13578 return (ffelexHandler) ffeexpr_token_rhs_;
13579
13580 case FFELEX_typeCLOSE_ANGLE:
13581 switch (ffeexpr_stack_->context)
13582 {
13583 case FFEEXPR_contextFORMAT:
13584 return ffeexpr_finished_ (t);
13585
13586 default:
13587 break;
13588 }
13589 e = ffeexpr_expr_new_ ();
13590 e->type = FFEEXPR_exprtypeBINARY_;
13591 e->token = ffelex_token_use (t);
13592 e->u.operator.op = FFEEXPR_operatorGT_;
13593 e->u.operator.prec = FFEEXPR_operatorprecedenceGT_;
13594 e->u.operator.as = FFEEXPR_operatorassociativityGT_;
13595 ffeexpr_exprstack_push_binary_ (e);
13596 return (ffelexHandler) ffeexpr_token_rhs_;
13597
13598 case FFELEX_typeREL_EQ:
13599 switch (ffeexpr_stack_->context)
13600 {
13601 case FFEEXPR_contextFORMAT:
13602 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
13603 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13604 ffebad_finish ();
13605 break;
13606
13607 default:
13608 break;
13609 }
13610 e = ffeexpr_expr_new_ ();
13611 e->type = FFEEXPR_exprtypeBINARY_;
13612 e->token = ffelex_token_use (t);
13613 e->u.operator.op = FFEEXPR_operatorEQ_;
13614 e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
13615 e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
13616 ffeexpr_exprstack_push_binary_ (e);
13617 return (ffelexHandler) ffeexpr_token_rhs_;
13618
13619 case FFELEX_typeREL_NE:
13620 switch (ffeexpr_stack_->context)
13621 {
13622 case FFEEXPR_contextFORMAT:
13623 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
13624 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13625 ffebad_finish ();
13626 break;
13627
13628 default:
13629 break;
13630 }
13631 e = ffeexpr_expr_new_ ();
13632 e->type = FFEEXPR_exprtypeBINARY_;
13633 e->token = ffelex_token_use (t);
13634 e->u.operator.op = FFEEXPR_operatorNE_;
13635 e->u.operator.prec = FFEEXPR_operatorprecedenceNE_;
13636 e->u.operator.as = FFEEXPR_operatorassociativityNE_;
13637 ffeexpr_exprstack_push_binary_ (e);
13638 return (ffelexHandler) ffeexpr_token_rhs_;
13639
13640 case FFELEX_typeREL_LE:
13641 switch (ffeexpr_stack_->context)
13642 {
13643 case FFEEXPR_contextFORMAT:
13644 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
13645 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13646 ffebad_finish ();
13647 break;
13648
13649 default:
13650 break;
13651 }
13652 e = ffeexpr_expr_new_ ();
13653 e->type = FFEEXPR_exprtypeBINARY_;
13654 e->token = ffelex_token_use (t);
13655 e->u.operator.op = FFEEXPR_operatorLE_;
13656 e->u.operator.prec = FFEEXPR_operatorprecedenceLE_;
13657 e->u.operator.as = FFEEXPR_operatorassociativityLE_;
13658 ffeexpr_exprstack_push_binary_ (e);
13659 return (ffelexHandler) ffeexpr_token_rhs_;
13660
13661 case FFELEX_typeREL_GE:
13662 switch (ffeexpr_stack_->context)
13663 {
13664 case FFEEXPR_contextFORMAT:
13665 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN);
13666 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
13667 ffebad_finish ();
13668 break;
13669
13670 default:
13671 break;
13672 }
13673 e = ffeexpr_expr_new_ ();
13674 e->type = FFEEXPR_exprtypeBINARY_;
13675 e->token = ffelex_token_use (t);
13676 e->u.operator.op = FFEEXPR_operatorGE_;
13677 e->u.operator.prec = FFEEXPR_operatorprecedenceGE_;
13678 e->u.operator.as = FFEEXPR_operatorassociativityGE_;
13679 ffeexpr_exprstack_push_binary_ (e);
13680 return (ffelexHandler) ffeexpr_token_rhs_;
13681
13682 case FFELEX_typePERIOD:
13683 ffeexpr_tokens_[0] = ffelex_token_use (t);
13684 return (ffelexHandler) ffeexpr_token_binary_period_;
13685
13686 #if 0
13687 case FFELEX_typeOPEN_PAREN:
13688 case FFELEX_typeCLOSE_PAREN:
13689 case FFELEX_typeEQUALS:
13690 case FFELEX_typePOINTS:
13691 case FFELEX_typeCOMMA:
13692 case FFELEX_typeCOLON:
13693 case FFELEX_typeEOS:
13694 case FFELEX_typeSEMICOLON:
13695 case FFELEX_typeNAME:
13696 case FFELEX_typeNAMES:
13697 #endif
13698 default:
13699 return (ffelexHandler) ffeexpr_finished_ (t);
13700 }
13701 }
13702
13703 /* ffeexpr_token_binary_period_ -- Binary PERIOD
13704
13705 Return a pointer to this function to the lexer (ffelex), which will
13706 invoke it for the next token.
13707
13708 Handle a period detected at binary (expecting binary op or end) state.
13709 Must begin a dot-dot name, of which .NOT., .TRUE., and .FALSE. are not
13710 valid. */
13711
13712 static ffelexHandler
13713 ffeexpr_token_binary_period_ (ffelexToken t)
13714 {
13715 ffeexprExpr_ operand;
13716
13717 switch (ffelex_token_type (t))
13718 {
13719 case FFELEX_typeNAME:
13720 case FFELEX_typeNAMES:
13721 ffeexpr_current_dotdot_ = ffestr_other (t);
13722 switch (ffeexpr_current_dotdot_)
13723 {
13724 case FFESTR_otherTRUE:
13725 case FFESTR_otherFALSE:
13726 case FFESTR_otherNOT:
13727 if (ffest_ffebad_start (FFEBAD_MISSING_BINARY_OPERATOR))
13728 {
13729 operand = ffeexpr_stack_->exprstack;
13730 assert (operand != NULL);
13731 assert (operand->type == FFEEXPR_exprtypeOPERAND_);
13732 ffebad_here (0, ffelex_token_where_line (operand->token), ffelex_token_where_column (operand->token));
13733 ffebad_here (1, ffelex_token_where_line (t),
13734 ffelex_token_where_column (t));
13735 ffebad_finish ();
13736 }
13737 ffelex_token_kill (ffeexpr_tokens_[0]);
13738 return (ffelexHandler) ffeexpr_token_binary_sw_per_;
13739
13740 default:
13741 ffeexpr_tokens_[1] = ffelex_token_use (t);
13742 return (ffelexHandler) ffeexpr_token_binary_end_per_;
13743 }
13744 break; /* Nothing really reaches here. */
13745
13746 default:
13747 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD))
13748 {
13749 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
13750 ffelex_token_where_column (ffeexpr_tokens_[0]));
13751 ffebad_finish ();
13752 }
13753 ffelex_token_kill (ffeexpr_tokens_[0]);
13754 return (ffelexHandler) ffeexpr_token_binary_ (t);
13755 }
13756 }
13757
13758 /* ffeexpr_token_binary_end_per_ -- Binary PERIOD NAME(not NOT, TRUE, or FALSE)
13759
13760 Return a pointer to this function to the lexer (ffelex), which will
13761 invoke it for the next token.
13762
13763 Expecting a period to close a dot-dot at binary (binary op
13764 or operator) state. If period isn't found, issue a diagnostic but
13765 pretend we saw one. ffeexpr_current_dotdot_ must already contained the
13766 dotdot representation of the name in between the two PERIOD tokens. */
13767
13768 static ffelexHandler
13769 ffeexpr_token_binary_end_per_ (ffelexToken t)
13770 {
13771 ffeexprExpr_ e;
13772
13773 e = ffeexpr_expr_new_ ();
13774 e->type = FFEEXPR_exprtypeBINARY_;
13775 e->token = ffeexpr_tokens_[0];
13776
13777 switch (ffeexpr_current_dotdot_)
13778 {
13779 case FFESTR_otherAND:
13780 e->u.operator.op = FFEEXPR_operatorAND_;
13781 e->u.operator.prec = FFEEXPR_operatorprecedenceAND_;
13782 e->u.operator.as = FFEEXPR_operatorassociativityAND_;
13783 break;
13784
13785 case FFESTR_otherOR:
13786 e->u.operator.op = FFEEXPR_operatorOR_;
13787 e->u.operator.prec = FFEEXPR_operatorprecedenceOR_;
13788 e->u.operator.as = FFEEXPR_operatorassociativityOR_;
13789 break;
13790
13791 case FFESTR_otherXOR:
13792 e->u.operator.op = FFEEXPR_operatorXOR_;
13793 e->u.operator.prec = FFEEXPR_operatorprecedenceXOR_;
13794 e->u.operator.as = FFEEXPR_operatorassociativityXOR_;
13795 break;
13796
13797 case FFESTR_otherEQV:
13798 e->u.operator.op = FFEEXPR_operatorEQV_;
13799 e->u.operator.prec = FFEEXPR_operatorprecedenceEQV_;
13800 e->u.operator.as = FFEEXPR_operatorassociativityEQV_;
13801 break;
13802
13803 case FFESTR_otherNEQV:
13804 e->u.operator.op = FFEEXPR_operatorNEQV_;
13805 e->u.operator.prec = FFEEXPR_operatorprecedenceNEQV_;
13806 e->u.operator.as = FFEEXPR_operatorassociativityNEQV_;
13807 break;
13808
13809 case FFESTR_otherLT:
13810 e->u.operator.op = FFEEXPR_operatorLT_;
13811 e->u.operator.prec = FFEEXPR_operatorprecedenceLT_;
13812 e->u.operator.as = FFEEXPR_operatorassociativityLT_;
13813 break;
13814
13815 case FFESTR_otherLE:
13816 e->u.operator.op = FFEEXPR_operatorLE_;
13817 e->u.operator.prec = FFEEXPR_operatorprecedenceLE_;
13818 e->u.operator.as = FFEEXPR_operatorassociativityLE_;
13819 break;
13820
13821 case FFESTR_otherEQ:
13822 e->u.operator.op = FFEEXPR_operatorEQ_;
13823 e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
13824 e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
13825 break;
13826
13827 case FFESTR_otherNE:
13828 e->u.operator.op = FFEEXPR_operatorNE_;
13829 e->u.operator.prec = FFEEXPR_operatorprecedenceNE_;
13830 e->u.operator.as = FFEEXPR_operatorassociativityNE_;
13831 break;
13832
13833 case FFESTR_otherGT:
13834 e->u.operator.op = FFEEXPR_operatorGT_;
13835 e->u.operator.prec = FFEEXPR_operatorprecedenceGT_;
13836 e->u.operator.as = FFEEXPR_operatorassociativityGT_;
13837 break;
13838
13839 case FFESTR_otherGE:
13840 e->u.operator.op = FFEEXPR_operatorGE_;
13841 e->u.operator.prec = FFEEXPR_operatorprecedenceGE_;
13842 e->u.operator.as = FFEEXPR_operatorassociativityGE_;
13843 break;
13844
13845 default:
13846 if (ffest_ffebad_start (FFEBAD_INVALID_DOTDOT))
13847 {
13848 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
13849 ffelex_token_where_column (ffeexpr_tokens_[0]));
13850 ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
13851 ffebad_finish ();
13852 }
13853 e->u.operator.op = FFEEXPR_operatorEQ_;
13854 e->u.operator.prec = FFEEXPR_operatorprecedenceEQ_;
13855 e->u.operator.as = FFEEXPR_operatorassociativityEQ_;
13856 break;
13857 }
13858
13859 ffeexpr_exprstack_push_binary_ (e);
13860
13861 if (ffelex_token_type (t) != FFELEX_typePERIOD)
13862 {
13863 if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD))
13864 {
13865 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
13866 ffelex_token_where_column (ffeexpr_tokens_[0]));
13867 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13868 ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
13869 ffebad_finish ();
13870 }
13871 ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill dot-dot token. */
13872 return (ffelexHandler) ffeexpr_token_rhs_ (t);
13873 }
13874
13875 ffelex_token_kill (ffeexpr_tokens_[1]); /* Kill dot-dot token. */
13876 return (ffelexHandler) ffeexpr_token_rhs_;
13877 }
13878
13879 /* ffeexpr_token_binary_sw_per_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
13880
13881 Return a pointer to this function to the lexer (ffelex), which will
13882 invoke it for the next token.
13883
13884 A diagnostic has already been issued; just swallow a period if there is
13885 one, then continue with ffeexpr_token_binary_. */
13886
13887 static ffelexHandler
13888 ffeexpr_token_binary_sw_per_ (ffelexToken t)
13889 {
13890 if (ffelex_token_type (t) != FFELEX_typePERIOD)
13891 return (ffelexHandler) ffeexpr_token_binary_ (t);
13892
13893 return (ffelexHandler) ffeexpr_token_binary_;
13894 }
13895
13896 /* ffeexpr_token_quote_ -- Rhs QUOTE
13897
13898 Return a pointer to this function to the lexer (ffelex), which will
13899 invoke it for the next token.
13900
13901 Expecting a NUMBER that we'll treat as an octal integer. */
13902
13903 static ffelexHandler
13904 ffeexpr_token_quote_ (ffelexToken t)
13905 {
13906 ffeexprExpr_ e;
13907 ffebld anyexpr;
13908
13909 if (ffelex_token_type (t) != FFELEX_typeNUMBER)
13910 {
13911 if (ffest_ffebad_start (FFEBAD_QUOTE_MISSES_DIGITS))
13912 {
13913 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
13914 ffelex_token_where_column (ffeexpr_tokens_[0]));
13915 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
13916 ffebad_finish ();
13917 }
13918 ffelex_token_kill (ffeexpr_tokens_[0]);
13919 return (ffelexHandler) ffeexpr_token_rhs_ (t);
13920 }
13921
13922 /* This is kind of a kludge to prevent any whining about magical numbers
13923 that start out as these octal integers, so "20000000000 (on a 32-bit
13924 2's-complement machine) by itself won't produce an error. */
13925
13926 anyexpr = ffebld_new_any ();
13927 ffebld_set_info (anyexpr, ffeinfo_new_any ());
13928
13929 e = ffeexpr_expr_new_ ();
13930 e->type = FFEEXPR_exprtypeOPERAND_;
13931 e->token = ffeexpr_tokens_[0];
13932 e->u.operand = ffebld_new_conter_with_orig
13933 (ffebld_constant_new_integeroctal (t), anyexpr);
13934 ffebld_set_info (e->u.operand, ffeinfo_new (FFEINFO_basictypeINTEGER,
13935 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFEINFO_kindENTITY,
13936 FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
13937 ffeexpr_exprstack_push_operand_ (e);
13938 return (ffelexHandler) ffeexpr_token_binary_;
13939 }
13940
13941 /* ffeexpr_token_apostrophe_ -- Rhs APOSTROPHE
13942
13943 Return a pointer to this function to the lexer (ffelex), which will
13944 invoke it for the next token.
13945
13946 Handle an open-apostrophe, which begins either a character ('char-const'),
13947 typeless octal ('octal-const'O), or typeless hexadecimal ('hex-const'Z or
13948 'hex-const'X) constant. */
13949
13950 static ffelexHandler
13951 ffeexpr_token_apostrophe_ (ffelexToken t)
13952 {
13953 assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
13954 if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t) == 0))
13955 {
13956 ffebad_start (FFEBAD_NULL_CHAR_CONST);
13957 ffebad_here (0, ffelex_token_where_line (t),
13958 ffelex_token_where_column (t));
13959 ffebad_finish ();
13960 }
13961 ffeexpr_tokens_[1] = ffelex_token_use (t);
13962 return (ffelexHandler) ffeexpr_token_apos_char_;
13963 }
13964
13965 /* ffeexpr_token_apos_char_ -- Rhs APOSTROPHE CHARACTER
13966
13967 Return a pointer to this function to the lexer (ffelex), which will
13968 invoke it for the next token.
13969
13970 Close-apostrophe is implicit; if this token is NAME, it is a possible
13971 typeless-constant radix specifier. */
13972
13973 static ffelexHandler
13974 ffeexpr_token_apos_char_ (ffelexToken t)
13975 {
13976 ffeexprExpr_ e;
13977 ffeinfo ni;
13978 char c;
13979 ffetargetCharacterSize size;
13980
13981 if ((ffelex_token_type (t) == FFELEX_typeNAME)
13982 || (ffelex_token_type (t) == FFELEX_typeNAMES))
13983 {
13984 if ((ffelex_token_length (t) == 1)
13985 && (ffesrc_char_match_init ((c = ffelex_token_text (t)[0]), 'B',
13986 'b')
13987 || ffesrc_char_match_init (c, 'O', 'o')
13988 || ffesrc_char_match_init (c, 'X', 'x')
13989 || ffesrc_char_match_init (c, 'Z', 'z')))
13990 {
13991 e = ffeexpr_expr_new_ ();
13992 e->type = FFEEXPR_exprtypeOPERAND_;
13993 e->token = ffeexpr_tokens_[0];
13994 switch (c)
13995 {
13996 case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b, no_match):
13997 e->u.operand = ffebld_new_conter
13998 (ffebld_constant_new_typeless_bv (ffeexpr_tokens_[1]));
13999 size = ffetarget_size_typeless_binary (ffeexpr_tokens_[1]);
14000 break;
14001
14002 case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o, no_match):
14003 e->u.operand = ffebld_new_conter
14004 (ffebld_constant_new_typeless_ov (ffeexpr_tokens_[1]));
14005 size = ffetarget_size_typeless_octal (ffeexpr_tokens_[1]);
14006 break;
14007
14008 case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x, no_match):
14009 e->u.operand = ffebld_new_conter
14010 (ffebld_constant_new_typeless_hxv (ffeexpr_tokens_[1]));
14011 size = ffetarget_size_typeless_hex (ffeexpr_tokens_[1]);
14012 break;
14013
14014 case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z, no_match):
14015 e->u.operand = ffebld_new_conter
14016 (ffebld_constant_new_typeless_hzv (ffeexpr_tokens_[1]));
14017 size = ffetarget_size_typeless_hex (ffeexpr_tokens_[1]);
14018 break;
14019
14020 default:
14021 no_match: /* :::::::::::::::::::: */
14022 assert ("not BOXZ!" == NULL);
14023 size = 0;
14024 break;
14025 }
14026 ffebld_set_info (e->u.operand,
14027 ffeinfo_new (FFEINFO_basictypeTYPELESS, FFEINFO_kindtypeNONE,
14028 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, size));
14029 ffeexpr_exprstack_push_operand_ (e);
14030 ffelex_token_kill (ffeexpr_tokens_[1]);
14031 return (ffelexHandler) ffeexpr_token_binary_;
14032 }
14033 }
14034 e = ffeexpr_expr_new_ ();
14035 e->type = FFEEXPR_exprtypeOPERAND_;
14036 e->token = ffeexpr_tokens_[0];
14037 e->u.operand = ffebld_new_conter (ffebld_constant_new_characterdefault
14038 (ffeexpr_tokens_[1]));
14039 ni = ffeinfo_new (FFEINFO_basictypeCHARACTER, FFEINFO_kindtypeCHARACTERDEFAULT,
14040 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
14041 ffelex_token_length (ffeexpr_tokens_[1]));
14042 ffebld_set_info (e->u.operand, ni);
14043 ffelex_token_kill (ffeexpr_tokens_[1]);
14044 ffeexpr_exprstack_push_operand_ (e);
14045 if ((ffelex_token_type (t) == FFELEX_typeNAME)
14046 || (ffelex_token_type (t) == FFELEX_typeNAMES))
14047 {
14048 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
14049 {
14050 ffebad_string (ffelex_token_text (t));
14051 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
14052 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_[0]),
14053 ffelex_token_where_column (ffeexpr_tokens_[0]));
14054 ffebad_finish ();
14055 }
14056 e = ffeexpr_expr_new_ ();
14057 e->type = FFEEXPR_exprtypeBINARY_;
14058 e->token = ffelex_token_use (t);
14059 e->u.operator.op = FFEEXPR_operatorCONCATENATE_;
14060 e->u.operator.prec = FFEEXPR_operatorprecedenceCONCATENATE_;
14061 e->u.operator.as = FFEEXPR_operatorassociativityCONCATENATE_;
14062 ffeexpr_exprstack_push_binary_ (e);
14063 return (ffelexHandler) ffeexpr_token_rhs_ (t);
14064 }
14065 ffeexpr_is_substr_ok_ = !ffe_is_pedantic_not_90 (); /* Allow "'hello'(3:5)". */
14066 return (ffelexHandler) ffeexpr_token_substrp_ (t);
14067 }
14068
14069 /* ffeexpr_token_name_lhs_ -- Lhs NAME
14070
14071 Return a pointer to this function to the lexer (ffelex), which will
14072 invoke it for the next token.
14073
14074 Handle a name followed by open-paren, period (RECORD.MEMBER), percent
14075 (RECORD%MEMBER), or nothing at all. */
14076
14077 static ffelexHandler
14078 ffeexpr_token_name_lhs_ (ffelexToken t)
14079 {
14080 ffeexprExpr_ e;
14081 ffeexprParenType_ paren_type;
14082 ffesymbol s;
14083 ffebld expr;
14084 ffeinfo info;
14085
14086 switch (ffelex_token_type (t))
14087 {
14088 case FFELEX_typeOPEN_PAREN:
14089 switch (ffeexpr_stack_->context)
14090 {
14091 case FFEEXPR_contextASSIGN:
14092 case FFEEXPR_contextAGOTO:
14093 case FFEEXPR_contextFILEUNIT_DF:
14094 goto just_name; /* :::::::::::::::::::: */
14095
14096 default:
14097 break;
14098 }
14099 e = ffeexpr_expr_new_ ();
14100 e->type = FFEEXPR_exprtypeOPERAND_;
14101 e->token = ffelex_token_use (ffeexpr_tokens_[0]);
14102 s = ffeexpr_declare_parenthesized_ (ffeexpr_tokens_[0], FALSE,
14103 &paren_type);
14104
14105 switch (ffesymbol_where (s))
14106 {
14107 case FFEINFO_whereLOCAL:
14108 if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
14109 ffesymbol_error (s, ffeexpr_tokens_[0]); /* Recursion. */
14110 break;
14111
14112 case FFEINFO_whereINTRINSIC:
14113 case FFEINFO_whereGLOBAL:
14114 if (ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
14115 ffesymbol_error (s, ffeexpr_tokens_[0]); /* Can call intrin. */
14116 break;
14117
14118 case FFEINFO_whereCOMMON:
14119 case FFEINFO_whereDUMMY:
14120 case FFEINFO_whereRESULT:
14121 break;
14122
14123 case FFEINFO_whereNONE:
14124 case FFEINFO_whereANY:
14125 break;
14126
14127 default:
14128 ffesymbol_error (s, ffeexpr_tokens_[0]);
14129 break;
14130 }
14131
14132 if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
14133 {
14134 e->u.operand = ffebld_new_any ();
14135 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
14136 }
14137 else
14138 {
14139 e->u.operand = ffebld_new_symter (s,
14140 ffesymbol_generic (s),
14141 ffesymbol_specific (s),
14142 ffesymbol_implementation (s));
14143 ffebld_set_info (e->u.operand, ffesymbol_info (s));
14144 }
14145 ffeexpr_exprstack_push_ (e); /* Not a complete operand yet. */
14146 ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
14147 switch (paren_type)
14148 {
14149 case FFEEXPR_parentypeSUBROUTINE_:
14150 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
14151 return
14152 (ffelexHandler)
14153 ffeexpr_rhs (ffeexpr_stack_->pool,
14154 FFEEXPR_contextACTUALARG_,
14155 ffeexpr_token_arguments_);
14156
14157 case FFEEXPR_parentypeARRAY_:
14158 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
14159 ffeexpr_stack_->bound_list = ffesymbol_dims (s);
14160 ffeexpr_stack_->rank = 0;
14161 ffeexpr_stack_->constant = TRUE;
14162 ffeexpr_stack_->immediate = TRUE;
14163 switch (ffeexpr_stack_->context)
14164 {
14165 case FFEEXPR_contextDATAIMPDOITEM_:
14166 return
14167 (ffelexHandler)
14168 ffeexpr_rhs (ffeexpr_stack_->pool,
14169 FFEEXPR_contextDATAIMPDOINDEX_,
14170 ffeexpr_token_elements_);
14171
14172 case FFEEXPR_contextEQUIVALENCE:
14173 return
14174 (ffelexHandler)
14175 ffeexpr_rhs (ffeexpr_stack_->pool,
14176 FFEEXPR_contextEQVINDEX_,
14177 ffeexpr_token_elements_);
14178
14179 default:
14180 return
14181 (ffelexHandler)
14182 ffeexpr_rhs (ffeexpr_stack_->pool,
14183 FFEEXPR_contextINDEX_,
14184 ffeexpr_token_elements_);
14185 }
14186
14187 case FFEEXPR_parentypeSUBSTRING_:
14188 e->u.operand = ffeexpr_collapse_symter (e->u.operand,
14189 ffeexpr_tokens_[0]);
14190 return
14191 (ffelexHandler)
14192 ffeexpr_rhs (ffeexpr_stack_->pool,
14193 FFEEXPR_contextINDEX_,
14194 ffeexpr_token_substring_);
14195
14196 case FFEEXPR_parentypeEQUIVALENCE_:
14197 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
14198 ffeexpr_stack_->bound_list = ffesymbol_dims (s);
14199 ffeexpr_stack_->rank = 0;
14200 ffeexpr_stack_->constant = TRUE;
14201 ffeexpr_stack_->immediate = TRUE;
14202 return
14203 (ffelexHandler)
14204 ffeexpr_rhs (ffeexpr_stack_->pool,
14205 FFEEXPR_contextEQVINDEX_,
14206 ffeexpr_token_equivalence_);
14207
14208 case FFEEXPR_parentypeFUNCTION_: /* Invalid case. */
14209 case FFEEXPR_parentypeFUNSUBSTR_: /* Invalid case. */
14210 ffesymbol_error (s, ffeexpr_tokens_[0]);
14211 /* Fall through. */
14212 case FFEEXPR_parentypeANY_:
14213 e->u.operand = ffebld_new_any ();
14214 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
14215 return
14216 (ffelexHandler)
14217 ffeexpr_rhs (ffeexpr_stack_->pool,
14218 FFEEXPR_contextACTUALARG_,
14219 ffeexpr_token_anything_);
14220
14221 default:
14222 assert ("bad paren type" == NULL);
14223 break;
14224 }
14225
14226 case FFELEX_typeEQUALS: /* As in "VAR=". */
14227 switch (ffeexpr_stack_->context)
14228 {
14229 case FFEEXPR_contextIMPDOITEM_: /* within
14230 "(,VAR=start,end[,incr])". */
14231 case FFEEXPR_contextIMPDOITEMDF_:
14232 ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
14233 break;
14234
14235 case FFEEXPR_contextDATAIMPDOITEM_:
14236 ffeexpr_stack_->context = FFEEXPR_contextDATAIMPDOCTRL_;
14237 break;
14238
14239 default:
14240 break;
14241 }
14242 break;
14243
14244 #if 0
14245 case FFELEX_typePERIOD:
14246 case FFELEX_typePERCENT:
14247 assert ("FOO%, FOO. not yet supported!~~" == NULL);
14248 break;
14249 #endif
14250
14251 default:
14252 break;
14253 }
14254
14255 just_name: /* :::::::::::::::::::: */
14256 e = ffeexpr_expr_new_ ();
14257 e->type = FFEEXPR_exprtypeOPERAND_;
14258 e->token = ffeexpr_tokens_[0];
14259 s = ffeexpr_declare_unadorned_ (ffeexpr_tokens_[0],
14260 (ffeexpr_stack_->context
14261 == FFEEXPR_contextSUBROUTINEREF));
14262
14263 switch (ffesymbol_where (s))
14264 {
14265 case FFEINFO_whereCONSTANT:
14266 if ((ffeexpr_stack_->context != FFEEXPR_contextPARAMETER)
14267 || (ffesymbol_kind (s) != FFEINFO_kindENTITY))
14268 ffesymbol_error (s, ffeexpr_tokens_[0]);
14269 break;
14270
14271 case FFEINFO_whereIMMEDIATE:
14272 if ((ffeexpr_stack_->context != FFEEXPR_contextDATAIMPDOCTRL_)
14273 && (ffeexpr_stack_->context != FFEEXPR_contextDATAIMPDOINDEX_))
14274 ffesymbol_error (s, ffeexpr_tokens_[0]);
14275 break;
14276
14277 case FFEINFO_whereLOCAL:
14278 if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
14279 ffesymbol_error (s, ffeexpr_tokens_[0]); /* Recurse!. */
14280 break;
14281
14282 case FFEINFO_whereINTRINSIC:
14283 if (ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
14284 ffesymbol_error (s, ffeexpr_tokens_[0]); /* Can call intrin. */
14285 break;
14286
14287 default:
14288 break;
14289 }
14290
14291 if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
14292 {
14293 expr = ffebld_new_any ();
14294 info = ffeinfo_new_any ();
14295 ffebld_set_info (expr, info);
14296 }
14297 else
14298 {
14299 expr = ffebld_new_symter (s,
14300 ffesymbol_generic (s),
14301 ffesymbol_specific (s),
14302 ffesymbol_implementation (s));
14303 info = ffesymbol_info (s);
14304 ffebld_set_info (expr, info);
14305 if (ffesymbol_is_doiter (s))
14306 {
14307 ffebad_start (FFEBAD_DOITER);
14308 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14309 ffelex_token_where_column (ffeexpr_tokens_[0]));
14310 ffest_ffebad_here_doiter (1, s);
14311 ffebad_string (ffesymbol_text (s));
14312 ffebad_finish ();
14313 }
14314 expr = ffeexpr_collapse_symter (expr, ffeexpr_tokens_[0]);
14315 }
14316
14317 if (ffeexpr_stack_->context == FFEEXPR_contextSUBROUTINEREF)
14318 {
14319 if (ffebld_op (expr) == FFEBLD_opANY)
14320 {
14321 expr = ffebld_new_any ();
14322 ffebld_set_info (expr, ffeinfo_new_any ());
14323 }
14324 else
14325 {
14326 expr = ffebld_new_subrref (expr, NULL); /* No argument list. */
14327 if (ffesymbol_generic (s) != FFEINTRIN_genNONE)
14328 ffeintrin_fulfill_generic (&expr, &info, e->token);
14329 else if (ffesymbol_specific (s) != FFEINTRIN_specNONE)
14330 ffeintrin_fulfill_specific (&expr, &info, NULL, e->token);
14331 else
14332 ffeexpr_fulfill_call_ (&expr, e->token);
14333
14334 if (ffebld_op (expr) != FFEBLD_opANY)
14335 ffebld_set_info (expr,
14336 ffeinfo_new (ffeinfo_basictype (info),
14337 ffeinfo_kindtype (info),
14338 0,
14339 FFEINFO_kindENTITY,
14340 FFEINFO_whereFLEETING,
14341 ffeinfo_size (info)));
14342 else
14343 ffebld_set_info (expr, ffeinfo_new_any ());
14344 }
14345 }
14346
14347 e->u.operand = expr;
14348 ffeexpr_exprstack_push_operand_ (e);
14349 return (ffelexHandler) ffeexpr_finished_ (t);
14350 }
14351
14352 /* ffeexpr_token_name_arg_ -- Rhs NAME
14353
14354 Return a pointer to this function to the lexer (ffelex), which will
14355 invoke it for the next token.
14356
14357 Handle first token in an actual-arg (or possible actual-arg) context
14358 being a NAME, and use second token to refine the context. */
14359
14360 static ffelexHandler
14361 ffeexpr_token_name_arg_ (ffelexToken t)
14362 {
14363 switch (ffelex_token_type (t))
14364 {
14365 case FFELEX_typeCLOSE_PAREN:
14366 case FFELEX_typeCOMMA:
14367 switch (ffeexpr_stack_->context)
14368 {
14369 case FFEEXPR_contextINDEXORACTUALARG_:
14370 ffeexpr_stack_->context = FFEEXPR_contextACTUALARG_;
14371 break;
14372
14373 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
14374 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARG_;
14375 break;
14376
14377 default:
14378 break;
14379 }
14380 break;
14381
14382 default:
14383 switch (ffeexpr_stack_->context)
14384 {
14385 case FFEEXPR_contextACTUALARG_:
14386 ffeexpr_stack_->context = FFEEXPR_contextACTUALARGEXPR_;
14387 break;
14388
14389 case FFEEXPR_contextINDEXORACTUALARG_:
14390 ffeexpr_stack_->context = FFEEXPR_contextINDEXORACTUALARGEXPR_;
14391 break;
14392
14393 case FFEEXPR_contextSFUNCDEFACTUALARG_:
14394 ffeexpr_stack_->context = FFEEXPR_contextSFUNCDEFACTUALARGEXPR_;
14395 break;
14396
14397 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
14398 ffeexpr_stack_->context
14399 = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_;
14400 break;
14401
14402 default:
14403 assert ("bad context in _name_arg_" == NULL);
14404 break;
14405 }
14406 break;
14407 }
14408
14409 return (ffelexHandler) ffeexpr_token_name_rhs_ (t);
14410 }
14411
14412 /* ffeexpr_token_name_rhs_ -- Rhs NAME
14413
14414 Return a pointer to this function to the lexer (ffelex), which will
14415 invoke it for the next token.
14416
14417 Handle a name followed by open-paren, apostrophe (O'octal-const',
14418 Z'hex-const', or X'hex-const'), period (RECORD.MEMBER).
14419
14420 26-Nov-91 JCB 1.2
14421 When followed by apostrophe or quote, set lex hexnum flag on so
14422 [0-9] as first char of next token seen as starting a potentially
14423 hex number (NAME).
14424 04-Oct-91 JCB 1.1
14425 In case of intrinsic, decorate its SYMTER with the type info for
14426 the specific intrinsic. */
14427
14428 static ffelexHandler
14429 ffeexpr_token_name_rhs_ (ffelexToken t)
14430 {
14431 ffeexprExpr_ e;
14432 ffeexprParenType_ paren_type;
14433 ffesymbol s;
14434 bool sfdef;
14435
14436 switch (ffelex_token_type (t))
14437 {
14438 case FFELEX_typeQUOTE:
14439 case FFELEX_typeAPOSTROPHE:
14440 ffeexpr_tokens_[1] = ffelex_token_use (t);
14441 ffelex_set_hexnum (TRUE);
14442 return (ffelexHandler) ffeexpr_token_name_apos_;
14443
14444 case FFELEX_typeOPEN_PAREN:
14445 e = ffeexpr_expr_new_ ();
14446 e->type = FFEEXPR_exprtypeOPERAND_;
14447 e->token = ffelex_token_use (ffeexpr_tokens_[0]);
14448 s = ffeexpr_declare_parenthesized_ (ffeexpr_tokens_[0], TRUE,
14449 &paren_type);
14450 if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
14451 e->u.operand = ffebld_new_any ();
14452 else
14453 e->u.operand = ffebld_new_symter (s, ffesymbol_generic (s),
14454 ffesymbol_specific (s),
14455 ffesymbol_implementation (s));
14456 ffeexpr_exprstack_push_ (e); /* Not a complete operand yet. */
14457 ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
14458 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
14459 {
14460 case FFEEXPR_contextSFUNCDEF:
14461 case FFEEXPR_contextSFUNCDEFINDEX_:
14462 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
14463 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
14464 sfdef = TRUE;
14465 break;
14466
14467 case FFEEXPR_contextSFUNCDEFACTUALARG_:
14468 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
14469 assert ("weird context!" == NULL);
14470 sfdef = FALSE;
14471 break;
14472
14473 default:
14474 sfdef = FALSE;
14475 break;
14476 }
14477 switch (paren_type)
14478 {
14479 case FFEEXPR_parentypeFUNCTION_:
14480 ffebld_set_info (e->u.operand, ffesymbol_info (s));
14481 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
14482 if (ffesymbol_where (s) == FFEINFO_whereCONSTANT)
14483 { /* A statement function. */
14484 ffeexpr_stack_->num_args
14485 = ffebld_list_length
14486 (ffeexpr_stack_->next_dummy
14487 = ffesymbol_dummyargs (s));
14488 ffeexpr_stack_->tokens[1] = NULL; /* !=NULL when > num_args. */
14489 }
14490 else if ((ffesymbol_where (s) == FFEINFO_whereINTRINSIC)
14491 && !ffe_is_pedantic_not_90 ()
14492 && ((ffesymbol_implementation (s)
14493 == FFEINTRIN_impICHAR)
14494 || (ffesymbol_implementation (s)
14495 == FFEINTRIN_impIACHAR)
14496 || (ffesymbol_implementation (s)
14497 == FFEINTRIN_impLEN)))
14498 { /* Allow arbitrary concatenations. */
14499 return
14500 (ffelexHandler)
14501 ffeexpr_rhs (ffeexpr_stack_->pool,
14502 sfdef
14503 ? FFEEXPR_contextSFUNCDEF
14504 : FFEEXPR_contextLET,
14505 ffeexpr_token_arguments_);
14506 }
14507 return
14508 (ffelexHandler)
14509 ffeexpr_rhs (ffeexpr_stack_->pool,
14510 sfdef
14511 ? FFEEXPR_contextSFUNCDEFACTUALARG_
14512 : FFEEXPR_contextACTUALARG_,
14513 ffeexpr_token_arguments_);
14514
14515 case FFEEXPR_parentypeARRAY_:
14516 ffebld_set_info (e->u.operand,
14517 ffesymbol_info (ffebld_symter (e->u.operand)));
14518 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
14519 ffeexpr_stack_->bound_list = ffesymbol_dims (s);
14520 ffeexpr_stack_->rank = 0;
14521 ffeexpr_stack_->constant = TRUE;
14522 ffeexpr_stack_->immediate = TRUE;
14523 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
14524 sfdef
14525 ? FFEEXPR_contextSFUNCDEFINDEX_
14526 : FFEEXPR_contextINDEX_,
14527 ffeexpr_token_elements_);
14528
14529 case FFEEXPR_parentypeSUBSTRING_:
14530 ffebld_set_info (e->u.operand,
14531 ffesymbol_info (ffebld_symter (e->u.operand)));
14532 e->u.operand = ffeexpr_collapse_symter (e->u.operand,
14533 ffeexpr_tokens_[0]);
14534 return
14535 (ffelexHandler)
14536 ffeexpr_rhs (ffeexpr_stack_->pool,
14537 sfdef
14538 ? FFEEXPR_contextSFUNCDEFINDEX_
14539 : FFEEXPR_contextINDEX_,
14540 ffeexpr_token_substring_);
14541
14542 case FFEEXPR_parentypeFUNSUBSTR_:
14543 return
14544 (ffelexHandler)
14545 ffeexpr_rhs (ffeexpr_stack_->pool,
14546 sfdef
14547 ? FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
14548 : FFEEXPR_contextINDEXORACTUALARG_,
14549 ffeexpr_token_funsubstr_);
14550
14551 case FFEEXPR_parentypeANY_:
14552 ffebld_set_info (e->u.operand, ffesymbol_info (s));
14553 return
14554 (ffelexHandler)
14555 ffeexpr_rhs (ffeexpr_stack_->pool,
14556 sfdef
14557 ? FFEEXPR_contextSFUNCDEFACTUALARG_
14558 : FFEEXPR_contextACTUALARG_,
14559 ffeexpr_token_anything_);
14560
14561 default:
14562 assert ("bad paren type" == NULL);
14563 break;
14564 }
14565
14566 case FFELEX_typeEQUALS: /* As in "VAR=". */
14567 switch (ffeexpr_stack_->context)
14568 {
14569 case FFEEXPR_contextIMPDOITEM_: /* "(,VAR=start,end[,incr])". */
14570 case FFEEXPR_contextIMPDOITEMDF_:
14571 ffeexpr_stack_->is_rhs = FALSE; /* Really an lhs construct. */
14572 ffeexpr_stack_->context = FFEEXPR_contextIMPDOCTRL_;
14573 break;
14574
14575 default:
14576 break;
14577 }
14578 break;
14579
14580 #if 0
14581 case FFELEX_typePERIOD:
14582 case FFELEX_typePERCENT:
14583 ~~Support these two someday, though not required
14584 assert ("FOO%, FOO. not yet supported!~~" == NULL);
14585 break;
14586 #endif
14587
14588 default:
14589 break;
14590 }
14591
14592 switch (ffeexpr_stack_->context)
14593 {
14594 case FFEEXPR_contextINDEXORACTUALARG_:
14595 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
14596 assert ("strange context" == NULL);
14597 break;
14598
14599 default:
14600 break;
14601 }
14602
14603 e = ffeexpr_expr_new_ ();
14604 e->type = FFEEXPR_exprtypeOPERAND_;
14605 e->token = ffeexpr_tokens_[0];
14606 s = ffeexpr_declare_unadorned_ (ffeexpr_tokens_[0], FALSE);
14607 if (ffesymbol_attrs (s) & FFESYMBOL_attrsANY)
14608 {
14609 e->u.operand = ffebld_new_any ();
14610 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
14611 }
14612 else
14613 {
14614 e->u.operand = ffebld_new_symter (s, FFEINTRIN_genNONE,
14615 ffesymbol_specific (s),
14616 ffesymbol_implementation (s));
14617 if (ffesymbol_specific (s) == FFEINTRIN_specNONE)
14618 ffebld_set_info (e->u.operand, ffeinfo_use (ffesymbol_info (s)));
14619 else
14620 { /* Decorate the SYMTER with the actual type
14621 of the intrinsic. */
14622 ffebld_set_info (e->u.operand, ffeinfo_new
14623 (ffeintrin_basictype (ffesymbol_specific (s)),
14624 ffeintrin_kindtype (ffesymbol_specific (s)),
14625 0,
14626 ffesymbol_kind (s),
14627 ffesymbol_where (s),
14628 FFETARGET_charactersizeNONE));
14629 }
14630 if (ffesymbol_is_doiter (s))
14631 ffebld_symter_set_is_doiter (e->u.operand, TRUE);
14632 e->u.operand = ffeexpr_collapse_symter (e->u.operand,
14633 ffeexpr_tokens_[0]);
14634 }
14635 ffeexpr_exprstack_push_operand_ (e);
14636 return (ffelexHandler) ffeexpr_token_binary_ (t);
14637 }
14638
14639 /* ffeexpr_token_name_apos_ -- Rhs NAME APOSTROPHE
14640
14641 Return a pointer to this function to the lexer (ffelex), which will
14642 invoke it for the next token.
14643
14644 Expecting a NAME token, analyze the previous NAME token to see what kind,
14645 if any, typeless constant we've got.
14646
14647 01-Sep-90 JCB 1.1
14648 Expect a NAME instead of CHARACTER in this situation. */
14649
14650 static ffelexHandler
14651 ffeexpr_token_name_apos_ (ffelexToken t)
14652 {
14653 ffeexprExpr_ e;
14654
14655 ffelex_set_hexnum (FALSE);
14656
14657 switch (ffelex_token_type (t))
14658 {
14659 case FFELEX_typeNAME:
14660 ffeexpr_tokens_[2] = ffelex_token_use (t);
14661 return (ffelexHandler) ffeexpr_token_name_apos_name_;
14662
14663 default:
14664 break;
14665 }
14666
14667 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
14668 {
14669 ffebad_string (ffelex_token_text (ffeexpr_tokens_[0]));
14670 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14671 ffelex_token_where_column (ffeexpr_tokens_[0]));
14672 ffebad_here (1, ffelex_token_where_line (t),
14673 ffelex_token_where_column (t));
14674 ffebad_finish ();
14675 }
14676
14677 ffelex_token_kill (ffeexpr_tokens_[1]);
14678
14679 e = ffeexpr_expr_new_ ();
14680 e->type = FFEEXPR_exprtypeOPERAND_;
14681 e->u.operand = ffebld_new_any ();
14682 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
14683 e->token = ffeexpr_tokens_[0];
14684 ffeexpr_exprstack_push_operand_ (e);
14685
14686 return (ffelexHandler) ffeexpr_token_binary_ (t);
14687 }
14688
14689 /* ffeexpr_token_name_apos_name_ -- Rhs NAME APOSTROPHE NAME
14690
14691 Return a pointer to this function to the lexer (ffelex), which will
14692 invoke it for the next token.
14693
14694 Expecting an APOSTROPHE token, analyze the previous NAME token to see
14695 what kind, if any, typeless constant we've got. */
14696
14697 static ffelexHandler
14698 ffeexpr_token_name_apos_name_ (ffelexToken t)
14699 {
14700 ffeexprExpr_ e;
14701 char c;
14702
14703 e = ffeexpr_expr_new_ ();
14704 e->type = FFEEXPR_exprtypeOPERAND_;
14705 e->token = ffeexpr_tokens_[0];
14706
14707 if ((ffelex_token_type (t) == ffelex_token_type (ffeexpr_tokens_[1]))
14708 && (ffelex_token_length (ffeexpr_tokens_[0]) == 1)
14709 && (ffesrc_char_match_init ((c = ffelex_token_text (ffeexpr_tokens_[0])[0]),
14710 'B', 'b')
14711 || ffesrc_char_match_init (c, 'O', 'o')
14712 || ffesrc_char_match_init (c, 'X', 'x')
14713 || ffesrc_char_match_init (c, 'Z', 'z')))
14714 {
14715 ffetargetCharacterSize size;
14716
14717 if (!ffe_is_typeless_boz ()) {
14718
14719 switch (c)
14720 {
14721 case FFESRC_CASE_MATCH_INIT ('B', 'b', imatch_b, no_imatch):
14722 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerbinary
14723 (ffeexpr_tokens_[2]));
14724 break;
14725
14726 case FFESRC_CASE_MATCH_INIT ('O', 'o', imatch_o, no_imatch):
14727 e->u.operand = ffebld_new_conter (ffebld_constant_new_integeroctal
14728 (ffeexpr_tokens_[2]));
14729 break;
14730
14731 case FFESRC_CASE_MATCH_INIT ('X', 'x', imatch_x, no_imatch):
14732 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerhex
14733 (ffeexpr_tokens_[2]));
14734 break;
14735
14736 case FFESRC_CASE_MATCH_INIT ('Z', 'z', imatch_z, no_imatch):
14737 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerhex
14738 (ffeexpr_tokens_[2]));
14739 break;
14740
14741 default:
14742 no_imatch: /* :::::::::::::::::::: */
14743 assert ("not BOXZ!" == NULL);
14744 abort ();
14745 }
14746
14747 ffebld_set_info (e->u.operand,
14748 ffeinfo_new (FFEINFO_basictypeINTEGER,
14749 FFEINFO_kindtypeINTEGERDEFAULT, 0,
14750 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
14751 FFETARGET_charactersizeNONE));
14752 ffeexpr_exprstack_push_operand_ (e);
14753 ffelex_token_kill (ffeexpr_tokens_[1]);
14754 ffelex_token_kill (ffeexpr_tokens_[2]);
14755 return (ffelexHandler) ffeexpr_token_binary_;
14756 }
14757
14758 switch (c)
14759 {
14760 case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b, no_match):
14761 e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_bm
14762 (ffeexpr_tokens_[2]));
14763 size = ffetarget_size_typeless_binary (ffeexpr_tokens_[2]);
14764 break;
14765
14766 case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o, no_match):
14767 e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_om
14768 (ffeexpr_tokens_[2]));
14769 size = ffetarget_size_typeless_octal (ffeexpr_tokens_[2]);
14770 break;
14771
14772 case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x, no_match):
14773 e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hxm
14774 (ffeexpr_tokens_[2]));
14775 size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
14776 break;
14777
14778 case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z, no_match):
14779 e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hzm
14780 (ffeexpr_tokens_[2]));
14781 size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
14782 break;
14783
14784 default:
14785 no_match: /* :::::::::::::::::::: */
14786 assert ("not BOXZ!" == NULL);
14787 e->u.operand = ffebld_new_conter (ffebld_constant_new_typeless_hzm
14788 (ffeexpr_tokens_[2]));
14789 size = ffetarget_size_typeless_hex (ffeexpr_tokens_[2]);
14790 break;
14791 }
14792 ffebld_set_info (e->u.operand,
14793 ffeinfo_new (FFEINFO_basictypeTYPELESS, FFEINFO_kindtypeNONE,
14794 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, size));
14795 ffeexpr_exprstack_push_operand_ (e);
14796 ffelex_token_kill (ffeexpr_tokens_[1]);
14797 ffelex_token_kill (ffeexpr_tokens_[2]);
14798 return (ffelexHandler) ffeexpr_token_binary_;
14799 }
14800
14801 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER))
14802 {
14803 ffebad_string (ffelex_token_text (ffeexpr_tokens_[0]));
14804 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14805 ffelex_token_where_column (ffeexpr_tokens_[0]));
14806 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
14807 ffebad_finish ();
14808 }
14809
14810 ffelex_token_kill (ffeexpr_tokens_[1]);
14811 ffelex_token_kill (ffeexpr_tokens_[2]);
14812
14813 e->type = FFEEXPR_exprtypeOPERAND_;
14814 e->u.operand = ffebld_new_any ();
14815 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
14816 e->token = ffeexpr_tokens_[0];
14817 ffeexpr_exprstack_push_operand_ (e);
14818
14819 switch (ffelex_token_type (t))
14820 {
14821 case FFELEX_typeAPOSTROPHE:
14822 case FFELEX_typeQUOTE:
14823 return (ffelexHandler) ffeexpr_token_binary_;
14824
14825 default:
14826 return (ffelexHandler) ffeexpr_token_binary_ (t);
14827 }
14828 }
14829
14830 /* ffeexpr_token_percent_ -- Rhs PERCENT
14831
14832 Handle a percent sign possibly followed by "LOC". If followed instead
14833 by "VAL", "REF", or "DESCR", issue an error message and substitute
14834 "LOC". If followed by something else, treat the percent sign as a
14835 spurious incorrect token and reprocess the token via _rhs_. */
14836
14837 static ffelexHandler
14838 ffeexpr_token_percent_ (ffelexToken t)
14839 {
14840 switch (ffelex_token_type (t))
14841 {
14842 case FFELEX_typeNAME:
14843 case FFELEX_typeNAMES:
14844 ffeexpr_stack_->percent = ffeexpr_percent_ (t);
14845 ffeexpr_tokens_[1] = ffelex_token_use (t);
14846 return (ffelexHandler) ffeexpr_token_percent_name_;
14847
14848 default:
14849 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
14850 {
14851 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14852 ffelex_token_where_column (ffeexpr_tokens_[0]));
14853 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
14854 ffelex_token_where_column (ffeexpr_stack_->first_token));
14855 ffebad_finish ();
14856 }
14857 ffelex_token_kill (ffeexpr_tokens_[0]);
14858 return (ffelexHandler) ffeexpr_token_rhs_ (t);
14859 }
14860 }
14861
14862 /* ffeexpr_token_percent_name_ -- Rhs PERCENT NAME
14863
14864 Make sure the token is OPEN_PAREN and prepare for the one-item list of
14865 LHS expressions. Else display an error message. */
14866
14867 static ffelexHandler
14868 ffeexpr_token_percent_name_ (ffelexToken t)
14869 {
14870 ffelexHandler nexthandler;
14871
14872 if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
14873 {
14874 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
14875 {
14876 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14877 ffelex_token_where_column (ffeexpr_tokens_[0]));
14878 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->first_token),
14879 ffelex_token_where_column (ffeexpr_stack_->first_token));
14880 ffebad_finish ();
14881 }
14882 ffelex_token_kill (ffeexpr_tokens_[0]);
14883 nexthandler = (ffelexHandler) ffeexpr_token_rhs_ (ffeexpr_tokens_[1]);
14884 ffelex_token_kill (ffeexpr_tokens_[1]);
14885 return (ffelexHandler) (*nexthandler) (t);
14886 }
14887
14888 switch (ffeexpr_stack_->percent)
14889 {
14890 default:
14891 if (ffest_ffebad_start (FFEBAD_INVALID_PERCENT))
14892 {
14893 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_[0]),
14894 ffelex_token_where_column (ffeexpr_tokens_[0]));
14895 ffebad_string (ffelex_token_text (ffeexpr_tokens_[1]));
14896 ffebad_finish ();
14897 }
14898 ffeexpr_stack_->percent = FFEEXPR_percentLOC_;
14899 /* Fall through. */
14900 case FFEEXPR_percentLOC_:
14901 ffeexpr_stack_->tokens[0] = ffeexpr_tokens_[0];
14902 ffelex_token_kill (ffeexpr_tokens_[1]);
14903 ffeexpr_stack_->tokens[1] = ffelex_token_use (t);
14904 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
14905 FFEEXPR_contextLOC_,
14906 ffeexpr_cb_end_loc_);
14907 }
14908 }
14909
14910 /* ffeexpr_make_float_const_ -- Make a floating-point constant
14911
14912 See prototype.
14913
14914 Pass 'E', 'D', or 'Q' for exponent letter. */
14915
14916 static void
14917 ffeexpr_make_float_const_ (char exp_letter, ffelexToken integer,
14918 ffelexToken decimal, ffelexToken fraction,
14919 ffelexToken exponent, ffelexToken exponent_sign,
14920 ffelexToken exponent_digits)
14921 {
14922 ffeexprExpr_ e;
14923
14924 e = ffeexpr_expr_new_ ();
14925 e->type = FFEEXPR_exprtypeOPERAND_;
14926 if (integer != NULL)
14927 e->token = ffelex_token_use (integer);
14928 else
14929 {
14930 assert (decimal != NULL);
14931 e->token = ffelex_token_use (decimal);
14932 }
14933
14934 switch (exp_letter)
14935 {
14936 #if !FFETARGET_okREALQUAD
14937 case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q, no_match):
14938 if (ffebad_start (FFEBAD_QUAD_UNSUPPORTED))
14939 {
14940 ffebad_here (0, ffelex_token_where_line (e->token),
14941 ffelex_token_where_column (e->token));
14942 ffebad_finish ();
14943 }
14944 goto match_d; /* The FFESRC_CASE_* macros don't
14945 allow fall-through! */
14946 #endif
14947
14948 case FFESRC_CASE_MATCH_INIT ('D', 'd', match_d, no_match):
14949 e->u.operand = ffebld_new_conter (ffebld_constant_new_realdouble
14950 (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
14951 ffebld_set_info (e->u.operand,
14952 ffeinfo_new (FFEINFO_basictypeREAL, FFEINFO_kindtypeREALDOUBLE,
14953 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
14954 break;
14955
14956 case FFESRC_CASE_MATCH_INIT ('E', 'e', match_e, no_match):
14957 e->u.operand = ffebld_new_conter (ffebld_constant_new_realdefault
14958 (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
14959 ffebld_set_info (e->u.operand, ffeinfo_new (FFEINFO_basictypeREAL,
14960 FFEINFO_kindtypeREALDEFAULT, 0, FFEINFO_kindENTITY,
14961 FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
14962 break;
14963
14964 #if FFETARGET_okREALQUAD
14965 case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q, no_match):
14966 e->u.operand = ffebld_new_conter (ffebld_constant_new_realquad
14967 (integer, decimal, fraction, exponent, exponent_sign, exponent_digits));
14968 ffebld_set_info (e->u.operand,
14969 ffeinfo_new (FFEINFO_basictypeREAL, FFEINFO_kindtypeREALQUAD,
14970 0, FFEINFO_kindENTITY, FFEINFO_whereCONSTANT, FFETARGET_charactersizeNONE));
14971 break;
14972 #endif
14973
14974 case 'I': /* Make an integer. */
14975 e->u.operand = ffebld_new_conter (ffebld_constant_new_integerdefault
14976 (ffeexpr_tokens_[0]));
14977 ffebld_set_info (e->u.operand,
14978 ffeinfo_new (FFEINFO_basictypeINTEGER,
14979 FFEINFO_kindtypeINTEGERDEFAULT, 0,
14980 FFEINFO_kindENTITY, FFEINFO_whereCONSTANT,
14981 FFETARGET_charactersizeNONE));
14982 break;
14983
14984 default:
14985 no_match: /* :::::::::::::::::::: */
14986 assert ("Lost the exponent letter!" == NULL);
14987 }
14988
14989 ffeexpr_exprstack_push_operand_ (e);
14990 }
14991
14992 /* Just like ffesymbol_declare_local, except performs any implicit info
14993 assignment necessary. */
14994
14995 static ffesymbol
14996 ffeexpr_declare_unadorned_ (ffelexToken t, bool maybe_intrin)
14997 {
14998 ffesymbol s;
14999 ffeinfoKind k;
15000 bool bad;
15001
15002 s = ffesymbol_declare_local (t, maybe_intrin);
15003
15004 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
15005 /* Special-case these since they can involve a different concept
15006 of "state" (in the stmtfunc name space). */
15007 {
15008 case FFEEXPR_contextDATAIMPDOINDEX_:
15009 case FFEEXPR_contextDATAIMPDOCTRL_:
15010 if (ffeexpr_context_outer_ (ffeexpr_stack_)
15011 == FFEEXPR_contextDATAIMPDOINDEX_)
15012 s = ffeexpr_sym_impdoitem_ (s, t);
15013 else
15014 if (ffeexpr_stack_->is_rhs)
15015 s = ffeexpr_sym_impdoitem_ (s, t);
15016 else
15017 s = ffeexpr_sym_lhs_impdoctrl_ (s, t);
15018 bad = (ffesymbol_kind (s) != FFEINFO_kindENTITY)
15019 || ((ffesymbol_where (s) != FFEINFO_whereCONSTANT)
15020 && (ffesymbol_where (s) != FFEINFO_whereIMMEDIATE));
15021 if (bad && (ffesymbol_kind (s) != FFEINFO_kindANY))
15022 ffesymbol_error (s, t);
15023 return s;
15024
15025 default:
15026 break;
15027 }
15028
15029 switch ((ffesymbol_sfdummyparent (s) == NULL)
15030 ? ffesymbol_state (s)
15031 : FFESYMBOL_stateUNDERSTOOD)
15032 {
15033 case FFESYMBOL_stateNONE: /* Before first exec, not seen in expr
15034 context. */
15035 if (!ffest_seen_first_exec ())
15036 goto seen; /* :::::::::::::::::::: */
15037 /* Fall through. */
15038 case FFESYMBOL_stateUNCERTAIN: /* Unseen since first exec. */
15039 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
15040 {
15041 case FFEEXPR_contextSUBROUTINEREF:
15042 s = ffeexpr_sym_lhs_call_ (s, t);
15043 break;
15044
15045 case FFEEXPR_contextFILEEXTFUNC:
15046 s = ffeexpr_sym_lhs_extfunc_ (s, t);
15047 break;
15048
15049 case FFEEXPR_contextSFUNCDEFACTUALARG_:
15050 s = ffecom_sym_exec_transition (s);
15051 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15052 goto understood; /* :::::::::::::::::::: */
15053 /* Fall through. */
15054 case FFEEXPR_contextACTUALARG_:
15055 s = ffeexpr_sym_rhs_actualarg_ (s, t);
15056 break;
15057
15058 case FFEEXPR_contextDATA:
15059 if (ffeexpr_stack_->is_rhs)
15060 s = ffeexpr_sym_rhs_let_ (s, t);
15061 else
15062 s = ffeexpr_sym_lhs_data_ (s, t);
15063 break;
15064
15065 case FFEEXPR_contextDATAIMPDOITEM_:
15066 s = ffeexpr_sym_lhs_data_ (s, t);
15067 break;
15068
15069 case FFEEXPR_contextSFUNCDEF:
15070 case FFEEXPR_contextSFUNCDEFINDEX_:
15071 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
15072 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
15073 s = ffecom_sym_exec_transition (s);
15074 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15075 goto understood; /* :::::::::::::::::::: */
15076 /* Fall through. */
15077 case FFEEXPR_contextLET:
15078 case FFEEXPR_contextPAREN_:
15079 case FFEEXPR_contextACTUALARGEXPR_:
15080 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
15081 case FFEEXPR_contextASSIGN:
15082 case FFEEXPR_contextIOLIST:
15083 case FFEEXPR_contextIOLISTDF:
15084 case FFEEXPR_contextDO:
15085 case FFEEXPR_contextDOWHILE:
15086 case FFEEXPR_contextAGOTO:
15087 case FFEEXPR_contextCGOTO:
15088 case FFEEXPR_contextIF:
15089 case FFEEXPR_contextARITHIF:
15090 case FFEEXPR_contextFORMAT:
15091 case FFEEXPR_contextSTOP:
15092 case FFEEXPR_contextRETURN:
15093 case FFEEXPR_contextSELECTCASE:
15094 case FFEEXPR_contextCASE:
15095 case FFEEXPR_contextFILEASSOC:
15096 case FFEEXPR_contextFILEINT:
15097 case FFEEXPR_contextFILEDFINT:
15098 case FFEEXPR_contextFILELOG:
15099 case FFEEXPR_contextFILENUM:
15100 case FFEEXPR_contextFILENUMAMBIG:
15101 case FFEEXPR_contextFILECHAR:
15102 case FFEEXPR_contextFILENUMCHAR:
15103 case FFEEXPR_contextFILEDFCHAR:
15104 case FFEEXPR_contextFILEKEY:
15105 case FFEEXPR_contextFILEUNIT:
15106 case FFEEXPR_contextFILEUNIT_DF:
15107 case FFEEXPR_contextFILEUNITAMBIG:
15108 case FFEEXPR_contextFILEFORMAT:
15109 case FFEEXPR_contextFILENAMELIST:
15110 case FFEEXPR_contextFILEVXTCODE:
15111 case FFEEXPR_contextINDEX_:
15112 case FFEEXPR_contextIMPDOITEM_:
15113 case FFEEXPR_contextIMPDOITEMDF_:
15114 case FFEEXPR_contextIMPDOCTRL_:
15115 case FFEEXPR_contextLOC_:
15116 if (ffeexpr_stack_->is_rhs)
15117 s = ffeexpr_sym_rhs_let_ (s, t);
15118 else
15119 s = ffeexpr_sym_lhs_let_ (s, t);
15120 break;
15121
15122 case FFEEXPR_contextCHARACTERSIZE:
15123 case FFEEXPR_contextEQUIVALENCE:
15124 case FFEEXPR_contextINCLUDE:
15125 case FFEEXPR_contextPARAMETER:
15126 case FFEEXPR_contextDIMLIST:
15127 case FFEEXPR_contextDIMLISTCOMMON:
15128 case FFEEXPR_contextKINDTYPE:
15129 case FFEEXPR_contextINITVAL:
15130 case FFEEXPR_contextEQVINDEX_:
15131 break; /* Will turn into errors below. */
15132
15133 default:
15134 ffesymbol_error (s, t);
15135 break;
15136 }
15137 /* Fall through. */
15138 case FFESYMBOL_stateUNDERSTOOD: /* Nothing much more to learn. */
15139 understood: /* :::::::::::::::::::: */
15140 k = ffesymbol_kind (s);
15141 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
15142 {
15143 case FFEEXPR_contextSUBROUTINEREF:
15144 bad = ((k != FFEINFO_kindSUBROUTINE)
15145 && ((ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
15146 || (k != FFEINFO_kindNONE)));
15147 break;
15148
15149 case FFEEXPR_contextFILEEXTFUNC:
15150 bad = (k != FFEINFO_kindFUNCTION)
15151 || (ffesymbol_where (s) != FFEINFO_whereGLOBAL);
15152 break;
15153
15154 case FFEEXPR_contextSFUNCDEFACTUALARG_:
15155 case FFEEXPR_contextACTUALARG_:
15156 switch (k)
15157 {
15158 case FFEINFO_kindENTITY:
15159 bad = FALSE;
15160 break;
15161
15162 case FFEINFO_kindFUNCTION:
15163 case FFEINFO_kindSUBROUTINE:
15164 bad
15165 = ((ffesymbol_where (s) != FFEINFO_whereGLOBAL)
15166 && (ffesymbol_where (s) != FFEINFO_whereDUMMY)
15167 && ((ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
15168 || !ffeintrin_is_actualarg (ffesymbol_specific (s))));
15169 break;
15170
15171 case FFEINFO_kindNONE:
15172 if (ffesymbol_where (s) == FFEINFO_whereINTRINSIC)
15173 {
15174 bad = !(ffeintrin_is_actualarg (ffesymbol_specific (s)));
15175 break;
15176 }
15177
15178 /* If state is UNDERSTOOD here, it's CHAR*(*) or attrsANY,
15179 and in the former case, attrsTYPE is set, so we
15180 see this as an error as we should, since CHAR*(*)
15181 cannot be actually referenced in a main/block data
15182 program unit. */
15183
15184 if ((ffesymbol_attrs (s) & (FFESYMBOL_attrsANY
15185 | FFESYMBOL_attrsEXTERNAL
15186 | FFESYMBOL_attrsTYPE))
15187 == FFESYMBOL_attrsEXTERNAL)
15188 bad = FALSE;
15189 else
15190 bad = TRUE;
15191 break;
15192
15193 default:
15194 bad = TRUE;
15195 break;
15196 }
15197 break;
15198
15199 case FFEEXPR_contextDATA:
15200 if (ffeexpr_stack_->is_rhs)
15201 bad = (k != FFEINFO_kindENTITY)
15202 || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
15203 else
15204 bad = (k != FFEINFO_kindENTITY)
15205 || ((ffesymbol_where (s) != FFEINFO_whereNONE)
15206 && (ffesymbol_where (s) != FFEINFO_whereLOCAL)
15207 && (ffesymbol_where (s) != FFEINFO_whereCOMMON));
15208 break;
15209
15210 case FFEEXPR_contextDATAIMPDOITEM_:
15211 bad = TRUE; /* Unadorned item never valid. */
15212 break;
15213
15214 case FFEEXPR_contextSFUNCDEF:
15215 case FFEEXPR_contextSFUNCDEFINDEX_:
15216 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
15217 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
15218 case FFEEXPR_contextLET:
15219 case FFEEXPR_contextPAREN_:
15220 case FFEEXPR_contextACTUALARGEXPR_:
15221 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
15222 case FFEEXPR_contextASSIGN:
15223 case FFEEXPR_contextIOLIST:
15224 case FFEEXPR_contextIOLISTDF:
15225 case FFEEXPR_contextDO:
15226 case FFEEXPR_contextDOWHILE:
15227 case FFEEXPR_contextAGOTO:
15228 case FFEEXPR_contextCGOTO:
15229 case FFEEXPR_contextIF:
15230 case FFEEXPR_contextARITHIF:
15231 case FFEEXPR_contextFORMAT:
15232 case FFEEXPR_contextSTOP:
15233 case FFEEXPR_contextRETURN:
15234 case FFEEXPR_contextSELECTCASE:
15235 case FFEEXPR_contextCASE:
15236 case FFEEXPR_contextFILEASSOC:
15237 case FFEEXPR_contextFILEINT:
15238 case FFEEXPR_contextFILEDFINT:
15239 case FFEEXPR_contextFILELOG:
15240 case FFEEXPR_contextFILENUM:
15241 case FFEEXPR_contextFILENUMAMBIG:
15242 case FFEEXPR_contextFILECHAR:
15243 case FFEEXPR_contextFILENUMCHAR:
15244 case FFEEXPR_contextFILEDFCHAR:
15245 case FFEEXPR_contextFILEKEY:
15246 case FFEEXPR_contextFILEUNIT:
15247 case FFEEXPR_contextFILEUNIT_DF:
15248 case FFEEXPR_contextFILEUNITAMBIG:
15249 case FFEEXPR_contextFILEFORMAT:
15250 case FFEEXPR_contextFILENAMELIST:
15251 case FFEEXPR_contextFILEVXTCODE:
15252 case FFEEXPR_contextINDEX_:
15253 case FFEEXPR_contextIMPDOITEM_:
15254 case FFEEXPR_contextIMPDOITEMDF_:
15255 case FFEEXPR_contextIMPDOCTRL_:
15256 case FFEEXPR_contextLOC_:
15257 bad = (k != FFEINFO_kindENTITY); /* This catches "SUBROUTINE
15258 X(A);EXTERNAL A;CALL
15259 Y(A);B=A", for example. */
15260 break;
15261
15262 case FFEEXPR_contextCHARACTERSIZE:
15263 case FFEEXPR_contextEQUIVALENCE:
15264 case FFEEXPR_contextPARAMETER:
15265 case FFEEXPR_contextDIMLIST:
15266 case FFEEXPR_contextDIMLISTCOMMON:
15267 case FFEEXPR_contextKINDTYPE:
15268 case FFEEXPR_contextINITVAL:
15269 case FFEEXPR_contextEQVINDEX_:
15270 bad = (k != FFEINFO_kindENTITY)
15271 || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
15272 break;
15273
15274 case FFEEXPR_contextINCLUDE:
15275 bad = TRUE;
15276 break;
15277
15278 default:
15279 bad = TRUE;
15280 break;
15281 }
15282 if (bad && (k != FFEINFO_kindANY))
15283 ffesymbol_error (s, t);
15284 return s;
15285
15286 case FFESYMBOL_stateSEEN: /* Seen but not yet in exec portion. */
15287 seen: /* :::::::::::::::::::: */
15288 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
15289 {
15290 case FFEEXPR_contextPARAMETER:
15291 if (ffeexpr_stack_->is_rhs)
15292 ffesymbol_error (s, t);
15293 else
15294 s = ffeexpr_sym_lhs_parameter_ (s, t);
15295 break;
15296
15297 case FFEEXPR_contextDATA:
15298 s = ffecom_sym_exec_transition (s);
15299 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15300 goto understood; /* :::::::::::::::::::: */
15301 if (ffeexpr_stack_->is_rhs)
15302 ffesymbol_error (s, t);
15303 else
15304 s = ffeexpr_sym_lhs_data_ (s, t);
15305 goto understood; /* :::::::::::::::::::: */
15306
15307 case FFEEXPR_contextDATAIMPDOITEM_:
15308 s = ffecom_sym_exec_transition (s);
15309 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15310 goto understood; /* :::::::::::::::::::: */
15311 s = ffeexpr_sym_lhs_data_ (s, t);
15312 goto understood; /* :::::::::::::::::::: */
15313
15314 case FFEEXPR_contextEQUIVALENCE:
15315 s = ffeexpr_sym_lhs_equivalence_ (s, t);
15316 break;
15317
15318 case FFEEXPR_contextDIMLIST:
15319 s = ffeexpr_sym_rhs_dimlist_ (s, t);
15320 break;
15321
15322 case FFEEXPR_contextCHARACTERSIZE:
15323 case FFEEXPR_contextKINDTYPE:
15324 case FFEEXPR_contextDIMLISTCOMMON:
15325 case FFEEXPR_contextINITVAL:
15326 case FFEEXPR_contextEQVINDEX_:
15327 ffesymbol_error (s, t);
15328 break;
15329
15330 case FFEEXPR_contextINCLUDE:
15331 ffesymbol_error (s, t);
15332 break;
15333
15334 case FFEEXPR_contextACTUALARG_: /* E.g. I in REAL A(Y(I)). */
15335 case FFEEXPR_contextSFUNCDEFACTUALARG_:
15336 s = ffecom_sym_exec_transition (s);
15337 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15338 goto understood; /* :::::::::::::::::::: */
15339 s = ffeexpr_sym_rhs_actualarg_ (s, t);
15340 goto understood; /* :::::::::::::::::::: */
15341
15342 case FFEEXPR_contextINDEX_:
15343 case FFEEXPR_contextACTUALARGEXPR_:
15344 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
15345 case FFEEXPR_contextSFUNCDEF:
15346 case FFEEXPR_contextSFUNCDEFINDEX_:
15347 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
15348 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
15349 assert (ffeexpr_stack_->is_rhs);
15350 s = ffecom_sym_exec_transition (s);
15351 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
15352 goto understood; /* :::::::::::::::::::: */
15353 s = ffeexpr_sym_rhs_let_ (s, t);
15354 goto understood; /* :::::::::::::::::::: */
15355
15356 default:
15357 ffesymbol_error (s, t);
15358 break;
15359 }
15360 return s;
15361
15362 default:
15363 assert ("bad symbol state" == NULL);
15364 return NULL;
15365 break;
15366 }
15367 }
15368
15369 /* Have FOO in DATA (XYZ(FOO),...)/.../ or DATA (...,XYZ=FOO,BAR,BLETCH).
15370 Could be found via the "statement-function" name space (in which case
15371 it should become an iterator) or the local name space (in which case
15372 it should be either a named constant, or a variable that will have an
15373 sfunc name space sibling that should become an iterator). */
15374
15375 static ffesymbol
15376 ffeexpr_sym_impdoitem_ (ffesymbol sp, ffelexToken t)
15377 {
15378 ffesymbol s;
15379 ffesymbolAttrs sa;
15380 ffesymbolAttrs na;
15381 ffesymbolState ss;
15382 ffesymbolState ns;
15383 ffeinfoKind kind;
15384 ffeinfoWhere where;
15385
15386 ss = ffesymbol_state (sp);
15387
15388 if (ffesymbol_sfdummyparent (sp) != NULL)
15389 { /* Have symbol in sfunc name space. */
15390 switch (ss)
15391 {
15392 case FFESYMBOL_stateNONE: /* Used as iterator already. */
15393 if (ffeexpr_level_ < ffesymbol_maxentrynum (sp))
15394 ffesymbol_error (sp, t); /* Can't use dead iterator. */
15395 else
15396 { /* Can use dead iterator because we're at at
15397 least an innermore (higher-numbered) level
15398 than the iterator's outermost
15399 (lowest-numbered) level. */
15400 ffesymbol_signal_change (sp);
15401 ffesymbol_set_state (sp, FFESYMBOL_stateSEEN);
15402 ffesymbol_set_maxentrynum (sp, ffeexpr_level_);
15403 ffesymbol_signal_unreported (sp);
15404 }
15405 break;
15406
15407 case FFESYMBOL_stateSEEN: /* Seen already in this or other
15408 implied-DO. Set symbol level
15409 number to outermost value, as that
15410 tells us we can see it as iterator
15411 at that level at the innermost. */
15412 if (ffeexpr_level_ < ffesymbol_maxentrynum (sp))
15413 {
15414 ffesymbol_signal_change (sp);
15415 ffesymbol_set_maxentrynum (sp, ffeexpr_level_);
15416 ffesymbol_signal_unreported (sp);
15417 }
15418 break;
15419
15420 case FFESYMBOL_stateUNCERTAIN: /* Iterator. */
15421 assert (ffeexpr_level_ == ffesymbol_maxentrynum (sp));
15422 ffesymbol_error (sp, t); /* (,,,I=I,10). */
15423 break;
15424
15425 case FFESYMBOL_stateUNDERSTOOD:
15426 break; /* ANY. */
15427
15428 default:
15429 assert ("Foo Bar!!" == NULL);
15430 break;
15431 }
15432
15433 return sp;
15434 }
15435
15436 /* Got symbol in local name space, so we haven't seen it in impdo yet.
15437 First, if it is brand-new and we're in executable statements, set the
15438 attributes and exec-transition it to set state UNCERTAIN or UNDERSTOOD.
15439 Second, if it is now a constant (PARAMETER), then just return it, it
15440 can't be an implied-do iterator. If it is understood, complain if it is
15441 not a valid variable, but make the inner name space iterator anyway and
15442 return that. If it is not understood, improve understanding of the
15443 symbol accordingly, complain accordingly, in either case make the inner
15444 name space iterator and return that. */
15445
15446 sa = ffesymbol_attrs (sp);
15447
15448 if (ffesymbol_state_is_specable (ss)
15449 && ffest_seen_first_exec ())
15450 {
15451 assert (sa == FFESYMBOL_attrsetNONE);
15452 ffesymbol_signal_change (sp);
15453 ffesymbol_set_state (sp, FFESYMBOL_stateSEEN);
15454 ffesymbol_resolve_intrin (sp);
15455 if (ffeimplic_establish_symbol (sp))
15456 ffesymbol_set_attr (sp, FFESYMBOL_attrSFARG);
15457 else
15458 ffesymbol_error (sp, t);
15459
15460 /* After the exec transition, the state will either be UNCERTAIN (could
15461 be a dummy or local var) or UNDERSTOOD (local var, because this is a
15462 PROGRAM/BLOCKDATA program unit). */
15463
15464 sp = ffecom_sym_exec_transition (sp);
15465 sa = ffesymbol_attrs (sp);
15466 ss = ffesymbol_state (sp);
15467 }
15468
15469 ns = ss;
15470 kind = ffesymbol_kind (sp);
15471 where = ffesymbol_where (sp);
15472
15473 if (ss == FFESYMBOL_stateUNDERSTOOD)
15474 {
15475 if (kind != FFEINFO_kindENTITY)
15476 ffesymbol_error (sp, t);
15477 if (where == FFEINFO_whereCONSTANT)
15478 return sp;
15479 }
15480 else
15481 {
15482 /* Enhance understanding of local symbol. This used to imply exec
15483 transition, but that doesn't seem necessary, since the local symbol
15484 doesn't actually get put into an ffebld tree here -- we just learn
15485 more about it, just like when we see a local symbol's name in the
15486 dummy-arg list of a statement function. */
15487
15488 if (ss != FFESYMBOL_stateUNCERTAIN)
15489 {
15490 /* Figure out what kind of object we've got based on previous
15491 declarations of or references to the object. */
15492
15493 ns = FFESYMBOL_stateSEEN;
15494
15495 if (sa & FFESYMBOL_attrsANY)
15496 na = sa;
15497 else if (!(sa & ~(FFESYMBOL_attrsADJUSTS
15498 | FFESYMBOL_attrsANY
15499 | FFESYMBOL_attrsCOMMON
15500 | FFESYMBOL_attrsDUMMY
15501 | FFESYMBOL_attrsEQUIV
15502 | FFESYMBOL_attrsINIT
15503 | FFESYMBOL_attrsNAMELIST
15504 | FFESYMBOL_attrsRESULT
15505 | FFESYMBOL_attrsSAVE
15506 | FFESYMBOL_attrsSFARG
15507 | FFESYMBOL_attrsTYPE)))
15508 na = sa | FFESYMBOL_attrsSFARG;
15509 else
15510 na = FFESYMBOL_attrsetNONE;
15511 }
15512 else
15513 { /* stateUNCERTAIN. */
15514 na = sa | FFESYMBOL_attrsSFARG;
15515 ns = FFESYMBOL_stateUNDERSTOOD;
15516
15517 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15518 | FFESYMBOL_attrsADJUSTABLE
15519 | FFESYMBOL_attrsANYLEN
15520 | FFESYMBOL_attrsARRAY
15521 | FFESYMBOL_attrsDUMMY
15522 | FFESYMBOL_attrsEXTERNAL
15523 | FFESYMBOL_attrsSFARG
15524 | FFESYMBOL_attrsTYPE)));
15525
15526 if (sa & FFESYMBOL_attrsEXTERNAL)
15527 {
15528 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15529 | FFESYMBOL_attrsDUMMY
15530 | FFESYMBOL_attrsEXTERNAL
15531 | FFESYMBOL_attrsTYPE)));
15532
15533 na = FFESYMBOL_attrsetNONE;
15534 }
15535 else if (sa & FFESYMBOL_attrsDUMMY)
15536 {
15537 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
15538 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
15539 | FFESYMBOL_attrsEXTERNAL
15540 | FFESYMBOL_attrsTYPE)));
15541
15542 kind = FFEINFO_kindENTITY;
15543 }
15544 else if (sa & FFESYMBOL_attrsARRAY)
15545 {
15546 assert (!(sa & ~(FFESYMBOL_attrsARRAY
15547 | FFESYMBOL_attrsADJUSTABLE
15548 | FFESYMBOL_attrsTYPE)));
15549
15550 na = FFESYMBOL_attrsetNONE;
15551 }
15552 else if (sa & FFESYMBOL_attrsSFARG)
15553 {
15554 assert (!(sa & ~(FFESYMBOL_attrsSFARG
15555 | FFESYMBOL_attrsTYPE)));
15556
15557 ns = FFESYMBOL_stateUNCERTAIN;
15558 }
15559 else if (sa & FFESYMBOL_attrsTYPE)
15560 {
15561 assert (!(sa & (FFESYMBOL_attrsARRAY
15562 | FFESYMBOL_attrsDUMMY
15563 | FFESYMBOL_attrsEXTERNAL
15564 | FFESYMBOL_attrsSFARG))); /* Handled above. */
15565 assert (!(sa & ~(FFESYMBOL_attrsTYPE
15566 | FFESYMBOL_attrsADJUSTABLE
15567 | FFESYMBOL_attrsANYLEN
15568 | FFESYMBOL_attrsARRAY
15569 | FFESYMBOL_attrsDUMMY
15570 | FFESYMBOL_attrsEXTERNAL
15571 | FFESYMBOL_attrsSFARG)));
15572
15573 kind = FFEINFO_kindENTITY;
15574
15575 if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
15576 na = FFESYMBOL_attrsetNONE;
15577 else if (ffest_is_entry_valid ())
15578 ns = FFESYMBOL_stateUNCERTAIN; /* Could be DUMMY or LOCAL. */
15579 else
15580 where = FFEINFO_whereLOCAL;
15581 }
15582 else
15583 na = FFESYMBOL_attrsetNONE; /* Error. */
15584 }
15585
15586 /* Now see what we've got for a new object: NONE means a new error
15587 cropped up; ANY means an old error to be ignored; otherwise,
15588 everything's ok, update the object (symbol) and continue on. */
15589
15590 if (na == FFESYMBOL_attrsetNONE)
15591 ffesymbol_error (sp, t);
15592 else if (!(na & FFESYMBOL_attrsANY))
15593 {
15594 ffesymbol_signal_change (sp); /* May need to back up to previous
15595 version. */
15596 if (!ffeimplic_establish_symbol (sp))
15597 ffesymbol_error (sp, t);
15598 else
15599 {
15600 ffesymbol_set_info (sp,
15601 ffeinfo_new (ffesymbol_basictype (sp),
15602 ffesymbol_kindtype (sp),
15603 ffesymbol_rank (sp),
15604 kind,
15605 where,
15606 ffesymbol_size (sp)));
15607 ffesymbol_set_attrs (sp, na);
15608 ffesymbol_set_state (sp, ns);
15609 ffesymbol_resolve_intrin (sp);
15610 if (!ffesymbol_state_is_specable (ns))
15611 sp = ffecom_sym_learned (sp);
15612 ffesymbol_signal_unreported (sp); /* For debugging purposes. */
15613 }
15614 }
15615 }
15616
15617 /* Here we create the sfunc-name-space symbol representing what should
15618 become an iterator in this name space at this or an outermore (lower-
15619 numbered) expression level, else the implied-DO construct is in error. */
15620
15621 s = ffesymbol_declare_sfdummy (t); /* Sets maxentrynum to 0 for new obj;
15622 also sets sfa_dummy_parent to
15623 parent symbol. */
15624 assert (sp == ffesymbol_sfdummyparent (s));
15625
15626 ffesymbol_signal_change (s);
15627 ffesymbol_set_state (s, FFESYMBOL_stateSEEN);
15628 ffesymbol_set_maxentrynum (s, ffeexpr_level_);
15629 ffesymbol_set_info (s,
15630 ffeinfo_new (FFEINFO_basictypeINTEGER,
15631 FFEINFO_kindtypeINTEGERDEFAULT,
15632 0,
15633 FFEINFO_kindENTITY,
15634 FFEINFO_whereIMMEDIATE,
15635 FFETARGET_charactersizeNONE));
15636 ffesymbol_signal_unreported (s);
15637
15638 if ((ffesymbol_basictype (sp) != FFEINFO_basictypeINTEGER)
15639 && (ffesymbol_basictype (sp) != FFEINFO_basictypeANY))
15640 ffesymbol_error (s, t);
15641
15642 return s;
15643 }
15644
15645 /* Have FOO in CALL FOO. Local name space, executable context only. */
15646
15647 static ffesymbol
15648 ffeexpr_sym_lhs_call_ (ffesymbol s, ffelexToken t)
15649 {
15650 ffesymbolAttrs sa;
15651 ffesymbolAttrs na;
15652 ffeinfoKind kind;
15653 ffeinfoWhere where;
15654 ffeintrinGen gen;
15655 ffeintrinSpec spec;
15656 ffeintrinImp imp;
15657 bool error = FALSE;
15658
15659 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
15660 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
15661
15662 na = sa = ffesymbol_attrs (s);
15663
15664 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15665 | FFESYMBOL_attrsADJUSTABLE
15666 | FFESYMBOL_attrsANYLEN
15667 | FFESYMBOL_attrsARRAY
15668 | FFESYMBOL_attrsDUMMY
15669 | FFESYMBOL_attrsEXTERNAL
15670 | FFESYMBOL_attrsSFARG
15671 | FFESYMBOL_attrsTYPE)));
15672
15673 kind = ffesymbol_kind (s);
15674 where = ffesymbol_where (s);
15675
15676 /* Figure out what kind of object we've got based on previous declarations
15677 of or references to the object. */
15678
15679 if (sa & FFESYMBOL_attrsEXTERNAL)
15680 {
15681 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15682 | FFESYMBOL_attrsDUMMY
15683 | FFESYMBOL_attrsEXTERNAL
15684 | FFESYMBOL_attrsTYPE)));
15685
15686 if (sa & FFESYMBOL_attrsTYPE)
15687 error = TRUE;
15688 else
15689 /* Not TYPE. */
15690 {
15691 kind = FFEINFO_kindSUBROUTINE;
15692
15693 if (sa & FFESYMBOL_attrsDUMMY)
15694 ; /* Not TYPE. */
15695 else if (sa & FFESYMBOL_attrsACTUALARG)
15696 ; /* Not DUMMY or TYPE. */
15697 else /* Not ACTUALARG, DUMMY, or TYPE. */
15698 where = FFEINFO_whereGLOBAL;
15699 }
15700 }
15701 else if (sa & FFESYMBOL_attrsDUMMY)
15702 {
15703 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
15704 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
15705 | FFESYMBOL_attrsEXTERNAL
15706 | FFESYMBOL_attrsTYPE)));
15707
15708 if (sa & FFESYMBOL_attrsTYPE)
15709 error = TRUE;
15710 else
15711 kind = FFEINFO_kindSUBROUTINE;
15712 }
15713 else if (sa & FFESYMBOL_attrsARRAY)
15714 {
15715 assert (!(sa & ~(FFESYMBOL_attrsARRAY
15716 | FFESYMBOL_attrsADJUSTABLE
15717 | FFESYMBOL_attrsTYPE)));
15718
15719 error = TRUE;
15720 }
15721 else if (sa & FFESYMBOL_attrsSFARG)
15722 {
15723 assert (!(sa & ~(FFESYMBOL_attrsSFARG
15724 | FFESYMBOL_attrsTYPE)));
15725
15726 error = TRUE;
15727 }
15728 else if (sa & FFESYMBOL_attrsTYPE)
15729 {
15730 assert (!(sa & (FFESYMBOL_attrsARRAY
15731 | FFESYMBOL_attrsDUMMY
15732 | FFESYMBOL_attrsEXTERNAL
15733 | FFESYMBOL_attrsSFARG))); /* Handled above. */
15734 assert (!(sa & ~(FFESYMBOL_attrsTYPE
15735 | FFESYMBOL_attrsADJUSTABLE
15736 | FFESYMBOL_attrsANYLEN
15737 | FFESYMBOL_attrsARRAY
15738 | FFESYMBOL_attrsDUMMY
15739 | FFESYMBOL_attrsEXTERNAL
15740 | FFESYMBOL_attrsSFARG)));
15741
15742 error = TRUE;
15743 }
15744 else if (sa == FFESYMBOL_attrsetNONE)
15745 {
15746 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
15747
15748 if (ffeintrin_is_intrinsic (ffesymbol_text (s), t, FALSE,
15749 &gen, &spec, &imp))
15750 {
15751 ffesymbol_signal_change (s); /* May need to back up to previous
15752 version. */
15753 ffesymbol_set_generic (s, gen);
15754 ffesymbol_set_specific (s, spec);
15755 ffesymbol_set_implementation (s, imp);
15756 ffesymbol_set_info (s,
15757 ffeinfo_new (FFEINFO_basictypeNONE,
15758 FFEINFO_kindtypeNONE,
15759 0,
15760 FFEINFO_kindSUBROUTINE,
15761 FFEINFO_whereINTRINSIC,
15762 FFETARGET_charactersizeNONE));
15763 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
15764 ffesymbol_resolve_intrin (s);
15765 ffesymbol_reference (s, t, FALSE);
15766 s = ffecom_sym_learned (s);
15767 ffesymbol_signal_unreported (s); /* For debugging purposes. */
15768
15769 return s;
15770 }
15771
15772 kind = FFEINFO_kindSUBROUTINE;
15773 where = FFEINFO_whereGLOBAL;
15774 }
15775 else
15776 error = TRUE;
15777
15778 /* Now see what we've got for a new object: NONE means a new error cropped
15779 up; ANY means an old error to be ignored; otherwise, everything's ok,
15780 update the object (symbol) and continue on. */
15781
15782 if (error)
15783 ffesymbol_error (s, t);
15784 else if (!(na & FFESYMBOL_attrsANY))
15785 {
15786 ffesymbol_signal_change (s); /* May need to back up to previous
15787 version. */
15788 ffesymbol_set_info (s,
15789 ffeinfo_new (ffesymbol_basictype (s),
15790 ffesymbol_kindtype (s),
15791 ffesymbol_rank (s),
15792 kind, /* SUBROUTINE. */
15793 where, /* GLOBAL or DUMMY. */
15794 ffesymbol_size (s)));
15795 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
15796 ffesymbol_resolve_intrin (s);
15797 ffesymbol_reference (s, t, FALSE);
15798 s = ffecom_sym_learned (s);
15799 ffesymbol_signal_unreported (s); /* For debugging purposes. */
15800 }
15801
15802 return s;
15803 }
15804
15805 /* Have FOO in DATA FOO/.../. Local name space and executable context
15806 only. (This will change in the future when DATA FOO may be followed
15807 by COMMON FOO or even INTEGER FOO(10), etc.) */
15808
15809 static ffesymbol
15810 ffeexpr_sym_lhs_data_ (ffesymbol s, ffelexToken t)
15811 {
15812 ffesymbolAttrs sa;
15813 ffesymbolAttrs na;
15814 ffeinfoKind kind;
15815 ffeinfoWhere where;
15816 bool error = FALSE;
15817
15818 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
15819 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
15820
15821 na = sa = ffesymbol_attrs (s);
15822
15823 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15824 | FFESYMBOL_attrsADJUSTABLE
15825 | FFESYMBOL_attrsANYLEN
15826 | FFESYMBOL_attrsARRAY
15827 | FFESYMBOL_attrsDUMMY
15828 | FFESYMBOL_attrsEXTERNAL
15829 | FFESYMBOL_attrsSFARG
15830 | FFESYMBOL_attrsTYPE)));
15831
15832 kind = ffesymbol_kind (s);
15833 where = ffesymbol_where (s);
15834
15835 /* Figure out what kind of object we've got based on previous declarations
15836 of or references to the object. */
15837
15838 if (sa & FFESYMBOL_attrsEXTERNAL)
15839 {
15840 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
15841 | FFESYMBOL_attrsDUMMY
15842 | FFESYMBOL_attrsEXTERNAL
15843 | FFESYMBOL_attrsTYPE)));
15844
15845 error = TRUE;
15846 }
15847 else if (sa & FFESYMBOL_attrsDUMMY)
15848 {
15849 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
15850 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
15851 | FFESYMBOL_attrsEXTERNAL
15852 | FFESYMBOL_attrsTYPE)));
15853
15854 error = TRUE;
15855 }
15856 else if (sa & FFESYMBOL_attrsARRAY)
15857 {
15858 assert (!(sa & ~(FFESYMBOL_attrsARRAY
15859 | FFESYMBOL_attrsADJUSTABLE
15860 | FFESYMBOL_attrsTYPE)));
15861
15862 if (sa & FFESYMBOL_attrsADJUSTABLE)
15863 error = TRUE;
15864 where = FFEINFO_whereLOCAL;
15865 }
15866 else if (sa & FFESYMBOL_attrsSFARG)
15867 {
15868 assert (!(sa & ~(FFESYMBOL_attrsSFARG
15869 | FFESYMBOL_attrsTYPE)));
15870
15871 where = FFEINFO_whereLOCAL;
15872 }
15873 else if (sa & FFESYMBOL_attrsTYPE)
15874 {
15875 assert (!(sa & (FFESYMBOL_attrsARRAY
15876 | FFESYMBOL_attrsDUMMY
15877 | FFESYMBOL_attrsEXTERNAL
15878 | FFESYMBOL_attrsSFARG))); /* Handled above. */
15879 assert (!(sa & ~(FFESYMBOL_attrsTYPE
15880 | FFESYMBOL_attrsADJUSTABLE
15881 | FFESYMBOL_attrsANYLEN
15882 | FFESYMBOL_attrsARRAY
15883 | FFESYMBOL_attrsDUMMY
15884 | FFESYMBOL_attrsEXTERNAL
15885 | FFESYMBOL_attrsSFARG)));
15886
15887 if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
15888 error = TRUE;
15889 else
15890 {
15891 kind = FFEINFO_kindENTITY;
15892 where = FFEINFO_whereLOCAL;
15893 }
15894 }
15895 else if (sa == FFESYMBOL_attrsetNONE)
15896 {
15897 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
15898 kind = FFEINFO_kindENTITY;
15899 where = FFEINFO_whereLOCAL;
15900 }
15901 else
15902 error = TRUE;
15903
15904 /* Now see what we've got for a new object: NONE means a new error cropped
15905 up; ANY means an old error to be ignored; otherwise, everything's ok,
15906 update the object (symbol) and continue on. */
15907
15908 if (error)
15909 ffesymbol_error (s, t);
15910 else if (!(na & FFESYMBOL_attrsANY))
15911 {
15912 ffesymbol_signal_change (s); /* May need to back up to previous
15913 version. */
15914 if (!ffeimplic_establish_symbol (s))
15915 {
15916 ffesymbol_error (s, t);
15917 return s;
15918 }
15919 ffesymbol_set_info (s,
15920 ffeinfo_new (ffesymbol_basictype (s),
15921 ffesymbol_kindtype (s),
15922 ffesymbol_rank (s),
15923 kind, /* ENTITY. */
15924 where, /* LOCAL. */
15925 ffesymbol_size (s)));
15926 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
15927 ffesymbol_resolve_intrin (s);
15928 s = ffecom_sym_learned (s);
15929 ffesymbol_signal_unreported (s); /* For debugging purposes. */
15930 }
15931
15932 return s;
15933 }
15934
15935 /* Have FOO in EQUIVALENCE (...,FOO,...). Does not include
15936 EQUIVALENCE (...,BAR(FOO),...). */
15937
15938 static ffesymbol
15939 ffeexpr_sym_lhs_equivalence_ (ffesymbol s, ffelexToken t)
15940 {
15941 ffesymbolAttrs sa;
15942 ffesymbolAttrs na;
15943 ffeinfoKind kind;
15944 ffeinfoWhere where;
15945
15946 na = sa = ffesymbol_attrs (s);
15947 kind = FFEINFO_kindENTITY;
15948 where = ffesymbol_where (s);
15949
15950 /* Figure out what kind of object we've got based on previous declarations
15951 of or references to the object. */
15952
15953 if (!(sa & ~(FFESYMBOL_attrsADJUSTS
15954 | FFESYMBOL_attrsARRAY
15955 | FFESYMBOL_attrsCOMMON
15956 | FFESYMBOL_attrsEQUIV
15957 | FFESYMBOL_attrsINIT
15958 | FFESYMBOL_attrsNAMELIST
15959 | FFESYMBOL_attrsSAVE
15960 | FFESYMBOL_attrsSFARG
15961 | FFESYMBOL_attrsTYPE)))
15962 na = sa | FFESYMBOL_attrsEQUIV;
15963 else
15964 na = FFESYMBOL_attrsetNONE;
15965
15966 /* Don't know why we're bothering to set kind and where in this code, but
15967 added the following to make it complete, in case it's really important.
15968 Generally this is left up to symbol exec transition. */
15969
15970 if (where == FFEINFO_whereNONE)
15971 {
15972 if (na & (FFESYMBOL_attrsADJUSTS
15973 | FFESYMBOL_attrsCOMMON))
15974 where = FFEINFO_whereCOMMON;
15975 else if (na & FFESYMBOL_attrsSAVE)
15976 where = FFEINFO_whereLOCAL;
15977 }
15978
15979 /* Now see what we've got for a new object: NONE means a new error cropped
15980 up; ANY means an old error to be ignored; otherwise, everything's ok,
15981 update the object (symbol) and continue on. */
15982
15983 if (na == FFESYMBOL_attrsetNONE)
15984 ffesymbol_error (s, t);
15985 else if (!(na & FFESYMBOL_attrsANY))
15986 {
15987 ffesymbol_signal_change (s); /* May need to back up to previous
15988 version. */
15989 ffesymbol_set_info (s,
15990 ffeinfo_new (ffesymbol_basictype (s),
15991 ffesymbol_kindtype (s),
15992 ffesymbol_rank (s),
15993 kind, /* Always ENTITY. */
15994 where, /* NONE, COMMON, or LOCAL. */
15995 ffesymbol_size (s)));
15996 ffesymbol_set_attrs (s, na);
15997 ffesymbol_set_state (s, FFESYMBOL_stateSEEN);
15998 ffesymbol_resolve_intrin (s);
15999 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16000 }
16001
16002 return s;
16003 }
16004
16005 /* Have FOO in OPEN(...,USEROPEN=FOO,...). Executable context only.
16006
16007 Note that I think this should be considered semantically similar to
16008 doing CALL XYZ(FOO), in that it should be considered like an
16009 ACTUALARG context. In particular, without EXTERNAL being specified,
16010 it should not be allowed. */
16011
16012 static ffesymbol
16013 ffeexpr_sym_lhs_extfunc_ (ffesymbol s, ffelexToken t)
16014 {
16015 ffesymbolAttrs sa;
16016 ffesymbolAttrs na;
16017 ffeinfoKind kind;
16018 ffeinfoWhere where;
16019 bool needs_type = FALSE;
16020 bool error = FALSE;
16021
16022 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
16023 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
16024
16025 na = sa = ffesymbol_attrs (s);
16026
16027 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16028 | FFESYMBOL_attrsADJUSTABLE
16029 | FFESYMBOL_attrsANYLEN
16030 | FFESYMBOL_attrsARRAY
16031 | FFESYMBOL_attrsDUMMY
16032 | FFESYMBOL_attrsEXTERNAL
16033 | FFESYMBOL_attrsSFARG
16034 | FFESYMBOL_attrsTYPE)));
16035
16036 kind = ffesymbol_kind (s);
16037 where = ffesymbol_where (s);
16038
16039 /* Figure out what kind of object we've got based on previous declarations
16040 of or references to the object. */
16041
16042 if (sa & FFESYMBOL_attrsEXTERNAL)
16043 {
16044 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16045 | FFESYMBOL_attrsDUMMY
16046 | FFESYMBOL_attrsEXTERNAL
16047 | FFESYMBOL_attrsTYPE)));
16048
16049 if (sa & FFESYMBOL_attrsTYPE)
16050 where = FFEINFO_whereGLOBAL;
16051 else
16052 /* Not TYPE. */
16053 {
16054 kind = FFEINFO_kindFUNCTION;
16055 needs_type = TRUE;
16056
16057 if (sa & FFESYMBOL_attrsDUMMY)
16058 ; /* Not TYPE. */
16059 else if (sa & FFESYMBOL_attrsACTUALARG)
16060 ; /* Not DUMMY or TYPE. */
16061 else /* Not ACTUALARG, DUMMY, or TYPE. */
16062 where = FFEINFO_whereGLOBAL;
16063 }
16064 }
16065 else if (sa & FFESYMBOL_attrsDUMMY)
16066 {
16067 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
16068 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
16069 | FFESYMBOL_attrsEXTERNAL
16070 | FFESYMBOL_attrsTYPE)));
16071
16072 kind = FFEINFO_kindFUNCTION;
16073 if (!(sa & FFESYMBOL_attrsTYPE))
16074 needs_type = TRUE;
16075 }
16076 else if (sa & FFESYMBOL_attrsARRAY)
16077 {
16078 assert (!(sa & ~(FFESYMBOL_attrsARRAY
16079 | FFESYMBOL_attrsADJUSTABLE
16080 | FFESYMBOL_attrsTYPE)));
16081
16082 error = TRUE;
16083 }
16084 else if (sa & FFESYMBOL_attrsSFARG)
16085 {
16086 assert (!(sa & ~(FFESYMBOL_attrsSFARG
16087 | FFESYMBOL_attrsTYPE)));
16088
16089 error = TRUE;
16090 }
16091 else if (sa & FFESYMBOL_attrsTYPE)
16092 {
16093 assert (!(sa & (FFESYMBOL_attrsARRAY
16094 | FFESYMBOL_attrsDUMMY
16095 | FFESYMBOL_attrsEXTERNAL
16096 | FFESYMBOL_attrsSFARG))); /* Handled above. */
16097 assert (!(sa & ~(FFESYMBOL_attrsTYPE
16098 | FFESYMBOL_attrsADJUSTABLE
16099 | FFESYMBOL_attrsANYLEN
16100 | FFESYMBOL_attrsARRAY
16101 | FFESYMBOL_attrsDUMMY
16102 | FFESYMBOL_attrsEXTERNAL
16103 | FFESYMBOL_attrsSFARG)));
16104
16105 if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYLEN))
16106 error = TRUE;
16107 else
16108 {
16109 kind = FFEINFO_kindFUNCTION;
16110 where = FFEINFO_whereGLOBAL;
16111 }
16112 }
16113 else if (sa == FFESYMBOL_attrsetNONE)
16114 {
16115 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
16116 kind = FFEINFO_kindFUNCTION;
16117 where = FFEINFO_whereGLOBAL;
16118 needs_type = TRUE;
16119 }
16120 else
16121 error = TRUE;
16122
16123 /* Now see what we've got for a new object: NONE means a new error cropped
16124 up; ANY means an old error to be ignored; otherwise, everything's ok,
16125 update the object (symbol) and continue on. */
16126
16127 if (error)
16128 ffesymbol_error (s, t);
16129 else if (!(na & FFESYMBOL_attrsANY))
16130 {
16131 ffesymbol_signal_change (s); /* May need to back up to previous
16132 version. */
16133 if (needs_type && !ffeimplic_establish_symbol (s))
16134 {
16135 ffesymbol_error (s, t);
16136 return s;
16137 }
16138 if (!ffesymbol_explicitwhere (s))
16139 {
16140 ffebad_start (FFEBAD_NEED_EXTERNAL);
16141 ffebad_here (0, ffelex_token_where_line (t),
16142 ffelex_token_where_column (t));
16143 ffebad_string (ffesymbol_text (s));
16144 ffebad_finish ();
16145 ffesymbol_set_explicitwhere (s, TRUE);
16146 }
16147 ffesymbol_set_info (s,
16148 ffeinfo_new (ffesymbol_basictype (s),
16149 ffesymbol_kindtype (s),
16150 ffesymbol_rank (s),
16151 kind, /* FUNCTION. */
16152 where, /* GLOBAL or DUMMY. */
16153 ffesymbol_size (s)));
16154 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
16155 ffesymbol_resolve_intrin (s);
16156 ffesymbol_reference (s, t, FALSE);
16157 s = ffecom_sym_learned (s);
16158 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16159 }
16160
16161 return s;
16162 }
16163
16164 /* Have FOO in DATA (stuff,FOO=1,10)/.../. */
16165
16166 static ffesymbol
16167 ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s, ffelexToken t)
16168 {
16169 ffesymbolState ss;
16170
16171 /* If the symbol isn't in the sfunc name space, pretend as though we saw a
16172 reference to it already within the imp-DO construct at this level, so as
16173 to get a symbol that is in the sfunc name space. But this is an
16174 erroneous construct, and should be caught elsewhere. */
16175
16176 if (ffesymbol_sfdummyparent (s) == NULL)
16177 {
16178 s = ffeexpr_sym_impdoitem_ (s, t);
16179 if (ffesymbol_sfdummyparent (s) == NULL)
16180 { /* PARAMETER FOO...DATA (A(I),FOO=...). */
16181 ffesymbol_error (s, t);
16182 return s;
16183 }
16184 }
16185
16186 ss = ffesymbol_state (s);
16187
16188 switch (ss)
16189 {
16190 case FFESYMBOL_stateNONE: /* Used as iterator already. */
16191 if (ffeexpr_level_ < ffesymbol_maxentrynum (s))
16192 ffesymbol_error (s, t); /* Can't reuse dead iterator. F90 disallows
16193 this; F77 allows it but it is a stupid
16194 feature. */
16195 else
16196 { /* Can use dead iterator because we're at at
16197 least a innermore (higher-numbered) level
16198 than the iterator's outermost
16199 (lowest-numbered) level. This should be
16200 diagnosed later, because it means an item
16201 in this list didn't reference this
16202 iterator. */
16203 #if 1
16204 ffesymbol_error (s, t); /* For now, complain. */
16205 #else /* Someday will detect all cases where initializer doesn't reference
16206 all applicable iterators, in which case reenable this code. */
16207 ffesymbol_signal_change (s);
16208 ffesymbol_set_state (s, FFESYMBOL_stateUNCERTAIN);
16209 ffesymbol_set_maxentrynum (s, ffeexpr_level_);
16210 ffesymbol_signal_unreported (s);
16211 #endif
16212 }
16213 break;
16214
16215 case FFESYMBOL_stateSEEN: /* Seen already in this or other implied-DO.
16216 If seen in outermore level, can't be an
16217 iterator here, so complain. If not seen
16218 at current level, complain for now,
16219 because that indicates something F90
16220 rejects (though we currently don't detect
16221 all such cases for now). */
16222 if (ffeexpr_level_ <= ffesymbol_maxentrynum (s))
16223 {
16224 ffesymbol_signal_change (s);
16225 ffesymbol_set_state (s, FFESYMBOL_stateUNCERTAIN);
16226 ffesymbol_signal_unreported (s);
16227 }
16228 else
16229 ffesymbol_error (s, t);
16230 break;
16231
16232 case FFESYMBOL_stateUNCERTAIN: /* Already iterator! */
16233 assert ("DATA implied-DO control var seen twice!!" == NULL);
16234 ffesymbol_error (s, t);
16235 break;
16236
16237 case FFESYMBOL_stateUNDERSTOOD:
16238 break; /* ANY. */
16239
16240 default:
16241 assert ("Foo Bletch!!" == NULL);
16242 break;
16243 }
16244
16245 return s;
16246 }
16247
16248 /* Have FOO in PARAMETER (FOO=...). */
16249
16250 static ffesymbol
16251 ffeexpr_sym_lhs_parameter_ (ffesymbol s, ffelexToken t)
16252 {
16253 ffesymbolAttrs sa;
16254
16255 sa = ffesymbol_attrs (s);
16256
16257 /* Figure out what kind of object we've got based on previous declarations
16258 of or references to the object. */
16259
16260 if (sa & ~(FFESYMBOL_attrsANYLEN
16261 | FFESYMBOL_attrsTYPE))
16262 {
16263 if (!(sa & FFESYMBOL_attrsANY))
16264 ffesymbol_error (s, t);
16265 }
16266 else
16267 {
16268 ffesymbol_signal_change (s); /* May need to back up to previous
16269 version. */
16270 if (!ffeimplic_establish_symbol (s))
16271 {
16272 ffesymbol_error (s, t);
16273 return s;
16274 }
16275 ffesymbol_set_info (s,
16276 ffeinfo_new (ffesymbol_basictype (s),
16277 ffesymbol_kindtype (s),
16278 ffesymbol_rank (s),
16279 FFEINFO_kindENTITY,
16280 FFEINFO_whereCONSTANT,
16281 ffesymbol_size (s)));
16282 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
16283 ffesymbol_resolve_intrin (s);
16284 s = ffecom_sym_learned (s);
16285 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16286 }
16287
16288 return s;
16289 }
16290
16291 /* Have FOO in CALL XYZ(...,FOO,...). Does not include any other
16292 embedding of FOO, such as CALL XYZ((FOO)) or CALL XYZ(FOO+1). */
16293
16294 static ffesymbol
16295 ffeexpr_sym_rhs_actualarg_ (ffesymbol s, ffelexToken t)
16296 {
16297 ffesymbolAttrs sa;
16298 ffesymbolAttrs na;
16299 ffeinfoKind kind;
16300 ffeinfoWhere where;
16301 ffesymbolState ns;
16302 bool needs_type = FALSE;
16303
16304 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
16305 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
16306
16307 na = sa = ffesymbol_attrs (s);
16308
16309 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16310 | FFESYMBOL_attrsADJUSTABLE
16311 | FFESYMBOL_attrsANYLEN
16312 | FFESYMBOL_attrsARRAY
16313 | FFESYMBOL_attrsDUMMY
16314 | FFESYMBOL_attrsEXTERNAL
16315 | FFESYMBOL_attrsSFARG
16316 | FFESYMBOL_attrsTYPE)));
16317
16318 kind = ffesymbol_kind (s);
16319 where = ffesymbol_where (s);
16320
16321 /* Figure out what kind of object we've got based on previous declarations
16322 of or references to the object. */
16323
16324 ns = FFESYMBOL_stateUNDERSTOOD;
16325
16326 if (sa & FFESYMBOL_attrsEXTERNAL)
16327 {
16328 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16329 | FFESYMBOL_attrsDUMMY
16330 | FFESYMBOL_attrsEXTERNAL
16331 | FFESYMBOL_attrsTYPE)));
16332
16333 if (sa & FFESYMBOL_attrsTYPE)
16334 where = FFEINFO_whereGLOBAL;
16335 else
16336 /* Not TYPE. */
16337 {
16338 ns = FFESYMBOL_stateUNCERTAIN;
16339
16340 if (sa & FFESYMBOL_attrsDUMMY)
16341 assert (kind == FFEINFO_kindNONE); /* FUNCTION, SUBROUTINE. */
16342 else if (sa & FFESYMBOL_attrsACTUALARG)
16343 ; /* Not DUMMY or TYPE. */
16344 else
16345 /* Not ACTUALARG, DUMMY, or TYPE. */
16346 {
16347 assert (kind == FFEINFO_kindNONE); /* FUNCTION, SUBROUTINE. */
16348 na |= FFESYMBOL_attrsACTUALARG;
16349 where = FFEINFO_whereGLOBAL;
16350 }
16351 }
16352 }
16353 else if (sa & FFESYMBOL_attrsDUMMY)
16354 {
16355 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
16356 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
16357 | FFESYMBOL_attrsEXTERNAL
16358 | FFESYMBOL_attrsTYPE)));
16359
16360 kind = FFEINFO_kindENTITY;
16361 if (!(sa & FFESYMBOL_attrsTYPE))
16362 needs_type = TRUE;
16363 }
16364 else if (sa & FFESYMBOL_attrsARRAY)
16365 {
16366 assert (!(sa & ~(FFESYMBOL_attrsARRAY
16367 | FFESYMBOL_attrsADJUSTABLE
16368 | FFESYMBOL_attrsTYPE)));
16369
16370 where = FFEINFO_whereLOCAL;
16371 }
16372 else if (sa & FFESYMBOL_attrsSFARG)
16373 {
16374 assert (!(sa & ~(FFESYMBOL_attrsSFARG
16375 | FFESYMBOL_attrsTYPE)));
16376
16377 where = FFEINFO_whereLOCAL;
16378 }
16379 else if (sa & FFESYMBOL_attrsTYPE)
16380 {
16381 assert (!(sa & (FFESYMBOL_attrsARRAY
16382 | FFESYMBOL_attrsDUMMY
16383 | FFESYMBOL_attrsEXTERNAL
16384 | FFESYMBOL_attrsSFARG))); /* Handled above. */
16385 assert (!(sa & ~(FFESYMBOL_attrsTYPE
16386 | FFESYMBOL_attrsADJUSTABLE
16387 | FFESYMBOL_attrsANYLEN
16388 | FFESYMBOL_attrsARRAY
16389 | FFESYMBOL_attrsDUMMY
16390 | FFESYMBOL_attrsEXTERNAL
16391 | FFESYMBOL_attrsSFARG)));
16392
16393 if (sa & FFESYMBOL_attrsANYLEN)
16394 ns = FFESYMBOL_stateNONE;
16395 else
16396 {
16397 kind = FFEINFO_kindENTITY;
16398 where = FFEINFO_whereLOCAL;
16399 }
16400 }
16401 else if (sa == FFESYMBOL_attrsetNONE)
16402 {
16403 /* New state is left empty because there isn't any state flag to
16404 set for this case, and it's UNDERSTOOD after all. */
16405 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
16406 kind = FFEINFO_kindENTITY;
16407 where = FFEINFO_whereLOCAL;
16408 needs_type = TRUE;
16409 }
16410 else
16411 ns = FFESYMBOL_stateNONE; /* Error. */
16412
16413 /* Now see what we've got for a new object: NONE means a new error cropped
16414 up; ANY means an old error to be ignored; otherwise, everything's ok,
16415 update the object (symbol) and continue on. */
16416
16417 if (ns == FFESYMBOL_stateNONE)
16418 ffesymbol_error (s, t);
16419 else if (!(na & FFESYMBOL_attrsANY))
16420 {
16421 ffesymbol_signal_change (s); /* May need to back up to previous
16422 version. */
16423 if (needs_type && !ffeimplic_establish_symbol (s))
16424 {
16425 ffesymbol_error (s, t);
16426 return s;
16427 }
16428 ffesymbol_set_info (s,
16429 ffeinfo_new (ffesymbol_basictype (s),
16430 ffesymbol_kindtype (s),
16431 ffesymbol_rank (s),
16432 kind,
16433 where,
16434 ffesymbol_size (s)));
16435 ffesymbol_set_attrs (s, na);
16436 ffesymbol_set_state (s, ns);
16437 s = ffecom_sym_learned (s);
16438 ffesymbol_reference (s, t, FALSE);
16439 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16440 }
16441
16442 return s;
16443 }
16444
16445 /* Have FOO in DIMENSION XYZ(FOO) or any array declarator containing
16446 a reference to FOO. */
16447
16448 static ffesymbol
16449 ffeexpr_sym_rhs_dimlist_ (ffesymbol s, ffelexToken t)
16450 {
16451 ffesymbolAttrs sa;
16452 ffesymbolAttrs na;
16453 ffeinfoKind kind;
16454 ffeinfoWhere where;
16455
16456 na = sa = ffesymbol_attrs (s);
16457 kind = FFEINFO_kindENTITY;
16458 where = ffesymbol_where (s);
16459
16460 /* Figure out what kind of object we've got based on previous declarations
16461 of or references to the object. */
16462
16463 if (!(sa & ~(FFESYMBOL_attrsADJUSTS
16464 | FFESYMBOL_attrsCOMMON
16465 | FFESYMBOL_attrsDUMMY
16466 | FFESYMBOL_attrsEQUIV
16467 | FFESYMBOL_attrsINIT
16468 | FFESYMBOL_attrsNAMELIST
16469 | FFESYMBOL_attrsSFARG
16470 | FFESYMBOL_attrsARRAY
16471 | FFESYMBOL_attrsTYPE)))
16472 na = sa | FFESYMBOL_attrsADJUSTS;
16473 else
16474 na = FFESYMBOL_attrsetNONE;
16475
16476 /* Since this symbol definitely is going into an expression (the
16477 dimension-list for some dummy array, presumably), figure out WHERE if
16478 possible. */
16479
16480 if (where == FFEINFO_whereNONE)
16481 {
16482 if (na & (FFESYMBOL_attrsCOMMON
16483 | FFESYMBOL_attrsEQUIV
16484 | FFESYMBOL_attrsINIT
16485 | FFESYMBOL_attrsNAMELIST))
16486 where = FFEINFO_whereCOMMON;
16487 else if (na & FFESYMBOL_attrsDUMMY)
16488 where = FFEINFO_whereDUMMY;
16489 }
16490
16491 /* Now see what we've got for a new object: NONE means a new error cropped
16492 up; ANY means an old error to be ignored; otherwise, everything's ok,
16493 update the object (symbol) and continue on. */
16494
16495 if (na == FFESYMBOL_attrsetNONE)
16496 ffesymbol_error (s, t);
16497 else if (!(na & FFESYMBOL_attrsANY))
16498 {
16499 ffesymbol_signal_change (s); /* May need to back up to previous
16500 version. */
16501 if (!ffeimplic_establish_symbol (s))
16502 {
16503 ffesymbol_error (s, t);
16504 return s;
16505 }
16506 ffesymbol_set_info (s,
16507 ffeinfo_new (ffesymbol_basictype (s),
16508 ffesymbol_kindtype (s),
16509 ffesymbol_rank (s),
16510 kind, /* Always ENTITY. */
16511 where, /* NONE, COMMON, or DUMMY. */
16512 ffesymbol_size (s)));
16513 ffesymbol_set_attrs (s, na);
16514 ffesymbol_set_state (s, FFESYMBOL_stateSEEN);
16515 ffesymbol_resolve_intrin (s);
16516 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16517 }
16518
16519 return s;
16520 }
16521
16522 /* Have FOO in XYZ = ...FOO.... Does not include cases like FOO in
16523 XYZ = BAR(FOO), as such cases are handled elsewhere. */
16524
16525 static ffesymbol
16526 ffeexpr_sym_rhs_let_ (ffesymbol s, ffelexToken t)
16527 {
16528 ffesymbolAttrs sa;
16529 ffesymbolAttrs na;
16530 ffeinfoKind kind;
16531 ffeinfoWhere where;
16532 bool error = FALSE;
16533
16534 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
16535 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
16536
16537 na = sa = ffesymbol_attrs (s);
16538
16539 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16540 | FFESYMBOL_attrsADJUSTABLE
16541 | FFESYMBOL_attrsANYLEN
16542 | FFESYMBOL_attrsARRAY
16543 | FFESYMBOL_attrsDUMMY
16544 | FFESYMBOL_attrsEXTERNAL
16545 | FFESYMBOL_attrsSFARG
16546 | FFESYMBOL_attrsTYPE)));
16547
16548 kind = ffesymbol_kind (s);
16549 where = ffesymbol_where (s);
16550
16551 /* Figure out what kind of object we've got based on previous declarations
16552 of or references to the object. */
16553
16554 if (sa & FFESYMBOL_attrsEXTERNAL)
16555 {
16556 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
16557 | FFESYMBOL_attrsDUMMY
16558 | FFESYMBOL_attrsEXTERNAL
16559 | FFESYMBOL_attrsTYPE)));
16560
16561 error = TRUE;
16562 }
16563 else if (sa & FFESYMBOL_attrsDUMMY)
16564 {
16565 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
16566 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
16567 | FFESYMBOL_attrsEXTERNAL
16568 | FFESYMBOL_attrsTYPE)));
16569
16570 kind = FFEINFO_kindENTITY;
16571 }
16572 else if (sa & FFESYMBOL_attrsARRAY)
16573 {
16574 assert (!(sa & ~(FFESYMBOL_attrsARRAY
16575 | FFESYMBOL_attrsADJUSTABLE
16576 | FFESYMBOL_attrsTYPE)));
16577
16578 where = FFEINFO_whereLOCAL;
16579 }
16580 else if (sa & FFESYMBOL_attrsSFARG)
16581 {
16582 assert (!(sa & ~(FFESYMBOL_attrsSFARG
16583 | FFESYMBOL_attrsTYPE)));
16584
16585 where = FFEINFO_whereLOCAL;
16586 }
16587 else if (sa & FFESYMBOL_attrsTYPE)
16588 {
16589 assert (!(sa & (FFESYMBOL_attrsARRAY
16590 | FFESYMBOL_attrsDUMMY
16591 | FFESYMBOL_attrsEXTERNAL
16592 | FFESYMBOL_attrsSFARG))); /* Handled above. */
16593 assert (!(sa & ~(FFESYMBOL_attrsTYPE
16594 | FFESYMBOL_attrsADJUSTABLE
16595 | FFESYMBOL_attrsANYLEN
16596 | FFESYMBOL_attrsARRAY
16597 | FFESYMBOL_attrsDUMMY
16598 | FFESYMBOL_attrsEXTERNAL
16599 | FFESYMBOL_attrsSFARG)));
16600
16601 if (sa & FFESYMBOL_attrsANYLEN)
16602 error = TRUE;
16603 else
16604 {
16605 kind = FFEINFO_kindENTITY;
16606 where = FFEINFO_whereLOCAL;
16607 }
16608 }
16609 else if (sa == FFESYMBOL_attrsetNONE)
16610 {
16611 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
16612 kind = FFEINFO_kindENTITY;
16613 where = FFEINFO_whereLOCAL;
16614 }
16615 else
16616 error = TRUE;
16617
16618 /* Now see what we've got for a new object: NONE means a new error cropped
16619 up; ANY means an old error to be ignored; otherwise, everything's ok,
16620 update the object (symbol) and continue on. */
16621
16622 if (error)
16623 ffesymbol_error (s, t);
16624 else if (!(na & FFESYMBOL_attrsANY))
16625 {
16626 ffesymbol_signal_change (s); /* May need to back up to previous
16627 version. */
16628 if (!ffeimplic_establish_symbol (s))
16629 {
16630 ffesymbol_error (s, t);
16631 return s;
16632 }
16633 ffesymbol_set_info (s,
16634 ffeinfo_new (ffesymbol_basictype (s),
16635 ffesymbol_kindtype (s),
16636 ffesymbol_rank (s),
16637 kind, /* ENTITY. */
16638 where, /* LOCAL. */
16639 ffesymbol_size (s)));
16640 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
16641 ffesymbol_resolve_intrin (s);
16642 s = ffecom_sym_learned (s);
16643 ffesymbol_signal_unreported (s); /* For debugging purposes. */
16644 }
16645
16646 return s;
16647 }
16648
16649 /* ffeexpr_declare_parenthesized_ -- ffesymbol wrapper for NAME(...) operand
16650
16651 ffelexToken t;
16652 bool maybe_intrin;
16653 ffeexprParenType_ paren_type;
16654 ffesymbol s;
16655 s = ffeexpr_declare_parenthesized_ (t, maybe_intrin, &paren_type);
16656
16657 Just like ffesymbol_declare_local, except performs any implicit info
16658 assignment necessary, and it returns the type of the parenthesized list
16659 (list of function args, list of array args, or substring spec). */
16660
16661 static ffesymbol
16662 ffeexpr_declare_parenthesized_ (ffelexToken t, bool maybe_intrin,
16663 ffeexprParenType_ *paren_type)
16664 {
16665 ffesymbol s;
16666 ffesymbolState st; /* Effective state. */
16667 ffeinfoKind k;
16668 bool bad;
16669
16670 if (maybe_intrin && ffesrc_check_symbol ())
16671 { /* Knock off some easy cases. */
16672 switch (ffeexpr_stack_->context)
16673 {
16674 case FFEEXPR_contextSUBROUTINEREF:
16675 case FFEEXPR_contextDATA:
16676 case FFEEXPR_contextDATAIMPDOINDEX_:
16677 case FFEEXPR_contextSFUNCDEF:
16678 case FFEEXPR_contextSFUNCDEFINDEX_:
16679 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
16680 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
16681 case FFEEXPR_contextLET:
16682 case FFEEXPR_contextPAREN_:
16683 case FFEEXPR_contextACTUALARGEXPR_:
16684 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
16685 case FFEEXPR_contextIOLIST:
16686 case FFEEXPR_contextIOLISTDF:
16687 case FFEEXPR_contextDO:
16688 case FFEEXPR_contextDOWHILE:
16689 case FFEEXPR_contextACTUALARG_:
16690 case FFEEXPR_contextCGOTO:
16691 case FFEEXPR_contextIF:
16692 case FFEEXPR_contextARITHIF:
16693 case FFEEXPR_contextFORMAT:
16694 case FFEEXPR_contextSTOP:
16695 case FFEEXPR_contextRETURN:
16696 case FFEEXPR_contextSELECTCASE:
16697 case FFEEXPR_contextCASE:
16698 case FFEEXPR_contextFILEASSOC:
16699 case FFEEXPR_contextFILEINT:
16700 case FFEEXPR_contextFILEDFINT:
16701 case FFEEXPR_contextFILELOG:
16702 case FFEEXPR_contextFILENUM:
16703 case FFEEXPR_contextFILENUMAMBIG:
16704 case FFEEXPR_contextFILECHAR:
16705 case FFEEXPR_contextFILENUMCHAR:
16706 case FFEEXPR_contextFILEDFCHAR:
16707 case FFEEXPR_contextFILEKEY:
16708 case FFEEXPR_contextFILEUNIT:
16709 case FFEEXPR_contextFILEUNIT_DF:
16710 case FFEEXPR_contextFILEUNITAMBIG:
16711 case FFEEXPR_contextFILEFORMAT:
16712 case FFEEXPR_contextFILENAMELIST:
16713 case FFEEXPR_contextFILEVXTCODE:
16714 case FFEEXPR_contextINDEX_:
16715 case FFEEXPR_contextIMPDOITEM_:
16716 case FFEEXPR_contextIMPDOITEMDF_:
16717 case FFEEXPR_contextIMPDOCTRL_:
16718 case FFEEXPR_contextDATAIMPDOCTRL_:
16719 case FFEEXPR_contextCHARACTERSIZE:
16720 case FFEEXPR_contextPARAMETER:
16721 case FFEEXPR_contextDIMLIST:
16722 case FFEEXPR_contextDIMLISTCOMMON:
16723 case FFEEXPR_contextKINDTYPE:
16724 case FFEEXPR_contextINITVAL:
16725 case FFEEXPR_contextEQVINDEX_:
16726 break; /* These could be intrinsic invocations. */
16727
16728 case FFEEXPR_contextAGOTO:
16729 case FFEEXPR_contextFILEFORMATNML:
16730 case FFEEXPR_contextALLOCATE:
16731 case FFEEXPR_contextDEALLOCATE:
16732 case FFEEXPR_contextHEAPSTAT:
16733 case FFEEXPR_contextNULLIFY:
16734 case FFEEXPR_contextINCLUDE:
16735 case FFEEXPR_contextDATAIMPDOITEM_:
16736 case FFEEXPR_contextLOC_:
16737 case FFEEXPR_contextINDEXORACTUALARG_:
16738 case FFEEXPR_contextSFUNCDEFACTUALARG_:
16739 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
16740 case FFEEXPR_contextPARENFILENUM_:
16741 case FFEEXPR_contextPARENFILEUNIT_:
16742 maybe_intrin = FALSE;
16743 break; /* Can't be intrinsic invocation. */
16744
16745 default:
16746 assert ("blah! blah! waaauuggh!" == NULL);
16747 break;
16748 }
16749 }
16750
16751 s = ffesymbol_declare_local (t, maybe_intrin);
16752
16753 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
16754 /* Special-case these since they can involve a different concept
16755 of "state" (in the stmtfunc name space). */
16756 {
16757 case FFEEXPR_contextDATAIMPDOINDEX_:
16758 case FFEEXPR_contextDATAIMPDOCTRL_:
16759 if (ffeexpr_context_outer_ (ffeexpr_stack_)
16760 == FFEEXPR_contextDATAIMPDOINDEX_)
16761 s = ffeexpr_sym_impdoitem_ (s, t);
16762 else
16763 if (ffeexpr_stack_->is_rhs)
16764 s = ffeexpr_sym_impdoitem_ (s, t);
16765 else
16766 s = ffeexpr_sym_lhs_impdoctrl_ (s, t);
16767 if (ffesymbol_kind (s) != FFEINFO_kindANY)
16768 ffesymbol_error (s, t);
16769 return s;
16770
16771 default:
16772 break;
16773 }
16774
16775 switch ((ffesymbol_sfdummyparent (s) == NULL)
16776 ? ffesymbol_state (s)
16777 : FFESYMBOL_stateUNDERSTOOD)
16778 {
16779 case FFESYMBOL_stateNONE: /* Before first exec, not seen in expr
16780 context. */
16781 if (!ffest_seen_first_exec ())
16782 goto seen; /* :::::::::::::::::::: */
16783 /* Fall through. */
16784 case FFESYMBOL_stateUNCERTAIN: /* Unseen since first exec. */
16785 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
16786 {
16787 case FFEEXPR_contextSUBROUTINEREF:
16788 s = ffeexpr_sym_lhs_call_ (s, t); /* "CALL FOO"=="CALL
16789 FOO(...)". */
16790 break;
16791
16792 case FFEEXPR_contextDATA:
16793 if (ffeexpr_stack_->is_rhs)
16794 s = ffeexpr_sym_rhs_let_ (s, t);
16795 else
16796 s = ffeexpr_sym_lhs_data_ (s, t);
16797 break;
16798
16799 case FFEEXPR_contextDATAIMPDOITEM_:
16800 s = ffeexpr_sym_lhs_data_ (s, t);
16801 break;
16802
16803 case FFEEXPR_contextSFUNCDEF:
16804 case FFEEXPR_contextSFUNCDEFINDEX_:
16805 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
16806 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
16807 s = ffecom_sym_exec_transition (s);
16808 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
16809 goto understood; /* :::::::::::::::::::: */
16810 /* Fall through. */
16811 case FFEEXPR_contextLET:
16812 case FFEEXPR_contextPAREN_:
16813 case FFEEXPR_contextACTUALARGEXPR_:
16814 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
16815 case FFEEXPR_contextIOLIST:
16816 case FFEEXPR_contextIOLISTDF:
16817 case FFEEXPR_contextDO:
16818 case FFEEXPR_contextDOWHILE:
16819 case FFEEXPR_contextACTUALARG_:
16820 case FFEEXPR_contextCGOTO:
16821 case FFEEXPR_contextIF:
16822 case FFEEXPR_contextARITHIF:
16823 case FFEEXPR_contextFORMAT:
16824 case FFEEXPR_contextSTOP:
16825 case FFEEXPR_contextRETURN:
16826 case FFEEXPR_contextSELECTCASE:
16827 case FFEEXPR_contextCASE:
16828 case FFEEXPR_contextFILEASSOC:
16829 case FFEEXPR_contextFILEINT:
16830 case FFEEXPR_contextFILEDFINT:
16831 case FFEEXPR_contextFILELOG:
16832 case FFEEXPR_contextFILENUM:
16833 case FFEEXPR_contextFILENUMAMBIG:
16834 case FFEEXPR_contextFILECHAR:
16835 case FFEEXPR_contextFILENUMCHAR:
16836 case FFEEXPR_contextFILEDFCHAR:
16837 case FFEEXPR_contextFILEKEY:
16838 case FFEEXPR_contextFILEUNIT:
16839 case FFEEXPR_contextFILEUNIT_DF:
16840 case FFEEXPR_contextFILEUNITAMBIG:
16841 case FFEEXPR_contextFILEFORMAT:
16842 case FFEEXPR_contextFILENAMELIST:
16843 case FFEEXPR_contextFILEVXTCODE:
16844 case FFEEXPR_contextINDEX_:
16845 case FFEEXPR_contextIMPDOITEM_:
16846 case FFEEXPR_contextIMPDOITEMDF_:
16847 case FFEEXPR_contextIMPDOCTRL_:
16848 case FFEEXPR_contextLOC_:
16849 if (ffeexpr_stack_->is_rhs)
16850 s = ffeexpr_paren_rhs_let_ (s, t);
16851 else
16852 s = ffeexpr_paren_lhs_let_ (s, t);
16853 break;
16854
16855 case FFEEXPR_contextASSIGN:
16856 case FFEEXPR_contextAGOTO:
16857 case FFEEXPR_contextCHARACTERSIZE:
16858 case FFEEXPR_contextEQUIVALENCE:
16859 case FFEEXPR_contextINCLUDE:
16860 case FFEEXPR_contextPARAMETER:
16861 case FFEEXPR_contextDIMLIST:
16862 case FFEEXPR_contextDIMLISTCOMMON:
16863 case FFEEXPR_contextKINDTYPE:
16864 case FFEEXPR_contextINITVAL:
16865 case FFEEXPR_contextEQVINDEX_:
16866 break; /* Will turn into errors below. */
16867
16868 default:
16869 ffesymbol_error (s, t);
16870 break;
16871 }
16872 /* Fall through. */
16873 case FFESYMBOL_stateUNDERSTOOD: /* Nothing much more to learn. */
16874 understood: /* :::::::::::::::::::: */
16875
16876 /* State might have changed, update it. */
16877 st = ((ffesymbol_sfdummyparent (s) == NULL)
16878 ? ffesymbol_state (s)
16879 : FFESYMBOL_stateUNDERSTOOD);
16880
16881 k = ffesymbol_kind (s);
16882 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
16883 {
16884 case FFEEXPR_contextSUBROUTINEREF:
16885 bad = ((k != FFEINFO_kindSUBROUTINE)
16886 && ((ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
16887 || (k != FFEINFO_kindNONE)));
16888 break;
16889
16890 case FFEEXPR_contextDATA:
16891 if (ffeexpr_stack_->is_rhs)
16892 bad = (k != FFEINFO_kindENTITY)
16893 || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
16894 else
16895 bad = (k != FFEINFO_kindENTITY)
16896 || ((ffesymbol_where (s) != FFEINFO_whereNONE)
16897 && (ffesymbol_where (s) != FFEINFO_whereLOCAL)
16898 && (ffesymbol_where (s) != FFEINFO_whereCOMMON));
16899 break;
16900
16901 case FFEEXPR_contextDATAIMPDOITEM_:
16902 bad = (k != FFEINFO_kindENTITY) || (ffesymbol_rank (s) == 0)
16903 || ((ffesymbol_where (s) != FFEINFO_whereNONE)
16904 && (ffesymbol_where (s) != FFEINFO_whereLOCAL)
16905 && (ffesymbol_where (s) != FFEINFO_whereCOMMON));
16906 break;
16907
16908 case FFEEXPR_contextSFUNCDEF:
16909 case FFEEXPR_contextSFUNCDEFINDEX_:
16910 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
16911 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
16912 case FFEEXPR_contextLET:
16913 case FFEEXPR_contextPAREN_:
16914 case FFEEXPR_contextACTUALARGEXPR_:
16915 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
16916 case FFEEXPR_contextIOLIST:
16917 case FFEEXPR_contextIOLISTDF:
16918 case FFEEXPR_contextDO:
16919 case FFEEXPR_contextDOWHILE:
16920 case FFEEXPR_contextACTUALARG_:
16921 case FFEEXPR_contextCGOTO:
16922 case FFEEXPR_contextIF:
16923 case FFEEXPR_contextARITHIF:
16924 case FFEEXPR_contextFORMAT:
16925 case FFEEXPR_contextSTOP:
16926 case FFEEXPR_contextRETURN:
16927 case FFEEXPR_contextSELECTCASE:
16928 case FFEEXPR_contextCASE:
16929 case FFEEXPR_contextFILEASSOC:
16930 case FFEEXPR_contextFILEINT:
16931 case FFEEXPR_contextFILEDFINT:
16932 case FFEEXPR_contextFILELOG:
16933 case FFEEXPR_contextFILENUM:
16934 case FFEEXPR_contextFILENUMAMBIG:
16935 case FFEEXPR_contextFILECHAR:
16936 case FFEEXPR_contextFILENUMCHAR:
16937 case FFEEXPR_contextFILEDFCHAR:
16938 case FFEEXPR_contextFILEKEY:
16939 case FFEEXPR_contextFILEUNIT:
16940 case FFEEXPR_contextFILEUNIT_DF:
16941 case FFEEXPR_contextFILEUNITAMBIG:
16942 case FFEEXPR_contextFILEFORMAT:
16943 case FFEEXPR_contextFILENAMELIST:
16944 case FFEEXPR_contextFILEVXTCODE:
16945 case FFEEXPR_contextINDEX_:
16946 case FFEEXPR_contextIMPDOITEM_:
16947 case FFEEXPR_contextIMPDOITEMDF_:
16948 case FFEEXPR_contextIMPDOCTRL_:
16949 case FFEEXPR_contextLOC_:
16950 bad = FALSE; /* Let paren-switch handle the cases. */
16951 break;
16952
16953 case FFEEXPR_contextASSIGN:
16954 case FFEEXPR_contextAGOTO:
16955 case FFEEXPR_contextCHARACTERSIZE:
16956 case FFEEXPR_contextEQUIVALENCE:
16957 case FFEEXPR_contextPARAMETER:
16958 case FFEEXPR_contextDIMLIST:
16959 case FFEEXPR_contextDIMLISTCOMMON:
16960 case FFEEXPR_contextKINDTYPE:
16961 case FFEEXPR_contextINITVAL:
16962 case FFEEXPR_contextEQVINDEX_:
16963 bad = (k != FFEINFO_kindENTITY)
16964 || (ffesymbol_where (s) != FFEINFO_whereCONSTANT);
16965 break;
16966
16967 case FFEEXPR_contextINCLUDE:
16968 bad = TRUE;
16969 break;
16970
16971 default:
16972 bad = TRUE;
16973 break;
16974 }
16975
16976 switch (bad ? FFEINFO_kindANY : k)
16977 {
16978 case FFEINFO_kindNONE: /* Case "CHARACTER X,Y; Y=X(?". */
16979 if (ffesymbol_where (s) == FFEINFO_whereINTRINSIC)
16980 {
16981 if (ffeexpr_context_outer_ (ffeexpr_stack_)
16982 == FFEEXPR_contextSUBROUTINEREF)
16983 *paren_type = FFEEXPR_parentypeSUBROUTINE_;
16984 else
16985 *paren_type = FFEEXPR_parentypeFUNCTION_;
16986 break;
16987 }
16988 if (st == FFESYMBOL_stateUNDERSTOOD)
16989 {
16990 bad = TRUE;
16991 *paren_type = FFEEXPR_parentypeANY_;
16992 }
16993 else
16994 *paren_type = FFEEXPR_parentypeFUNSUBSTR_;
16995 break;
16996
16997 case FFEINFO_kindFUNCTION:
16998 *paren_type = FFEEXPR_parentypeFUNCTION_;
16999 switch (ffesymbol_where (s))
17000 {
17001 case FFEINFO_whereLOCAL:
17002 bad = TRUE; /* Attempt to recurse! */
17003 break;
17004
17005 case FFEINFO_whereCONSTANT:
17006 bad = ((ffesymbol_sfexpr (s) == NULL)
17007 || (ffebld_op (ffesymbol_sfexpr (s))
17008 == FFEBLD_opANY)); /* Attempt to recurse! */
17009 break;
17010
17011 default:
17012 break;
17013 }
17014 break;
17015
17016 case FFEINFO_kindSUBROUTINE:
17017 if ((ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
17018 || (ffeexpr_stack_->previous != NULL))
17019 {
17020 bad = TRUE;
17021 *paren_type = FFEEXPR_parentypeANY_;
17022 break;
17023 }
17024
17025 *paren_type = FFEEXPR_parentypeSUBROUTINE_;
17026 switch (ffesymbol_where (s))
17027 {
17028 case FFEINFO_whereLOCAL:
17029 case FFEINFO_whereCONSTANT:
17030 bad = TRUE; /* Attempt to recurse! */
17031 break;
17032
17033 default:
17034 break;
17035 }
17036 break;
17037
17038 case FFEINFO_kindENTITY:
17039 if (ffesymbol_rank (s) == 0)
17040 {
17041 if (ffesymbol_basictype (s) == FFEINFO_basictypeCHARACTER)
17042 *paren_type = FFEEXPR_parentypeSUBSTRING_;
17043 else
17044 {
17045 bad = TRUE;
17046 *paren_type = FFEEXPR_parentypeANY_;
17047 }
17048 }
17049 else
17050 *paren_type = FFEEXPR_parentypeARRAY_;
17051 break;
17052
17053 default:
17054 case FFEINFO_kindANY:
17055 bad = TRUE;
17056 *paren_type = FFEEXPR_parentypeANY_;
17057 break;
17058 }
17059
17060 if (bad)
17061 {
17062 if (k == FFEINFO_kindANY)
17063 ffest_shutdown ();
17064 else
17065 ffesymbol_error (s, t);
17066 }
17067
17068 return s;
17069
17070 case FFESYMBOL_stateSEEN: /* Seen but not yet in exec portion. */
17071 seen: /* :::::::::::::::::::: */
17072 bad = TRUE;
17073 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
17074 {
17075 case FFEEXPR_contextPARAMETER:
17076 if (ffeexpr_stack_->is_rhs)
17077 ffesymbol_error (s, t);
17078 else
17079 s = ffeexpr_sym_lhs_parameter_ (s, t);
17080 break;
17081
17082 case FFEEXPR_contextDATA:
17083 s = ffecom_sym_exec_transition (s);
17084 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
17085 goto understood; /* :::::::::::::::::::: */
17086 if (ffeexpr_stack_->is_rhs)
17087 ffesymbol_error (s, t);
17088 else
17089 s = ffeexpr_sym_lhs_data_ (s, t);
17090 goto understood; /* :::::::::::::::::::: */
17091
17092 case FFEEXPR_contextDATAIMPDOITEM_:
17093 s = ffecom_sym_exec_transition (s);
17094 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
17095 goto understood; /* :::::::::::::::::::: */
17096 s = ffeexpr_sym_lhs_data_ (s, t);
17097 goto understood; /* :::::::::::::::::::: */
17098
17099 case FFEEXPR_contextEQUIVALENCE:
17100 s = ffeexpr_sym_lhs_equivalence_ (s, t);
17101 bad = FALSE;
17102 break;
17103
17104 case FFEEXPR_contextDIMLIST:
17105 s = ffeexpr_sym_rhs_dimlist_ (s, t);
17106 bad = FALSE;
17107 break;
17108
17109 case FFEEXPR_contextCHARACTERSIZE:
17110 case FFEEXPR_contextKINDTYPE:
17111 case FFEEXPR_contextDIMLISTCOMMON:
17112 case FFEEXPR_contextINITVAL:
17113 case FFEEXPR_contextEQVINDEX_:
17114 break;
17115
17116 case FFEEXPR_contextINCLUDE:
17117 break;
17118
17119 case FFEEXPR_contextINDEX_:
17120 case FFEEXPR_contextACTUALARGEXPR_:
17121 case FFEEXPR_contextINDEXORACTUALARGEXPR_:
17122 case FFEEXPR_contextSFUNCDEF:
17123 case FFEEXPR_contextSFUNCDEFINDEX_:
17124 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
17125 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
17126 assert (ffeexpr_stack_->is_rhs);
17127 s = ffecom_sym_exec_transition (s);
17128 if (ffesymbol_state (s) == FFESYMBOL_stateUNDERSTOOD)
17129 goto understood; /* :::::::::::::::::::: */
17130 s = ffeexpr_paren_rhs_let_ (s, t);
17131 goto understood; /* :::::::::::::::::::: */
17132
17133 default:
17134 break;
17135 }
17136 k = ffesymbol_kind (s);
17137 switch (bad ? FFEINFO_kindANY : k)
17138 {
17139 case FFEINFO_kindNONE: /* Case "CHARACTER X,Y; Y=X(?". */
17140 *paren_type = FFEEXPR_parentypeFUNSUBSTR_;
17141 break;
17142
17143 case FFEINFO_kindFUNCTION:
17144 *paren_type = FFEEXPR_parentypeFUNCTION_;
17145 switch (ffesymbol_where (s))
17146 {
17147 case FFEINFO_whereLOCAL:
17148 bad = TRUE; /* Attempt to recurse! */
17149 break;
17150
17151 case FFEINFO_whereCONSTANT:
17152 bad = ((ffesymbol_sfexpr (s) == NULL)
17153 || (ffebld_op (ffesymbol_sfexpr (s))
17154 == FFEBLD_opANY)); /* Attempt to recurse! */
17155 break;
17156
17157 default:
17158 break;
17159 }
17160 break;
17161
17162 case FFEINFO_kindSUBROUTINE:
17163 *paren_type = FFEEXPR_parentypeANY_;
17164 bad = TRUE; /* Cannot possibly be in
17165 contextSUBROUTINEREF. */
17166 break;
17167
17168 case FFEINFO_kindENTITY:
17169 if (ffesymbol_rank (s) == 0)
17170 {
17171 if (ffeexpr_stack_->context == FFEEXPR_contextEQUIVALENCE)
17172 *paren_type = FFEEXPR_parentypeEQUIVALENCE_;
17173 else if (ffesymbol_basictype (s) == FFEINFO_basictypeCHARACTER)
17174 *paren_type = FFEEXPR_parentypeSUBSTRING_;
17175 else
17176 {
17177 bad = TRUE;
17178 *paren_type = FFEEXPR_parentypeANY_;
17179 }
17180 }
17181 else
17182 *paren_type = FFEEXPR_parentypeARRAY_;
17183 break;
17184
17185 default:
17186 case FFEINFO_kindANY:
17187 bad = TRUE;
17188 *paren_type = FFEEXPR_parentypeANY_;
17189 break;
17190 }
17191
17192 if (bad)
17193 {
17194 if (k == FFEINFO_kindANY)
17195 ffest_shutdown ();
17196 else
17197 ffesymbol_error (s, t);
17198 }
17199
17200 return s;
17201
17202 default:
17203 assert ("bad symbol state" == NULL);
17204 return NULL;
17205 }
17206 }
17207
17208 /* Have FOO in XYZ = ...FOO(...).... Executable context only. */
17209
17210 static ffesymbol
17211 ffeexpr_paren_rhs_let_ (ffesymbol s, ffelexToken t)
17212 {
17213 ffesymbolAttrs sa;
17214 ffesymbolAttrs na;
17215 ffeinfoKind kind;
17216 ffeinfoWhere where;
17217 ffeintrinGen gen;
17218 ffeintrinSpec spec;
17219 ffeintrinImp imp;
17220 bool maybe_ambig = FALSE;
17221 bool error = FALSE;
17222
17223 assert ((ffesymbol_state (s) == FFESYMBOL_stateNONE)
17224 || (ffesymbol_state (s) == FFESYMBOL_stateUNCERTAIN));
17225
17226 na = sa = ffesymbol_attrs (s);
17227
17228 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
17229 | FFESYMBOL_attrsADJUSTABLE
17230 | FFESYMBOL_attrsANYLEN
17231 | FFESYMBOL_attrsARRAY
17232 | FFESYMBOL_attrsDUMMY
17233 | FFESYMBOL_attrsEXTERNAL
17234 | FFESYMBOL_attrsSFARG
17235 | FFESYMBOL_attrsTYPE)));
17236
17237 kind = ffesymbol_kind (s);
17238 where = ffesymbol_where (s);
17239
17240 /* Figure out what kind of object we've got based on previous declarations
17241 of or references to the object. */
17242
17243 if (sa & FFESYMBOL_attrsEXTERNAL)
17244 {
17245 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
17246 | FFESYMBOL_attrsDUMMY
17247 | FFESYMBOL_attrsEXTERNAL
17248 | FFESYMBOL_attrsTYPE)));
17249
17250 if (sa & FFESYMBOL_attrsTYPE)
17251 where = FFEINFO_whereGLOBAL;
17252 else
17253 /* Not TYPE. */
17254 {
17255 kind = FFEINFO_kindFUNCTION;
17256
17257 if (sa & FFESYMBOL_attrsDUMMY)
17258 ; /* Not TYPE. */
17259 else if (sa & FFESYMBOL_attrsACTUALARG)
17260 ; /* Not DUMMY or TYPE. */
17261 else /* Not ACTUALARG, DUMMY, or TYPE. */
17262 where = FFEINFO_whereGLOBAL;
17263 }
17264 }
17265 else if (sa & FFESYMBOL_attrsDUMMY)
17266 {
17267 assert (!(sa & FFESYMBOL_attrsEXTERNAL)); /* Handled above. */
17268 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
17269 | FFESYMBOL_attrsEXTERNAL
17270 | FFESYMBOL_attrsTYPE)));
17271
17272 kind = FFEINFO_kindFUNCTION;
17273 maybe_ambig = TRUE; /* If basictypeCHARACTER, can't be sure; kind
17274 could be ENTITY w/substring ref. */
17275 }
17276 else if (sa & FFESYMBOL_attrsARRAY)
17277 {
17278 assert (!(sa & ~(FFESYMBOL_attrsARRAY
17279 | FFESYMBOL_attrsADJUSTABLE
17280 | FFESYMBOL_attrsTYPE)));
17281
17282 where = FFEINFO_whereLOCAL;
17283 }
17284 else if (sa & FFESYMBOL_attrsSFARG)
17285 {
17286 assert (!(sa & ~(FFESYMBOL_attrsSFARG
17287 | FFESYMBOL_attrsTYPE)));
17288
17289 where = FFEINFO_whereLOCAL; /* Actually an error, but at least we
17290 know it's a local var. */
17291 }
17292 else if (sa & FFESYMBOL_attrsTYPE)
17293 {
17294 assert (!(sa & (FFESYMBOL_attrsARRAY
17295 | FFESYMBOL_attrsDUMMY
17296 | FFESYMBOL_attrsEXTERNAL
17297 | FFESYMBOL_attrsSFARG))); /* Handled above. */
17298 assert (!(sa & ~(FFESYMBOL_attrsTYPE
17299 | FFESYMBOL_attrsADJUSTABLE
17300 | FFESYMBOL_attrsANYLEN
17301 | FFESYMBOL_attrsARRAY
17302 | FFESYMBOL_attrsDUMMY
17303 | FFESYMBOL_attrsEXTERNAL
17304 | FFESYMBOL_attrsSFARG)));
17305
17306 if (ffeintrin_is_intrinsic (ffesymbol_text (s), t, FALSE,
17307 &gen, &spec, &imp))
17308 {
17309 if (!(sa & FFESYMBOL_attrsANYLEN)
17310 && (ffeimplic_peek_symbol_type (s, NULL)
17311 == FFEINFO_basictypeCHARACTER))
17312 return s; /* Haven't learned anything yet. */
17313
17314 ffesymbol_signal_change (s); /* May need to back up to previous
17315 version. */
17316 ffesymbol_set_generic (s, gen);
17317 ffesymbol_set_specific (s, spec);
17318 ffesymbol_set_implementation (s, imp);
17319 ffesymbol_set_info (s,
17320 ffeinfo_new (ffesymbol_basictype (s),
17321 ffesymbol_kindtype (s),
17322 0,
17323 FFEINFO_kindFUNCTION,
17324 FFEINFO_whereINTRINSIC,
17325 ffesymbol_size (s)));
17326 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
17327 ffesymbol_resolve_intrin (s);
17328 ffesymbol_reference (s, t, FALSE);
17329 s = ffecom_sym_learned (s);
17330 ffesymbol_signal_unreported (s); /* For debugging purposes. */
17331
17332 return s;
17333 }
17334 if (sa & FFESYMBOL_attrsANYLEN)
17335 error = TRUE; /* Error, since the only way we can,
17336 given CHARACTER*(*) FOO, accept
17337 FOO(...) is for FOO to be a dummy
17338 arg or constant, but it can't
17339 become either now. */
17340 else if (sa & FFESYMBOL_attrsADJUSTABLE)
17341 {
17342 kind = FFEINFO_kindENTITY;
17343 where = FFEINFO_whereLOCAL;
17344 }
17345 else
17346 {
17347 kind = FFEINFO_kindFUNCTION;
17348 where = FFEINFO_whereGLOBAL;
17349 maybe_ambig = TRUE; /* If basictypeCHARACTER, can't be sure;
17350 could be ENTITY/LOCAL w/substring ref. */
17351 }
17352 }
17353 else if (sa == FFESYMBOL_attrsetNONE)
17354 {
17355 assert (ffesymbol_state (s) == FFESYMBOL_stateNONE);
17356
17357 if (ffeintrin_is_intrinsic (ffesymbol_text (s), t, FALSE,
17358 &gen, &spec, &imp))
17359 {
17360 if (ffeimplic_peek_symbol_type (s, NULL)
17361 == FFEINFO_basictypeCHARACTER)
17362 return s; /* Haven't learned anything yet. */
17363
17364 ffesymbol_signal_change (s); /* May need to back up to previous
17365 version. */
17366 ffesymbol_set_generic (s, gen);
17367 ffesymbol_set_specific (s, spec);
17368 ffesymbol_set_implementation (s, imp);
17369 ffesymbol_set_info (s,
17370 ffeinfo_new (ffesymbol_basictype (s),
17371 ffesymbol_kindtype (s),
17372 0,
17373 FFEINFO_kindFUNCTION,
17374 FFEINFO_whereINTRINSIC,
17375 ffesymbol_size (s)));
17376 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
17377 ffesymbol_resolve_intrin (s);
17378 s = ffecom_sym_learned (s);
17379 ffesymbol_reference (s, t, FALSE);
17380 ffesymbol_signal_unreported (s); /* For debugging purposes. */
17381 return s;
17382 }
17383
17384 kind = FFEINFO_kindFUNCTION;
17385 where = FFEINFO_whereGLOBAL;
17386 maybe_ambig = TRUE; /* If basictypeCHARACTER, can't be sure;
17387 could be ENTITY/LOCAL w/substring ref. */
17388 }
17389 else
17390 error = TRUE;
17391
17392 /* Now see what we've got for a new object: NONE means a new error cropped
17393 up; ANY means an old error to be ignored; otherwise, everything's ok,
17394 update the object (symbol) and continue on. */
17395
17396 if (error)
17397 ffesymbol_error (s, t);
17398 else if (!(na & FFESYMBOL_attrsANY))
17399 {
17400 ffesymbol_signal_change (s); /* May need to back up to previous
17401 version. */
17402 if (!ffeimplic_establish_symbol (s))
17403 {
17404 ffesymbol_error (s, t);
17405 return s;
17406 }
17407 if (maybe_ambig
17408 && (ffesymbol_basictype (s) == FFEINFO_basictypeCHARACTER))
17409 return s; /* Still not sure, let caller deal with it
17410 based on (...). */
17411
17412 ffesymbol_set_info (s,
17413 ffeinfo_new (ffesymbol_basictype (s),
17414 ffesymbol_kindtype (s),
17415 ffesymbol_rank (s),
17416 kind,
17417 where,
17418 ffesymbol_size (s)));
17419 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
17420 ffesymbol_resolve_intrin (s);
17421 s = ffecom_sym_learned (s);
17422 ffesymbol_reference (s, t, FALSE);
17423 ffesymbol_signal_unreported (s); /* For debugging purposes. */
17424 }
17425
17426 return s;
17427 }
17428
17429 /* ffeexpr_token_arguments_ -- OPEN_PAREN [expr COMMA]...expr
17430
17431 Return a pointer to this function to the lexer (ffelex), which will
17432 invoke it for the next token.
17433
17434 Handle expression (which might be null) and COMMA or CLOSE_PAREN. */
17435
17436 static ffelexHandler
17437 ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr, ffelexToken t)
17438 {
17439 ffeexprExpr_ procedure;
17440 ffebld reduced;
17441 ffeinfo info;
17442 ffeexprContext ctx;
17443 bool check_intrin = FALSE; /* Set TRUE if intrinsic is REAL(Z) or AIMAG(Z). */
17444
17445 procedure = ffeexpr_stack_->exprstack;
17446 info = ffebld_info (procedure->u.operand);
17447
17448 /* Is there an expression to add? If the expression is nil,
17449 it might still be an argument. It is if:
17450
17451 - The current token is comma, or
17452
17453 - The -fugly-comma flag was specified *and* the procedure
17454 being invoked is external.
17455
17456 Otherwise, if neither of the above is the case, just
17457 ignore this (nil) expression. */
17458
17459 if ((expr != NULL)
17460 || (ffelex_token_type (t) == FFELEX_typeCOMMA)
17461 || (ffe_is_ugly_comma ()
17462 && (ffeinfo_where (info) == FFEINFO_whereGLOBAL)))
17463 {
17464 /* This expression, even if nil, is apparently intended as an argument. */
17465
17466 /* Internal procedure (CONTAINS, or statement function)? */
17467
17468 if (ffeinfo_where (info) == FFEINFO_whereCONSTANT)
17469 {
17470 if ((expr == NULL)
17471 && ffebad_start (FFEBAD_NULL_ARGUMENT))
17472 {
17473 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17474 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17475 ffebad_here (1, ffelex_token_where_line (t),
17476 ffelex_token_where_column (t));
17477 ffebad_finish ();
17478 }
17479
17480 if (expr == NULL)
17481 ;
17482 else
17483 {
17484 if (ffeexpr_stack_->next_dummy == NULL)
17485 { /* Report later which was the first extra argument. */
17486 if (ffeexpr_stack_->tokens[1] == NULL)
17487 {
17488 ffeexpr_stack_->tokens[1] = ffelex_token_use (ft);
17489 ffeexpr_stack_->num_args = 0;
17490 }
17491 ++ffeexpr_stack_->num_args; /* Count # of extra arguments. */
17492 }
17493 else
17494 {
17495 if ((ffeinfo_rank (ffebld_info (expr)) != 0)
17496 && ffebad_start (FFEBAD_ARRAY_AS_SFARG))
17497 {
17498 ffebad_here (0,
17499 ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17500 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17501 ffebad_here (1, ffelex_token_where_line (ft),
17502 ffelex_token_where_column (ft));
17503 ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent
17504 (ffebld_symter (ffebld_head
17505 (ffeexpr_stack_->next_dummy)))));
17506 ffebad_finish ();
17507 }
17508 else
17509 {
17510 expr = ffeexpr_convert_expr (expr, ft,
17511 ffebld_head (ffeexpr_stack_->next_dummy),
17512 ffeexpr_stack_->tokens[0],
17513 FFEEXPR_contextLET);
17514 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17515 }
17516 --ffeexpr_stack_->num_args; /* Count down # of args. */
17517 ffeexpr_stack_->next_dummy
17518 = ffebld_trail (ffeexpr_stack_->next_dummy);
17519 }
17520 }
17521 }
17522 else
17523 {
17524 if ((expr == NULL)
17525 && ffe_is_pedantic ()
17526 && ffebad_start (FFEBAD_NULL_ARGUMENT_W))
17527 {
17528 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17529 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17530 ffebad_here (1, ffelex_token_where_line (t),
17531 ffelex_token_where_column (t));
17532 ffebad_finish ();
17533 }
17534 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17535 }
17536 }
17537
17538 switch (ffelex_token_type (t))
17539 {
17540 case FFELEX_typeCOMMA:
17541 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
17542 {
17543 case FFEEXPR_contextSFUNCDEF:
17544 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_:
17545 case FFEEXPR_contextSFUNCDEFINDEX_:
17546 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_:
17547 ctx = FFEEXPR_contextSFUNCDEFACTUALARG_;
17548 break;
17549
17550 case FFEEXPR_contextSFUNCDEFACTUALARG_:
17551 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
17552 assert ("bad context" == NULL);
17553 ctx = FFEEXPR_context;
17554 break;
17555
17556 default:
17557 ctx = FFEEXPR_contextACTUALARG_;
17558 break;
17559 }
17560 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool, ctx,
17561 ffeexpr_token_arguments_);
17562
17563 default:
17564 break;
17565 }
17566
17567 if ((ffeinfo_where (info) == FFEINFO_whereCONSTANT)
17568 && (ffeexpr_stack_->next_dummy != NULL))
17569 { /* Too few arguments. */
17570 if (ffebad_start (FFEBAD_TOO_FEW_ARGUMENTS))
17571 {
17572 char num[10];
17573
17574 sprintf (num, "%" ffebldListLength_f "u", ffeexpr_stack_->num_args);
17575
17576 ffebad_here (0, ffelex_token_where_line (t),
17577 ffelex_token_where_column (t));
17578 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17579 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17580 ffebad_string (num);
17581 ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent (ffebld_symter
17582 (ffebld_head (ffeexpr_stack_->next_dummy)))));
17583 ffebad_finish ();
17584 }
17585 for (;
17586 ffeexpr_stack_->next_dummy != NULL;
17587 ffeexpr_stack_->next_dummy
17588 = ffebld_trail (ffeexpr_stack_->next_dummy))
17589 {
17590 expr = ffebld_new_conter (ffebld_constant_new_integerdefault_val (0));
17591 ffebld_set_info (expr, ffeinfo_new_any ());
17592 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17593 }
17594 }
17595
17596 if ((ffeinfo_where (info) == FFEINFO_whereCONSTANT)
17597 && (ffeexpr_stack_->tokens[1] != NULL))
17598 { /* Too many arguments to statement function. */
17599 if (ffebad_start (FFEBAD_TOO_MANY_ARGUMENTS))
17600 {
17601 char num[10];
17602
17603 sprintf (num, "%" ffebldListLength_f "u", ffeexpr_stack_->num_args);
17604
17605 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
17606 ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
17607 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17608 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17609 ffebad_string (num);
17610 ffebad_finish ();
17611 }
17612 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
17613 }
17614 ffebld_end_list (&ffeexpr_stack_->bottom);
17615
17616 if (ffebld_op (procedure->u.operand) == FFEBLD_opANY)
17617 {
17618 reduced = ffebld_new_any ();
17619 ffebld_set_info (reduced, ffeinfo_new_any ());
17620 }
17621 else
17622 {
17623 if (ffeexpr_stack_->context != FFEEXPR_contextSUBROUTINEREF)
17624 reduced = ffebld_new_funcref (procedure->u.operand,
17625 ffeexpr_stack_->expr);
17626 else
17627 reduced = ffebld_new_subrref (procedure->u.operand,
17628 ffeexpr_stack_->expr);
17629 if (ffebld_symter_generic (procedure->u.operand) != FFEINTRIN_genNONE)
17630 ffeintrin_fulfill_generic (&reduced, &info, ffeexpr_stack_->tokens[0]);
17631 else if (ffebld_symter_specific (procedure->u.operand)
17632 != FFEINTRIN_specNONE)
17633 ffeintrin_fulfill_specific (&reduced, &info, &check_intrin,
17634 ffeexpr_stack_->tokens[0]);
17635 else
17636 ffeexpr_fulfill_call_ (&reduced, ffeexpr_stack_->tokens[0]);
17637
17638 if (ffebld_op (reduced) != FFEBLD_opANY)
17639 ffebld_set_info (reduced,
17640 ffeinfo_new (ffeinfo_basictype (info),
17641 ffeinfo_kindtype (info),
17642 0,
17643 FFEINFO_kindENTITY,
17644 FFEINFO_whereFLEETING,
17645 ffeinfo_size (info)));
17646 else
17647 ffebld_set_info (reduced, ffeinfo_new_any ());
17648 }
17649 if (ffebld_op (reduced) == FFEBLD_opFUNCREF)
17650 reduced = ffeexpr_collapse_funcref (reduced, ffeexpr_stack_->tokens[0]);
17651 ffeexpr_stack_->exprstack = procedure->previous; /* Pops
17652 not-quite-operand off
17653 stack. */
17654 procedure->u.operand = reduced; /* Save the line/column ffewhere
17655 info. */
17656 ffeexpr_exprstack_push_operand_ (procedure); /* Push it back on stack. */
17657 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
17658 {
17659 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
17660 ffeexpr_is_substr_ok_ = FALSE; /* Nobody likes "FUNC(3)(1:1)".... */
17661
17662 /* If the intrinsic needs checking (is REAL(Z) or AIMAG(Z), where
17663 Z is DOUBLE COMPLEX), and a command-line option doesn't already
17664 establish interpretation, probably complain. */
17665
17666 if (check_intrin
17667 && !ffe_is_90 ()
17668 && !ffe_is_ugly_complex ())
17669 {
17670 /* If the outer expression is REAL(me...), issue diagnostic
17671 only if next token isn't the close-paren for REAL(me). */
17672
17673 if ((ffeexpr_stack_->previous != NULL)
17674 && (ffeexpr_stack_->previous->exprstack != NULL)
17675 && (ffeexpr_stack_->previous->exprstack->type == FFEEXPR_exprtypeOPERAND_)
17676 && ((reduced = ffeexpr_stack_->previous->exprstack->u.operand) != NULL)
17677 && (ffebld_op (reduced) == FFEBLD_opSYMTER)
17678 && (ffebld_symter_implementation (reduced) == FFEINTRIN_impREAL))
17679 return (ffelexHandler) ffeexpr_token_intrincheck_;
17680
17681 /* Diagnose the ambiguity now. */
17682
17683 if (ffebad_start (FFEBAD_INTRINSIC_CMPAMBIG))
17684 {
17685 ffebad_string (ffeintrin_name_implementation
17686 (ffebld_symter_implementation
17687 (ffebld_left
17688 (ffeexpr_stack_->exprstack->u.operand))));
17689 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
17690 ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
17691 ffebad_finish ();
17692 }
17693 }
17694 return (ffelexHandler) ffeexpr_token_substrp_;
17695 }
17696
17697 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
17698 {
17699 ffebad_here (0, ffelex_token_where_line (t),
17700 ffelex_token_where_column (t));
17701 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17702 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17703 ffebad_finish ();
17704 }
17705 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
17706 ffeexpr_is_substr_ok_ = FALSE;/* Nobody likes "FUNC(3)(1:1)".... */
17707 return
17708 (ffelexHandler) ffeexpr_find_close_paren_ (t,
17709 (ffelexHandler)
17710 ffeexpr_token_substrp_);
17711 }
17712
17713 /* ffeexpr_token_elements_ -- OPEN_PAREN [expr COMMA]...expr
17714
17715 Return a pointer to this array to the lexer (ffelex), which will
17716 invoke it for the next token.
17717
17718 Handle expression and COMMA or CLOSE_PAREN. */
17719
17720 static ffelexHandler
17721 ffeexpr_token_elements_ (ffelexToken ft, ffebld expr, ffelexToken t)
17722 {
17723 ffeexprExpr_ array;
17724 ffebld reduced;
17725 ffeinfo info;
17726 ffeinfoWhere where;
17727 ffetargetIntegerDefault val;
17728 ffetargetIntegerDefault lval = 0;
17729 ffetargetIntegerDefault uval = 0;
17730 ffebld lbound;
17731 ffebld ubound;
17732 bool lcheck;
17733 bool ucheck;
17734
17735 array = ffeexpr_stack_->exprstack;
17736 info = ffebld_info (array->u.operand);
17737
17738 if ((expr == NULL) /* && ((ffeexpr_stack_->rank != 0) ||
17739 (ffelex_token_type(t) ==
17740 FFELEX_typeCOMMA)) */ )
17741 {
17742 if (ffebad_start (FFEBAD_NULL_ELEMENT))
17743 {
17744 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17745 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17746 ffebad_here (1, ffelex_token_where_line (t),
17747 ffelex_token_where_column (t));
17748 ffebad_finish ();
17749 }
17750 if (ffeexpr_stack_->rank < ffeinfo_rank (info))
17751 { /* Don't bother if we're going to complain
17752 later! */
17753 expr = ffebld_new_conter (ffebld_constant_new_integerdefault_val (1));
17754 ffebld_set_info (expr, ffeinfo_new_any ());
17755 }
17756 }
17757
17758 if (expr == NULL)
17759 ;
17760 else if (ffeinfo_rank (info) == 0)
17761 { /* In EQUIVALENCE context, ffeinfo_rank(info)
17762 may == 0. */
17763 ++ffeexpr_stack_->rank; /* Track anyway, may need for new VXT
17764 feature. */
17765 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17766 }
17767 else
17768 {
17769 ++ffeexpr_stack_->rank;
17770 if (ffeexpr_stack_->rank > ffeinfo_rank (info))
17771 { /* Report later which was the first extra
17772 element. */
17773 if (ffeexpr_stack_->rank == ffeinfo_rank (info) + 1)
17774 ffeexpr_stack_->tokens[1] = ffelex_token_use (ft);
17775 }
17776 else
17777 {
17778 switch (ffeinfo_where (ffebld_info (expr)))
17779 {
17780 case FFEINFO_whereCONSTANT:
17781 break;
17782
17783 case FFEINFO_whereIMMEDIATE:
17784 ffeexpr_stack_->constant = FALSE;
17785 break;
17786
17787 default:
17788 ffeexpr_stack_->constant = FALSE;
17789 ffeexpr_stack_->immediate = FALSE;
17790 break;
17791 }
17792 if (ffebld_op (expr) == FFEBLD_opCONTER
17793 && ffebld_kindtype (expr) == FFEINFO_kindtypeINTEGERDEFAULT)
17794 {
17795 val = ffebld_constant_integerdefault (ffebld_conter (expr));
17796
17797 lbound = ffebld_left (ffebld_head (ffeexpr_stack_->bound_list));
17798 if (lbound == NULL)
17799 {
17800 lcheck = TRUE;
17801 lval = 1;
17802 }
17803 else if (ffebld_op (lbound) == FFEBLD_opCONTER)
17804 {
17805 lcheck = TRUE;
17806 lval = ffebld_constant_integerdefault (ffebld_conter (lbound));
17807 }
17808 else
17809 lcheck = FALSE;
17810
17811 ubound = ffebld_right (ffebld_head (ffeexpr_stack_->bound_list));
17812 assert (ubound != NULL);
17813 if (ffebld_op (ubound) == FFEBLD_opCONTER)
17814 {
17815 ucheck = TRUE;
17816 uval = ffebld_constant_integerdefault (ffebld_conter (ubound));
17817 }
17818 else
17819 ucheck = FALSE;
17820
17821 if ((lcheck && (val < lval)) || (ucheck && (val > uval)))
17822 {
17823 ffebad_start (FFEBAD_RANGE_ARRAY);
17824 ffebad_here (0, ffelex_token_where_line (ft),
17825 ffelex_token_where_column (ft));
17826 ffebad_finish ();
17827 }
17828 }
17829 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17830 ffeexpr_stack_->bound_list = ffebld_trail (ffeexpr_stack_->bound_list);
17831 }
17832 }
17833
17834 switch (ffelex_token_type (t))
17835 {
17836 case FFELEX_typeCOMMA:
17837 switch (ffeexpr_context_outer_ (ffeexpr_stack_))
17838 {
17839 case FFEEXPR_contextDATAIMPDOITEM_:
17840 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
17841 FFEEXPR_contextDATAIMPDOINDEX_,
17842 ffeexpr_token_elements_);
17843
17844 case FFEEXPR_contextEQUIVALENCE:
17845 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
17846 FFEEXPR_contextEQVINDEX_,
17847 ffeexpr_token_elements_);
17848
17849 case FFEEXPR_contextSFUNCDEF:
17850 case FFEEXPR_contextSFUNCDEFINDEX_:
17851 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
17852 FFEEXPR_contextSFUNCDEFINDEX_,
17853 ffeexpr_token_elements_);
17854
17855 case FFEEXPR_contextSFUNCDEFACTUALARG_:
17856 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
17857 assert ("bad context" == NULL);
17858 break;
17859
17860 default:
17861 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
17862 FFEEXPR_contextINDEX_,
17863 ffeexpr_token_elements_);
17864 }
17865
17866 default:
17867 break;
17868 }
17869
17870 if ((ffeexpr_stack_->rank != ffeinfo_rank (info))
17871 && (ffeinfo_rank (info) != 0))
17872 {
17873 char num[10];
17874
17875 if (ffeexpr_stack_->rank < ffeinfo_rank (info))
17876 {
17877 if (ffebad_start (FFEBAD_TOO_FEW_ELEMENTS))
17878 {
17879 sprintf (num, "%d",
17880 (int) (ffeinfo_rank (info) - ffeexpr_stack_->rank));
17881
17882 ffebad_here (0, ffelex_token_where_line (t),
17883 ffelex_token_where_column (t));
17884 ffebad_here (1,
17885 ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17886 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17887 ffebad_string (num);
17888 ffebad_finish ();
17889 }
17890 }
17891 else
17892 {
17893 if (ffebad_start (FFEBAD_TOO_MANY_ELEMENTS))
17894 {
17895 sprintf (num, "%d",
17896 (int) (ffeexpr_stack_->rank - ffeinfo_rank (info)));
17897
17898 ffebad_here (0,
17899 ffelex_token_where_line (ffeexpr_stack_->tokens[1]),
17900 ffelex_token_where_column (ffeexpr_stack_->tokens[1]));
17901 ffebad_here (1,
17902 ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17903 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17904 ffebad_string (num);
17905 ffebad_finish ();
17906 }
17907 ffelex_token_kill (ffeexpr_stack_->tokens[1]);
17908 }
17909 while (ffeexpr_stack_->rank++ < ffeinfo_rank (info))
17910 {
17911 expr = ffebld_new_conter (ffebld_constant_new_integerdefault_val (1));
17912 ffebld_set_info (expr, ffeinfo_new (FFEINFO_basictypeINTEGER,
17913 FFEINFO_kindtypeINTEGERDEFAULT,
17914 0, FFEINFO_kindENTITY,
17915 FFEINFO_whereCONSTANT,
17916 FFETARGET_charactersizeNONE));
17917 ffebld_append_item (&ffeexpr_stack_->bottom, expr);
17918 }
17919 }
17920 ffebld_end_list (&ffeexpr_stack_->bottom);
17921
17922 if (ffebld_op (array->u.operand) == FFEBLD_opANY)
17923 {
17924 reduced = ffebld_new_any ();
17925 ffebld_set_info (reduced, ffeinfo_new_any ());
17926 }
17927 else
17928 {
17929 reduced = ffebld_new_arrayref (array->u.operand, ffeexpr_stack_->expr);
17930 if (ffeexpr_stack_->constant)
17931 where = FFEINFO_whereFLEETING_CADDR;
17932 else if (ffeexpr_stack_->immediate)
17933 where = FFEINFO_whereFLEETING_IADDR;
17934 else
17935 where = FFEINFO_whereFLEETING;
17936 ffebld_set_info (reduced,
17937 ffeinfo_new (ffeinfo_basictype (info),
17938 ffeinfo_kindtype (info),
17939 0,
17940 FFEINFO_kindENTITY,
17941 where,
17942 ffeinfo_size (info)));
17943 reduced = ffeexpr_collapse_arrayref (reduced, ffeexpr_stack_->tokens[0]);
17944 }
17945
17946 ffeexpr_stack_->exprstack = array->previous; /* Pops not-quite-operand off
17947 stack. */
17948 array->u.operand = reduced; /* Save the line/column ffewhere info. */
17949 ffeexpr_exprstack_push_operand_ (array); /* Push it back on stack. */
17950
17951 switch (ffeinfo_basictype (info))
17952 {
17953 case FFEINFO_basictypeCHARACTER:
17954 ffeexpr_is_substr_ok_ = TRUE; /* Everyone likes "FOO(3)(1:1)".... */
17955 break;
17956
17957 case FFEINFO_basictypeNONE:
17958 ffeexpr_is_substr_ok_ = TRUE;
17959 assert (ffeexpr_stack_->context == FFEEXPR_contextEQUIVALENCE);
17960 break;
17961
17962 default:
17963 ffeexpr_is_substr_ok_ = FALSE;
17964 break;
17965 }
17966
17967 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
17968 {
17969 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
17970 return (ffelexHandler) ffeexpr_token_substrp_;
17971 }
17972
17973 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
17974 {
17975 ffebad_here (0, ffelex_token_where_line (t),
17976 ffelex_token_where_column (t));
17977 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
17978 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
17979 ffebad_finish ();
17980 }
17981 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
17982 return
17983 (ffelexHandler) ffeexpr_find_close_paren_ (t,
17984 (ffelexHandler)
17985 ffeexpr_token_substrp_);
17986 }
17987
17988 /* ffeexpr_token_equivalence_ -- OPEN_PAREN expr
17989
17990 Return a pointer to this array to the lexer (ffelex), which will
17991 invoke it for the next token.
17992
17993 If token is COLON, pass off to _substr_, else init list and pass off
17994 to _elements_. This handles the case "EQUIVALENCE (FOO(expr?", where
17995 ? marks the token, and where FOO's rank/type has not yet been established,
17996 meaning we could be in a list of indices or in a substring
17997 specification. */
17998
17999 static ffelexHandler
18000 ffeexpr_token_equivalence_ (ffelexToken ft, ffebld expr, ffelexToken t)
18001 {
18002 if (ffelex_token_type (t) == FFELEX_typeCOLON)
18003 return ffeexpr_token_substring_ (ft, expr, t);
18004
18005 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
18006 return ffeexpr_token_elements_ (ft, expr, t);
18007 }
18008
18009 /* ffeexpr_token_substring_ -- NAME(of kindENTITY) OPEN_PAREN expr
18010
18011 Return a pointer to this function to the lexer (ffelex), which will
18012 invoke it for the next token.
18013
18014 Handle expression (which may be null) and COLON. */
18015
18016 static ffelexHandler
18017 ffeexpr_token_substring_ (ffelexToken ft, ffebld expr, ffelexToken t)
18018 {
18019 ffeexprExpr_ string;
18020 ffeinfo info;
18021 ffetargetIntegerDefault i;
18022 ffeexprContext ctx;
18023 ffetargetCharacterSize size;
18024
18025 string = ffeexpr_stack_->exprstack;
18026 info = ffebld_info (string->u.operand);
18027 size = ffebld_size_max (string->u.operand);
18028
18029 if (ffelex_token_type (t) == FFELEX_typeCOLON)
18030 {
18031 if ((expr != NULL)
18032 && (ffebld_op (expr) == FFEBLD_opCONTER)
18033 && (((i = ffebld_constant_integerdefault (ffebld_conter (expr)))
18034 < 1)
18035 || ((size != FFETARGET_charactersizeNONE) && (i > size))))
18036 {
18037 ffebad_start (FFEBAD_RANGE_SUBSTR);
18038 ffebad_here (0, ffelex_token_where_line (ft),
18039 ffelex_token_where_column (ft));
18040 ffebad_finish ();
18041 }
18042 ffeexpr_stack_->expr = expr;
18043
18044 switch (ffeexpr_stack_->context)
18045 {
18046 case FFEEXPR_contextSFUNCDEF:
18047 case FFEEXPR_contextSFUNCDEFINDEX_:
18048 ctx = FFEEXPR_contextSFUNCDEFINDEX_;
18049 break;
18050
18051 case FFEEXPR_contextSFUNCDEFACTUALARG_:
18052 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
18053 assert ("bad context" == NULL);
18054 ctx = FFEEXPR_context;
18055 break;
18056
18057 default:
18058 ctx = FFEEXPR_contextINDEX_;
18059 break;
18060 }
18061
18062 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool, ctx,
18063 ffeexpr_token_substring_1_);
18064 }
18065
18066 if (ffest_ffebad_start (FFEBAD_MISSING_COLON_IN_SUBSTR))
18067 {
18068 ffebad_here (0, ffelex_token_where_line (t),
18069 ffelex_token_where_column (t));
18070 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
18071 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
18072 ffebad_finish ();
18073 }
18074
18075 ffeexpr_stack_->expr = NULL;
18076 return (ffelexHandler) ffeexpr_token_substring_1_ (ft, expr, t);
18077 }
18078
18079 /* ffeexpr_token_substring_1_ -- NAME OPEN_PAREN [expr COMMA]...expr
18080
18081 Return a pointer to this function to the lexer (ffelex), which will
18082 invoke it for the next token.
18083
18084 Handle expression (which might be null) and CLOSE_PAREN. */
18085
18086 static ffelexHandler
18087 ffeexpr_token_substring_1_ (ffelexToken ft, ffebld last, ffelexToken t)
18088 {
18089 ffeexprExpr_ string;
18090 ffebld reduced;
18091 ffebld substrlist;
18092 ffebld first = ffeexpr_stack_->expr;
18093 ffebld strop;
18094 ffeinfo info;
18095 ffeinfoWhere lwh;
18096 ffeinfoWhere rwh;
18097 ffeinfoWhere where;
18098 ffeinfoKindtype first_kt;
18099 ffeinfoKindtype last_kt;
18100 ffetargetIntegerDefault first_val;
18101 ffetargetIntegerDefault last_val;
18102 ffetargetCharacterSize size;
18103 ffetargetCharacterSize strop_size_max;
18104 bool first_known;
18105
18106 string = ffeexpr_stack_->exprstack;
18107 strop = string->u.operand;
18108 info = ffebld_info (strop);
18109
18110 if (first == NULL
18111 || (ffebld_op (first) == FFEBLD_opCONTER
18112 && ffebld_kindtype (first) == FFEINFO_kindtypeINTEGERDEFAULT))
18113 { /* The starting point is known. */
18114 first_val = (first == NULL) ? 1
18115 : ffebld_constant_integerdefault (ffebld_conter (first));
18116 first_known = TRUE;
18117 }
18118 else
18119 { /* Assume start of the entity. */
18120 first_val = 1;
18121 first_known = FALSE;
18122 }
18123
18124 if (last != NULL
18125 && (ffebld_op (last) == FFEBLD_opCONTER
18126 && ffebld_kindtype (last) == FFEINFO_kindtypeINTEGERDEFAULT))
18127 { /* The ending point is known. */
18128 last_val = ffebld_constant_integerdefault (ffebld_conter (last));
18129
18130 if (first_known)
18131 { /* The beginning point is a constant. */
18132 if (first_val <= last_val)
18133 size = last_val - first_val + 1;
18134 else
18135 {
18136 if (0 && ffe_is_90 ())
18137 size = 0;
18138 else
18139 {
18140 size = 1;
18141 ffebad_start (FFEBAD_ZERO_SIZE);
18142 ffebad_here (0, ffelex_token_where_line (ft),
18143 ffelex_token_where_column (ft));
18144 ffebad_finish ();
18145 }
18146 }
18147 }
18148 else
18149 size = FFETARGET_charactersizeNONE;
18150
18151 strop_size_max = ffebld_size_max (strop);
18152
18153 if ((strop_size_max != FFETARGET_charactersizeNONE)
18154 && (last_val > strop_size_max))
18155 { /* Beyond maximum possible end of string. */
18156 ffebad_start (FFEBAD_RANGE_SUBSTR);
18157 ffebad_here (0, ffelex_token_where_line (ft),
18158 ffelex_token_where_column (ft));
18159 ffebad_finish ();
18160 }
18161 }
18162 else
18163 size = FFETARGET_charactersizeNONE; /* The size is not known. */
18164
18165 #if 0 /* Don't do this, or "is size of target
18166 known?" would no longer be easily
18167 answerable. To see if there is a max
18168 size, use ffebld_size_max; to get only the
18169 known size, else NONE, use
18170 ffebld_size_known; use ffebld_size if
18171 values are sure to be the same (not
18172 opSUBSTR or opCONCATENATE or known to have
18173 known length). By getting rid of this
18174 "useful info" stuff, we don't end up
18175 blank-padding the constant in the
18176 assignment "A(I:J)='XYZ'" to the known
18177 length of A. */
18178 if (size == FFETARGET_charactersizeNONE)
18179 size = strop_size_max; /* Assume we use the entire string. */
18180 #endif
18181
18182 substrlist
18183 = ffebld_new_item
18184 (first,
18185 ffebld_new_item
18186 (last,
18187 NULL
18188 )
18189 )
18190 ;
18191
18192 if (first == NULL)
18193 lwh = FFEINFO_whereCONSTANT;
18194 else
18195 lwh = ffeinfo_where (ffebld_info (first));
18196 if (last == NULL)
18197 rwh = FFEINFO_whereCONSTANT;
18198 else
18199 rwh = ffeinfo_where (ffebld_info (last));
18200
18201 switch (lwh)
18202 {
18203 case FFEINFO_whereCONSTANT:
18204 switch (rwh)
18205 {
18206 case FFEINFO_whereCONSTANT:
18207 where = FFEINFO_whereCONSTANT;
18208 break;
18209
18210 case FFEINFO_whereIMMEDIATE:
18211 where = FFEINFO_whereIMMEDIATE;
18212 break;
18213
18214 default:
18215 where = FFEINFO_whereFLEETING;
18216 break;
18217 }
18218 break;
18219
18220 case FFEINFO_whereIMMEDIATE:
18221 switch (rwh)
18222 {
18223 case FFEINFO_whereCONSTANT:
18224 case FFEINFO_whereIMMEDIATE:
18225 where = FFEINFO_whereIMMEDIATE;
18226 break;
18227
18228 default:
18229 where = FFEINFO_whereFLEETING;
18230 break;
18231 }
18232 break;
18233
18234 default:
18235 where = FFEINFO_whereFLEETING;
18236 break;
18237 }
18238
18239 if (first == NULL)
18240 first_kt = FFEINFO_kindtypeINTEGERDEFAULT;
18241 else
18242 first_kt = ffeinfo_kindtype (ffebld_info (first));
18243 if (last == NULL)
18244 last_kt = FFEINFO_kindtypeINTEGERDEFAULT;
18245 else
18246 last_kt = ffeinfo_kindtype (ffebld_info (last));
18247
18248 switch (where)
18249 {
18250 case FFEINFO_whereCONSTANT:
18251 switch (ffeinfo_where (info))
18252 {
18253 case FFEINFO_whereCONSTANT:
18254 break;
18255
18256 case FFEINFO_whereIMMEDIATE: /* Not possible, actually. */
18257 where = FFEINFO_whereIMMEDIATE;
18258 break;
18259
18260 default:
18261 where = FFEINFO_whereFLEETING_CADDR;
18262 break;
18263 }
18264 break;
18265
18266 case FFEINFO_whereIMMEDIATE:
18267 switch (ffeinfo_where (info))
18268 {
18269 case FFEINFO_whereCONSTANT:
18270 case FFEINFO_whereIMMEDIATE: /* Not possible, actually. */
18271 break;
18272
18273 default:
18274 where = FFEINFO_whereFLEETING_IADDR;
18275 break;
18276 }
18277 break;
18278
18279 default:
18280 switch (ffeinfo_where (info))
18281 {
18282 case FFEINFO_whereCONSTANT:
18283 where = FFEINFO_whereCONSTANT_SUBOBJECT; /* An F90 concept. */
18284 break;
18285
18286 case FFEINFO_whereIMMEDIATE: /* Not possible, actually. */
18287 default:
18288 where = FFEINFO_whereFLEETING;
18289 break;
18290 }
18291 break;
18292 }
18293
18294 if (ffebld_op (strop) == FFEBLD_opANY)
18295 {
18296 reduced = ffebld_new_any ();
18297 ffebld_set_info (reduced, ffeinfo_new_any ());
18298 }
18299 else
18300 {
18301 reduced = ffebld_new_substr (strop, substrlist);
18302 ffebld_set_info (reduced, ffeinfo_new
18303 (FFEINFO_basictypeCHARACTER,
18304 ffeinfo_kindtype (info),
18305 0,
18306 FFEINFO_kindENTITY,
18307 where,
18308 size));
18309 reduced = ffeexpr_collapse_substr (reduced, ffeexpr_stack_->tokens[0]);
18310 }
18311
18312 ffeexpr_stack_->exprstack = string->previous; /* Pops not-quite-operand off
18313 stack. */
18314 string->u.operand = reduced; /* Save the line/column ffewhere info. */
18315 ffeexpr_exprstack_push_operand_ (string); /* Push it back on stack. */
18316
18317 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
18318 {
18319 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
18320 ffeexpr_is_substr_ok_ = FALSE; /* Nobody likes "FOO(3:5)(1:1)".... */
18321 return (ffelexHandler) ffeexpr_token_substrp_;
18322 }
18323
18324 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION))
18325 {
18326 ffebad_here (0, ffelex_token_where_line (t),
18327 ffelex_token_where_column (t));
18328 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->tokens[0]),
18329 ffelex_token_where_column (ffeexpr_stack_->tokens[0]));
18330 ffebad_finish ();
18331 }
18332
18333 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
18334 ffeexpr_is_substr_ok_ = FALSE;/* Nobody likes "FOO(3:5)(1:1)".... */
18335 return
18336 (ffelexHandler) ffeexpr_find_close_paren_ (t,
18337 (ffelexHandler)
18338 ffeexpr_token_substrp_);
18339 }
18340
18341 /* ffeexpr_token_substrp_ -- Rhs <character entity>
18342
18343 Return a pointer to this function to the lexer (ffelex), which will
18344 invoke it for the next token.
18345
18346 If OPEN_PAREN, treat as start of a substring ("(3:4)") construct, and
18347 issue error message if flag (serves as argument) is set. Else, just
18348 forward token to binary_. */
18349
18350 static ffelexHandler
18351 ffeexpr_token_substrp_ (ffelexToken t)
18352 {
18353 ffeexprContext ctx;
18354
18355 if (ffelex_token_type (t) != FFELEX_typeOPEN_PAREN)
18356 return (ffelexHandler) ffeexpr_token_binary_ (t);
18357
18358 ffeexpr_stack_->tokens[0] = ffelex_token_use (t);
18359
18360 switch (ffeexpr_stack_->context)
18361 {
18362 case FFEEXPR_contextSFUNCDEF:
18363 case FFEEXPR_contextSFUNCDEFINDEX_:
18364 ctx = FFEEXPR_contextSFUNCDEFINDEX_;
18365 break;
18366
18367 case FFEEXPR_contextSFUNCDEFACTUALARG_:
18368 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_:
18369 assert ("bad context" == NULL);
18370 ctx = FFEEXPR_context;
18371 break;
18372
18373 default:
18374 ctx = FFEEXPR_contextINDEX_;
18375 break;
18376 }
18377
18378 if (!ffeexpr_is_substr_ok_)
18379 {
18380 if (ffebad_start (FFEBAD_BAD_SUBSTR))
18381 {
18382 ffebad_here (0, ffelex_token_where_line (t),
18383 ffelex_token_where_column (t));
18384 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
18385 ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
18386 ffebad_finish ();
18387 }
18388
18389 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool, ctx,
18390 ffeexpr_token_anything_);
18391 }
18392
18393 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool, ctx,
18394 ffeexpr_token_substring_);
18395 }
18396
18397 static ffelexHandler
18398 ffeexpr_token_intrincheck_ (ffelexToken t)
18399 {
18400 if ((ffelex_token_type (t) != FFELEX_typeCLOSE_PAREN)
18401 && ffebad_start (FFEBAD_INTRINSIC_CMPAMBIG))
18402 {
18403 ffebad_string (ffeintrin_name_implementation
18404 (ffebld_symter_implementation
18405 (ffebld_left
18406 (ffeexpr_stack_->exprstack->u.operand))));
18407 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->exprstack->token),
18408 ffelex_token_where_column (ffeexpr_stack_->exprstack->token));
18409 ffebad_finish ();
18410 }
18411
18412 return (ffelexHandler) ffeexpr_token_substrp_ (t);
18413 }
18414
18415 /* ffeexpr_token_funsubstr_ -- NAME OPEN_PAREN expr
18416
18417 Return a pointer to this function to the lexer (ffelex), which will
18418 invoke it for the next token.
18419
18420 If COLON, do everything we would have done since _parenthesized_ if
18421 we had known NAME represented a kindENTITY instead of a kindFUNCTION.
18422 If not COLON, do likewise for kindFUNCTION instead. */
18423
18424 static ffelexHandler
18425 ffeexpr_token_funsubstr_ (ffelexToken ft, ffebld expr, ffelexToken t)
18426 {
18427 ffeinfoWhere where;
18428 ffesymbol s;
18429 ffesymbolAttrs sa;
18430 ffebld symter = ffeexpr_stack_->exprstack->u.operand;
18431 bool needs_type;
18432 ffeintrinGen gen;
18433 ffeintrinSpec spec;
18434 ffeintrinImp imp;
18435
18436 s = ffebld_symter (symter);
18437 sa = ffesymbol_attrs (s);
18438 where = ffesymbol_where (s);
18439
18440 /* We get here only if we don't already know enough about FOO when seeing a
18441 FOO(stuff) reference, and FOO might turn out to be a CHARACTER type. If
18442 "stuff" is a substring reference, then FOO is a CHARACTER scalar type.
18443 Else FOO is a function, either intrinsic or external. If intrinsic, it
18444 wouldn't necessarily be CHARACTER type, so unless it has already been
18445 declared DUMMY, it hasn't had its type established yet. It can't be
18446 CHAR*(*) in any case, though it can have an explicit CHAR*n type. */
18447
18448 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
18449 | FFESYMBOL_attrsTYPE)));
18450
18451 needs_type = !(ffesymbol_attrs (s) & FFESYMBOL_attrsDUMMY);
18452
18453 ffesymbol_signal_change (s); /* Probably already done, but in case.... */
18454
18455 if (ffelex_token_type (t) == FFELEX_typeCOLON)
18456 { /* Definitely an ENTITY (char substring). */
18457 if (needs_type && !ffeimplic_establish_symbol (s))
18458 {
18459 ffesymbol_error (s, ffeexpr_stack_->tokens[0]);
18460 return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);
18461 }
18462
18463 ffesymbol_set_info (s,
18464 ffeinfo_new (ffesymbol_basictype (s),
18465 ffesymbol_kindtype (s),
18466 ffesymbol_rank (s),
18467 FFEINFO_kindENTITY,
18468 (where == FFEINFO_whereNONE)
18469 ? FFEINFO_whereLOCAL
18470 : where,
18471 ffesymbol_size (s)));
18472 ffebld_set_info (symter, ffeinfo_use (ffesymbol_info (s)));
18473
18474 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
18475 ffesymbol_resolve_intrin (s);
18476 s = ffecom_sym_learned (s);
18477 ffesymbol_signal_unreported (s); /* For debugging purposes. */
18478
18479 ffeexpr_stack_->exprstack->u.operand
18480 = ffeexpr_collapse_symter (symter, ffeexpr_tokens_[0]);
18481
18482 return (ffelexHandler) ffeexpr_token_substring_ (ft, expr, t);
18483 }
18484
18485 /* The "stuff" isn't a substring notation, so we now know the overall
18486 reference is to a function. */
18487
18488 if (ffeintrin_is_intrinsic (ffesymbol_text (s), ffeexpr_stack_->tokens[0],
18489 FALSE, &gen, &spec, &imp))
18490 {
18491 ffebld_symter_set_generic (symter, gen);
18492 ffebld_symter_set_specific (symter, spec);
18493 ffebld_symter_set_implementation (symter, imp);
18494 ffesymbol_set_generic (s, gen);
18495 ffesymbol_set_specific (s, spec);
18496 ffesymbol_set_implementation (s, imp);
18497 ffesymbol_set_info (s,
18498 ffeinfo_new (ffesymbol_basictype (s),
18499 ffesymbol_kindtype (s),
18500 0,
18501 FFEINFO_kindFUNCTION,
18502 FFEINFO_whereINTRINSIC,
18503 ffesymbol_size (s)));
18504 }
18505 else
18506 { /* Not intrinsic, now needs CHAR type. */
18507 if (!ffeimplic_establish_symbol (s))
18508 {
18509 ffesymbol_error (s, ffeexpr_stack_->tokens[0]);
18510 return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);
18511 }
18512
18513 ffesymbol_set_info (s,
18514 ffeinfo_new (ffesymbol_basictype (s),
18515 ffesymbol_kindtype (s),
18516 ffesymbol_rank (s),
18517 FFEINFO_kindFUNCTION,
18518 (where == FFEINFO_whereNONE)
18519 ? FFEINFO_whereGLOBAL
18520 : where,
18521 ffesymbol_size (s)));
18522 }
18523
18524 ffebld_set_info (symter, ffeinfo_use (ffesymbol_info (s)));
18525
18526 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
18527 ffesymbol_resolve_intrin (s);
18528 s = ffecom_sym_learned (s);
18529 ffesymbol_reference (s, ffeexpr_stack_->tokens[0], FALSE);
18530 ffesymbol_signal_unreported (s); /* For debugging purposes. */
18531 ffebld_init_list (&ffeexpr_stack_->expr, &ffeexpr_stack_->bottom);
18532 return (ffelexHandler) ffeexpr_token_arguments_ (ft, expr, t);
18533 }
18534
18535 /* ffeexpr_token_anything_ -- NAME OPEN_PAREN any-expr
18536
18537 Handle basically any expression, looking for CLOSE_PAREN. */
18538
18539 static ffelexHandler
18540 ffeexpr_token_anything_ (ffelexToken ft UNUSED, ffebld expr UNUSED,
18541 ffelexToken t)
18542 {
18543 ffeexprExpr_ e = ffeexpr_stack_->exprstack;
18544
18545 switch (ffelex_token_type (t))
18546 {
18547 case FFELEX_typeCOMMA:
18548 case FFELEX_typeCOLON:
18549 return (ffelexHandler) ffeexpr_rhs (ffeexpr_stack_->pool,
18550 FFEEXPR_contextACTUALARG_,
18551 ffeexpr_token_anything_);
18552
18553 default:
18554 e->u.operand = ffebld_new_any ();
18555 ffebld_set_info (e->u.operand, ffeinfo_new_any ());
18556 ffelex_token_kill (ffeexpr_stack_->tokens[0]);
18557 ffeexpr_is_substr_ok_ = FALSE;
18558 if (ffelex_token_type (t) == FFELEX_typeCLOSE_PAREN)
18559 return (ffelexHandler) ffeexpr_token_substrp_;
18560 return (ffelexHandler) ffeexpr_token_substrp_ (t);
18561 }
18562 }
18563
18564 /* Terminate module. */
18565
18566 void
18567 ffeexpr_terminate_2 (void)
18568 {
18569 assert (ffeexpr_stack_ == NULL);
18570 assert (ffeexpr_level_ == 0);
18571 }