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.
6 This file is part of GNU Fortran.
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)
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.
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
27 Handles syntactic and semantic analysis of Fortran expressions.
53 /* Externals defined here. */
56 /* Simple definitions and enumerations. */
60 FFEEXPR_exprtypeUNKNOWN_
,
61 FFEEXPR_exprtypeOPERAND_
,
62 FFEEXPR_exprtypeUNARY_
,
63 FFEEXPR_exprtypeBINARY_
,
69 FFEEXPR_operatorPOWER_
,
70 FFEEXPR_operatorMULTIPLY_
,
71 FFEEXPR_operatorDIVIDE_
,
73 FFEEXPR_operatorSUBTRACT_
,
74 FFEEXPR_operatorCONCATENATE_
,
86 FFEEXPR_operatorNEQV_
,
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_
;
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_
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. */
151 FFEEXPR_percentNONE_
,
155 FFEEXPR_percentDESCR_
,
159 /* Internal typedefs. */
161 typedef struct _ffeexpr_expr_
*ffeexprExpr_
;
162 typedef bool ffeexprOperatorAssociativity_
;
163 typedef struct _ffeexpr_stack_
*ffeexprStack_
;
165 /* Private include files. */
168 /* Internal structure definitions. */
170 struct _ffeexpr_expr_
172 ffeexprExpr_ previous
;
174 ffeexprExprtype_ type
;
180 ffeexprOperatorPrecedence_ prec
;
181 ffeexprOperatorAssociativity_ as
;
189 struct _ffeexpr_stack_
191 ffeexprStack_ previous
;
193 ffeexprContext context
;
194 ffeexprCallback callback
;
195 ffelexToken first_token
;
196 ffeexprExpr_ exprstack
;
197 ffelexToken tokens
[10]; /* Used in certain cases, like (unary)
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
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
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. */
216 struct _ffeexpr_find_
223 /* Static objects accessed by functions in this module. */
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_
;
233 /* Static functions (internal). */
235 static ffelexHandler
ffeexpr_cb_close_paren_ (ffelexToken ft
, ffebld expr
,
237 static ffelexHandler
ffeexpr_cb_close_paren_ambig_ (ffelexToken ft
,
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
,
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
,
249 static ffelexHandler
ffeexpr_cb_comma_i_ (ffelexToken ft
, ffebld expr
,
251 static ffelexHandler
ffeexpr_cb_comma_i_1_ (ffelexToken ft
, ffebld expr
,
253 static ffelexHandler
ffeexpr_cb_comma_i_2_ (ffelexToken ft
, ffebld expr
,
255 static ffelexHandler
ffeexpr_cb_comma_i_3_ (ffelexToken ft
, ffebld expr
,
257 static ffelexHandler
ffeexpr_cb_comma_i_4_ (ffelexToken ft
, ffebld expr
,
259 static ffelexHandler
ffeexpr_cb_comma_i_5_ (ffelexToken t
);
260 static ffelexHandler
ffeexpr_cb_end_loc_ (ffelexToken ft
, ffebld expr
,
262 static ffelexHandler
ffeexpr_cb_end_notloc_ (ffelexToken ft
, ffebld expr
,
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
,
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
,
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
,
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 static ffelexHandler
ffeexpr_find_close_paren_ (ffelexToken t
,
314 ffelexHandler after
);
315 static ffelexHandler
ffeexpr_nil_finished_ (ffelexToken t
);
316 static ffelexHandler
ffeexpr_nil_rhs_ (ffelexToken t
);
317 static ffelexHandler
ffeexpr_nil_period_ (ffelexToken t
);
318 static ffelexHandler
ffeexpr_nil_end_period_ (ffelexToken t
);
319 static ffelexHandler
ffeexpr_nil_swallow_period_ (ffelexToken t
);
320 static ffelexHandler
ffeexpr_nil_real_ (ffelexToken t
);
321 static ffelexHandler
ffeexpr_nil_real_exponent_ (ffelexToken t
);
322 static ffelexHandler
ffeexpr_nil_real_exp_sign_ (ffelexToken t
);
323 static ffelexHandler
ffeexpr_nil_number_ (ffelexToken t
);
324 static ffelexHandler
ffeexpr_nil_number_exponent_ (ffelexToken t
);
325 static ffelexHandler
ffeexpr_nil_number_exp_sign_ (ffelexToken t
);
326 static ffelexHandler
ffeexpr_nil_number_period_ (ffelexToken t
);
327 static ffelexHandler
ffeexpr_nil_number_per_exp_ (ffelexToken t
);
328 static ffelexHandler
ffeexpr_nil_number_real_ (ffelexToken t
);
329 static ffelexHandler
ffeexpr_nil_num_per_exp_sign_ (ffelexToken t
);
330 static ffelexHandler
ffeexpr_nil_number_real_exp_ (ffelexToken t
);
331 static ffelexHandler
ffeexpr_nil_num_real_exp_sn_ (ffelexToken t
);
332 static ffelexHandler
ffeexpr_nil_binary_ (ffelexToken t
);
333 static ffelexHandler
ffeexpr_nil_binary_period_ (ffelexToken t
);
334 static ffelexHandler
ffeexpr_nil_binary_end_per_ (ffelexToken t
);
335 static ffelexHandler
ffeexpr_nil_binary_sw_per_ (ffelexToken t
);
336 static ffelexHandler
ffeexpr_nil_quote_ (ffelexToken t
);
337 static ffelexHandler
ffeexpr_nil_apostrophe_ (ffelexToken t
);
338 static ffelexHandler
ffeexpr_nil_apos_char_ (ffelexToken t
);
339 static ffelexHandler
ffeexpr_nil_name_rhs_ (ffelexToken t
);
340 static ffelexHandler
ffeexpr_nil_name_apos_ (ffelexToken t
);
341 static ffelexHandler
ffeexpr_nil_name_apos_name_ (ffelexToken t
);
342 static ffelexHandler
ffeexpr_nil_percent_ (ffelexToken t
);
343 static ffelexHandler
ffeexpr_nil_percent_name_ (ffelexToken t
);
344 static ffelexHandler
ffeexpr_nil_substrp_ (ffelexToken t
);
345 static ffelexHandler
ffeexpr_finished_ (ffelexToken t
);
346 static ffebld
ffeexpr_finished_ambig_ (ffelexToken t
, ffebld expr
);
347 static ffelexHandler
ffeexpr_token_lhs_ (ffelexToken t
);
348 static ffelexHandler
ffeexpr_token_rhs_ (ffelexToken t
);
349 static ffelexHandler
ffeexpr_token_binary_ (ffelexToken t
);
350 static ffelexHandler
ffeexpr_token_period_ (ffelexToken t
);
351 static ffelexHandler
ffeexpr_token_end_period_ (ffelexToken t
);
352 static ffelexHandler
ffeexpr_token_swallow_period_ (ffelexToken t
);
353 static ffelexHandler
ffeexpr_token_real_ (ffelexToken t
);
354 static ffelexHandler
ffeexpr_token_real_exponent_ (ffelexToken t
);
355 static ffelexHandler
ffeexpr_token_real_exp_sign_ (ffelexToken t
);
356 static ffelexHandler
ffeexpr_token_number_ (ffelexToken t
);
357 static ffelexHandler
ffeexpr_token_number_exponent_ (ffelexToken t
);
358 static ffelexHandler
ffeexpr_token_number_exp_sign_ (ffelexToken t
);
359 static ffelexHandler
ffeexpr_token_number_period_ (ffelexToken t
);
360 static ffelexHandler
ffeexpr_token_number_per_exp_ (ffelexToken t
);
361 static ffelexHandler
ffeexpr_token_number_real_ (ffelexToken t
);
362 static ffelexHandler
ffeexpr_token_num_per_exp_sign_ (ffelexToken t
);
363 static ffelexHandler
ffeexpr_token_number_real_exp_ (ffelexToken t
);
364 static ffelexHandler
ffeexpr_token_num_real_exp_sn_ (ffelexToken t
);
365 static ffelexHandler
ffeexpr_token_binary_period_ (ffelexToken t
);
366 static ffelexHandler
ffeexpr_token_binary_end_per_ (ffelexToken t
);
367 static ffelexHandler
ffeexpr_token_binary_sw_per_ (ffelexToken t
);
368 static ffelexHandler
ffeexpr_token_quote_ (ffelexToken t
);
369 static ffelexHandler
ffeexpr_token_apostrophe_ (ffelexToken t
);
370 static ffelexHandler
ffeexpr_token_apos_char_ (ffelexToken t
);
371 static ffelexHandler
ffeexpr_token_name_lhs_ (ffelexToken t
);
372 static ffelexHandler
ffeexpr_token_name_arg_ (ffelexToken t
);
373 static ffelexHandler
ffeexpr_token_name_rhs_ (ffelexToken t
);
374 static ffelexHandler
ffeexpr_token_name_apos_ (ffelexToken t
);
375 static ffelexHandler
ffeexpr_token_name_apos_name_ (ffelexToken t
);
376 static ffelexHandler
ffeexpr_token_percent_ (ffelexToken t
);
377 static ffelexHandler
ffeexpr_token_percent_name_ (ffelexToken t
);
378 static ffelexHandler
ffeexpr_token_arguments_ (ffelexToken ft
, ffebld expr
,
380 static ffelexHandler
ffeexpr_token_elements_ (ffelexToken ft
, ffebld expr
,
382 static ffelexHandler
ffeexpr_token_equivalence_ (ffelexToken ft
, ffebld expr
,
384 static ffelexHandler
ffeexpr_token_substring_ (ffelexToken ft
, ffebld expr
,
386 static ffelexHandler
ffeexpr_token_substring_1_ (ffelexToken ft
, ffebld expr
,
388 static ffelexHandler
ffeexpr_token_substrp_ (ffelexToken t
);
389 static ffelexHandler
ffeexpr_token_intrincheck_ (ffelexToken t
);
390 static ffelexHandler
ffeexpr_token_funsubstr_ (ffelexToken ft
, ffebld expr
,
392 static ffelexHandler
ffeexpr_token_anything_ (ffelexToken ft
, ffebld expr
,
394 static void ffeexpr_make_float_const_ (char exp_letter
, ffelexToken integer
,
395 ffelexToken decimal
, ffelexToken fraction
, ffelexToken exponent
,
396 ffelexToken exponent_sign
, ffelexToken exponent_digits
);
397 static ffesymbol
ffeexpr_declare_unadorned_ (ffelexToken t
, bool maybe_intrin
);
398 static ffesymbol
ffeexpr_sym_impdoitem_ (ffesymbol s
, ffelexToken t
);
399 static ffesymbol
ffeexpr_sym_lhs_call_ (ffesymbol s
, ffelexToken t
);
400 static ffesymbol
ffeexpr_sym_lhs_data_ (ffesymbol s
, ffelexToken t
);
401 static ffesymbol
ffeexpr_sym_lhs_equivalence_ (ffesymbol s
, ffelexToken t
);
402 static ffesymbol
ffeexpr_sym_lhs_extfunc_ (ffesymbol s
, ffelexToken t
);
403 static ffesymbol
ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s
, ffelexToken t
);
404 static ffesymbol
ffeexpr_sym_lhs_parameter_ (ffesymbol s
, ffelexToken t
);
405 static ffesymbol
ffeexpr_sym_rhs_actualarg_ (ffesymbol s
, ffelexToken t
);
406 static ffesymbol
ffeexpr_sym_rhs_dimlist_ (ffesymbol s
, ffelexToken t
);
407 static ffesymbol
ffeexpr_sym_rhs_let_ (ffesymbol s
, ffelexToken t
);
408 static ffesymbol
ffeexpr_declare_parenthesized_ (ffelexToken t
,
410 ffeexprParenType_
*paren_type
);
411 static ffesymbol
ffeexpr_paren_rhs_let_ (ffesymbol s
, ffelexToken t
);
413 /* Internal macros. */
415 #define ffeexpr_paren_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
416 #define ffeexpr_sym_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)
418 /* ffeexpr_collapse_convert -- Collapse convert expr
422 expr = ffeexpr_collapse_convert(expr,token);
424 If the result of the expr is a constant, replaces the expr with the
425 computed constant. */
428 ffeexpr_collapse_convert (ffebld expr
, ffelexToken t
)
430 ffebad error
= FFEBAD
;
432 ffebldConstantUnion u
;
435 ffetargetCharacterSize sz
;
436 ffetargetCharacterSize sz2
;
438 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
441 l
= ffebld_left (expr
);
443 if (ffebld_op (l
) != FFEBLD_opCONTER
)
446 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
448 case FFEINFO_basictypeANY
:
451 case FFEINFO_basictypeINTEGER
:
452 sz
= FFETARGET_charactersizeNONE
;
453 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
455 #if FFETARGET_okINTEGER1
456 case FFEINFO_kindtypeINTEGER1
:
457 switch (ffeinfo_basictype (ffebld_info (l
)))
459 case FFEINFO_basictypeINTEGER
:
460 switch (ffeinfo_kindtype (ffebld_info (l
)))
462 #if FFETARGET_okINTEGER2
463 case FFEINFO_kindtypeINTEGER2
:
464 error
= ffetarget_convert_integer1_integer2
465 (ffebld_cu_ptr_integer1 (u
),
466 ffebld_constant_integer2 (ffebld_conter (l
)));
470 #if FFETARGET_okINTEGER3
471 case FFEINFO_kindtypeINTEGER3
:
472 error
= ffetarget_convert_integer1_integer3
473 (ffebld_cu_ptr_integer1 (u
),
474 ffebld_constant_integer3 (ffebld_conter (l
)));
478 #if FFETARGET_okINTEGER4
479 case FFEINFO_kindtypeINTEGER4
:
480 error
= ffetarget_convert_integer1_integer4
481 (ffebld_cu_ptr_integer1 (u
),
482 ffebld_constant_integer4 (ffebld_conter (l
)));
487 assert ("INTEGER1/INTEGER bad source kind type" == NULL
);
492 case FFEINFO_basictypeREAL
:
493 switch (ffeinfo_kindtype (ffebld_info (l
)))
495 #if FFETARGET_okREAL1
496 case FFEINFO_kindtypeREAL1
:
497 error
= ffetarget_convert_integer1_real1
498 (ffebld_cu_ptr_integer1 (u
),
499 ffebld_constant_real1 (ffebld_conter (l
)));
503 #if FFETARGET_okREAL2
504 case FFEINFO_kindtypeREAL2
:
505 error
= ffetarget_convert_integer1_real2
506 (ffebld_cu_ptr_integer1 (u
),
507 ffebld_constant_real2 (ffebld_conter (l
)));
511 #if FFETARGET_okREAL3
512 case FFEINFO_kindtypeREAL3
:
513 error
= ffetarget_convert_integer1_real3
514 (ffebld_cu_ptr_integer1 (u
),
515 ffebld_constant_real3 (ffebld_conter (l
)));
519 #if FFETARGET_okREAL4
520 case FFEINFO_kindtypeREAL4
:
521 error
= ffetarget_convert_integer1_real4
522 (ffebld_cu_ptr_integer1 (u
),
523 ffebld_constant_real4 (ffebld_conter (l
)));
528 assert ("INTEGER1/REAL bad source kind type" == NULL
);
533 case FFEINFO_basictypeCOMPLEX
:
534 switch (ffeinfo_kindtype (ffebld_info (l
)))
536 #if FFETARGET_okCOMPLEX1
537 case FFEINFO_kindtypeREAL1
:
538 error
= ffetarget_convert_integer1_complex1
539 (ffebld_cu_ptr_integer1 (u
),
540 ffebld_constant_complex1 (ffebld_conter (l
)));
544 #if FFETARGET_okCOMPLEX2
545 case FFEINFO_kindtypeREAL2
:
546 error
= ffetarget_convert_integer1_complex2
547 (ffebld_cu_ptr_integer1 (u
),
548 ffebld_constant_complex2 (ffebld_conter (l
)));
552 #if FFETARGET_okCOMPLEX3
553 case FFEINFO_kindtypeREAL3
:
554 error
= ffetarget_convert_integer1_complex3
555 (ffebld_cu_ptr_integer1 (u
),
556 ffebld_constant_complex3 (ffebld_conter (l
)));
560 #if FFETARGET_okCOMPLEX4
561 case FFEINFO_kindtypeREAL4
:
562 error
= ffetarget_convert_integer1_complex4
563 (ffebld_cu_ptr_integer1 (u
),
564 ffebld_constant_complex4 (ffebld_conter (l
)));
569 assert ("INTEGER1/COMPLEX bad source kind type" == NULL
);
574 case FFEINFO_basictypeLOGICAL
:
575 switch (ffeinfo_kindtype (ffebld_info (l
)))
577 #if FFETARGET_okLOGICAL1
578 case FFEINFO_kindtypeLOGICAL1
:
579 error
= ffetarget_convert_integer1_logical1
580 (ffebld_cu_ptr_integer1 (u
),
581 ffebld_constant_logical1 (ffebld_conter (l
)));
585 #if FFETARGET_okLOGICAL2
586 case FFEINFO_kindtypeLOGICAL2
:
587 error
= ffetarget_convert_integer1_logical2
588 (ffebld_cu_ptr_integer1 (u
),
589 ffebld_constant_logical2 (ffebld_conter (l
)));
593 #if FFETARGET_okLOGICAL3
594 case FFEINFO_kindtypeLOGICAL3
:
595 error
= ffetarget_convert_integer1_logical3
596 (ffebld_cu_ptr_integer1 (u
),
597 ffebld_constant_logical3 (ffebld_conter (l
)));
601 #if FFETARGET_okLOGICAL4
602 case FFEINFO_kindtypeLOGICAL4
:
603 error
= ffetarget_convert_integer1_logical4
604 (ffebld_cu_ptr_integer1 (u
),
605 ffebld_constant_logical4 (ffebld_conter (l
)));
610 assert ("INTEGER1/LOGICAL bad source kind type" == NULL
);
615 case FFEINFO_basictypeCHARACTER
:
616 error
= ffetarget_convert_integer1_character1
617 (ffebld_cu_ptr_integer1 (u
),
618 ffebld_constant_character1 (ffebld_conter (l
)));
621 case FFEINFO_basictypeHOLLERITH
:
622 error
= ffetarget_convert_integer1_hollerith
623 (ffebld_cu_ptr_integer1 (u
),
624 ffebld_constant_hollerith (ffebld_conter (l
)));
627 case FFEINFO_basictypeTYPELESS
:
628 error
= ffetarget_convert_integer1_typeless
629 (ffebld_cu_ptr_integer1 (u
),
630 ffebld_constant_typeless (ffebld_conter (l
)));
634 assert ("INTEGER1 bad type" == NULL
);
638 /* If conversion operation is not implemented, return original expr. */
639 if (error
== FFEBAD_NOCANDO
)
642 expr
= ffebld_new_conter_with_orig
643 (ffebld_constant_new_integer1_val
644 (ffebld_cu_val_integer1 (u
)), expr
);
648 #if FFETARGET_okINTEGER2
649 case FFEINFO_kindtypeINTEGER2
:
650 switch (ffeinfo_basictype (ffebld_info (l
)))
652 case FFEINFO_basictypeINTEGER
:
653 switch (ffeinfo_kindtype (ffebld_info (l
)))
655 #if FFETARGET_okINTEGER1
656 case FFEINFO_kindtypeINTEGER1
:
657 error
= ffetarget_convert_integer2_integer1
658 (ffebld_cu_ptr_integer2 (u
),
659 ffebld_constant_integer1 (ffebld_conter (l
)));
663 #if FFETARGET_okINTEGER3
664 case FFEINFO_kindtypeINTEGER3
:
665 error
= ffetarget_convert_integer2_integer3
666 (ffebld_cu_ptr_integer2 (u
),
667 ffebld_constant_integer3 (ffebld_conter (l
)));
671 #if FFETARGET_okINTEGER4
672 case FFEINFO_kindtypeINTEGER4
:
673 error
= ffetarget_convert_integer2_integer4
674 (ffebld_cu_ptr_integer2 (u
),
675 ffebld_constant_integer4 (ffebld_conter (l
)));
680 assert ("INTEGER2/INTEGER bad source kind type" == NULL
);
685 case FFEINFO_basictypeREAL
:
686 switch (ffeinfo_kindtype (ffebld_info (l
)))
688 #if FFETARGET_okREAL1
689 case FFEINFO_kindtypeREAL1
:
690 error
= ffetarget_convert_integer2_real1
691 (ffebld_cu_ptr_integer2 (u
),
692 ffebld_constant_real1 (ffebld_conter (l
)));
696 #if FFETARGET_okREAL2
697 case FFEINFO_kindtypeREAL2
:
698 error
= ffetarget_convert_integer2_real2
699 (ffebld_cu_ptr_integer2 (u
),
700 ffebld_constant_real2 (ffebld_conter (l
)));
704 #if FFETARGET_okREAL3
705 case FFEINFO_kindtypeREAL3
:
706 error
= ffetarget_convert_integer2_real3
707 (ffebld_cu_ptr_integer2 (u
),
708 ffebld_constant_real3 (ffebld_conter (l
)));
712 #if FFETARGET_okREAL4
713 case FFEINFO_kindtypeREAL4
:
714 error
= ffetarget_convert_integer2_real4
715 (ffebld_cu_ptr_integer2 (u
),
716 ffebld_constant_real4 (ffebld_conter (l
)));
721 assert ("INTEGER2/REAL bad source kind type" == NULL
);
726 case FFEINFO_basictypeCOMPLEX
:
727 switch (ffeinfo_kindtype (ffebld_info (l
)))
729 #if FFETARGET_okCOMPLEX1
730 case FFEINFO_kindtypeREAL1
:
731 error
= ffetarget_convert_integer2_complex1
732 (ffebld_cu_ptr_integer2 (u
),
733 ffebld_constant_complex1 (ffebld_conter (l
)));
737 #if FFETARGET_okCOMPLEX2
738 case FFEINFO_kindtypeREAL2
:
739 error
= ffetarget_convert_integer2_complex2
740 (ffebld_cu_ptr_integer2 (u
),
741 ffebld_constant_complex2 (ffebld_conter (l
)));
745 #if FFETARGET_okCOMPLEX3
746 case FFEINFO_kindtypeREAL3
:
747 error
= ffetarget_convert_integer2_complex3
748 (ffebld_cu_ptr_integer2 (u
),
749 ffebld_constant_complex3 (ffebld_conter (l
)));
753 #if FFETARGET_okCOMPLEX4
754 case FFEINFO_kindtypeREAL4
:
755 error
= ffetarget_convert_integer2_complex4
756 (ffebld_cu_ptr_integer2 (u
),
757 ffebld_constant_complex4 (ffebld_conter (l
)));
762 assert ("INTEGER2/COMPLEX bad source kind type" == NULL
);
767 case FFEINFO_basictypeLOGICAL
:
768 switch (ffeinfo_kindtype (ffebld_info (l
)))
770 #if FFETARGET_okLOGICAL1
771 case FFEINFO_kindtypeLOGICAL1
:
772 error
= ffetarget_convert_integer2_logical1
773 (ffebld_cu_ptr_integer2 (u
),
774 ffebld_constant_logical1 (ffebld_conter (l
)));
778 #if FFETARGET_okLOGICAL2
779 case FFEINFO_kindtypeLOGICAL2
:
780 error
= ffetarget_convert_integer2_logical2
781 (ffebld_cu_ptr_integer2 (u
),
782 ffebld_constant_logical2 (ffebld_conter (l
)));
786 #if FFETARGET_okLOGICAL3
787 case FFEINFO_kindtypeLOGICAL3
:
788 error
= ffetarget_convert_integer2_logical3
789 (ffebld_cu_ptr_integer2 (u
),
790 ffebld_constant_logical3 (ffebld_conter (l
)));
794 #if FFETARGET_okLOGICAL4
795 case FFEINFO_kindtypeLOGICAL4
:
796 error
= ffetarget_convert_integer2_logical4
797 (ffebld_cu_ptr_integer2 (u
),
798 ffebld_constant_logical4 (ffebld_conter (l
)));
803 assert ("INTEGER2/LOGICAL bad source kind type" == NULL
);
808 case FFEINFO_basictypeCHARACTER
:
809 error
= ffetarget_convert_integer2_character1
810 (ffebld_cu_ptr_integer2 (u
),
811 ffebld_constant_character1 (ffebld_conter (l
)));
814 case FFEINFO_basictypeHOLLERITH
:
815 error
= ffetarget_convert_integer2_hollerith
816 (ffebld_cu_ptr_integer2 (u
),
817 ffebld_constant_hollerith (ffebld_conter (l
)));
820 case FFEINFO_basictypeTYPELESS
:
821 error
= ffetarget_convert_integer2_typeless
822 (ffebld_cu_ptr_integer2 (u
),
823 ffebld_constant_typeless (ffebld_conter (l
)));
827 assert ("INTEGER2 bad type" == NULL
);
831 /* If conversion operation is not implemented, return original expr. */
832 if (error
== FFEBAD_NOCANDO
)
835 expr
= ffebld_new_conter_with_orig
836 (ffebld_constant_new_integer2_val
837 (ffebld_cu_val_integer2 (u
)), expr
);
841 #if FFETARGET_okINTEGER3
842 case FFEINFO_kindtypeINTEGER3
:
843 switch (ffeinfo_basictype (ffebld_info (l
)))
845 case FFEINFO_basictypeINTEGER
:
846 switch (ffeinfo_kindtype (ffebld_info (l
)))
848 #if FFETARGET_okINTEGER1
849 case FFEINFO_kindtypeINTEGER1
:
850 error
= ffetarget_convert_integer3_integer1
851 (ffebld_cu_ptr_integer3 (u
),
852 ffebld_constant_integer1 (ffebld_conter (l
)));
856 #if FFETARGET_okINTEGER2
857 case FFEINFO_kindtypeINTEGER2
:
858 error
= ffetarget_convert_integer3_integer2
859 (ffebld_cu_ptr_integer3 (u
),
860 ffebld_constant_integer2 (ffebld_conter (l
)));
864 #if FFETARGET_okINTEGER4
865 case FFEINFO_kindtypeINTEGER4
:
866 error
= ffetarget_convert_integer3_integer4
867 (ffebld_cu_ptr_integer3 (u
),
868 ffebld_constant_integer4 (ffebld_conter (l
)));
873 assert ("INTEGER3/INTEGER bad source kind type" == NULL
);
878 case FFEINFO_basictypeREAL
:
879 switch (ffeinfo_kindtype (ffebld_info (l
)))
881 #if FFETARGET_okREAL1
882 case FFEINFO_kindtypeREAL1
:
883 error
= ffetarget_convert_integer3_real1
884 (ffebld_cu_ptr_integer3 (u
),
885 ffebld_constant_real1 (ffebld_conter (l
)));
889 #if FFETARGET_okREAL2
890 case FFEINFO_kindtypeREAL2
:
891 error
= ffetarget_convert_integer3_real2
892 (ffebld_cu_ptr_integer3 (u
),
893 ffebld_constant_real2 (ffebld_conter (l
)));
897 #if FFETARGET_okREAL3
898 case FFEINFO_kindtypeREAL3
:
899 error
= ffetarget_convert_integer3_real3
900 (ffebld_cu_ptr_integer3 (u
),
901 ffebld_constant_real3 (ffebld_conter (l
)));
905 #if FFETARGET_okREAL4
906 case FFEINFO_kindtypeREAL4
:
907 error
= ffetarget_convert_integer3_real4
908 (ffebld_cu_ptr_integer3 (u
),
909 ffebld_constant_real4 (ffebld_conter (l
)));
914 assert ("INTEGER3/REAL bad source kind type" == NULL
);
919 case FFEINFO_basictypeCOMPLEX
:
920 switch (ffeinfo_kindtype (ffebld_info (l
)))
922 #if FFETARGET_okCOMPLEX1
923 case FFEINFO_kindtypeREAL1
:
924 error
= ffetarget_convert_integer3_complex1
925 (ffebld_cu_ptr_integer3 (u
),
926 ffebld_constant_complex1 (ffebld_conter (l
)));
930 #if FFETARGET_okCOMPLEX2
931 case FFEINFO_kindtypeREAL2
:
932 error
= ffetarget_convert_integer3_complex2
933 (ffebld_cu_ptr_integer3 (u
),
934 ffebld_constant_complex2 (ffebld_conter (l
)));
938 #if FFETARGET_okCOMPLEX3
939 case FFEINFO_kindtypeREAL3
:
940 error
= ffetarget_convert_integer3_complex3
941 (ffebld_cu_ptr_integer3 (u
),
942 ffebld_constant_complex3 (ffebld_conter (l
)));
946 #if FFETARGET_okCOMPLEX4
947 case FFEINFO_kindtypeREAL4
:
948 error
= ffetarget_convert_integer3_complex4
949 (ffebld_cu_ptr_integer3 (u
),
950 ffebld_constant_complex4 (ffebld_conter (l
)));
955 assert ("INTEGER3/COMPLEX bad source kind type" == NULL
);
960 case FFEINFO_basictypeLOGICAL
:
961 switch (ffeinfo_kindtype (ffebld_info (l
)))
963 #if FFETARGET_okLOGICAL1
964 case FFEINFO_kindtypeLOGICAL1
:
965 error
= ffetarget_convert_integer3_logical1
966 (ffebld_cu_ptr_integer3 (u
),
967 ffebld_constant_logical1 (ffebld_conter (l
)));
971 #if FFETARGET_okLOGICAL2
972 case FFEINFO_kindtypeLOGICAL2
:
973 error
= ffetarget_convert_integer3_logical2
974 (ffebld_cu_ptr_integer3 (u
),
975 ffebld_constant_logical2 (ffebld_conter (l
)));
979 #if FFETARGET_okLOGICAL3
980 case FFEINFO_kindtypeLOGICAL3
:
981 error
= ffetarget_convert_integer3_logical3
982 (ffebld_cu_ptr_integer3 (u
),
983 ffebld_constant_logical3 (ffebld_conter (l
)));
987 #if FFETARGET_okLOGICAL4
988 case FFEINFO_kindtypeLOGICAL4
:
989 error
= ffetarget_convert_integer3_logical4
990 (ffebld_cu_ptr_integer3 (u
),
991 ffebld_constant_logical4 (ffebld_conter (l
)));
996 assert ("INTEGER3/LOGICAL bad source kind type" == NULL
);
1001 case FFEINFO_basictypeCHARACTER
:
1002 error
= ffetarget_convert_integer3_character1
1003 (ffebld_cu_ptr_integer3 (u
),
1004 ffebld_constant_character1 (ffebld_conter (l
)));
1007 case FFEINFO_basictypeHOLLERITH
:
1008 error
= ffetarget_convert_integer3_hollerith
1009 (ffebld_cu_ptr_integer3 (u
),
1010 ffebld_constant_hollerith (ffebld_conter (l
)));
1013 case FFEINFO_basictypeTYPELESS
:
1014 error
= ffetarget_convert_integer3_typeless
1015 (ffebld_cu_ptr_integer3 (u
),
1016 ffebld_constant_typeless (ffebld_conter (l
)));
1020 assert ("INTEGER3 bad type" == NULL
);
1024 /* If conversion operation is not implemented, return original expr. */
1025 if (error
== FFEBAD_NOCANDO
)
1028 expr
= ffebld_new_conter_with_orig
1029 (ffebld_constant_new_integer3_val
1030 (ffebld_cu_val_integer3 (u
)), expr
);
1034 #if FFETARGET_okINTEGER4
1035 case FFEINFO_kindtypeINTEGER4
:
1036 switch (ffeinfo_basictype (ffebld_info (l
)))
1038 case FFEINFO_basictypeINTEGER
:
1039 switch (ffeinfo_kindtype (ffebld_info (l
)))
1041 #if FFETARGET_okINTEGER1
1042 case FFEINFO_kindtypeINTEGER1
:
1043 error
= ffetarget_convert_integer4_integer1
1044 (ffebld_cu_ptr_integer4 (u
),
1045 ffebld_constant_integer1 (ffebld_conter (l
)));
1049 #if FFETARGET_okINTEGER2
1050 case FFEINFO_kindtypeINTEGER2
:
1051 error
= ffetarget_convert_integer4_integer2
1052 (ffebld_cu_ptr_integer4 (u
),
1053 ffebld_constant_integer2 (ffebld_conter (l
)));
1057 #if FFETARGET_okINTEGER3
1058 case FFEINFO_kindtypeINTEGER3
:
1059 error
= ffetarget_convert_integer4_integer3
1060 (ffebld_cu_ptr_integer4 (u
),
1061 ffebld_constant_integer3 (ffebld_conter (l
)));
1066 assert ("INTEGER4/INTEGER bad source kind type" == NULL
);
1071 case FFEINFO_basictypeREAL
:
1072 switch (ffeinfo_kindtype (ffebld_info (l
)))
1074 #if FFETARGET_okREAL1
1075 case FFEINFO_kindtypeREAL1
:
1076 error
= ffetarget_convert_integer4_real1
1077 (ffebld_cu_ptr_integer4 (u
),
1078 ffebld_constant_real1 (ffebld_conter (l
)));
1082 #if FFETARGET_okREAL2
1083 case FFEINFO_kindtypeREAL2
:
1084 error
= ffetarget_convert_integer4_real2
1085 (ffebld_cu_ptr_integer4 (u
),
1086 ffebld_constant_real2 (ffebld_conter (l
)));
1090 #if FFETARGET_okREAL3
1091 case FFEINFO_kindtypeREAL3
:
1092 error
= ffetarget_convert_integer4_real3
1093 (ffebld_cu_ptr_integer4 (u
),
1094 ffebld_constant_real3 (ffebld_conter (l
)));
1098 #if FFETARGET_okREAL4
1099 case FFEINFO_kindtypeREAL4
:
1100 error
= ffetarget_convert_integer4_real4
1101 (ffebld_cu_ptr_integer4 (u
),
1102 ffebld_constant_real4 (ffebld_conter (l
)));
1107 assert ("INTEGER4/REAL bad source kind type" == NULL
);
1112 case FFEINFO_basictypeCOMPLEX
:
1113 switch (ffeinfo_kindtype (ffebld_info (l
)))
1115 #if FFETARGET_okCOMPLEX1
1116 case FFEINFO_kindtypeREAL1
:
1117 error
= ffetarget_convert_integer4_complex1
1118 (ffebld_cu_ptr_integer4 (u
),
1119 ffebld_constant_complex1 (ffebld_conter (l
)));
1123 #if FFETARGET_okCOMPLEX2
1124 case FFEINFO_kindtypeREAL2
:
1125 error
= ffetarget_convert_integer4_complex2
1126 (ffebld_cu_ptr_integer4 (u
),
1127 ffebld_constant_complex2 (ffebld_conter (l
)));
1131 #if FFETARGET_okCOMPLEX3
1132 case FFEINFO_kindtypeREAL3
:
1133 error
= ffetarget_convert_integer4_complex3
1134 (ffebld_cu_ptr_integer4 (u
),
1135 ffebld_constant_complex3 (ffebld_conter (l
)));
1139 #if FFETARGET_okCOMPLEX4
1140 case FFEINFO_kindtypeREAL4
:
1141 error
= ffetarget_convert_integer4_complex4
1142 (ffebld_cu_ptr_integer4 (u
),
1143 ffebld_constant_complex4 (ffebld_conter (l
)));
1148 assert ("INTEGER3/COMPLEX bad source kind type" == NULL
);
1153 case FFEINFO_basictypeLOGICAL
:
1154 switch (ffeinfo_kindtype (ffebld_info (l
)))
1156 #if FFETARGET_okLOGICAL1
1157 case FFEINFO_kindtypeLOGICAL1
:
1158 error
= ffetarget_convert_integer4_logical1
1159 (ffebld_cu_ptr_integer4 (u
),
1160 ffebld_constant_logical1 (ffebld_conter (l
)));
1164 #if FFETARGET_okLOGICAL2
1165 case FFEINFO_kindtypeLOGICAL2
:
1166 error
= ffetarget_convert_integer4_logical2
1167 (ffebld_cu_ptr_integer4 (u
),
1168 ffebld_constant_logical2 (ffebld_conter (l
)));
1172 #if FFETARGET_okLOGICAL3
1173 case FFEINFO_kindtypeLOGICAL3
:
1174 error
= ffetarget_convert_integer4_logical3
1175 (ffebld_cu_ptr_integer4 (u
),
1176 ffebld_constant_logical3 (ffebld_conter (l
)));
1180 #if FFETARGET_okLOGICAL4
1181 case FFEINFO_kindtypeLOGICAL4
:
1182 error
= ffetarget_convert_integer4_logical4
1183 (ffebld_cu_ptr_integer4 (u
),
1184 ffebld_constant_logical4 (ffebld_conter (l
)));
1189 assert ("INTEGER4/LOGICAL bad source kind type" == NULL
);
1194 case FFEINFO_basictypeCHARACTER
:
1195 error
= ffetarget_convert_integer4_character1
1196 (ffebld_cu_ptr_integer4 (u
),
1197 ffebld_constant_character1 (ffebld_conter (l
)));
1200 case FFEINFO_basictypeHOLLERITH
:
1201 error
= ffetarget_convert_integer4_hollerith
1202 (ffebld_cu_ptr_integer4 (u
),
1203 ffebld_constant_hollerith (ffebld_conter (l
)));
1206 case FFEINFO_basictypeTYPELESS
:
1207 error
= ffetarget_convert_integer4_typeless
1208 (ffebld_cu_ptr_integer4 (u
),
1209 ffebld_constant_typeless (ffebld_conter (l
)));
1213 assert ("INTEGER4 bad type" == NULL
);
1217 /* If conversion operation is not implemented, return original expr. */
1218 if (error
== FFEBAD_NOCANDO
)
1221 expr
= ffebld_new_conter_with_orig
1222 (ffebld_constant_new_integer4_val
1223 (ffebld_cu_val_integer4 (u
)), expr
);
1228 assert ("bad integer kind type" == NULL
);
1233 case FFEINFO_basictypeLOGICAL
:
1234 sz
= FFETARGET_charactersizeNONE
;
1235 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
1237 #if FFETARGET_okLOGICAL1
1238 case FFEINFO_kindtypeLOGICAL1
:
1239 switch (ffeinfo_basictype (ffebld_info (l
)))
1241 case FFEINFO_basictypeLOGICAL
:
1242 switch (ffeinfo_kindtype (ffebld_info (l
)))
1244 #if FFETARGET_okLOGICAL2
1245 case FFEINFO_kindtypeLOGICAL2
:
1246 error
= ffetarget_convert_logical1_logical2
1247 (ffebld_cu_ptr_logical1 (u
),
1248 ffebld_constant_logical2 (ffebld_conter (l
)));
1252 #if FFETARGET_okLOGICAL3
1253 case FFEINFO_kindtypeLOGICAL3
:
1254 error
= ffetarget_convert_logical1_logical3
1255 (ffebld_cu_ptr_logical1 (u
),
1256 ffebld_constant_logical3 (ffebld_conter (l
)));
1260 #if FFETARGET_okLOGICAL4
1261 case FFEINFO_kindtypeLOGICAL4
:
1262 error
= ffetarget_convert_logical1_logical4
1263 (ffebld_cu_ptr_logical1 (u
),
1264 ffebld_constant_logical4 (ffebld_conter (l
)));
1269 assert ("LOGICAL1/LOGICAL bad source kind type" == NULL
);
1274 case FFEINFO_basictypeINTEGER
:
1275 switch (ffeinfo_kindtype (ffebld_info (l
)))
1277 #if FFETARGET_okINTEGER1
1278 case FFEINFO_kindtypeINTEGER1
:
1279 error
= ffetarget_convert_logical1_integer1
1280 (ffebld_cu_ptr_logical1 (u
),
1281 ffebld_constant_integer1 (ffebld_conter (l
)));
1285 #if FFETARGET_okINTEGER2
1286 case FFEINFO_kindtypeINTEGER2
:
1287 error
= ffetarget_convert_logical1_integer2
1288 (ffebld_cu_ptr_logical1 (u
),
1289 ffebld_constant_integer2 (ffebld_conter (l
)));
1293 #if FFETARGET_okINTEGER3
1294 case FFEINFO_kindtypeINTEGER3
:
1295 error
= ffetarget_convert_logical1_integer3
1296 (ffebld_cu_ptr_logical1 (u
),
1297 ffebld_constant_integer3 (ffebld_conter (l
)));
1301 #if FFETARGET_okINTEGER4
1302 case FFEINFO_kindtypeINTEGER4
:
1303 error
= ffetarget_convert_logical1_integer4
1304 (ffebld_cu_ptr_logical1 (u
),
1305 ffebld_constant_integer4 (ffebld_conter (l
)));
1310 assert ("LOGICAL1/INTEGER bad source kind type" == NULL
);
1315 case FFEINFO_basictypeCHARACTER
:
1316 error
= ffetarget_convert_logical1_character1
1317 (ffebld_cu_ptr_logical1 (u
),
1318 ffebld_constant_character1 (ffebld_conter (l
)));
1321 case FFEINFO_basictypeHOLLERITH
:
1322 error
= ffetarget_convert_logical1_hollerith
1323 (ffebld_cu_ptr_logical1 (u
),
1324 ffebld_constant_hollerith (ffebld_conter (l
)));
1327 case FFEINFO_basictypeTYPELESS
:
1328 error
= ffetarget_convert_logical1_typeless
1329 (ffebld_cu_ptr_logical1 (u
),
1330 ffebld_constant_typeless (ffebld_conter (l
)));
1334 assert ("LOGICAL1 bad type" == NULL
);
1338 /* If conversion operation is not implemented, return original expr. */
1339 if (error
== FFEBAD_NOCANDO
)
1342 expr
= ffebld_new_conter_with_orig
1343 (ffebld_constant_new_logical1_val
1344 (ffebld_cu_val_logical1 (u
)), expr
);
1348 #if FFETARGET_okLOGICAL2
1349 case FFEINFO_kindtypeLOGICAL2
:
1350 switch (ffeinfo_basictype (ffebld_info (l
)))
1352 case FFEINFO_basictypeLOGICAL
:
1353 switch (ffeinfo_kindtype (ffebld_info (l
)))
1355 #if FFETARGET_okLOGICAL1
1356 case FFEINFO_kindtypeLOGICAL1
:
1357 error
= ffetarget_convert_logical2_logical1
1358 (ffebld_cu_ptr_logical2 (u
),
1359 ffebld_constant_logical1 (ffebld_conter (l
)));
1363 #if FFETARGET_okLOGICAL3
1364 case FFEINFO_kindtypeLOGICAL3
:
1365 error
= ffetarget_convert_logical2_logical3
1366 (ffebld_cu_ptr_logical2 (u
),
1367 ffebld_constant_logical3 (ffebld_conter (l
)));
1371 #if FFETARGET_okLOGICAL4
1372 case FFEINFO_kindtypeLOGICAL4
:
1373 error
= ffetarget_convert_logical2_logical4
1374 (ffebld_cu_ptr_logical2 (u
),
1375 ffebld_constant_logical4 (ffebld_conter (l
)));
1380 assert ("LOGICAL2/LOGICAL bad source kind type" == NULL
);
1385 case FFEINFO_basictypeINTEGER
:
1386 switch (ffeinfo_kindtype (ffebld_info (l
)))
1388 #if FFETARGET_okINTEGER1
1389 case FFEINFO_kindtypeINTEGER1
:
1390 error
= ffetarget_convert_logical2_integer1
1391 (ffebld_cu_ptr_logical2 (u
),
1392 ffebld_constant_integer1 (ffebld_conter (l
)));
1396 #if FFETARGET_okINTEGER2
1397 case FFEINFO_kindtypeINTEGER2
:
1398 error
= ffetarget_convert_logical2_integer2
1399 (ffebld_cu_ptr_logical2 (u
),
1400 ffebld_constant_integer2 (ffebld_conter (l
)));
1404 #if FFETARGET_okINTEGER3
1405 case FFEINFO_kindtypeINTEGER3
:
1406 error
= ffetarget_convert_logical2_integer3
1407 (ffebld_cu_ptr_logical2 (u
),
1408 ffebld_constant_integer3 (ffebld_conter (l
)));
1412 #if FFETARGET_okINTEGER4
1413 case FFEINFO_kindtypeINTEGER4
:
1414 error
= ffetarget_convert_logical2_integer4
1415 (ffebld_cu_ptr_logical2 (u
),
1416 ffebld_constant_integer4 (ffebld_conter (l
)));
1421 assert ("LOGICAL2/INTEGER bad source kind type" == NULL
);
1426 case FFEINFO_basictypeCHARACTER
:
1427 error
= ffetarget_convert_logical2_character1
1428 (ffebld_cu_ptr_logical2 (u
),
1429 ffebld_constant_character1 (ffebld_conter (l
)));
1432 case FFEINFO_basictypeHOLLERITH
:
1433 error
= ffetarget_convert_logical2_hollerith
1434 (ffebld_cu_ptr_logical2 (u
),
1435 ffebld_constant_hollerith (ffebld_conter (l
)));
1438 case FFEINFO_basictypeTYPELESS
:
1439 error
= ffetarget_convert_logical2_typeless
1440 (ffebld_cu_ptr_logical2 (u
),
1441 ffebld_constant_typeless (ffebld_conter (l
)));
1445 assert ("LOGICAL2 bad type" == NULL
);
1449 /* If conversion operation is not implemented, return original expr. */
1450 if (error
== FFEBAD_NOCANDO
)
1453 expr
= ffebld_new_conter_with_orig
1454 (ffebld_constant_new_logical2_val
1455 (ffebld_cu_val_logical2 (u
)), expr
);
1459 #if FFETARGET_okLOGICAL3
1460 case FFEINFO_kindtypeLOGICAL3
:
1461 switch (ffeinfo_basictype (ffebld_info (l
)))
1463 case FFEINFO_basictypeLOGICAL
:
1464 switch (ffeinfo_kindtype (ffebld_info (l
)))
1466 #if FFETARGET_okLOGICAL1
1467 case FFEINFO_kindtypeLOGICAL1
:
1468 error
= ffetarget_convert_logical3_logical1
1469 (ffebld_cu_ptr_logical3 (u
),
1470 ffebld_constant_logical1 (ffebld_conter (l
)));
1474 #if FFETARGET_okLOGICAL2
1475 case FFEINFO_kindtypeLOGICAL2
:
1476 error
= ffetarget_convert_logical3_logical2
1477 (ffebld_cu_ptr_logical3 (u
),
1478 ffebld_constant_logical2 (ffebld_conter (l
)));
1482 #if FFETARGET_okLOGICAL4
1483 case FFEINFO_kindtypeLOGICAL4
:
1484 error
= ffetarget_convert_logical3_logical4
1485 (ffebld_cu_ptr_logical3 (u
),
1486 ffebld_constant_logical4 (ffebld_conter (l
)));
1491 assert ("LOGICAL3/LOGICAL bad source kind type" == NULL
);
1496 case FFEINFO_basictypeINTEGER
:
1497 switch (ffeinfo_kindtype (ffebld_info (l
)))
1499 #if FFETARGET_okINTEGER1
1500 case FFEINFO_kindtypeINTEGER1
:
1501 error
= ffetarget_convert_logical3_integer1
1502 (ffebld_cu_ptr_logical3 (u
),
1503 ffebld_constant_integer1 (ffebld_conter (l
)));
1507 #if FFETARGET_okINTEGER2
1508 case FFEINFO_kindtypeINTEGER2
:
1509 error
= ffetarget_convert_logical3_integer2
1510 (ffebld_cu_ptr_logical3 (u
),
1511 ffebld_constant_integer2 (ffebld_conter (l
)));
1515 #if FFETARGET_okINTEGER3
1516 case FFEINFO_kindtypeINTEGER3
:
1517 error
= ffetarget_convert_logical3_integer3
1518 (ffebld_cu_ptr_logical3 (u
),
1519 ffebld_constant_integer3 (ffebld_conter (l
)));
1523 #if FFETARGET_okINTEGER4
1524 case FFEINFO_kindtypeINTEGER4
:
1525 error
= ffetarget_convert_logical3_integer4
1526 (ffebld_cu_ptr_logical3 (u
),
1527 ffebld_constant_integer4 (ffebld_conter (l
)));
1532 assert ("LOGICAL3/INTEGER bad source kind type" == NULL
);
1537 case FFEINFO_basictypeCHARACTER
:
1538 error
= ffetarget_convert_logical3_character1
1539 (ffebld_cu_ptr_logical3 (u
),
1540 ffebld_constant_character1 (ffebld_conter (l
)));
1543 case FFEINFO_basictypeHOLLERITH
:
1544 error
= ffetarget_convert_logical3_hollerith
1545 (ffebld_cu_ptr_logical3 (u
),
1546 ffebld_constant_hollerith (ffebld_conter (l
)));
1549 case FFEINFO_basictypeTYPELESS
:
1550 error
= ffetarget_convert_logical3_typeless
1551 (ffebld_cu_ptr_logical3 (u
),
1552 ffebld_constant_typeless (ffebld_conter (l
)));
1556 assert ("LOGICAL3 bad type" == NULL
);
1560 /* If conversion operation is not implemented, return original expr. */
1561 if (error
== FFEBAD_NOCANDO
)
1564 expr
= ffebld_new_conter_with_orig
1565 (ffebld_constant_new_logical3_val
1566 (ffebld_cu_val_logical3 (u
)), expr
);
1570 #if FFETARGET_okLOGICAL4
1571 case FFEINFO_kindtypeLOGICAL4
:
1572 switch (ffeinfo_basictype (ffebld_info (l
)))
1574 case FFEINFO_basictypeLOGICAL
:
1575 switch (ffeinfo_kindtype (ffebld_info (l
)))
1577 #if FFETARGET_okLOGICAL1
1578 case FFEINFO_kindtypeLOGICAL1
:
1579 error
= ffetarget_convert_logical4_logical1
1580 (ffebld_cu_ptr_logical4 (u
),
1581 ffebld_constant_logical1 (ffebld_conter (l
)));
1585 #if FFETARGET_okLOGICAL2
1586 case FFEINFO_kindtypeLOGICAL2
:
1587 error
= ffetarget_convert_logical4_logical2
1588 (ffebld_cu_ptr_logical4 (u
),
1589 ffebld_constant_logical2 (ffebld_conter (l
)));
1593 #if FFETARGET_okLOGICAL3
1594 case FFEINFO_kindtypeLOGICAL3
:
1595 error
= ffetarget_convert_logical4_logical3
1596 (ffebld_cu_ptr_logical4 (u
),
1597 ffebld_constant_logical3 (ffebld_conter (l
)));
1602 assert ("LOGICAL4/LOGICAL bad source kind type" == NULL
);
1607 case FFEINFO_basictypeINTEGER
:
1608 switch (ffeinfo_kindtype (ffebld_info (l
)))
1610 #if FFETARGET_okINTEGER1
1611 case FFEINFO_kindtypeINTEGER1
:
1612 error
= ffetarget_convert_logical4_integer1
1613 (ffebld_cu_ptr_logical4 (u
),
1614 ffebld_constant_integer1 (ffebld_conter (l
)));
1618 #if FFETARGET_okINTEGER2
1619 case FFEINFO_kindtypeINTEGER2
:
1620 error
= ffetarget_convert_logical4_integer2
1621 (ffebld_cu_ptr_logical4 (u
),
1622 ffebld_constant_integer2 (ffebld_conter (l
)));
1626 #if FFETARGET_okINTEGER3
1627 case FFEINFO_kindtypeINTEGER3
:
1628 error
= ffetarget_convert_logical4_integer3
1629 (ffebld_cu_ptr_logical4 (u
),
1630 ffebld_constant_integer3 (ffebld_conter (l
)));
1634 #if FFETARGET_okINTEGER4
1635 case FFEINFO_kindtypeINTEGER4
:
1636 error
= ffetarget_convert_logical4_integer4
1637 (ffebld_cu_ptr_logical4 (u
),
1638 ffebld_constant_integer4 (ffebld_conter (l
)));
1643 assert ("LOGICAL4/INTEGER bad source kind type" == NULL
);
1648 case FFEINFO_basictypeCHARACTER
:
1649 error
= ffetarget_convert_logical4_character1
1650 (ffebld_cu_ptr_logical4 (u
),
1651 ffebld_constant_character1 (ffebld_conter (l
)));
1654 case FFEINFO_basictypeHOLLERITH
:
1655 error
= ffetarget_convert_logical4_hollerith
1656 (ffebld_cu_ptr_logical4 (u
),
1657 ffebld_constant_hollerith (ffebld_conter (l
)));
1660 case FFEINFO_basictypeTYPELESS
:
1661 error
= ffetarget_convert_logical4_typeless
1662 (ffebld_cu_ptr_logical4 (u
),
1663 ffebld_constant_typeless (ffebld_conter (l
)));
1667 assert ("LOGICAL4 bad type" == NULL
);
1671 /* If conversion operation is not implemented, return original expr. */
1672 if (error
== FFEBAD_NOCANDO
)
1675 expr
= ffebld_new_conter_with_orig
1676 (ffebld_constant_new_logical4_val
1677 (ffebld_cu_val_logical4 (u
)), expr
);
1682 assert ("bad logical kind type" == NULL
);
1687 case FFEINFO_basictypeREAL
:
1688 sz
= FFETARGET_charactersizeNONE
;
1689 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
1691 #if FFETARGET_okREAL1
1692 case FFEINFO_kindtypeREAL1
:
1693 switch (ffeinfo_basictype (ffebld_info (l
)))
1695 case FFEINFO_basictypeINTEGER
:
1696 switch (ffeinfo_kindtype (ffebld_info (l
)))
1698 #if FFETARGET_okINTEGER1
1699 case FFEINFO_kindtypeINTEGER1
:
1700 error
= ffetarget_convert_real1_integer1
1701 (ffebld_cu_ptr_real1 (u
),
1702 ffebld_constant_integer1 (ffebld_conter (l
)));
1706 #if FFETARGET_okINTEGER2
1707 case FFEINFO_kindtypeINTEGER2
:
1708 error
= ffetarget_convert_real1_integer2
1709 (ffebld_cu_ptr_real1 (u
),
1710 ffebld_constant_integer2 (ffebld_conter (l
)));
1714 #if FFETARGET_okINTEGER3
1715 case FFEINFO_kindtypeINTEGER3
:
1716 error
= ffetarget_convert_real1_integer3
1717 (ffebld_cu_ptr_real1 (u
),
1718 ffebld_constant_integer3 (ffebld_conter (l
)));
1722 #if FFETARGET_okINTEGER4
1723 case FFEINFO_kindtypeINTEGER4
:
1724 error
= ffetarget_convert_real1_integer4
1725 (ffebld_cu_ptr_real1 (u
),
1726 ffebld_constant_integer4 (ffebld_conter (l
)));
1731 assert ("REAL1/INTEGER bad source kind type" == NULL
);
1736 case FFEINFO_basictypeREAL
:
1737 switch (ffeinfo_kindtype (ffebld_info (l
)))
1739 #if FFETARGET_okREAL2
1740 case FFEINFO_kindtypeREAL2
:
1741 error
= ffetarget_convert_real1_real2
1742 (ffebld_cu_ptr_real1 (u
),
1743 ffebld_constant_real2 (ffebld_conter (l
)));
1747 #if FFETARGET_okREAL3
1748 case FFEINFO_kindtypeREAL3
:
1749 error
= ffetarget_convert_real1_real3
1750 (ffebld_cu_ptr_real1 (u
),
1751 ffebld_constant_real3 (ffebld_conter (l
)));
1755 #if FFETARGET_okREAL4
1756 case FFEINFO_kindtypeREAL4
:
1757 error
= ffetarget_convert_real1_real4
1758 (ffebld_cu_ptr_real1 (u
),
1759 ffebld_constant_real4 (ffebld_conter (l
)));
1764 assert ("REAL1/REAL bad source kind type" == NULL
);
1769 case FFEINFO_basictypeCOMPLEX
:
1770 switch (ffeinfo_kindtype (ffebld_info (l
)))
1772 #if FFETARGET_okCOMPLEX1
1773 case FFEINFO_kindtypeREAL1
:
1774 error
= ffetarget_convert_real1_complex1
1775 (ffebld_cu_ptr_real1 (u
),
1776 ffebld_constant_complex1 (ffebld_conter (l
)));
1780 #if FFETARGET_okCOMPLEX2
1781 case FFEINFO_kindtypeREAL2
:
1782 error
= ffetarget_convert_real1_complex2
1783 (ffebld_cu_ptr_real1 (u
),
1784 ffebld_constant_complex2 (ffebld_conter (l
)));
1788 #if FFETARGET_okCOMPLEX3
1789 case FFEINFO_kindtypeREAL3
:
1790 error
= ffetarget_convert_real1_complex3
1791 (ffebld_cu_ptr_real1 (u
),
1792 ffebld_constant_complex3 (ffebld_conter (l
)));
1796 #if FFETARGET_okCOMPLEX4
1797 case FFEINFO_kindtypeREAL4
:
1798 error
= ffetarget_convert_real1_complex4
1799 (ffebld_cu_ptr_real1 (u
),
1800 ffebld_constant_complex4 (ffebld_conter (l
)));
1805 assert ("REAL1/COMPLEX bad source kind type" == NULL
);
1810 case FFEINFO_basictypeCHARACTER
:
1811 error
= ffetarget_convert_real1_character1
1812 (ffebld_cu_ptr_real1 (u
),
1813 ffebld_constant_character1 (ffebld_conter (l
)));
1816 case FFEINFO_basictypeHOLLERITH
:
1817 error
= ffetarget_convert_real1_hollerith
1818 (ffebld_cu_ptr_real1 (u
),
1819 ffebld_constant_hollerith (ffebld_conter (l
)));
1822 case FFEINFO_basictypeTYPELESS
:
1823 error
= ffetarget_convert_real1_typeless
1824 (ffebld_cu_ptr_real1 (u
),
1825 ffebld_constant_typeless (ffebld_conter (l
)));
1829 assert ("REAL1 bad type" == NULL
);
1833 /* If conversion operation is not implemented, return original expr. */
1834 if (error
== FFEBAD_NOCANDO
)
1837 expr
= ffebld_new_conter_with_orig
1838 (ffebld_constant_new_real1_val
1839 (ffebld_cu_val_real1 (u
)), expr
);
1843 #if FFETARGET_okREAL2
1844 case FFEINFO_kindtypeREAL2
:
1845 switch (ffeinfo_basictype (ffebld_info (l
)))
1847 case FFEINFO_basictypeINTEGER
:
1848 switch (ffeinfo_kindtype (ffebld_info (l
)))
1850 #if FFETARGET_okINTEGER1
1851 case FFEINFO_kindtypeINTEGER1
:
1852 error
= ffetarget_convert_real2_integer1
1853 (ffebld_cu_ptr_real2 (u
),
1854 ffebld_constant_integer1 (ffebld_conter (l
)));
1858 #if FFETARGET_okINTEGER2
1859 case FFEINFO_kindtypeINTEGER2
:
1860 error
= ffetarget_convert_real2_integer2
1861 (ffebld_cu_ptr_real2 (u
),
1862 ffebld_constant_integer2 (ffebld_conter (l
)));
1866 #if FFETARGET_okINTEGER3
1867 case FFEINFO_kindtypeINTEGER3
:
1868 error
= ffetarget_convert_real2_integer3
1869 (ffebld_cu_ptr_real2 (u
),
1870 ffebld_constant_integer3 (ffebld_conter (l
)));
1874 #if FFETARGET_okINTEGER4
1875 case FFEINFO_kindtypeINTEGER4
:
1876 error
= ffetarget_convert_real2_integer4
1877 (ffebld_cu_ptr_real2 (u
),
1878 ffebld_constant_integer4 (ffebld_conter (l
)));
1883 assert ("REAL2/INTEGER bad source kind type" == NULL
);
1888 case FFEINFO_basictypeREAL
:
1889 switch (ffeinfo_kindtype (ffebld_info (l
)))
1891 #if FFETARGET_okREAL1
1892 case FFEINFO_kindtypeREAL1
:
1893 error
= ffetarget_convert_real2_real1
1894 (ffebld_cu_ptr_real2 (u
),
1895 ffebld_constant_real1 (ffebld_conter (l
)));
1899 #if FFETARGET_okREAL3
1900 case FFEINFO_kindtypeREAL3
:
1901 error
= ffetarget_convert_real2_real3
1902 (ffebld_cu_ptr_real2 (u
),
1903 ffebld_constant_real3 (ffebld_conter (l
)));
1907 #if FFETARGET_okREAL4
1908 case FFEINFO_kindtypeREAL4
:
1909 error
= ffetarget_convert_real2_real4
1910 (ffebld_cu_ptr_real2 (u
),
1911 ffebld_constant_real4 (ffebld_conter (l
)));
1916 assert ("REAL2/REAL bad source kind type" == NULL
);
1921 case FFEINFO_basictypeCOMPLEX
:
1922 switch (ffeinfo_kindtype (ffebld_info (l
)))
1924 #if FFETARGET_okCOMPLEX1
1925 case FFEINFO_kindtypeREAL1
:
1926 error
= ffetarget_convert_real2_complex1
1927 (ffebld_cu_ptr_real2 (u
),
1928 ffebld_constant_complex1 (ffebld_conter (l
)));
1932 #if FFETARGET_okCOMPLEX2
1933 case FFEINFO_kindtypeREAL2
:
1934 error
= ffetarget_convert_real2_complex2
1935 (ffebld_cu_ptr_real2 (u
),
1936 ffebld_constant_complex2 (ffebld_conter (l
)));
1940 #if FFETARGET_okCOMPLEX3
1941 case FFEINFO_kindtypeREAL3
:
1942 error
= ffetarget_convert_real2_complex3
1943 (ffebld_cu_ptr_real2 (u
),
1944 ffebld_constant_complex3 (ffebld_conter (l
)));
1948 #if FFETARGET_okCOMPLEX4
1949 case FFEINFO_kindtypeREAL4
:
1950 error
= ffetarget_convert_real2_complex4
1951 (ffebld_cu_ptr_real2 (u
),
1952 ffebld_constant_complex4 (ffebld_conter (l
)));
1957 assert ("REAL2/COMPLEX bad source kind type" == NULL
);
1962 case FFEINFO_basictypeCHARACTER
:
1963 error
= ffetarget_convert_real2_character1
1964 (ffebld_cu_ptr_real2 (u
),
1965 ffebld_constant_character1 (ffebld_conter (l
)));
1968 case FFEINFO_basictypeHOLLERITH
:
1969 error
= ffetarget_convert_real2_hollerith
1970 (ffebld_cu_ptr_real2 (u
),
1971 ffebld_constant_hollerith (ffebld_conter (l
)));
1974 case FFEINFO_basictypeTYPELESS
:
1975 error
= ffetarget_convert_real2_typeless
1976 (ffebld_cu_ptr_real2 (u
),
1977 ffebld_constant_typeless (ffebld_conter (l
)));
1981 assert ("REAL2 bad type" == NULL
);
1985 /* If conversion operation is not implemented, return original expr. */
1986 if (error
== FFEBAD_NOCANDO
)
1989 expr
= ffebld_new_conter_with_orig
1990 (ffebld_constant_new_real2_val
1991 (ffebld_cu_val_real2 (u
)), expr
);
1995 #if FFETARGET_okREAL3
1996 case FFEINFO_kindtypeREAL3
:
1997 switch (ffeinfo_basictype (ffebld_info (l
)))
1999 case FFEINFO_basictypeINTEGER
:
2000 switch (ffeinfo_kindtype (ffebld_info (l
)))
2002 #if FFETARGET_okINTEGER1
2003 case FFEINFO_kindtypeINTEGER1
:
2004 error
= ffetarget_convert_real3_integer1
2005 (ffebld_cu_ptr_real3 (u
),
2006 ffebld_constant_integer1 (ffebld_conter (l
)));
2010 #if FFETARGET_okINTEGER2
2011 case FFEINFO_kindtypeINTEGER2
:
2012 error
= ffetarget_convert_real3_integer2
2013 (ffebld_cu_ptr_real3 (u
),
2014 ffebld_constant_integer2 (ffebld_conter (l
)));
2018 #if FFETARGET_okINTEGER3
2019 case FFEINFO_kindtypeINTEGER3
:
2020 error
= ffetarget_convert_real3_integer3
2021 (ffebld_cu_ptr_real3 (u
),
2022 ffebld_constant_integer3 (ffebld_conter (l
)));
2026 #if FFETARGET_okINTEGER4
2027 case FFEINFO_kindtypeINTEGER4
:
2028 error
= ffetarget_convert_real3_integer4
2029 (ffebld_cu_ptr_real3 (u
),
2030 ffebld_constant_integer4 (ffebld_conter (l
)));
2035 assert ("REAL3/INTEGER bad source kind type" == NULL
);
2040 case FFEINFO_basictypeREAL
:
2041 switch (ffeinfo_kindtype (ffebld_info (l
)))
2043 #if FFETARGET_okREAL1
2044 case FFEINFO_kindtypeREAL1
:
2045 error
= ffetarget_convert_real3_real1
2046 (ffebld_cu_ptr_real3 (u
),
2047 ffebld_constant_real1 (ffebld_conter (l
)));
2051 #if FFETARGET_okREAL2
2052 case FFEINFO_kindtypeREAL2
:
2053 error
= ffetarget_convert_real3_real2
2054 (ffebld_cu_ptr_real3 (u
),
2055 ffebld_constant_real2 (ffebld_conter (l
)));
2059 #if FFETARGET_okREAL4
2060 case FFEINFO_kindtypeREAL4
:
2061 error
= ffetarget_convert_real3_real4
2062 (ffebld_cu_ptr_real3 (u
),
2063 ffebld_constant_real4 (ffebld_conter (l
)));
2068 assert ("REAL3/REAL bad source kind type" == NULL
);
2073 case FFEINFO_basictypeCOMPLEX
:
2074 switch (ffeinfo_kindtype (ffebld_info (l
)))
2076 #if FFETARGET_okCOMPLEX1
2077 case FFEINFO_kindtypeREAL1
:
2078 error
= ffetarget_convert_real3_complex1
2079 (ffebld_cu_ptr_real3 (u
),
2080 ffebld_constant_complex1 (ffebld_conter (l
)));
2084 #if FFETARGET_okCOMPLEX2
2085 case FFEINFO_kindtypeREAL2
:
2086 error
= ffetarget_convert_real3_complex2
2087 (ffebld_cu_ptr_real3 (u
),
2088 ffebld_constant_complex2 (ffebld_conter (l
)));
2092 #if FFETARGET_okCOMPLEX3
2093 case FFEINFO_kindtypeREAL3
:
2094 error
= ffetarget_convert_real3_complex3
2095 (ffebld_cu_ptr_real3 (u
),
2096 ffebld_constant_complex3 (ffebld_conter (l
)));
2100 #if FFETARGET_okCOMPLEX4
2101 case FFEINFO_kindtypeREAL4
:
2102 error
= ffetarget_convert_real3_complex4
2103 (ffebld_cu_ptr_real3 (u
),
2104 ffebld_constant_complex4 (ffebld_conter (l
)));
2109 assert ("REAL3/COMPLEX bad source kind type" == NULL
);
2114 case FFEINFO_basictypeCHARACTER
:
2115 error
= ffetarget_convert_real3_character1
2116 (ffebld_cu_ptr_real3 (u
),
2117 ffebld_constant_character1 (ffebld_conter (l
)));
2120 case FFEINFO_basictypeHOLLERITH
:
2121 error
= ffetarget_convert_real3_hollerith
2122 (ffebld_cu_ptr_real3 (u
),
2123 ffebld_constant_hollerith (ffebld_conter (l
)));
2126 case FFEINFO_basictypeTYPELESS
:
2127 error
= ffetarget_convert_real3_typeless
2128 (ffebld_cu_ptr_real3 (u
),
2129 ffebld_constant_typeless (ffebld_conter (l
)));
2133 assert ("REAL3 bad type" == NULL
);
2137 /* If conversion operation is not implemented, return original expr. */
2138 if (error
== FFEBAD_NOCANDO
)
2141 expr
= ffebld_new_conter_with_orig
2142 (ffebld_constant_new_real3_val
2143 (ffebld_cu_val_real3 (u
)), expr
);
2147 #if FFETARGET_okREAL4
2148 case FFEINFO_kindtypeREAL4
:
2149 switch (ffeinfo_basictype (ffebld_info (l
)))
2151 case FFEINFO_basictypeINTEGER
:
2152 switch (ffeinfo_kindtype (ffebld_info (l
)))
2154 #if FFETARGET_okINTEGER1
2155 case FFEINFO_kindtypeINTEGER1
:
2156 error
= ffetarget_convert_real4_integer1
2157 (ffebld_cu_ptr_real4 (u
),
2158 ffebld_constant_integer1 (ffebld_conter (l
)));
2162 #if FFETARGET_okINTEGER2
2163 case FFEINFO_kindtypeINTEGER2
:
2164 error
= ffetarget_convert_real4_integer2
2165 (ffebld_cu_ptr_real4 (u
),
2166 ffebld_constant_integer2 (ffebld_conter (l
)));
2170 #if FFETARGET_okINTEGER3
2171 case FFEINFO_kindtypeINTEGER3
:
2172 error
= ffetarget_convert_real4_integer3
2173 (ffebld_cu_ptr_real4 (u
),
2174 ffebld_constant_integer3 (ffebld_conter (l
)));
2178 #if FFETARGET_okINTEGER4
2179 case FFEINFO_kindtypeINTEGER4
:
2180 error
= ffetarget_convert_real4_integer4
2181 (ffebld_cu_ptr_real4 (u
),
2182 ffebld_constant_integer4 (ffebld_conter (l
)));
2187 assert ("REAL4/INTEGER bad source kind type" == NULL
);
2192 case FFEINFO_basictypeREAL
:
2193 switch (ffeinfo_kindtype (ffebld_info (l
)))
2195 #if FFETARGET_okREAL1
2196 case FFEINFO_kindtypeREAL1
:
2197 error
= ffetarget_convert_real4_real1
2198 (ffebld_cu_ptr_real4 (u
),
2199 ffebld_constant_real1 (ffebld_conter (l
)));
2203 #if FFETARGET_okREAL2
2204 case FFEINFO_kindtypeREAL2
:
2205 error
= ffetarget_convert_real4_real2
2206 (ffebld_cu_ptr_real4 (u
),
2207 ffebld_constant_real2 (ffebld_conter (l
)));
2211 #if FFETARGET_okREAL3
2212 case FFEINFO_kindtypeREAL3
:
2213 error
= ffetarget_convert_real4_real3
2214 (ffebld_cu_ptr_real4 (u
),
2215 ffebld_constant_real3 (ffebld_conter (l
)));
2220 assert ("REAL4/REAL bad source kind type" == NULL
);
2225 case FFEINFO_basictypeCOMPLEX
:
2226 switch (ffeinfo_kindtype (ffebld_info (l
)))
2228 #if FFETARGET_okCOMPLEX1
2229 case FFEINFO_kindtypeREAL1
:
2230 error
= ffetarget_convert_real4_complex1
2231 (ffebld_cu_ptr_real4 (u
),
2232 ffebld_constant_complex1 (ffebld_conter (l
)));
2236 #if FFETARGET_okCOMPLEX2
2237 case FFEINFO_kindtypeREAL2
:
2238 error
= ffetarget_convert_real4_complex2
2239 (ffebld_cu_ptr_real4 (u
),
2240 ffebld_constant_complex2 (ffebld_conter (l
)));
2244 #if FFETARGET_okCOMPLEX3
2245 case FFEINFO_kindtypeREAL3
:
2246 error
= ffetarget_convert_real4_complex3
2247 (ffebld_cu_ptr_real4 (u
),
2248 ffebld_constant_complex3 (ffebld_conter (l
)));
2252 #if FFETARGET_okCOMPLEX4
2253 case FFEINFO_kindtypeREAL4
:
2254 error
= ffetarget_convert_real4_complex4
2255 (ffebld_cu_ptr_real4 (u
),
2256 ffebld_constant_complex4 (ffebld_conter (l
)));
2261 assert ("REAL4/COMPLEX bad source kind type" == NULL
);
2266 case FFEINFO_basictypeCHARACTER
:
2267 error
= ffetarget_convert_real4_character1
2268 (ffebld_cu_ptr_real4 (u
),
2269 ffebld_constant_character1 (ffebld_conter (l
)));
2272 case FFEINFO_basictypeHOLLERITH
:
2273 error
= ffetarget_convert_real4_hollerith
2274 (ffebld_cu_ptr_real4 (u
),
2275 ffebld_constant_hollerith (ffebld_conter (l
)));
2278 case FFEINFO_basictypeTYPELESS
:
2279 error
= ffetarget_convert_real4_typeless
2280 (ffebld_cu_ptr_real4 (u
),
2281 ffebld_constant_typeless (ffebld_conter (l
)));
2285 assert ("REAL4 bad type" == NULL
);
2289 /* If conversion operation is not implemented, return original expr. */
2290 if (error
== FFEBAD_NOCANDO
)
2293 expr
= ffebld_new_conter_with_orig
2294 (ffebld_constant_new_real4_val
2295 (ffebld_cu_val_real4 (u
)), expr
);
2300 assert ("bad real kind type" == NULL
);
2305 case FFEINFO_basictypeCOMPLEX
:
2306 sz
= FFETARGET_charactersizeNONE
;
2307 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
2309 #if FFETARGET_okCOMPLEX1
2310 case FFEINFO_kindtypeREAL1
:
2311 switch (ffeinfo_basictype (ffebld_info (l
)))
2313 case FFEINFO_basictypeINTEGER
:
2314 switch (ffeinfo_kindtype (ffebld_info (l
)))
2316 #if FFETARGET_okINTEGER1
2317 case FFEINFO_kindtypeINTEGER1
:
2318 error
= ffetarget_convert_complex1_integer1
2319 (ffebld_cu_ptr_complex1 (u
),
2320 ffebld_constant_integer1 (ffebld_conter (l
)));
2324 #if FFETARGET_okINTEGER2
2325 case FFEINFO_kindtypeINTEGER2
:
2326 error
= ffetarget_convert_complex1_integer2
2327 (ffebld_cu_ptr_complex1 (u
),
2328 ffebld_constant_integer2 (ffebld_conter (l
)));
2332 #if FFETARGET_okINTEGER3
2333 case FFEINFO_kindtypeINTEGER3
:
2334 error
= ffetarget_convert_complex1_integer3
2335 (ffebld_cu_ptr_complex1 (u
),
2336 ffebld_constant_integer3 (ffebld_conter (l
)));
2340 #if FFETARGET_okINTEGER4
2341 case FFEINFO_kindtypeINTEGER4
:
2342 error
= ffetarget_convert_complex1_integer4
2343 (ffebld_cu_ptr_complex1 (u
),
2344 ffebld_constant_integer4 (ffebld_conter (l
)));
2349 assert ("COMPLEX1/INTEGER bad source kind type" == NULL
);
2354 case FFEINFO_basictypeREAL
:
2355 switch (ffeinfo_kindtype (ffebld_info (l
)))
2357 #if FFETARGET_okREAL1
2358 case FFEINFO_kindtypeREAL1
:
2359 error
= ffetarget_convert_complex1_real1
2360 (ffebld_cu_ptr_complex1 (u
),
2361 ffebld_constant_real1 (ffebld_conter (l
)));
2365 #if FFETARGET_okREAL2
2366 case FFEINFO_kindtypeREAL2
:
2367 error
= ffetarget_convert_complex1_real2
2368 (ffebld_cu_ptr_complex1 (u
),
2369 ffebld_constant_real2 (ffebld_conter (l
)));
2373 #if FFETARGET_okREAL3
2374 case FFEINFO_kindtypeREAL3
:
2375 error
= ffetarget_convert_complex1_real3
2376 (ffebld_cu_ptr_complex1 (u
),
2377 ffebld_constant_real3 (ffebld_conter (l
)));
2381 #if FFETARGET_okREAL4
2382 case FFEINFO_kindtypeREAL4
:
2383 error
= ffetarget_convert_complex1_real4
2384 (ffebld_cu_ptr_complex1 (u
),
2385 ffebld_constant_real4 (ffebld_conter (l
)));
2390 assert ("COMPLEX1/REAL bad source kind type" == NULL
);
2395 case FFEINFO_basictypeCOMPLEX
:
2396 switch (ffeinfo_kindtype (ffebld_info (l
)))
2398 #if FFETARGET_okCOMPLEX2
2399 case FFEINFO_kindtypeREAL2
:
2400 error
= ffetarget_convert_complex1_complex2
2401 (ffebld_cu_ptr_complex1 (u
),
2402 ffebld_constant_complex2 (ffebld_conter (l
)));
2406 #if FFETARGET_okCOMPLEX3
2407 case FFEINFO_kindtypeREAL3
:
2408 error
= ffetarget_convert_complex1_complex3
2409 (ffebld_cu_ptr_complex1 (u
),
2410 ffebld_constant_complex3 (ffebld_conter (l
)));
2414 #if FFETARGET_okCOMPLEX4
2415 case FFEINFO_kindtypeREAL4
:
2416 error
= ffetarget_convert_complex1_complex4
2417 (ffebld_cu_ptr_complex1 (u
),
2418 ffebld_constant_complex4 (ffebld_conter (l
)));
2423 assert ("COMPLEX1/COMPLEX bad source kind type" == NULL
);
2428 case FFEINFO_basictypeCHARACTER
:
2429 error
= ffetarget_convert_complex1_character1
2430 (ffebld_cu_ptr_complex1 (u
),
2431 ffebld_constant_character1 (ffebld_conter (l
)));
2434 case FFEINFO_basictypeHOLLERITH
:
2435 error
= ffetarget_convert_complex1_hollerith
2436 (ffebld_cu_ptr_complex1 (u
),
2437 ffebld_constant_hollerith (ffebld_conter (l
)));
2440 case FFEINFO_basictypeTYPELESS
:
2441 error
= ffetarget_convert_complex1_typeless
2442 (ffebld_cu_ptr_complex1 (u
),
2443 ffebld_constant_typeless (ffebld_conter (l
)));
2447 assert ("COMPLEX1 bad type" == NULL
);
2451 /* If conversion operation is not implemented, return original expr. */
2452 if (error
== FFEBAD_NOCANDO
)
2455 expr
= ffebld_new_conter_with_orig
2456 (ffebld_constant_new_complex1_val
2457 (ffebld_cu_val_complex1 (u
)), expr
);
2461 #if FFETARGET_okCOMPLEX2
2462 case FFEINFO_kindtypeREAL2
:
2463 switch (ffeinfo_basictype (ffebld_info (l
)))
2465 case FFEINFO_basictypeINTEGER
:
2466 switch (ffeinfo_kindtype (ffebld_info (l
)))
2468 #if FFETARGET_okINTEGER1
2469 case FFEINFO_kindtypeINTEGER1
:
2470 error
= ffetarget_convert_complex2_integer1
2471 (ffebld_cu_ptr_complex2 (u
),
2472 ffebld_constant_integer1 (ffebld_conter (l
)));
2476 #if FFETARGET_okINTEGER2
2477 case FFEINFO_kindtypeINTEGER2
:
2478 error
= ffetarget_convert_complex2_integer2
2479 (ffebld_cu_ptr_complex2 (u
),
2480 ffebld_constant_integer2 (ffebld_conter (l
)));
2484 #if FFETARGET_okINTEGER3
2485 case FFEINFO_kindtypeINTEGER3
:
2486 error
= ffetarget_convert_complex2_integer3
2487 (ffebld_cu_ptr_complex2 (u
),
2488 ffebld_constant_integer3 (ffebld_conter (l
)));
2492 #if FFETARGET_okINTEGER4
2493 case FFEINFO_kindtypeINTEGER4
:
2494 error
= ffetarget_convert_complex2_integer4
2495 (ffebld_cu_ptr_complex2 (u
),
2496 ffebld_constant_integer4 (ffebld_conter (l
)));
2501 assert ("COMPLEX2/INTEGER bad source kind type" == NULL
);
2506 case FFEINFO_basictypeREAL
:
2507 switch (ffeinfo_kindtype (ffebld_info (l
)))
2509 #if FFETARGET_okREAL1
2510 case FFEINFO_kindtypeREAL1
:
2511 error
= ffetarget_convert_complex2_real1
2512 (ffebld_cu_ptr_complex2 (u
),
2513 ffebld_constant_real1 (ffebld_conter (l
)));
2517 #if FFETARGET_okREAL2
2518 case FFEINFO_kindtypeREAL2
:
2519 error
= ffetarget_convert_complex2_real2
2520 (ffebld_cu_ptr_complex2 (u
),
2521 ffebld_constant_real2 (ffebld_conter (l
)));
2525 #if FFETARGET_okREAL3
2526 case FFEINFO_kindtypeREAL3
:
2527 error
= ffetarget_convert_complex2_real3
2528 (ffebld_cu_ptr_complex2 (u
),
2529 ffebld_constant_real3 (ffebld_conter (l
)));
2533 #if FFETARGET_okREAL4
2534 case FFEINFO_kindtypeREAL4
:
2535 error
= ffetarget_convert_complex2_real4
2536 (ffebld_cu_ptr_complex2 (u
),
2537 ffebld_constant_real4 (ffebld_conter (l
)));
2542 assert ("COMPLEX2/REAL bad source kind type" == NULL
);
2547 case FFEINFO_basictypeCOMPLEX
:
2548 switch (ffeinfo_kindtype (ffebld_info (l
)))
2550 #if FFETARGET_okCOMPLEX1
2551 case FFEINFO_kindtypeREAL1
:
2552 error
= ffetarget_convert_complex2_complex1
2553 (ffebld_cu_ptr_complex2 (u
),
2554 ffebld_constant_complex1 (ffebld_conter (l
)));
2558 #if FFETARGET_okCOMPLEX3
2559 case FFEINFO_kindtypeREAL3
:
2560 error
= ffetarget_convert_complex2_complex3
2561 (ffebld_cu_ptr_complex2 (u
),
2562 ffebld_constant_complex3 (ffebld_conter (l
)));
2566 #if FFETARGET_okCOMPLEX4
2567 case FFEINFO_kindtypeREAL4
:
2568 error
= ffetarget_convert_complex2_complex4
2569 (ffebld_cu_ptr_complex2 (u
),
2570 ffebld_constant_complex4 (ffebld_conter (l
)));
2575 assert ("COMPLEX2/COMPLEX bad source kind type" == NULL
);
2580 case FFEINFO_basictypeCHARACTER
:
2581 error
= ffetarget_convert_complex2_character1
2582 (ffebld_cu_ptr_complex2 (u
),
2583 ffebld_constant_character1 (ffebld_conter (l
)));
2586 case FFEINFO_basictypeHOLLERITH
:
2587 error
= ffetarget_convert_complex2_hollerith
2588 (ffebld_cu_ptr_complex2 (u
),
2589 ffebld_constant_hollerith (ffebld_conter (l
)));
2592 case FFEINFO_basictypeTYPELESS
:
2593 error
= ffetarget_convert_complex2_typeless
2594 (ffebld_cu_ptr_complex2 (u
),
2595 ffebld_constant_typeless (ffebld_conter (l
)));
2599 assert ("COMPLEX2 bad type" == NULL
);
2603 /* If conversion operation is not implemented, return original expr. */
2604 if (error
== FFEBAD_NOCANDO
)
2607 expr
= ffebld_new_conter_with_orig
2608 (ffebld_constant_new_complex2_val
2609 (ffebld_cu_val_complex2 (u
)), expr
);
2613 #if FFETARGET_okCOMPLEX3
2614 case FFEINFO_kindtypeREAL3
:
2615 switch (ffeinfo_basictype (ffebld_info (l
)))
2617 case FFEINFO_basictypeINTEGER
:
2618 switch (ffeinfo_kindtype (ffebld_info (l
)))
2620 #if FFETARGET_okINTEGER1
2621 case FFEINFO_kindtypeINTEGER1
:
2622 error
= ffetarget_convert_complex3_integer1
2623 (ffebld_cu_ptr_complex3 (u
),
2624 ffebld_constant_integer1 (ffebld_conter (l
)));
2628 #if FFETARGET_okINTEGER2
2629 case FFEINFO_kindtypeINTEGER2
:
2630 error
= ffetarget_convert_complex3_integer2
2631 (ffebld_cu_ptr_complex3 (u
),
2632 ffebld_constant_integer2 (ffebld_conter (l
)));
2636 #if FFETARGET_okINTEGER3
2637 case FFEINFO_kindtypeINTEGER3
:
2638 error
= ffetarget_convert_complex3_integer3
2639 (ffebld_cu_ptr_complex3 (u
),
2640 ffebld_constant_integer3 (ffebld_conter (l
)));
2644 #if FFETARGET_okINTEGER4
2645 case FFEINFO_kindtypeINTEGER4
:
2646 error
= ffetarget_convert_complex3_integer4
2647 (ffebld_cu_ptr_complex3 (u
),
2648 ffebld_constant_integer4 (ffebld_conter (l
)));
2653 assert ("COMPLEX3/INTEGER bad source kind type" == NULL
);
2658 case FFEINFO_basictypeREAL
:
2659 switch (ffeinfo_kindtype (ffebld_info (l
)))
2661 #if FFETARGET_okREAL1
2662 case FFEINFO_kindtypeREAL1
:
2663 error
= ffetarget_convert_complex3_real1
2664 (ffebld_cu_ptr_complex3 (u
),
2665 ffebld_constant_real1 (ffebld_conter (l
)));
2669 #if FFETARGET_okREAL2
2670 case FFEINFO_kindtypeREAL2
:
2671 error
= ffetarget_convert_complex3_real2
2672 (ffebld_cu_ptr_complex3 (u
),
2673 ffebld_constant_real2 (ffebld_conter (l
)));
2677 #if FFETARGET_okREAL3
2678 case FFEINFO_kindtypeREAL3
:
2679 error
= ffetarget_convert_complex3_real3
2680 (ffebld_cu_ptr_complex3 (u
),
2681 ffebld_constant_real3 (ffebld_conter (l
)));
2685 #if FFETARGET_okREAL4
2686 case FFEINFO_kindtypeREAL4
:
2687 error
= ffetarget_convert_complex3_real4
2688 (ffebld_cu_ptr_complex3 (u
),
2689 ffebld_constant_real4 (ffebld_conter (l
)));
2694 assert ("COMPLEX3/REAL bad source kind type" == NULL
);
2699 case FFEINFO_basictypeCOMPLEX
:
2700 switch (ffeinfo_kindtype (ffebld_info (l
)))
2702 #if FFETARGET_okCOMPLEX1
2703 case FFEINFO_kindtypeREAL1
:
2704 error
= ffetarget_convert_complex3_complex1
2705 (ffebld_cu_ptr_complex3 (u
),
2706 ffebld_constant_complex1 (ffebld_conter (l
)));
2710 #if FFETARGET_okCOMPLEX2
2711 case FFEINFO_kindtypeREAL2
:
2712 error
= ffetarget_convert_complex3_complex2
2713 (ffebld_cu_ptr_complex3 (u
),
2714 ffebld_constant_complex2 (ffebld_conter (l
)));
2718 #if FFETARGET_okCOMPLEX4
2719 case FFEINFO_kindtypeREAL4
:
2720 error
= ffetarget_convert_complex3_complex4
2721 (ffebld_cu_ptr_complex3 (u
),
2722 ffebld_constant_complex4 (ffebld_conter (l
)));
2727 assert ("COMPLEX3/COMPLEX bad source kind type" == NULL
);
2732 case FFEINFO_basictypeCHARACTER
:
2733 error
= ffetarget_convert_complex3_character1
2734 (ffebld_cu_ptr_complex3 (u
),
2735 ffebld_constant_character1 (ffebld_conter (l
)));
2738 case FFEINFO_basictypeHOLLERITH
:
2739 error
= ffetarget_convert_complex3_hollerith
2740 (ffebld_cu_ptr_complex3 (u
),
2741 ffebld_constant_hollerith (ffebld_conter (l
)));
2744 case FFEINFO_basictypeTYPELESS
:
2745 error
= ffetarget_convert_complex3_typeless
2746 (ffebld_cu_ptr_complex3 (u
),
2747 ffebld_constant_typeless (ffebld_conter (l
)));
2751 assert ("COMPLEX3 bad type" == NULL
);
2755 /* If conversion operation is not implemented, return original expr. */
2756 if (error
== FFEBAD_NOCANDO
)
2759 expr
= ffebld_new_conter_with_orig
2760 (ffebld_constant_new_complex3_val
2761 (ffebld_cu_val_complex3 (u
)), expr
);
2765 #if FFETARGET_okCOMPLEX4
2766 case FFEINFO_kindtypeREAL4
:
2767 switch (ffeinfo_basictype (ffebld_info (l
)))
2769 case FFEINFO_basictypeINTEGER
:
2770 switch (ffeinfo_kindtype (ffebld_info (l
)))
2772 #if FFETARGET_okINTEGER1
2773 case FFEINFO_kindtypeINTEGER1
:
2774 error
= ffetarget_convert_complex4_integer1
2775 (ffebld_cu_ptr_complex4 (u
),
2776 ffebld_constant_integer1 (ffebld_conter (l
)));
2780 #if FFETARGET_okINTEGER2
2781 case FFEINFO_kindtypeINTEGER2
:
2782 error
= ffetarget_convert_complex4_integer2
2783 (ffebld_cu_ptr_complex4 (u
),
2784 ffebld_constant_integer2 (ffebld_conter (l
)));
2788 #if FFETARGET_okINTEGER3
2789 case FFEINFO_kindtypeINTEGER3
:
2790 error
= ffetarget_convert_complex4_integer3
2791 (ffebld_cu_ptr_complex4 (u
),
2792 ffebld_constant_integer3 (ffebld_conter (l
)));
2796 #if FFETARGET_okINTEGER4
2797 case FFEINFO_kindtypeINTEGER4
:
2798 error
= ffetarget_convert_complex4_integer4
2799 (ffebld_cu_ptr_complex4 (u
),
2800 ffebld_constant_integer4 (ffebld_conter (l
)));
2805 assert ("COMPLEX4/INTEGER bad source kind type" == NULL
);
2810 case FFEINFO_basictypeREAL
:
2811 switch (ffeinfo_kindtype (ffebld_info (l
)))
2813 #if FFETARGET_okREAL1
2814 case FFEINFO_kindtypeREAL1
:
2815 error
= ffetarget_convert_complex4_real1
2816 (ffebld_cu_ptr_complex4 (u
),
2817 ffebld_constant_real1 (ffebld_conter (l
)));
2821 #if FFETARGET_okREAL2
2822 case FFEINFO_kindtypeREAL2
:
2823 error
= ffetarget_convert_complex4_real2
2824 (ffebld_cu_ptr_complex4 (u
),
2825 ffebld_constant_real2 (ffebld_conter (l
)));
2829 #if FFETARGET_okREAL3
2830 case FFEINFO_kindtypeREAL3
:
2831 error
= ffetarget_convert_complex4_real3
2832 (ffebld_cu_ptr_complex4 (u
),
2833 ffebld_constant_real3 (ffebld_conter (l
)));
2837 #if FFETARGET_okREAL4
2838 case FFEINFO_kindtypeREAL4
:
2839 error
= ffetarget_convert_complex4_real4
2840 (ffebld_cu_ptr_complex4 (u
),
2841 ffebld_constant_real4 (ffebld_conter (l
)));
2846 assert ("COMPLEX4/REAL bad source kind type" == NULL
);
2851 case FFEINFO_basictypeCOMPLEX
:
2852 switch (ffeinfo_kindtype (ffebld_info (l
)))
2854 #if FFETARGET_okCOMPLEX1
2855 case FFEINFO_kindtypeREAL1
:
2856 error
= ffetarget_convert_complex4_complex1
2857 (ffebld_cu_ptr_complex4 (u
),
2858 ffebld_constant_complex1 (ffebld_conter (l
)));
2862 #if FFETARGET_okCOMPLEX2
2863 case FFEINFO_kindtypeREAL2
:
2864 error
= ffetarget_convert_complex4_complex2
2865 (ffebld_cu_ptr_complex4 (u
),
2866 ffebld_constant_complex2 (ffebld_conter (l
)));
2870 #if FFETARGET_okCOMPLEX3
2871 case FFEINFO_kindtypeREAL3
:
2872 error
= ffetarget_convert_complex4_complex3
2873 (ffebld_cu_ptr_complex4 (u
),
2874 ffebld_constant_complex3 (ffebld_conter (l
)));
2879 assert ("COMPLEX4/COMPLEX bad source kind type" == NULL
);
2884 case FFEINFO_basictypeCHARACTER
:
2885 error
= ffetarget_convert_complex4_character1
2886 (ffebld_cu_ptr_complex4 (u
),
2887 ffebld_constant_character1 (ffebld_conter (l
)));
2890 case FFEINFO_basictypeHOLLERITH
:
2891 error
= ffetarget_convert_complex4_hollerith
2892 (ffebld_cu_ptr_complex4 (u
),
2893 ffebld_constant_hollerith (ffebld_conter (l
)));
2896 case FFEINFO_basictypeTYPELESS
:
2897 error
= ffetarget_convert_complex4_typeless
2898 (ffebld_cu_ptr_complex4 (u
),
2899 ffebld_constant_typeless (ffebld_conter (l
)));
2903 assert ("COMPLEX4 bad type" == NULL
);
2907 /* If conversion operation is not implemented, return original expr. */
2908 if (error
== FFEBAD_NOCANDO
)
2911 expr
= ffebld_new_conter_with_orig
2912 (ffebld_constant_new_complex4_val
2913 (ffebld_cu_val_complex4 (u
)), expr
);
2918 assert ("bad complex kind type" == NULL
);
2923 case FFEINFO_basictypeCHARACTER
:
2924 if ((sz
= ffebld_size (expr
)) == FFETARGET_charactersizeNONE
)
2926 kt
= ffeinfo_kindtype (ffebld_info (expr
));
2929 #if FFETARGET_okCHARACTER1
2930 case FFEINFO_kindtypeCHARACTER1
:
2931 switch (ffeinfo_basictype (ffebld_info (l
)))
2933 case FFEINFO_basictypeCHARACTER
:
2934 if ((sz2
= ffebld_size (l
)) == FFETARGET_charactersizeNONE
)
2936 assert (kt
== ffeinfo_kindtype (ffebld_info (l
)));
2937 assert (sz2
== ffetarget_length_character1
2938 (ffebld_constant_character1
2939 (ffebld_conter (l
))));
2941 = ffetarget_convert_character1_character1
2942 (ffebld_cu_ptr_character1 (u
), sz
,
2943 ffebld_constant_character1 (ffebld_conter (l
)),
2944 ffebld_constant_pool ());
2947 case FFEINFO_basictypeINTEGER
:
2948 switch (ffeinfo_kindtype (ffebld_info (l
)))
2950 #if FFETARGET_okINTEGER1
2951 case FFEINFO_kindtypeINTEGER1
:
2953 = ffetarget_convert_character1_integer1
2954 (ffebld_cu_ptr_character1 (u
),
2956 ffebld_constant_integer1 (ffebld_conter (l
)),
2957 ffebld_constant_pool ());
2961 #if FFETARGET_okINTEGER2
2962 case FFEINFO_kindtypeINTEGER2
:
2964 = ffetarget_convert_character1_integer2
2965 (ffebld_cu_ptr_character1 (u
),
2967 ffebld_constant_integer2 (ffebld_conter (l
)),
2968 ffebld_constant_pool ());
2972 #if FFETARGET_okINTEGER3
2973 case FFEINFO_kindtypeINTEGER3
:
2975 = ffetarget_convert_character1_integer3
2976 (ffebld_cu_ptr_character1 (u
),
2978 ffebld_constant_integer3 (ffebld_conter (l
)),
2979 ffebld_constant_pool ());
2983 #if FFETARGET_okINTEGER4
2984 case FFEINFO_kindtypeINTEGER4
:
2986 = ffetarget_convert_character1_integer4
2987 (ffebld_cu_ptr_character1 (u
),
2989 ffebld_constant_integer4 (ffebld_conter (l
)),
2990 ffebld_constant_pool ());
2995 assert ("CHARACTER1/INTEGER bad source kind type" == NULL
);
3000 case FFEINFO_basictypeLOGICAL
:
3001 switch (ffeinfo_kindtype (ffebld_info (l
)))
3003 #if FFETARGET_okLOGICAL1
3004 case FFEINFO_kindtypeLOGICAL1
:
3006 = ffetarget_convert_character1_logical1
3007 (ffebld_cu_ptr_character1 (u
),
3009 ffebld_constant_logical1 (ffebld_conter (l
)),
3010 ffebld_constant_pool ());
3014 #if FFETARGET_okLOGICAL2
3015 case FFEINFO_kindtypeLOGICAL2
:
3017 = ffetarget_convert_character1_logical2
3018 (ffebld_cu_ptr_character1 (u
),
3020 ffebld_constant_logical2 (ffebld_conter (l
)),
3021 ffebld_constant_pool ());
3025 #if FFETARGET_okLOGICAL3
3026 case FFEINFO_kindtypeLOGICAL3
:
3028 = ffetarget_convert_character1_logical3
3029 (ffebld_cu_ptr_character1 (u
),
3031 ffebld_constant_logical3 (ffebld_conter (l
)),
3032 ffebld_constant_pool ());
3036 #if FFETARGET_okLOGICAL4
3037 case FFEINFO_kindtypeLOGICAL4
:
3039 = ffetarget_convert_character1_logical4
3040 (ffebld_cu_ptr_character1 (u
),
3042 ffebld_constant_logical4 (ffebld_conter (l
)),
3043 ffebld_constant_pool ());
3048 assert ("CHARACTER1/LOGICAL bad source kind type" == NULL
);
3053 case FFEINFO_basictypeHOLLERITH
:
3055 = ffetarget_convert_character1_hollerith
3056 (ffebld_cu_ptr_character1 (u
),
3058 ffebld_constant_hollerith (ffebld_conter (l
)),
3059 ffebld_constant_pool ());
3062 case FFEINFO_basictypeTYPELESS
:
3064 = ffetarget_convert_character1_typeless
3065 (ffebld_cu_ptr_character1 (u
),
3067 ffebld_constant_typeless (ffebld_conter (l
)),
3068 ffebld_constant_pool ());
3072 assert ("CHARACTER1 bad type" == NULL
);
3076 = ffebld_new_conter_with_orig
3077 (ffebld_constant_new_character1_val
3078 (ffebld_cu_val_character1 (u
)),
3084 assert ("bad character kind type" == NULL
);
3090 assert ("bad type" == NULL
);
3094 ffebld_set_info (expr
, ffeinfo_new
3099 FFEINFO_whereCONSTANT
,
3102 if ((error
!= FFEBAD
)
3103 && ffebad_start (error
))
3106 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
3113 /* ffeexpr_collapse_paren -- Collapse paren expr
3117 expr = ffeexpr_collapse_paren(expr,token);
3119 If the result of the expr is a constant, replaces the expr with the
3120 computed constant. */
3123 ffeexpr_collapse_paren (ffebld expr
, ffelexToken t UNUSED
)
3126 ffeinfoBasictype bt
;
3128 ffetargetCharacterSize len
;
3130 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3133 r
= ffebld_left (expr
);
3135 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3138 bt
= ffeinfo_basictype (ffebld_info (r
));
3139 kt
= ffeinfo_kindtype (ffebld_info (r
));
3140 len
= ffebld_size (r
);
3142 expr
= ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r
)),
3145 ffebld_set_info (expr
, ffeinfo_new
3150 FFEINFO_whereCONSTANT
,
3156 /* ffeexpr_collapse_uplus -- Collapse uplus expr
3160 expr = ffeexpr_collapse_uplus(expr,token);
3162 If the result of the expr is a constant, replaces the expr with the
3163 computed constant. */
3166 ffeexpr_collapse_uplus (ffebld expr
, ffelexToken t UNUSED
)
3169 ffeinfoBasictype bt
;
3171 ffetargetCharacterSize len
;
3173 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3176 r
= ffebld_left (expr
);
3178 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3181 bt
= ffeinfo_basictype (ffebld_info (r
));
3182 kt
= ffeinfo_kindtype (ffebld_info (r
));
3183 len
= ffebld_size (r
);
3185 expr
= ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r
)),
3188 ffebld_set_info (expr
, ffeinfo_new
3193 FFEINFO_whereCONSTANT
,
3199 /* ffeexpr_collapse_uminus -- Collapse uminus expr
3203 expr = ffeexpr_collapse_uminus(expr,token);
3205 If the result of the expr is a constant, replaces the expr with the
3206 computed constant. */
3209 ffeexpr_collapse_uminus (ffebld expr
, ffelexToken t
)
3211 ffebad error
= FFEBAD
;
3213 ffebldConstantUnion u
;
3214 ffeinfoBasictype bt
;
3217 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3220 r
= ffebld_left (expr
);
3222 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3225 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
3227 case FFEINFO_basictypeANY
:
3230 case FFEINFO_basictypeINTEGER
:
3231 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3233 #if FFETARGET_okINTEGER1
3234 case FFEINFO_kindtypeINTEGER1
:
3235 error
= ffetarget_uminus_integer1 (ffebld_cu_ptr_integer1 (u
),
3236 ffebld_constant_integer1 (ffebld_conter (r
)));
3237 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3238 (ffebld_cu_val_integer1 (u
)), expr
);
3242 #if FFETARGET_okINTEGER2
3243 case FFEINFO_kindtypeINTEGER2
:
3244 error
= ffetarget_uminus_integer2 (ffebld_cu_ptr_integer2 (u
),
3245 ffebld_constant_integer2 (ffebld_conter (r
)));
3246 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3247 (ffebld_cu_val_integer2 (u
)), expr
);
3251 #if FFETARGET_okINTEGER3
3252 case FFEINFO_kindtypeINTEGER3
:
3253 error
= ffetarget_uminus_integer3 (ffebld_cu_ptr_integer3 (u
),
3254 ffebld_constant_integer3 (ffebld_conter (r
)));
3255 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3256 (ffebld_cu_val_integer3 (u
)), expr
);
3260 #if FFETARGET_okINTEGER4
3261 case FFEINFO_kindtypeINTEGER4
:
3262 error
= ffetarget_uminus_integer4 (ffebld_cu_ptr_integer4 (u
),
3263 ffebld_constant_integer4 (ffebld_conter (r
)));
3264 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3265 (ffebld_cu_val_integer4 (u
)), expr
);
3270 assert ("bad integer kind type" == NULL
);
3275 case FFEINFO_basictypeREAL
:
3276 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3278 #if FFETARGET_okREAL1
3279 case FFEINFO_kindtypeREAL1
:
3280 error
= ffetarget_uminus_real1 (ffebld_cu_ptr_real1 (u
),
3281 ffebld_constant_real1 (ffebld_conter (r
)));
3282 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3283 (ffebld_cu_val_real1 (u
)), expr
);
3287 #if FFETARGET_okREAL2
3288 case FFEINFO_kindtypeREAL2
:
3289 error
= ffetarget_uminus_real2 (ffebld_cu_ptr_real2 (u
),
3290 ffebld_constant_real2 (ffebld_conter (r
)));
3291 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3292 (ffebld_cu_val_real2 (u
)), expr
);
3296 #if FFETARGET_okREAL3
3297 case FFEINFO_kindtypeREAL3
:
3298 error
= ffetarget_uminus_real3 (ffebld_cu_ptr_real3 (u
),
3299 ffebld_constant_real3 (ffebld_conter (r
)));
3300 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3301 (ffebld_cu_val_real3 (u
)), expr
);
3305 #if FFETARGET_okREAL4
3306 case FFEINFO_kindtypeREAL4
:
3307 error
= ffetarget_uminus_real4 (ffebld_cu_ptr_real4 (u
),
3308 ffebld_constant_real4 (ffebld_conter (r
)));
3309 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
3310 (ffebld_cu_val_real4 (u
)), expr
);
3315 assert ("bad real kind type" == NULL
);
3320 case FFEINFO_basictypeCOMPLEX
:
3321 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3323 #if FFETARGET_okCOMPLEX1
3324 case FFEINFO_kindtypeREAL1
:
3325 error
= ffetarget_uminus_complex1 (ffebld_cu_ptr_complex1 (u
),
3326 ffebld_constant_complex1 (ffebld_conter (r
)));
3327 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3328 (ffebld_cu_val_complex1 (u
)), expr
);
3332 #if FFETARGET_okCOMPLEX2
3333 case FFEINFO_kindtypeREAL2
:
3334 error
= ffetarget_uminus_complex2 (ffebld_cu_ptr_complex2 (u
),
3335 ffebld_constant_complex2 (ffebld_conter (r
)));
3336 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3337 (ffebld_cu_val_complex2 (u
)), expr
);
3341 #if FFETARGET_okCOMPLEX3
3342 case FFEINFO_kindtypeREAL3
:
3343 error
= ffetarget_uminus_complex3 (ffebld_cu_ptr_complex3 (u
),
3344 ffebld_constant_complex3 (ffebld_conter (r
)));
3345 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3346 (ffebld_cu_val_complex3 (u
)), expr
);
3350 #if FFETARGET_okCOMPLEX4
3351 case FFEINFO_kindtypeREAL4
:
3352 error
= ffetarget_uminus_complex4 (ffebld_cu_ptr_complex4 (u
),
3353 ffebld_constant_complex4 (ffebld_conter (r
)));
3354 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
3355 (ffebld_cu_val_complex4 (u
)), expr
);
3360 assert ("bad complex kind type" == NULL
);
3366 assert ("bad type" == NULL
);
3370 ffebld_set_info (expr
, ffeinfo_new
3375 FFEINFO_whereCONSTANT
,
3376 FFETARGET_charactersizeNONE
));
3378 if ((error
!= FFEBAD
)
3379 && ffebad_start (error
))
3381 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
3388 /* ffeexpr_collapse_not -- Collapse not expr
3392 expr = ffeexpr_collapse_not(expr,token);
3394 If the result of the expr is a constant, replaces the expr with the
3395 computed constant. */
3398 ffeexpr_collapse_not (ffebld expr
, ffelexToken t
)
3400 ffebad error
= FFEBAD
;
3402 ffebldConstantUnion u
;
3403 ffeinfoBasictype bt
;
3406 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3409 r
= ffebld_left (expr
);
3411 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3414 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
3416 case FFEINFO_basictypeANY
:
3419 case FFEINFO_basictypeINTEGER
:
3420 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3422 #if FFETARGET_okINTEGER1
3423 case FFEINFO_kindtypeINTEGER1
:
3424 error
= ffetarget_not_integer1 (ffebld_cu_ptr_integer1 (u
),
3425 ffebld_constant_integer1 (ffebld_conter (r
)));
3426 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3427 (ffebld_cu_val_integer1 (u
)), expr
);
3431 #if FFETARGET_okINTEGER2
3432 case FFEINFO_kindtypeINTEGER2
:
3433 error
= ffetarget_not_integer2 (ffebld_cu_ptr_integer2 (u
),
3434 ffebld_constant_integer2 (ffebld_conter (r
)));
3435 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3436 (ffebld_cu_val_integer2 (u
)), expr
);
3440 #if FFETARGET_okINTEGER3
3441 case FFEINFO_kindtypeINTEGER3
:
3442 error
= ffetarget_not_integer3 (ffebld_cu_ptr_integer3 (u
),
3443 ffebld_constant_integer3 (ffebld_conter (r
)));
3444 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3445 (ffebld_cu_val_integer3 (u
)), expr
);
3449 #if FFETARGET_okINTEGER4
3450 case FFEINFO_kindtypeINTEGER4
:
3451 error
= ffetarget_not_integer4 (ffebld_cu_ptr_integer4 (u
),
3452 ffebld_constant_integer4 (ffebld_conter (r
)));
3453 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3454 (ffebld_cu_val_integer4 (u
)), expr
);
3459 assert ("bad integer kind type" == NULL
);
3464 case FFEINFO_basictypeLOGICAL
:
3465 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3467 #if FFETARGET_okLOGICAL1
3468 case FFEINFO_kindtypeLOGICAL1
:
3469 error
= ffetarget_not_logical1 (ffebld_cu_ptr_logical1 (u
),
3470 ffebld_constant_logical1 (ffebld_conter (r
)));
3471 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
3472 (ffebld_cu_val_logical1 (u
)), expr
);
3476 #if FFETARGET_okLOGICAL2
3477 case FFEINFO_kindtypeLOGICAL2
:
3478 error
= ffetarget_not_logical2 (ffebld_cu_ptr_logical2 (u
),
3479 ffebld_constant_logical2 (ffebld_conter (r
)));
3480 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
3481 (ffebld_cu_val_logical2 (u
)), expr
);
3485 #if FFETARGET_okLOGICAL3
3486 case FFEINFO_kindtypeLOGICAL3
:
3487 error
= ffetarget_not_logical3 (ffebld_cu_ptr_logical3 (u
),
3488 ffebld_constant_logical3 (ffebld_conter (r
)));
3489 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
3490 (ffebld_cu_val_logical3 (u
)), expr
);
3494 #if FFETARGET_okLOGICAL4
3495 case FFEINFO_kindtypeLOGICAL4
:
3496 error
= ffetarget_not_logical4 (ffebld_cu_ptr_logical4 (u
),
3497 ffebld_constant_logical4 (ffebld_conter (r
)));
3498 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
3499 (ffebld_cu_val_logical4 (u
)), expr
);
3504 assert ("bad logical kind type" == NULL
);
3510 assert ("bad type" == NULL
);
3514 ffebld_set_info (expr
, ffeinfo_new
3519 FFEINFO_whereCONSTANT
,
3520 FFETARGET_charactersizeNONE
));
3522 if ((error
!= FFEBAD
)
3523 && ffebad_start (error
))
3525 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
3532 /* ffeexpr_collapse_add -- Collapse add expr
3536 expr = ffeexpr_collapse_add(expr,token);
3538 If the result of the expr is a constant, replaces the expr with the
3539 computed constant. */
3542 ffeexpr_collapse_add (ffebld expr
, ffelexToken t
)
3544 ffebad error
= FFEBAD
;
3547 ffebldConstantUnion u
;
3548 ffeinfoBasictype bt
;
3551 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3554 l
= ffebld_left (expr
);
3555 r
= ffebld_right (expr
);
3557 if (ffebld_op (l
) != FFEBLD_opCONTER
)
3559 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3562 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
3564 case FFEINFO_basictypeANY
:
3567 case FFEINFO_basictypeINTEGER
:
3568 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3570 #if FFETARGET_okINTEGER1
3571 case FFEINFO_kindtypeINTEGER1
:
3572 error
= ffetarget_add_integer1 (ffebld_cu_ptr_integer1 (u
),
3573 ffebld_constant_integer1 (ffebld_conter (l
)),
3574 ffebld_constant_integer1 (ffebld_conter (r
)));
3575 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3576 (ffebld_cu_val_integer1 (u
)), expr
);
3580 #if FFETARGET_okINTEGER2
3581 case FFEINFO_kindtypeINTEGER2
:
3582 error
= ffetarget_add_integer2 (ffebld_cu_ptr_integer2 (u
),
3583 ffebld_constant_integer2 (ffebld_conter (l
)),
3584 ffebld_constant_integer2 (ffebld_conter (r
)));
3585 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3586 (ffebld_cu_val_integer2 (u
)), expr
);
3590 #if FFETARGET_okINTEGER3
3591 case FFEINFO_kindtypeINTEGER3
:
3592 error
= ffetarget_add_integer3 (ffebld_cu_ptr_integer3 (u
),
3593 ffebld_constant_integer3 (ffebld_conter (l
)),
3594 ffebld_constant_integer3 (ffebld_conter (r
)));
3595 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3596 (ffebld_cu_val_integer3 (u
)), expr
);
3600 #if FFETARGET_okINTEGER4
3601 case FFEINFO_kindtypeINTEGER4
:
3602 error
= ffetarget_add_integer4 (ffebld_cu_ptr_integer4 (u
),
3603 ffebld_constant_integer4 (ffebld_conter (l
)),
3604 ffebld_constant_integer4 (ffebld_conter (r
)));
3605 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3606 (ffebld_cu_val_integer4 (u
)), expr
);
3611 assert ("bad integer kind type" == NULL
);
3616 case FFEINFO_basictypeREAL
:
3617 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3619 #if FFETARGET_okREAL1
3620 case FFEINFO_kindtypeREAL1
:
3621 error
= ffetarget_add_real1 (ffebld_cu_ptr_real1 (u
),
3622 ffebld_constant_real1 (ffebld_conter (l
)),
3623 ffebld_constant_real1 (ffebld_conter (r
)));
3624 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3625 (ffebld_cu_val_real1 (u
)), expr
);
3629 #if FFETARGET_okREAL2
3630 case FFEINFO_kindtypeREAL2
:
3631 error
= ffetarget_add_real2 (ffebld_cu_ptr_real2 (u
),
3632 ffebld_constant_real2 (ffebld_conter (l
)),
3633 ffebld_constant_real2 (ffebld_conter (r
)));
3634 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3635 (ffebld_cu_val_real2 (u
)), expr
);
3639 #if FFETARGET_okREAL3
3640 case FFEINFO_kindtypeREAL3
:
3641 error
= ffetarget_add_real3 (ffebld_cu_ptr_real3 (u
),
3642 ffebld_constant_real3 (ffebld_conter (l
)),
3643 ffebld_constant_real3 (ffebld_conter (r
)));
3644 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3645 (ffebld_cu_val_real3 (u
)), expr
);
3649 #if FFETARGET_okREAL4
3650 case FFEINFO_kindtypeREAL4
:
3651 error
= ffetarget_add_real4 (ffebld_cu_ptr_real4 (u
),
3652 ffebld_constant_real4 (ffebld_conter (l
)),
3653 ffebld_constant_real4 (ffebld_conter (r
)));
3654 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
3655 (ffebld_cu_val_real4 (u
)), expr
);
3660 assert ("bad real kind type" == NULL
);
3665 case FFEINFO_basictypeCOMPLEX
:
3666 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3668 #if FFETARGET_okCOMPLEX1
3669 case FFEINFO_kindtypeREAL1
:
3670 error
= ffetarget_add_complex1 (ffebld_cu_ptr_complex1 (u
),
3671 ffebld_constant_complex1 (ffebld_conter (l
)),
3672 ffebld_constant_complex1 (ffebld_conter (r
)));
3673 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3674 (ffebld_cu_val_complex1 (u
)), expr
);
3678 #if FFETARGET_okCOMPLEX2
3679 case FFEINFO_kindtypeREAL2
:
3680 error
= ffetarget_add_complex2 (ffebld_cu_ptr_complex2 (u
),
3681 ffebld_constant_complex2 (ffebld_conter (l
)),
3682 ffebld_constant_complex2 (ffebld_conter (r
)));
3683 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3684 (ffebld_cu_val_complex2 (u
)), expr
);
3688 #if FFETARGET_okCOMPLEX3
3689 case FFEINFO_kindtypeREAL3
:
3690 error
= ffetarget_add_complex3 (ffebld_cu_ptr_complex3 (u
),
3691 ffebld_constant_complex3 (ffebld_conter (l
)),
3692 ffebld_constant_complex3 (ffebld_conter (r
)));
3693 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3694 (ffebld_cu_val_complex3 (u
)), expr
);
3698 #if FFETARGET_okCOMPLEX4
3699 case FFEINFO_kindtypeREAL4
:
3700 error
= ffetarget_add_complex4 (ffebld_cu_ptr_complex4 (u
),
3701 ffebld_constant_complex4 (ffebld_conter (l
)),
3702 ffebld_constant_complex4 (ffebld_conter (r
)));
3703 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
3704 (ffebld_cu_val_complex4 (u
)), expr
);
3709 assert ("bad complex kind type" == NULL
);
3715 assert ("bad type" == NULL
);
3719 ffebld_set_info (expr
, ffeinfo_new
3724 FFEINFO_whereCONSTANT
,
3725 FFETARGET_charactersizeNONE
));
3727 if ((error
!= FFEBAD
)
3728 && ffebad_start (error
))
3730 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
3737 /* ffeexpr_collapse_subtract -- Collapse subtract expr
3741 expr = ffeexpr_collapse_subtract(expr,token);
3743 If the result of the expr is a constant, replaces the expr with the
3744 computed constant. */
3747 ffeexpr_collapse_subtract (ffebld expr
, ffelexToken t
)
3749 ffebad error
= FFEBAD
;
3752 ffebldConstantUnion u
;
3753 ffeinfoBasictype bt
;
3756 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3759 l
= ffebld_left (expr
);
3760 r
= ffebld_right (expr
);
3762 if (ffebld_op (l
) != FFEBLD_opCONTER
)
3764 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3767 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
3769 case FFEINFO_basictypeANY
:
3772 case FFEINFO_basictypeINTEGER
:
3773 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3775 #if FFETARGET_okINTEGER1
3776 case FFEINFO_kindtypeINTEGER1
:
3777 error
= ffetarget_subtract_integer1 (ffebld_cu_ptr_integer1 (u
),
3778 ffebld_constant_integer1 (ffebld_conter (l
)),
3779 ffebld_constant_integer1 (ffebld_conter (r
)));
3780 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3781 (ffebld_cu_val_integer1 (u
)), expr
);
3785 #if FFETARGET_okINTEGER2
3786 case FFEINFO_kindtypeINTEGER2
:
3787 error
= ffetarget_subtract_integer2 (ffebld_cu_ptr_integer2 (u
),
3788 ffebld_constant_integer2 (ffebld_conter (l
)),
3789 ffebld_constant_integer2 (ffebld_conter (r
)));
3790 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3791 (ffebld_cu_val_integer2 (u
)), expr
);
3795 #if FFETARGET_okINTEGER3
3796 case FFEINFO_kindtypeINTEGER3
:
3797 error
= ffetarget_subtract_integer3 (ffebld_cu_ptr_integer3 (u
),
3798 ffebld_constant_integer3 (ffebld_conter (l
)),
3799 ffebld_constant_integer3 (ffebld_conter (r
)));
3800 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
3801 (ffebld_cu_val_integer3 (u
)), expr
);
3805 #if FFETARGET_okINTEGER4
3806 case FFEINFO_kindtypeINTEGER4
:
3807 error
= ffetarget_subtract_integer4 (ffebld_cu_ptr_integer4 (u
),
3808 ffebld_constant_integer4 (ffebld_conter (l
)),
3809 ffebld_constant_integer4 (ffebld_conter (r
)));
3810 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
3811 (ffebld_cu_val_integer4 (u
)), expr
);
3816 assert ("bad integer kind type" == NULL
);
3821 case FFEINFO_basictypeREAL
:
3822 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3824 #if FFETARGET_okREAL1
3825 case FFEINFO_kindtypeREAL1
:
3826 error
= ffetarget_subtract_real1 (ffebld_cu_ptr_real1 (u
),
3827 ffebld_constant_real1 (ffebld_conter (l
)),
3828 ffebld_constant_real1 (ffebld_conter (r
)));
3829 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
3830 (ffebld_cu_val_real1 (u
)), expr
);
3834 #if FFETARGET_okREAL2
3835 case FFEINFO_kindtypeREAL2
:
3836 error
= ffetarget_subtract_real2 (ffebld_cu_ptr_real2 (u
),
3837 ffebld_constant_real2 (ffebld_conter (l
)),
3838 ffebld_constant_real2 (ffebld_conter (r
)));
3839 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
3840 (ffebld_cu_val_real2 (u
)), expr
);
3844 #if FFETARGET_okREAL3
3845 case FFEINFO_kindtypeREAL3
:
3846 error
= ffetarget_subtract_real3 (ffebld_cu_ptr_real3 (u
),
3847 ffebld_constant_real3 (ffebld_conter (l
)),
3848 ffebld_constant_real3 (ffebld_conter (r
)));
3849 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
3850 (ffebld_cu_val_real3 (u
)), expr
);
3854 #if FFETARGET_okREAL4
3855 case FFEINFO_kindtypeREAL4
:
3856 error
= ffetarget_subtract_real4 (ffebld_cu_ptr_real4 (u
),
3857 ffebld_constant_real4 (ffebld_conter (l
)),
3858 ffebld_constant_real4 (ffebld_conter (r
)));
3859 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
3860 (ffebld_cu_val_real4 (u
)), expr
);
3865 assert ("bad real kind type" == NULL
);
3870 case FFEINFO_basictypeCOMPLEX
:
3871 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3873 #if FFETARGET_okCOMPLEX1
3874 case FFEINFO_kindtypeREAL1
:
3875 error
= ffetarget_subtract_complex1 (ffebld_cu_ptr_complex1 (u
),
3876 ffebld_constant_complex1 (ffebld_conter (l
)),
3877 ffebld_constant_complex1 (ffebld_conter (r
)));
3878 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
3879 (ffebld_cu_val_complex1 (u
)), expr
);
3883 #if FFETARGET_okCOMPLEX2
3884 case FFEINFO_kindtypeREAL2
:
3885 error
= ffetarget_subtract_complex2 (ffebld_cu_ptr_complex2 (u
),
3886 ffebld_constant_complex2 (ffebld_conter (l
)),
3887 ffebld_constant_complex2 (ffebld_conter (r
)));
3888 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
3889 (ffebld_cu_val_complex2 (u
)), expr
);
3893 #if FFETARGET_okCOMPLEX3
3894 case FFEINFO_kindtypeREAL3
:
3895 error
= ffetarget_subtract_complex3 (ffebld_cu_ptr_complex3 (u
),
3896 ffebld_constant_complex3 (ffebld_conter (l
)),
3897 ffebld_constant_complex3 (ffebld_conter (r
)));
3898 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
3899 (ffebld_cu_val_complex3 (u
)), expr
);
3903 #if FFETARGET_okCOMPLEX4
3904 case FFEINFO_kindtypeREAL4
:
3905 error
= ffetarget_subtract_complex4 (ffebld_cu_ptr_complex4 (u
),
3906 ffebld_constant_complex4 (ffebld_conter (l
)),
3907 ffebld_constant_complex4 (ffebld_conter (r
)));
3908 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
3909 (ffebld_cu_val_complex4 (u
)), expr
);
3914 assert ("bad complex kind type" == NULL
);
3920 assert ("bad type" == NULL
);
3924 ffebld_set_info (expr
, ffeinfo_new
3929 FFEINFO_whereCONSTANT
,
3930 FFETARGET_charactersizeNONE
));
3932 if ((error
!= FFEBAD
)
3933 && ffebad_start (error
))
3935 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
3942 /* ffeexpr_collapse_multiply -- Collapse multiply expr
3946 expr = ffeexpr_collapse_multiply(expr,token);
3948 If the result of the expr is a constant, replaces the expr with the
3949 computed constant. */
3952 ffeexpr_collapse_multiply (ffebld expr
, ffelexToken t
)
3954 ffebad error
= FFEBAD
;
3957 ffebldConstantUnion u
;
3958 ffeinfoBasictype bt
;
3961 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
3964 l
= ffebld_left (expr
);
3965 r
= ffebld_right (expr
);
3967 if (ffebld_op (l
) != FFEBLD_opCONTER
)
3969 if (ffebld_op (r
) != FFEBLD_opCONTER
)
3972 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
3974 case FFEINFO_basictypeANY
:
3977 case FFEINFO_basictypeINTEGER
:
3978 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
3980 #if FFETARGET_okINTEGER1
3981 case FFEINFO_kindtypeINTEGER1
:
3982 error
= ffetarget_multiply_integer1 (ffebld_cu_ptr_integer1 (u
),
3983 ffebld_constant_integer1 (ffebld_conter (l
)),
3984 ffebld_constant_integer1 (ffebld_conter (r
)));
3985 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
3986 (ffebld_cu_val_integer1 (u
)), expr
);
3990 #if FFETARGET_okINTEGER2
3991 case FFEINFO_kindtypeINTEGER2
:
3992 error
= ffetarget_multiply_integer2 (ffebld_cu_ptr_integer2 (u
),
3993 ffebld_constant_integer2 (ffebld_conter (l
)),
3994 ffebld_constant_integer2 (ffebld_conter (r
)));
3995 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
3996 (ffebld_cu_val_integer2 (u
)), expr
);
4000 #if FFETARGET_okINTEGER3
4001 case FFEINFO_kindtypeINTEGER3
:
4002 error
= ffetarget_multiply_integer3 (ffebld_cu_ptr_integer3 (u
),
4003 ffebld_constant_integer3 (ffebld_conter (l
)),
4004 ffebld_constant_integer3 (ffebld_conter (r
)));
4005 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
4006 (ffebld_cu_val_integer3 (u
)), expr
);
4010 #if FFETARGET_okINTEGER4
4011 case FFEINFO_kindtypeINTEGER4
:
4012 error
= ffetarget_multiply_integer4 (ffebld_cu_ptr_integer4 (u
),
4013 ffebld_constant_integer4 (ffebld_conter (l
)),
4014 ffebld_constant_integer4 (ffebld_conter (r
)));
4015 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
4016 (ffebld_cu_val_integer4 (u
)), expr
);
4021 assert ("bad integer kind type" == NULL
);
4026 case FFEINFO_basictypeREAL
:
4027 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4029 #if FFETARGET_okREAL1
4030 case FFEINFO_kindtypeREAL1
:
4031 error
= ffetarget_multiply_real1 (ffebld_cu_ptr_real1 (u
),
4032 ffebld_constant_real1 (ffebld_conter (l
)),
4033 ffebld_constant_real1 (ffebld_conter (r
)));
4034 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
4035 (ffebld_cu_val_real1 (u
)), expr
);
4039 #if FFETARGET_okREAL2
4040 case FFEINFO_kindtypeREAL2
:
4041 error
= ffetarget_multiply_real2 (ffebld_cu_ptr_real2 (u
),
4042 ffebld_constant_real2 (ffebld_conter (l
)),
4043 ffebld_constant_real2 (ffebld_conter (r
)));
4044 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
4045 (ffebld_cu_val_real2 (u
)), expr
);
4049 #if FFETARGET_okREAL3
4050 case FFEINFO_kindtypeREAL3
:
4051 error
= ffetarget_multiply_real3 (ffebld_cu_ptr_real3 (u
),
4052 ffebld_constant_real3 (ffebld_conter (l
)),
4053 ffebld_constant_real3 (ffebld_conter (r
)));
4054 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
4055 (ffebld_cu_val_real3 (u
)), expr
);
4059 #if FFETARGET_okREAL4
4060 case FFEINFO_kindtypeREAL4
:
4061 error
= ffetarget_multiply_real4 (ffebld_cu_ptr_real4 (u
),
4062 ffebld_constant_real4 (ffebld_conter (l
)),
4063 ffebld_constant_real4 (ffebld_conter (r
)));
4064 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
4065 (ffebld_cu_val_real4 (u
)), expr
);
4070 assert ("bad real kind type" == NULL
);
4075 case FFEINFO_basictypeCOMPLEX
:
4076 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4078 #if FFETARGET_okCOMPLEX1
4079 case FFEINFO_kindtypeREAL1
:
4080 error
= ffetarget_multiply_complex1 (ffebld_cu_ptr_complex1 (u
),
4081 ffebld_constant_complex1 (ffebld_conter (l
)),
4082 ffebld_constant_complex1 (ffebld_conter (r
)));
4083 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
4084 (ffebld_cu_val_complex1 (u
)), expr
);
4088 #if FFETARGET_okCOMPLEX2
4089 case FFEINFO_kindtypeREAL2
:
4090 error
= ffetarget_multiply_complex2 (ffebld_cu_ptr_complex2 (u
),
4091 ffebld_constant_complex2 (ffebld_conter (l
)),
4092 ffebld_constant_complex2 (ffebld_conter (r
)));
4093 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
4094 (ffebld_cu_val_complex2 (u
)), expr
);
4098 #if FFETARGET_okCOMPLEX3
4099 case FFEINFO_kindtypeREAL3
:
4100 error
= ffetarget_multiply_complex3 (ffebld_cu_ptr_complex3 (u
),
4101 ffebld_constant_complex3 (ffebld_conter (l
)),
4102 ffebld_constant_complex3 (ffebld_conter (r
)));
4103 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
4104 (ffebld_cu_val_complex3 (u
)), expr
);
4108 #if FFETARGET_okCOMPLEX4
4109 case FFEINFO_kindtypeREAL4
:
4110 error
= ffetarget_multiply_complex4 (ffebld_cu_ptr_complex4 (u
),
4111 ffebld_constant_complex4 (ffebld_conter (l
)),
4112 ffebld_constant_complex4 (ffebld_conter (r
)));
4113 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
4114 (ffebld_cu_val_complex4 (u
)), expr
);
4119 assert ("bad complex kind type" == NULL
);
4125 assert ("bad type" == NULL
);
4129 ffebld_set_info (expr
, ffeinfo_new
4134 FFEINFO_whereCONSTANT
,
4135 FFETARGET_charactersizeNONE
));
4137 if ((error
!= FFEBAD
)
4138 && ffebad_start (error
))
4140 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
4147 /* ffeexpr_collapse_divide -- Collapse divide expr
4151 expr = ffeexpr_collapse_divide(expr,token);
4153 If the result of the expr is a constant, replaces the expr with the
4154 computed constant. */
4157 ffeexpr_collapse_divide (ffebld expr
, ffelexToken t
)
4159 ffebad error
= FFEBAD
;
4162 ffebldConstantUnion u
;
4163 ffeinfoBasictype bt
;
4166 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
4169 l
= ffebld_left (expr
);
4170 r
= ffebld_right (expr
);
4172 if (ffebld_op (l
) != FFEBLD_opCONTER
)
4174 if (ffebld_op (r
) != FFEBLD_opCONTER
)
4177 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
4179 case FFEINFO_basictypeANY
:
4182 case FFEINFO_basictypeINTEGER
:
4183 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4185 #if FFETARGET_okINTEGER1
4186 case FFEINFO_kindtypeINTEGER1
:
4187 error
= ffetarget_divide_integer1 (ffebld_cu_ptr_integer1 (u
),
4188 ffebld_constant_integer1 (ffebld_conter (l
)),
4189 ffebld_constant_integer1 (ffebld_conter (r
)));
4190 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
4191 (ffebld_cu_val_integer1 (u
)), expr
);
4195 #if FFETARGET_okINTEGER2
4196 case FFEINFO_kindtypeINTEGER2
:
4197 error
= ffetarget_divide_integer2 (ffebld_cu_ptr_integer2 (u
),
4198 ffebld_constant_integer2 (ffebld_conter (l
)),
4199 ffebld_constant_integer2 (ffebld_conter (r
)));
4200 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
4201 (ffebld_cu_val_integer2 (u
)), expr
);
4205 #if FFETARGET_okINTEGER3
4206 case FFEINFO_kindtypeINTEGER3
:
4207 error
= ffetarget_divide_integer3 (ffebld_cu_ptr_integer3 (u
),
4208 ffebld_constant_integer3 (ffebld_conter (l
)),
4209 ffebld_constant_integer3 (ffebld_conter (r
)));
4210 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
4211 (ffebld_cu_val_integer3 (u
)), expr
);
4215 #if FFETARGET_okINTEGER4
4216 case FFEINFO_kindtypeINTEGER4
:
4217 error
= ffetarget_divide_integer4 (ffebld_cu_ptr_integer4 (u
),
4218 ffebld_constant_integer4 (ffebld_conter (l
)),
4219 ffebld_constant_integer4 (ffebld_conter (r
)));
4220 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
4221 (ffebld_cu_val_integer4 (u
)), expr
);
4226 assert ("bad integer kind type" == NULL
);
4231 case FFEINFO_basictypeREAL
:
4232 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4234 #if FFETARGET_okREAL1
4235 case FFEINFO_kindtypeREAL1
:
4236 error
= ffetarget_divide_real1 (ffebld_cu_ptr_real1 (u
),
4237 ffebld_constant_real1 (ffebld_conter (l
)),
4238 ffebld_constant_real1 (ffebld_conter (r
)));
4239 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real1_val
4240 (ffebld_cu_val_real1 (u
)), expr
);
4244 #if FFETARGET_okREAL2
4245 case FFEINFO_kindtypeREAL2
:
4246 error
= ffetarget_divide_real2 (ffebld_cu_ptr_real2 (u
),
4247 ffebld_constant_real2 (ffebld_conter (l
)),
4248 ffebld_constant_real2 (ffebld_conter (r
)));
4249 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real2_val
4250 (ffebld_cu_val_real2 (u
)), expr
);
4254 #if FFETARGET_okREAL3
4255 case FFEINFO_kindtypeREAL3
:
4256 error
= ffetarget_divide_real3 (ffebld_cu_ptr_real3 (u
),
4257 ffebld_constant_real3 (ffebld_conter (l
)),
4258 ffebld_constant_real3 (ffebld_conter (r
)));
4259 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real3_val
4260 (ffebld_cu_val_real3 (u
)), expr
);
4264 #if FFETARGET_okREAL4
4265 case FFEINFO_kindtypeREAL4
:
4266 error
= ffetarget_divide_real4 (ffebld_cu_ptr_real4 (u
),
4267 ffebld_constant_real4 (ffebld_conter (l
)),
4268 ffebld_constant_real4 (ffebld_conter (r
)));
4269 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_real4_val
4270 (ffebld_cu_val_real4 (u
)), expr
);
4275 assert ("bad real kind type" == NULL
);
4280 case FFEINFO_basictypeCOMPLEX
:
4281 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4283 #if FFETARGET_okCOMPLEX1
4284 case FFEINFO_kindtypeREAL1
:
4285 error
= ffetarget_divide_complex1 (ffebld_cu_ptr_complex1 (u
),
4286 ffebld_constant_complex1 (ffebld_conter (l
)),
4287 ffebld_constant_complex1 (ffebld_conter (r
)));
4288 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex1_val
4289 (ffebld_cu_val_complex1 (u
)), expr
);
4293 #if FFETARGET_okCOMPLEX2
4294 case FFEINFO_kindtypeREAL2
:
4295 error
= ffetarget_divide_complex2 (ffebld_cu_ptr_complex2 (u
),
4296 ffebld_constant_complex2 (ffebld_conter (l
)),
4297 ffebld_constant_complex2 (ffebld_conter (r
)));
4298 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex2_val
4299 (ffebld_cu_val_complex2 (u
)), expr
);
4303 #if FFETARGET_okCOMPLEX3
4304 case FFEINFO_kindtypeREAL3
:
4305 error
= ffetarget_divide_complex3 (ffebld_cu_ptr_complex3 (u
),
4306 ffebld_constant_complex3 (ffebld_conter (l
)),
4307 ffebld_constant_complex3 (ffebld_conter (r
)));
4308 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex3_val
4309 (ffebld_cu_val_complex3 (u
)), expr
);
4313 #if FFETARGET_okCOMPLEX4
4314 case FFEINFO_kindtypeREAL4
:
4315 error
= ffetarget_divide_complex4 (ffebld_cu_ptr_complex4 (u
),
4316 ffebld_constant_complex4 (ffebld_conter (l
)),
4317 ffebld_constant_complex4 (ffebld_conter (r
)));
4318 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_complex4_val
4319 (ffebld_cu_val_complex4 (u
)), expr
);
4324 assert ("bad complex kind type" == NULL
);
4330 assert ("bad type" == NULL
);
4334 ffebld_set_info (expr
, ffeinfo_new
4339 FFEINFO_whereCONSTANT
,
4340 FFETARGET_charactersizeNONE
));
4342 if ((error
!= FFEBAD
)
4343 && ffebad_start (error
))
4345 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
4352 /* ffeexpr_collapse_power -- Collapse power expr
4356 expr = ffeexpr_collapse_power(expr,token);
4358 If the result of the expr is a constant, replaces the expr with the
4359 computed constant. */
4362 ffeexpr_collapse_power (ffebld expr
, ffelexToken t
)
4364 ffebad error
= FFEBAD
;
4367 ffebldConstantUnion u
;
4368 ffeinfoBasictype bt
;
4371 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
4374 l
= ffebld_left (expr
);
4375 r
= ffebld_right (expr
);
4377 if (ffebld_op (l
) != FFEBLD_opCONTER
)
4379 if (ffebld_op (r
) != FFEBLD_opCONTER
)
4382 if ((ffeinfo_basictype (ffebld_info (r
)) != FFEINFO_basictypeINTEGER
)
4383 || (ffeinfo_kindtype (ffebld_info (r
)) != FFEINFO_kindtypeINTEGERDEFAULT
))
4386 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
4388 case FFEINFO_basictypeANY
:
4391 case FFEINFO_basictypeINTEGER
:
4392 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4394 case FFEINFO_kindtypeINTEGERDEFAULT
:
4395 error
= ffetarget_power_integerdefault_integerdefault
4396 (ffebld_cu_ptr_integerdefault (u
),
4397 ffebld_constant_integerdefault (ffebld_conter (l
)),
4398 ffebld_constant_integerdefault (ffebld_conter (r
)));
4399 expr
= ffebld_new_conter_with_orig
4400 (ffebld_constant_new_integerdefault_val
4401 (ffebld_cu_val_integerdefault (u
)), expr
);
4405 assert ("bad integer kind type" == NULL
);
4410 case FFEINFO_basictypeREAL
:
4411 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4413 case FFEINFO_kindtypeREALDEFAULT
:
4414 error
= ffetarget_power_realdefault_integerdefault
4415 (ffebld_cu_ptr_realdefault (u
),
4416 ffebld_constant_realdefault (ffebld_conter (l
)),
4417 ffebld_constant_integerdefault (ffebld_conter (r
)));
4418 expr
= ffebld_new_conter_with_orig
4419 (ffebld_constant_new_realdefault_val
4420 (ffebld_cu_val_realdefault (u
)), expr
);
4423 case FFEINFO_kindtypeREALDOUBLE
:
4424 error
= ffetarget_power_realdouble_integerdefault
4425 (ffebld_cu_ptr_realdouble (u
),
4426 ffebld_constant_realdouble (ffebld_conter (l
)),
4427 ffebld_constant_integerdefault (ffebld_conter (r
)));
4428 expr
= ffebld_new_conter_with_orig
4429 (ffebld_constant_new_realdouble_val
4430 (ffebld_cu_val_realdouble (u
)), expr
);
4433 #if FFETARGET_okREALQUAD
4434 case FFEINFO_kindtypeREALQUAD
:
4435 error
= ffetarget_power_realquad_integerdefault
4436 (ffebld_cu_ptr_realquad (u
),
4437 ffebld_constant_realquad (ffebld_conter (l
)),
4438 ffebld_constant_integerdefault (ffebld_conter (r
)));
4439 expr
= ffebld_new_conter_with_orig
4440 (ffebld_constant_new_realquad_val
4441 (ffebld_cu_val_realquad (u
)), expr
);
4445 assert ("bad real kind type" == NULL
);
4450 case FFEINFO_basictypeCOMPLEX
:
4451 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4453 case FFEINFO_kindtypeREALDEFAULT
:
4454 error
= ffetarget_power_complexdefault_integerdefault
4455 (ffebld_cu_ptr_complexdefault (u
),
4456 ffebld_constant_complexdefault (ffebld_conter (l
)),
4457 ffebld_constant_integerdefault (ffebld_conter (r
)));
4458 expr
= ffebld_new_conter_with_orig
4459 (ffebld_constant_new_complexdefault_val
4460 (ffebld_cu_val_complexdefault (u
)), expr
);
4463 #if FFETARGET_okCOMPLEXDOUBLE
4464 case FFEINFO_kindtypeREALDOUBLE
:
4465 error
= ffetarget_power_complexdouble_integerdefault
4466 (ffebld_cu_ptr_complexdouble (u
),
4467 ffebld_constant_complexdouble (ffebld_conter (l
)),
4468 ffebld_constant_integerdefault (ffebld_conter (r
)));
4469 expr
= ffebld_new_conter_with_orig
4470 (ffebld_constant_new_complexdouble_val
4471 (ffebld_cu_val_complexdouble (u
)), expr
);
4475 #if FFETARGET_okCOMPLEXQUAD
4476 case FFEINFO_kindtypeREALQUAD
:
4477 error
= ffetarget_power_complexquad_integerdefault
4478 (ffebld_cu_ptr_complexquad (u
),
4479 ffebld_constant_complexquad (ffebld_conter (l
)),
4480 ffebld_constant_integerdefault (ffebld_conter (r
)));
4481 expr
= ffebld_new_conter_with_orig
4482 (ffebld_constant_new_complexquad_val
4483 (ffebld_cu_val_complexquad (u
)), expr
);
4488 assert ("bad complex kind type" == NULL
);
4494 assert ("bad type" == NULL
);
4498 ffebld_set_info (expr
, ffeinfo_new
4503 FFEINFO_whereCONSTANT
,
4504 FFETARGET_charactersizeNONE
));
4506 if ((error
!= FFEBAD
)
4507 && ffebad_start (error
))
4509 ffebad_here (0, ffelex_token_where_line (t
),
4510 ffelex_token_where_column (t
));
4517 /* ffeexpr_collapse_concatenate -- Collapse concatenate expr
4521 expr = ffeexpr_collapse_concatenate(expr,token);
4523 If the result of the expr is a constant, replaces the expr with the
4524 computed constant. */
4527 ffeexpr_collapse_concatenate (ffebld expr
, ffelexToken t
)
4529 ffebad error
= FFEBAD
;
4532 ffebldConstantUnion u
;
4534 ffetargetCharacterSize len
;
4536 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
4539 l
= ffebld_left (expr
);
4540 r
= ffebld_right (expr
);
4542 if (ffebld_op (l
) != FFEBLD_opCONTER
)
4544 if (ffebld_op (r
) != FFEBLD_opCONTER
)
4547 switch (ffeinfo_basictype (ffebld_info (expr
)))
4549 case FFEINFO_basictypeANY
:
4552 case FFEINFO_basictypeCHARACTER
:
4553 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
4555 #if FFETARGET_okCHARACTER1
4556 case FFEINFO_kindtypeCHARACTER1
:
4557 error
= ffetarget_concatenate_character1 (ffebld_cu_ptr_character1 (u
),
4558 ffebld_constant_character1 (ffebld_conter (l
)),
4559 ffebld_constant_character1 (ffebld_conter (r
)),
4560 ffebld_constant_pool (), &len
);
4561 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
4562 (ffebld_cu_val_character1 (u
)), expr
);
4566 #if FFETARGET_okCHARACTER2
4567 case FFEINFO_kindtypeCHARACTER2
:
4568 error
= ffetarget_concatenate_character2 (ffebld_cu_ptr_character2 (u
),
4569 ffebld_constant_character2 (ffebld_conter (l
)),
4570 ffebld_constant_character2 (ffebld_conter (r
)),
4571 ffebld_constant_pool (), &len
);
4572 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character2_val
4573 (ffebld_cu_val_character2 (u
)), expr
);
4577 #if FFETARGET_okCHARACTER3
4578 case FFEINFO_kindtypeCHARACTER3
:
4579 error
= ffetarget_concatenate_character3 (ffebld_cu_ptr_character3 (u
),
4580 ffebld_constant_character3 (ffebld_conter (l
)),
4581 ffebld_constant_character3 (ffebld_conter (r
)),
4582 ffebld_constant_pool (), &len
);
4583 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character3_val
4584 (ffebld_cu_val_character3 (u
)), expr
);
4588 #if FFETARGET_okCHARACTER4
4589 case FFEINFO_kindtypeCHARACTER4
:
4590 error
= ffetarget_concatenate_character4 (ffebld_cu_ptr_character4 (u
),
4591 ffebld_constant_character4 (ffebld_conter (l
)),
4592 ffebld_constant_character4 (ffebld_conter (r
)),
4593 ffebld_constant_pool (), &len
);
4594 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character4_val
4595 (ffebld_cu_val_character4 (u
)), expr
);
4600 assert ("bad character kind type" == NULL
);
4606 assert ("bad type" == NULL
);
4610 ffebld_set_info (expr
, ffeinfo_new
4611 (FFEINFO_basictypeCHARACTER
,
4615 FFEINFO_whereCONSTANT
,
4618 if ((error
!= FFEBAD
)
4619 && ffebad_start (error
))
4621 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
4628 /* ffeexpr_collapse_eq -- Collapse eq expr
4632 expr = ffeexpr_collapse_eq(expr,token);
4634 If the result of the expr is a constant, replaces the expr with the
4635 computed constant. */
4638 ffeexpr_collapse_eq (ffebld expr
, ffelexToken t
)
4640 ffebad error
= FFEBAD
;
4645 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
4648 l
= ffebld_left (expr
);
4649 r
= ffebld_right (expr
);
4651 if (ffebld_op (l
) != FFEBLD_opCONTER
)
4653 if (ffebld_op (r
) != FFEBLD_opCONTER
)
4656 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
4658 case FFEINFO_basictypeANY
:
4661 case FFEINFO_basictypeINTEGER
:
4662 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4664 #if FFETARGET_okINTEGER1
4665 case FFEINFO_kindtypeINTEGER1
:
4666 error
= ffetarget_eq_integer1 (&val
,
4667 ffebld_constant_integer1 (ffebld_conter (l
)),
4668 ffebld_constant_integer1 (ffebld_conter (r
)));
4669 expr
= ffebld_new_conter_with_orig
4670 (ffebld_constant_new_logicaldefault (val
), expr
);
4674 #if FFETARGET_okINTEGER2
4675 case FFEINFO_kindtypeINTEGER2
:
4676 error
= ffetarget_eq_integer2 (&val
,
4677 ffebld_constant_integer2 (ffebld_conter (l
)),
4678 ffebld_constant_integer2 (ffebld_conter (r
)));
4679 expr
= ffebld_new_conter_with_orig
4680 (ffebld_constant_new_logicaldefault (val
), expr
);
4684 #if FFETARGET_okINTEGER3
4685 case FFEINFO_kindtypeINTEGER3
:
4686 error
= ffetarget_eq_integer3 (&val
,
4687 ffebld_constant_integer3 (ffebld_conter (l
)),
4688 ffebld_constant_integer3 (ffebld_conter (r
)));
4689 expr
= ffebld_new_conter_with_orig
4690 (ffebld_constant_new_logicaldefault (val
), expr
);
4694 #if FFETARGET_okINTEGER4
4695 case FFEINFO_kindtypeINTEGER4
:
4696 error
= ffetarget_eq_integer4 (&val
,
4697 ffebld_constant_integer4 (ffebld_conter (l
)),
4698 ffebld_constant_integer4 (ffebld_conter (r
)));
4699 expr
= ffebld_new_conter_with_orig
4700 (ffebld_constant_new_logicaldefault (val
), expr
);
4705 assert ("bad integer kind type" == NULL
);
4710 case FFEINFO_basictypeREAL
:
4711 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4713 #if FFETARGET_okREAL1
4714 case FFEINFO_kindtypeREAL1
:
4715 error
= ffetarget_eq_real1 (&val
,
4716 ffebld_constant_real1 (ffebld_conter (l
)),
4717 ffebld_constant_real1 (ffebld_conter (r
)));
4718 expr
= ffebld_new_conter_with_orig
4719 (ffebld_constant_new_logicaldefault (val
), expr
);
4723 #if FFETARGET_okREAL2
4724 case FFEINFO_kindtypeREAL2
:
4725 error
= ffetarget_eq_real2 (&val
,
4726 ffebld_constant_real2 (ffebld_conter (l
)),
4727 ffebld_constant_real2 (ffebld_conter (r
)));
4728 expr
= ffebld_new_conter_with_orig
4729 (ffebld_constant_new_logicaldefault (val
), expr
);
4733 #if FFETARGET_okREAL3
4734 case FFEINFO_kindtypeREAL3
:
4735 error
= ffetarget_eq_real3 (&val
,
4736 ffebld_constant_real3 (ffebld_conter (l
)),
4737 ffebld_constant_real3 (ffebld_conter (r
)));
4738 expr
= ffebld_new_conter_with_orig
4739 (ffebld_constant_new_logicaldefault (val
), expr
);
4743 #if FFETARGET_okREAL4
4744 case FFEINFO_kindtypeREAL4
:
4745 error
= ffetarget_eq_real4 (&val
,
4746 ffebld_constant_real4 (ffebld_conter (l
)),
4747 ffebld_constant_real4 (ffebld_conter (r
)));
4748 expr
= ffebld_new_conter_with_orig
4749 (ffebld_constant_new_logicaldefault (val
), expr
);
4754 assert ("bad real kind type" == NULL
);
4759 case FFEINFO_basictypeCOMPLEX
:
4760 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4762 #if FFETARGET_okCOMPLEX1
4763 case FFEINFO_kindtypeREAL1
:
4764 error
= ffetarget_eq_complex1 (&val
,
4765 ffebld_constant_complex1 (ffebld_conter (l
)),
4766 ffebld_constant_complex1 (ffebld_conter (r
)));
4767 expr
= ffebld_new_conter_with_orig
4768 (ffebld_constant_new_logicaldefault (val
), expr
);
4772 #if FFETARGET_okCOMPLEX2
4773 case FFEINFO_kindtypeREAL2
:
4774 error
= ffetarget_eq_complex2 (&val
,
4775 ffebld_constant_complex2 (ffebld_conter (l
)),
4776 ffebld_constant_complex2 (ffebld_conter (r
)));
4777 expr
= ffebld_new_conter_with_orig
4778 (ffebld_constant_new_logicaldefault (val
), expr
);
4782 #if FFETARGET_okCOMPLEX3
4783 case FFEINFO_kindtypeREAL3
:
4784 error
= ffetarget_eq_complex3 (&val
,
4785 ffebld_constant_complex3 (ffebld_conter (l
)),
4786 ffebld_constant_complex3 (ffebld_conter (r
)));
4787 expr
= ffebld_new_conter_with_orig
4788 (ffebld_constant_new_logicaldefault (val
), expr
);
4792 #if FFETARGET_okCOMPLEX4
4793 case FFEINFO_kindtypeREAL4
:
4794 error
= ffetarget_eq_complex4 (&val
,
4795 ffebld_constant_complex4 (ffebld_conter (l
)),
4796 ffebld_constant_complex4 (ffebld_conter (r
)));
4797 expr
= ffebld_new_conter_with_orig
4798 (ffebld_constant_new_logicaldefault (val
), expr
);
4803 assert ("bad complex kind type" == NULL
);
4808 case FFEINFO_basictypeCHARACTER
:
4809 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4811 #if FFETARGET_okCHARACTER1
4812 case FFEINFO_kindtypeCHARACTER1
:
4813 error
= ffetarget_eq_character1 (&val
,
4814 ffebld_constant_character1 (ffebld_conter (l
)),
4815 ffebld_constant_character1 (ffebld_conter (r
)));
4816 expr
= ffebld_new_conter_with_orig
4817 (ffebld_constant_new_logicaldefault (val
), expr
);
4821 #if FFETARGET_okCHARACTER2
4822 case FFEINFO_kindtypeCHARACTER2
:
4823 error
= ffetarget_eq_character2 (&val
,
4824 ffebld_constant_character2 (ffebld_conter (l
)),
4825 ffebld_constant_character2 (ffebld_conter (r
)));
4826 expr
= ffebld_new_conter_with_orig
4827 (ffebld_constant_new_logicaldefault (val
), expr
);
4831 #if FFETARGET_okCHARACTER3
4832 case FFEINFO_kindtypeCHARACTER3
:
4833 error
= ffetarget_eq_character3 (&val
,
4834 ffebld_constant_character3 (ffebld_conter (l
)),
4835 ffebld_constant_character3 (ffebld_conter (r
)));
4836 expr
= ffebld_new_conter_with_orig
4837 (ffebld_constant_new_logicaldefault (val
), expr
);
4841 #if FFETARGET_okCHARACTER4
4842 case FFEINFO_kindtypeCHARACTER4
:
4843 error
= ffetarget_eq_character4 (&val
,
4844 ffebld_constant_character4 (ffebld_conter (l
)),
4845 ffebld_constant_character4 (ffebld_conter (r
)));
4846 expr
= ffebld_new_conter_with_orig
4847 (ffebld_constant_new_logicaldefault (val
), expr
);
4852 assert ("bad character kind type" == NULL
);
4858 assert ("bad type" == NULL
);
4862 ffebld_set_info (expr
, ffeinfo_new
4863 (FFEINFO_basictypeLOGICAL
,
4864 FFEINFO_kindtypeLOGICALDEFAULT
,
4867 FFEINFO_whereCONSTANT
,
4868 FFETARGET_charactersizeNONE
));
4870 if ((error
!= FFEBAD
)
4871 && ffebad_start (error
))
4873 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
4880 /* ffeexpr_collapse_ne -- Collapse ne expr
4884 expr = ffeexpr_collapse_ne(expr,token);
4886 If the result of the expr is a constant, replaces the expr with the
4887 computed constant. */
4890 ffeexpr_collapse_ne (ffebld expr
, ffelexToken t
)
4892 ffebad error
= FFEBAD
;
4897 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
4900 l
= ffebld_left (expr
);
4901 r
= ffebld_right (expr
);
4903 if (ffebld_op (l
) != FFEBLD_opCONTER
)
4905 if (ffebld_op (r
) != FFEBLD_opCONTER
)
4908 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
4910 case FFEINFO_basictypeANY
:
4913 case FFEINFO_basictypeINTEGER
:
4914 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4916 #if FFETARGET_okINTEGER1
4917 case FFEINFO_kindtypeINTEGER1
:
4918 error
= ffetarget_ne_integer1 (&val
,
4919 ffebld_constant_integer1 (ffebld_conter (l
)),
4920 ffebld_constant_integer1 (ffebld_conter (r
)));
4921 expr
= ffebld_new_conter_with_orig
4922 (ffebld_constant_new_logicaldefault (val
), expr
);
4926 #if FFETARGET_okINTEGER2
4927 case FFEINFO_kindtypeINTEGER2
:
4928 error
= ffetarget_ne_integer2 (&val
,
4929 ffebld_constant_integer2 (ffebld_conter (l
)),
4930 ffebld_constant_integer2 (ffebld_conter (r
)));
4931 expr
= ffebld_new_conter_with_orig
4932 (ffebld_constant_new_logicaldefault (val
), expr
);
4936 #if FFETARGET_okINTEGER3
4937 case FFEINFO_kindtypeINTEGER3
:
4938 error
= ffetarget_ne_integer3 (&val
,
4939 ffebld_constant_integer3 (ffebld_conter (l
)),
4940 ffebld_constant_integer3 (ffebld_conter (r
)));
4941 expr
= ffebld_new_conter_with_orig
4942 (ffebld_constant_new_logicaldefault (val
), expr
);
4946 #if FFETARGET_okINTEGER4
4947 case FFEINFO_kindtypeINTEGER4
:
4948 error
= ffetarget_ne_integer4 (&val
,
4949 ffebld_constant_integer4 (ffebld_conter (l
)),
4950 ffebld_constant_integer4 (ffebld_conter (r
)));
4951 expr
= ffebld_new_conter_with_orig
4952 (ffebld_constant_new_logicaldefault (val
), expr
);
4957 assert ("bad integer kind type" == NULL
);
4962 case FFEINFO_basictypeREAL
:
4963 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
4965 #if FFETARGET_okREAL1
4966 case FFEINFO_kindtypeREAL1
:
4967 error
= ffetarget_ne_real1 (&val
,
4968 ffebld_constant_real1 (ffebld_conter (l
)),
4969 ffebld_constant_real1 (ffebld_conter (r
)));
4970 expr
= ffebld_new_conter_with_orig
4971 (ffebld_constant_new_logicaldefault (val
), expr
);
4975 #if FFETARGET_okREAL2
4976 case FFEINFO_kindtypeREAL2
:
4977 error
= ffetarget_ne_real2 (&val
,
4978 ffebld_constant_real2 (ffebld_conter (l
)),
4979 ffebld_constant_real2 (ffebld_conter (r
)));
4980 expr
= ffebld_new_conter_with_orig
4981 (ffebld_constant_new_logicaldefault (val
), expr
);
4985 #if FFETARGET_okREAL3
4986 case FFEINFO_kindtypeREAL3
:
4987 error
= ffetarget_ne_real3 (&val
,
4988 ffebld_constant_real3 (ffebld_conter (l
)),
4989 ffebld_constant_real3 (ffebld_conter (r
)));
4990 expr
= ffebld_new_conter_with_orig
4991 (ffebld_constant_new_logicaldefault (val
), expr
);
4995 #if FFETARGET_okREAL4
4996 case FFEINFO_kindtypeREAL4
:
4997 error
= ffetarget_ne_real4 (&val
,
4998 ffebld_constant_real4 (ffebld_conter (l
)),
4999 ffebld_constant_real4 (ffebld_conter (r
)));
5000 expr
= ffebld_new_conter_with_orig
5001 (ffebld_constant_new_logicaldefault (val
), expr
);
5006 assert ("bad real kind type" == NULL
);
5011 case FFEINFO_basictypeCOMPLEX
:
5012 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5014 #if FFETARGET_okCOMPLEX1
5015 case FFEINFO_kindtypeREAL1
:
5016 error
= ffetarget_ne_complex1 (&val
,
5017 ffebld_constant_complex1 (ffebld_conter (l
)),
5018 ffebld_constant_complex1 (ffebld_conter (r
)));
5019 expr
= ffebld_new_conter_with_orig
5020 (ffebld_constant_new_logicaldefault (val
), expr
);
5024 #if FFETARGET_okCOMPLEX2
5025 case FFEINFO_kindtypeREAL2
:
5026 error
= ffetarget_ne_complex2 (&val
,
5027 ffebld_constant_complex2 (ffebld_conter (l
)),
5028 ffebld_constant_complex2 (ffebld_conter (r
)));
5029 expr
= ffebld_new_conter_with_orig
5030 (ffebld_constant_new_logicaldefault (val
), expr
);
5034 #if FFETARGET_okCOMPLEX3
5035 case FFEINFO_kindtypeREAL3
:
5036 error
= ffetarget_ne_complex3 (&val
,
5037 ffebld_constant_complex3 (ffebld_conter (l
)),
5038 ffebld_constant_complex3 (ffebld_conter (r
)));
5039 expr
= ffebld_new_conter_with_orig
5040 (ffebld_constant_new_logicaldefault (val
), expr
);
5044 #if FFETARGET_okCOMPLEX4
5045 case FFEINFO_kindtypeREAL4
:
5046 error
= ffetarget_ne_complex4 (&val
,
5047 ffebld_constant_complex4 (ffebld_conter (l
)),
5048 ffebld_constant_complex4 (ffebld_conter (r
)));
5049 expr
= ffebld_new_conter_with_orig
5050 (ffebld_constant_new_logicaldefault (val
), expr
);
5055 assert ("bad complex kind type" == NULL
);
5060 case FFEINFO_basictypeCHARACTER
:
5061 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5063 #if FFETARGET_okCHARACTER1
5064 case FFEINFO_kindtypeCHARACTER1
:
5065 error
= ffetarget_ne_character1 (&val
,
5066 ffebld_constant_character1 (ffebld_conter (l
)),
5067 ffebld_constant_character1 (ffebld_conter (r
)));
5068 expr
= ffebld_new_conter_with_orig
5069 (ffebld_constant_new_logicaldefault (val
), expr
);
5073 #if FFETARGET_okCHARACTER2
5074 case FFEINFO_kindtypeCHARACTER2
:
5075 error
= ffetarget_ne_character2 (&val
,
5076 ffebld_constant_character2 (ffebld_conter (l
)),
5077 ffebld_constant_character2 (ffebld_conter (r
)));
5078 expr
= ffebld_new_conter_with_orig
5079 (ffebld_constant_new_logicaldefault (val
), expr
);
5083 #if FFETARGET_okCHARACTER3
5084 case FFEINFO_kindtypeCHARACTER3
:
5085 error
= ffetarget_ne_character3 (&val
,
5086 ffebld_constant_character3 (ffebld_conter (l
)),
5087 ffebld_constant_character3 (ffebld_conter (r
)));
5088 expr
= ffebld_new_conter_with_orig
5089 (ffebld_constant_new_logicaldefault (val
), expr
);
5093 #if FFETARGET_okCHARACTER4
5094 case FFEINFO_kindtypeCHARACTER4
:
5095 error
= ffetarget_ne_character4 (&val
,
5096 ffebld_constant_character4 (ffebld_conter (l
)),
5097 ffebld_constant_character4 (ffebld_conter (r
)));
5098 expr
= ffebld_new_conter_with_orig
5099 (ffebld_constant_new_logicaldefault (val
), expr
);
5104 assert ("bad character kind type" == NULL
);
5110 assert ("bad type" == NULL
);
5114 ffebld_set_info (expr
, ffeinfo_new
5115 (FFEINFO_basictypeLOGICAL
,
5116 FFEINFO_kindtypeLOGICALDEFAULT
,
5119 FFEINFO_whereCONSTANT
,
5120 FFETARGET_charactersizeNONE
));
5122 if ((error
!= FFEBAD
)
5123 && ffebad_start (error
))
5125 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
5132 /* ffeexpr_collapse_ge -- Collapse ge expr
5136 expr = ffeexpr_collapse_ge(expr,token);
5138 If the result of the expr is a constant, replaces the expr with the
5139 computed constant. */
5142 ffeexpr_collapse_ge (ffebld expr
, ffelexToken t
)
5144 ffebad error
= FFEBAD
;
5149 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
5152 l
= ffebld_left (expr
);
5153 r
= ffebld_right (expr
);
5155 if (ffebld_op (l
) != FFEBLD_opCONTER
)
5157 if (ffebld_op (r
) != FFEBLD_opCONTER
)
5160 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
5162 case FFEINFO_basictypeANY
:
5165 case FFEINFO_basictypeINTEGER
:
5166 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5168 #if FFETARGET_okINTEGER1
5169 case FFEINFO_kindtypeINTEGER1
:
5170 error
= ffetarget_ge_integer1 (&val
,
5171 ffebld_constant_integer1 (ffebld_conter (l
)),
5172 ffebld_constant_integer1 (ffebld_conter (r
)));
5173 expr
= ffebld_new_conter_with_orig
5174 (ffebld_constant_new_logicaldefault (val
), expr
);
5178 #if FFETARGET_okINTEGER2
5179 case FFEINFO_kindtypeINTEGER2
:
5180 error
= ffetarget_ge_integer2 (&val
,
5181 ffebld_constant_integer2 (ffebld_conter (l
)),
5182 ffebld_constant_integer2 (ffebld_conter (r
)));
5183 expr
= ffebld_new_conter_with_orig
5184 (ffebld_constant_new_logicaldefault (val
), expr
);
5188 #if FFETARGET_okINTEGER3
5189 case FFEINFO_kindtypeINTEGER3
:
5190 error
= ffetarget_ge_integer3 (&val
,
5191 ffebld_constant_integer3 (ffebld_conter (l
)),
5192 ffebld_constant_integer3 (ffebld_conter (r
)));
5193 expr
= ffebld_new_conter_with_orig
5194 (ffebld_constant_new_logicaldefault (val
), expr
);
5198 #if FFETARGET_okINTEGER4
5199 case FFEINFO_kindtypeINTEGER4
:
5200 error
= ffetarget_ge_integer4 (&val
,
5201 ffebld_constant_integer4 (ffebld_conter (l
)),
5202 ffebld_constant_integer4 (ffebld_conter (r
)));
5203 expr
= ffebld_new_conter_with_orig
5204 (ffebld_constant_new_logicaldefault (val
), expr
);
5209 assert ("bad integer kind type" == NULL
);
5214 case FFEINFO_basictypeREAL
:
5215 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5217 #if FFETARGET_okREAL1
5218 case FFEINFO_kindtypeREAL1
:
5219 error
= ffetarget_ge_real1 (&val
,
5220 ffebld_constant_real1 (ffebld_conter (l
)),
5221 ffebld_constant_real1 (ffebld_conter (r
)));
5222 expr
= ffebld_new_conter_with_orig
5223 (ffebld_constant_new_logicaldefault (val
), expr
);
5227 #if FFETARGET_okREAL2
5228 case FFEINFO_kindtypeREAL2
:
5229 error
= ffetarget_ge_real2 (&val
,
5230 ffebld_constant_real2 (ffebld_conter (l
)),
5231 ffebld_constant_real2 (ffebld_conter (r
)));
5232 expr
= ffebld_new_conter_with_orig
5233 (ffebld_constant_new_logicaldefault (val
), expr
);
5237 #if FFETARGET_okREAL3
5238 case FFEINFO_kindtypeREAL3
:
5239 error
= ffetarget_ge_real3 (&val
,
5240 ffebld_constant_real3 (ffebld_conter (l
)),
5241 ffebld_constant_real3 (ffebld_conter (r
)));
5242 expr
= ffebld_new_conter_with_orig
5243 (ffebld_constant_new_logicaldefault (val
), expr
);
5247 #if FFETARGET_okREAL4
5248 case FFEINFO_kindtypeREAL4
:
5249 error
= ffetarget_ge_real4 (&val
,
5250 ffebld_constant_real4 (ffebld_conter (l
)),
5251 ffebld_constant_real4 (ffebld_conter (r
)));
5252 expr
= ffebld_new_conter_with_orig
5253 (ffebld_constant_new_logicaldefault (val
), expr
);
5258 assert ("bad real kind type" == NULL
);
5263 case FFEINFO_basictypeCHARACTER
:
5264 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5266 #if FFETARGET_okCHARACTER1
5267 case FFEINFO_kindtypeCHARACTER1
:
5268 error
= ffetarget_ge_character1 (&val
,
5269 ffebld_constant_character1 (ffebld_conter (l
)),
5270 ffebld_constant_character1 (ffebld_conter (r
)));
5271 expr
= ffebld_new_conter_with_orig
5272 (ffebld_constant_new_logicaldefault (val
), expr
);
5276 #if FFETARGET_okCHARACTER2
5277 case FFEINFO_kindtypeCHARACTER2
:
5278 error
= ffetarget_ge_character2 (&val
,
5279 ffebld_constant_character2 (ffebld_conter (l
)),
5280 ffebld_constant_character2 (ffebld_conter (r
)));
5281 expr
= ffebld_new_conter_with_orig
5282 (ffebld_constant_new_logicaldefault (val
), expr
);
5286 #if FFETARGET_okCHARACTER3
5287 case FFEINFO_kindtypeCHARACTER3
:
5288 error
= ffetarget_ge_character3 (&val
,
5289 ffebld_constant_character3 (ffebld_conter (l
)),
5290 ffebld_constant_character3 (ffebld_conter (r
)));
5291 expr
= ffebld_new_conter_with_orig
5292 (ffebld_constant_new_logicaldefault (val
), expr
);
5296 #if FFETARGET_okCHARACTER4
5297 case FFEINFO_kindtypeCHARACTER4
:
5298 error
= ffetarget_ge_character4 (&val
,
5299 ffebld_constant_character4 (ffebld_conter (l
)),
5300 ffebld_constant_character4 (ffebld_conter (r
)));
5301 expr
= ffebld_new_conter_with_orig
5302 (ffebld_constant_new_logicaldefault (val
), expr
);
5307 assert ("bad character kind type" == NULL
);
5313 assert ("bad type" == NULL
);
5317 ffebld_set_info (expr
, ffeinfo_new
5318 (FFEINFO_basictypeLOGICAL
,
5319 FFEINFO_kindtypeLOGICALDEFAULT
,
5322 FFEINFO_whereCONSTANT
,
5323 FFETARGET_charactersizeNONE
));
5325 if ((error
!= FFEBAD
)
5326 && ffebad_start (error
))
5328 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
5335 /* ffeexpr_collapse_gt -- Collapse gt expr
5339 expr = ffeexpr_collapse_gt(expr,token);
5341 If the result of the expr is a constant, replaces the expr with the
5342 computed constant. */
5345 ffeexpr_collapse_gt (ffebld expr
, ffelexToken t
)
5347 ffebad error
= FFEBAD
;
5352 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
5355 l
= ffebld_left (expr
);
5356 r
= ffebld_right (expr
);
5358 if (ffebld_op (l
) != FFEBLD_opCONTER
)
5360 if (ffebld_op (r
) != FFEBLD_opCONTER
)
5363 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
5365 case FFEINFO_basictypeANY
:
5368 case FFEINFO_basictypeINTEGER
:
5369 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5371 #if FFETARGET_okINTEGER1
5372 case FFEINFO_kindtypeINTEGER1
:
5373 error
= ffetarget_gt_integer1 (&val
,
5374 ffebld_constant_integer1 (ffebld_conter (l
)),
5375 ffebld_constant_integer1 (ffebld_conter (r
)));
5376 expr
= ffebld_new_conter_with_orig
5377 (ffebld_constant_new_logicaldefault (val
), expr
);
5381 #if FFETARGET_okINTEGER2
5382 case FFEINFO_kindtypeINTEGER2
:
5383 error
= ffetarget_gt_integer2 (&val
,
5384 ffebld_constant_integer2 (ffebld_conter (l
)),
5385 ffebld_constant_integer2 (ffebld_conter (r
)));
5386 expr
= ffebld_new_conter_with_orig
5387 (ffebld_constant_new_logicaldefault (val
), expr
);
5391 #if FFETARGET_okINTEGER3
5392 case FFEINFO_kindtypeINTEGER3
:
5393 error
= ffetarget_gt_integer3 (&val
,
5394 ffebld_constant_integer3 (ffebld_conter (l
)),
5395 ffebld_constant_integer3 (ffebld_conter (r
)));
5396 expr
= ffebld_new_conter_with_orig
5397 (ffebld_constant_new_logicaldefault (val
), expr
);
5401 #if FFETARGET_okINTEGER4
5402 case FFEINFO_kindtypeINTEGER4
:
5403 error
= ffetarget_gt_integer4 (&val
,
5404 ffebld_constant_integer4 (ffebld_conter (l
)),
5405 ffebld_constant_integer4 (ffebld_conter (r
)));
5406 expr
= ffebld_new_conter_with_orig
5407 (ffebld_constant_new_logicaldefault (val
), expr
);
5412 assert ("bad integer kind type" == NULL
);
5417 case FFEINFO_basictypeREAL
:
5418 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5420 #if FFETARGET_okREAL1
5421 case FFEINFO_kindtypeREAL1
:
5422 error
= ffetarget_gt_real1 (&val
,
5423 ffebld_constant_real1 (ffebld_conter (l
)),
5424 ffebld_constant_real1 (ffebld_conter (r
)));
5425 expr
= ffebld_new_conter_with_orig
5426 (ffebld_constant_new_logicaldefault (val
), expr
);
5430 #if FFETARGET_okREAL2
5431 case FFEINFO_kindtypeREAL2
:
5432 error
= ffetarget_gt_real2 (&val
,
5433 ffebld_constant_real2 (ffebld_conter (l
)),
5434 ffebld_constant_real2 (ffebld_conter (r
)));
5435 expr
= ffebld_new_conter_with_orig
5436 (ffebld_constant_new_logicaldefault (val
), expr
);
5440 #if FFETARGET_okREAL3
5441 case FFEINFO_kindtypeREAL3
:
5442 error
= ffetarget_gt_real3 (&val
,
5443 ffebld_constant_real3 (ffebld_conter (l
)),
5444 ffebld_constant_real3 (ffebld_conter (r
)));
5445 expr
= ffebld_new_conter_with_orig
5446 (ffebld_constant_new_logicaldefault (val
), expr
);
5450 #if FFETARGET_okREAL4
5451 case FFEINFO_kindtypeREAL4
:
5452 error
= ffetarget_gt_real4 (&val
,
5453 ffebld_constant_real4 (ffebld_conter (l
)),
5454 ffebld_constant_real4 (ffebld_conter (r
)));
5455 expr
= ffebld_new_conter_with_orig
5456 (ffebld_constant_new_logicaldefault (val
), expr
);
5461 assert ("bad real kind type" == NULL
);
5466 case FFEINFO_basictypeCHARACTER
:
5467 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5469 #if FFETARGET_okCHARACTER1
5470 case FFEINFO_kindtypeCHARACTER1
:
5471 error
= ffetarget_gt_character1 (&val
,
5472 ffebld_constant_character1 (ffebld_conter (l
)),
5473 ffebld_constant_character1 (ffebld_conter (r
)));
5474 expr
= ffebld_new_conter_with_orig
5475 (ffebld_constant_new_logicaldefault (val
), expr
);
5479 #if FFETARGET_okCHARACTER2
5480 case FFEINFO_kindtypeCHARACTER2
:
5481 error
= ffetarget_gt_character2 (&val
,
5482 ffebld_constant_character2 (ffebld_conter (l
)),
5483 ffebld_constant_character2 (ffebld_conter (r
)));
5484 expr
= ffebld_new_conter_with_orig
5485 (ffebld_constant_new_logicaldefault (val
), expr
);
5489 #if FFETARGET_okCHARACTER3
5490 case FFEINFO_kindtypeCHARACTER3
:
5491 error
= ffetarget_gt_character3 (&val
,
5492 ffebld_constant_character3 (ffebld_conter (l
)),
5493 ffebld_constant_character3 (ffebld_conter (r
)));
5494 expr
= ffebld_new_conter_with_orig
5495 (ffebld_constant_new_logicaldefault (val
), expr
);
5499 #if FFETARGET_okCHARACTER4
5500 case FFEINFO_kindtypeCHARACTER4
:
5501 error
= ffetarget_gt_character4 (&val
,
5502 ffebld_constant_character4 (ffebld_conter (l
)),
5503 ffebld_constant_character4 (ffebld_conter (r
)));
5504 expr
= ffebld_new_conter_with_orig
5505 (ffebld_constant_new_logicaldefault (val
), expr
);
5510 assert ("bad character kind type" == NULL
);
5516 assert ("bad type" == NULL
);
5520 ffebld_set_info (expr
, ffeinfo_new
5521 (FFEINFO_basictypeLOGICAL
,
5522 FFEINFO_kindtypeLOGICALDEFAULT
,
5525 FFEINFO_whereCONSTANT
,
5526 FFETARGET_charactersizeNONE
));
5528 if ((error
!= FFEBAD
)
5529 && ffebad_start (error
))
5531 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
5538 /* ffeexpr_collapse_le -- Collapse le expr
5542 expr = ffeexpr_collapse_le(expr,token);
5544 If the result of the expr is a constant, replaces the expr with the
5545 computed constant. */
5548 ffeexpr_collapse_le (ffebld expr
, ffelexToken t
)
5550 ffebad error
= FFEBAD
;
5555 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
5558 l
= ffebld_left (expr
);
5559 r
= ffebld_right (expr
);
5561 if (ffebld_op (l
) != FFEBLD_opCONTER
)
5563 if (ffebld_op (r
) != FFEBLD_opCONTER
)
5566 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
5568 case FFEINFO_basictypeANY
:
5571 case FFEINFO_basictypeINTEGER
:
5572 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5574 #if FFETARGET_okINTEGER1
5575 case FFEINFO_kindtypeINTEGER1
:
5576 error
= ffetarget_le_integer1 (&val
,
5577 ffebld_constant_integer1 (ffebld_conter (l
)),
5578 ffebld_constant_integer1 (ffebld_conter (r
)));
5579 expr
= ffebld_new_conter_with_orig
5580 (ffebld_constant_new_logicaldefault (val
), expr
);
5584 #if FFETARGET_okINTEGER2
5585 case FFEINFO_kindtypeINTEGER2
:
5586 error
= ffetarget_le_integer2 (&val
,
5587 ffebld_constant_integer2 (ffebld_conter (l
)),
5588 ffebld_constant_integer2 (ffebld_conter (r
)));
5589 expr
= ffebld_new_conter_with_orig
5590 (ffebld_constant_new_logicaldefault (val
), expr
);
5594 #if FFETARGET_okINTEGER3
5595 case FFEINFO_kindtypeINTEGER3
:
5596 error
= ffetarget_le_integer3 (&val
,
5597 ffebld_constant_integer3 (ffebld_conter (l
)),
5598 ffebld_constant_integer3 (ffebld_conter (r
)));
5599 expr
= ffebld_new_conter_with_orig
5600 (ffebld_constant_new_logicaldefault (val
), expr
);
5604 #if FFETARGET_okINTEGER4
5605 case FFEINFO_kindtypeINTEGER4
:
5606 error
= ffetarget_le_integer4 (&val
,
5607 ffebld_constant_integer4 (ffebld_conter (l
)),
5608 ffebld_constant_integer4 (ffebld_conter (r
)));
5609 expr
= ffebld_new_conter_with_orig
5610 (ffebld_constant_new_logicaldefault (val
), expr
);
5615 assert ("bad integer kind type" == NULL
);
5620 case FFEINFO_basictypeREAL
:
5621 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5623 #if FFETARGET_okREAL1
5624 case FFEINFO_kindtypeREAL1
:
5625 error
= ffetarget_le_real1 (&val
,
5626 ffebld_constant_real1 (ffebld_conter (l
)),
5627 ffebld_constant_real1 (ffebld_conter (r
)));
5628 expr
= ffebld_new_conter_with_orig
5629 (ffebld_constant_new_logicaldefault (val
), expr
);
5633 #if FFETARGET_okREAL2
5634 case FFEINFO_kindtypeREAL2
:
5635 error
= ffetarget_le_real2 (&val
,
5636 ffebld_constant_real2 (ffebld_conter (l
)),
5637 ffebld_constant_real2 (ffebld_conter (r
)));
5638 expr
= ffebld_new_conter_with_orig
5639 (ffebld_constant_new_logicaldefault (val
), expr
);
5643 #if FFETARGET_okREAL3
5644 case FFEINFO_kindtypeREAL3
:
5645 error
= ffetarget_le_real3 (&val
,
5646 ffebld_constant_real3 (ffebld_conter (l
)),
5647 ffebld_constant_real3 (ffebld_conter (r
)));
5648 expr
= ffebld_new_conter_with_orig
5649 (ffebld_constant_new_logicaldefault (val
), expr
);
5653 #if FFETARGET_okREAL4
5654 case FFEINFO_kindtypeREAL4
:
5655 error
= ffetarget_le_real4 (&val
,
5656 ffebld_constant_real4 (ffebld_conter (l
)),
5657 ffebld_constant_real4 (ffebld_conter (r
)));
5658 expr
= ffebld_new_conter_with_orig
5659 (ffebld_constant_new_logicaldefault (val
), expr
);
5664 assert ("bad real kind type" == NULL
);
5669 case FFEINFO_basictypeCHARACTER
:
5670 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5672 #if FFETARGET_okCHARACTER1
5673 case FFEINFO_kindtypeCHARACTER1
:
5674 error
= ffetarget_le_character1 (&val
,
5675 ffebld_constant_character1 (ffebld_conter (l
)),
5676 ffebld_constant_character1 (ffebld_conter (r
)));
5677 expr
= ffebld_new_conter_with_orig
5678 (ffebld_constant_new_logicaldefault (val
), expr
);
5682 #if FFETARGET_okCHARACTER2
5683 case FFEINFO_kindtypeCHARACTER2
:
5684 error
= ffetarget_le_character2 (&val
,
5685 ffebld_constant_character2 (ffebld_conter (l
)),
5686 ffebld_constant_character2 (ffebld_conter (r
)));
5687 expr
= ffebld_new_conter_with_orig
5688 (ffebld_constant_new_logicaldefault (val
), expr
);
5692 #if FFETARGET_okCHARACTER3
5693 case FFEINFO_kindtypeCHARACTER3
:
5694 error
= ffetarget_le_character3 (&val
,
5695 ffebld_constant_character3 (ffebld_conter (l
)),
5696 ffebld_constant_character3 (ffebld_conter (r
)));
5697 expr
= ffebld_new_conter_with_orig
5698 (ffebld_constant_new_logicaldefault (val
), expr
);
5702 #if FFETARGET_okCHARACTER4
5703 case FFEINFO_kindtypeCHARACTER4
:
5704 error
= ffetarget_le_character4 (&val
,
5705 ffebld_constant_character4 (ffebld_conter (l
)),
5706 ffebld_constant_character4 (ffebld_conter (r
)));
5707 expr
= ffebld_new_conter_with_orig
5708 (ffebld_constant_new_logicaldefault (val
), expr
);
5713 assert ("bad character kind type" == NULL
);
5719 assert ("bad type" == NULL
);
5723 ffebld_set_info (expr
, ffeinfo_new
5724 (FFEINFO_basictypeLOGICAL
,
5725 FFEINFO_kindtypeLOGICALDEFAULT
,
5728 FFEINFO_whereCONSTANT
,
5729 FFETARGET_charactersizeNONE
));
5731 if ((error
!= FFEBAD
)
5732 && ffebad_start (error
))
5734 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
5741 /* ffeexpr_collapse_lt -- Collapse lt expr
5745 expr = ffeexpr_collapse_lt(expr,token);
5747 If the result of the expr is a constant, replaces the expr with the
5748 computed constant. */
5751 ffeexpr_collapse_lt (ffebld expr
, ffelexToken t
)
5753 ffebad error
= FFEBAD
;
5758 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
5761 l
= ffebld_left (expr
);
5762 r
= ffebld_right (expr
);
5764 if (ffebld_op (l
) != FFEBLD_opCONTER
)
5766 if (ffebld_op (r
) != FFEBLD_opCONTER
)
5769 switch (ffeinfo_basictype (ffebld_info (ffebld_left (expr
))))
5771 case FFEINFO_basictypeANY
:
5774 case FFEINFO_basictypeINTEGER
:
5775 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5777 #if FFETARGET_okINTEGER1
5778 case FFEINFO_kindtypeINTEGER1
:
5779 error
= ffetarget_lt_integer1 (&val
,
5780 ffebld_constant_integer1 (ffebld_conter (l
)),
5781 ffebld_constant_integer1 (ffebld_conter (r
)));
5782 expr
= ffebld_new_conter_with_orig
5783 (ffebld_constant_new_logicaldefault (val
), expr
);
5787 #if FFETARGET_okINTEGER2
5788 case FFEINFO_kindtypeINTEGER2
:
5789 error
= ffetarget_lt_integer2 (&val
,
5790 ffebld_constant_integer2 (ffebld_conter (l
)),
5791 ffebld_constant_integer2 (ffebld_conter (r
)));
5792 expr
= ffebld_new_conter_with_orig
5793 (ffebld_constant_new_logicaldefault (val
), expr
);
5797 #if FFETARGET_okINTEGER3
5798 case FFEINFO_kindtypeINTEGER3
:
5799 error
= ffetarget_lt_integer3 (&val
,
5800 ffebld_constant_integer3 (ffebld_conter (l
)),
5801 ffebld_constant_integer3 (ffebld_conter (r
)));
5802 expr
= ffebld_new_conter_with_orig
5803 (ffebld_constant_new_logicaldefault (val
), expr
);
5807 #if FFETARGET_okINTEGER4
5808 case FFEINFO_kindtypeINTEGER4
:
5809 error
= ffetarget_lt_integer4 (&val
,
5810 ffebld_constant_integer4 (ffebld_conter (l
)),
5811 ffebld_constant_integer4 (ffebld_conter (r
)));
5812 expr
= ffebld_new_conter_with_orig
5813 (ffebld_constant_new_logicaldefault (val
), expr
);
5818 assert ("bad integer kind type" == NULL
);
5823 case FFEINFO_basictypeREAL
:
5824 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5826 #if FFETARGET_okREAL1
5827 case FFEINFO_kindtypeREAL1
:
5828 error
= ffetarget_lt_real1 (&val
,
5829 ffebld_constant_real1 (ffebld_conter (l
)),
5830 ffebld_constant_real1 (ffebld_conter (r
)));
5831 expr
= ffebld_new_conter_with_orig
5832 (ffebld_constant_new_logicaldefault (val
), expr
);
5836 #if FFETARGET_okREAL2
5837 case FFEINFO_kindtypeREAL2
:
5838 error
= ffetarget_lt_real2 (&val
,
5839 ffebld_constant_real2 (ffebld_conter (l
)),
5840 ffebld_constant_real2 (ffebld_conter (r
)));
5841 expr
= ffebld_new_conter_with_orig
5842 (ffebld_constant_new_logicaldefault (val
), expr
);
5846 #if FFETARGET_okREAL3
5847 case FFEINFO_kindtypeREAL3
:
5848 error
= ffetarget_lt_real3 (&val
,
5849 ffebld_constant_real3 (ffebld_conter (l
)),
5850 ffebld_constant_real3 (ffebld_conter (r
)));
5851 expr
= ffebld_new_conter_with_orig
5852 (ffebld_constant_new_logicaldefault (val
), expr
);
5856 #if FFETARGET_okREAL4
5857 case FFEINFO_kindtypeREAL4
:
5858 error
= ffetarget_lt_real4 (&val
,
5859 ffebld_constant_real4 (ffebld_conter (l
)),
5860 ffebld_constant_real4 (ffebld_conter (r
)));
5861 expr
= ffebld_new_conter_with_orig
5862 (ffebld_constant_new_logicaldefault (val
), expr
);
5867 assert ("bad real kind type" == NULL
);
5872 case FFEINFO_basictypeCHARACTER
:
5873 switch (ffeinfo_kindtype (ffebld_info (ffebld_left (expr
))))
5875 #if FFETARGET_okCHARACTER1
5876 case FFEINFO_kindtypeCHARACTER1
:
5877 error
= ffetarget_lt_character1 (&val
,
5878 ffebld_constant_character1 (ffebld_conter (l
)),
5879 ffebld_constant_character1 (ffebld_conter (r
)));
5880 expr
= ffebld_new_conter_with_orig
5881 (ffebld_constant_new_logicaldefault (val
), expr
);
5885 #if FFETARGET_okCHARACTER2
5886 case FFEINFO_kindtypeCHARACTER2
:
5887 error
= ffetarget_lt_character2 (&val
,
5888 ffebld_constant_character2 (ffebld_conter (l
)),
5889 ffebld_constant_character2 (ffebld_conter (r
)));
5890 expr
= ffebld_new_conter_with_orig
5891 (ffebld_constant_new_logicaldefault (val
), expr
);
5895 #if FFETARGET_okCHARACTER3
5896 case FFEINFO_kindtypeCHARACTER3
:
5897 error
= ffetarget_lt_character3 (&val
,
5898 ffebld_constant_character3 (ffebld_conter (l
)),
5899 ffebld_constant_character3 (ffebld_conter (r
)));
5900 expr
= ffebld_new_conter_with_orig
5901 (ffebld_constant_new_logicaldefault (val
), expr
);
5905 #if FFETARGET_okCHARACTER4
5906 case FFEINFO_kindtypeCHARACTER4
:
5907 error
= ffetarget_lt_character4 (&val
,
5908 ffebld_constant_character4 (ffebld_conter (l
)),
5909 ffebld_constant_character4 (ffebld_conter (r
)));
5910 expr
= ffebld_new_conter_with_orig
5911 (ffebld_constant_new_logicaldefault (val
), expr
);
5916 assert ("bad character kind type" == NULL
);
5922 assert ("bad type" == NULL
);
5926 ffebld_set_info (expr
, ffeinfo_new
5927 (FFEINFO_basictypeLOGICAL
,
5928 FFEINFO_kindtypeLOGICALDEFAULT
,
5931 FFEINFO_whereCONSTANT
,
5932 FFETARGET_charactersizeNONE
));
5934 if ((error
!= FFEBAD
)
5935 && ffebad_start (error
))
5937 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
5944 /* ffeexpr_collapse_and -- Collapse and expr
5948 expr = ffeexpr_collapse_and(expr,token);
5950 If the result of the expr is a constant, replaces the expr with the
5951 computed constant. */
5954 ffeexpr_collapse_and (ffebld expr
, ffelexToken t
)
5956 ffebad error
= FFEBAD
;
5959 ffebldConstantUnion u
;
5960 ffeinfoBasictype bt
;
5963 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
5966 l
= ffebld_left (expr
);
5967 r
= ffebld_right (expr
);
5969 if (ffebld_op (l
) != FFEBLD_opCONTER
)
5971 if (ffebld_op (r
) != FFEBLD_opCONTER
)
5974 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
5976 case FFEINFO_basictypeANY
:
5979 case FFEINFO_basictypeINTEGER
:
5980 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
5982 #if FFETARGET_okINTEGER1
5983 case FFEINFO_kindtypeINTEGER1
:
5984 error
= ffetarget_and_integer1 (ffebld_cu_ptr_integer1 (u
),
5985 ffebld_constant_integer1 (ffebld_conter (l
)),
5986 ffebld_constant_integer1 (ffebld_conter (r
)));
5987 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
5988 (ffebld_cu_val_integer1 (u
)), expr
);
5992 #if FFETARGET_okINTEGER2
5993 case FFEINFO_kindtypeINTEGER2
:
5994 error
= ffetarget_and_integer2 (ffebld_cu_ptr_integer2 (u
),
5995 ffebld_constant_integer2 (ffebld_conter (l
)),
5996 ffebld_constant_integer2 (ffebld_conter (r
)));
5997 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
5998 (ffebld_cu_val_integer2 (u
)), expr
);
6002 #if FFETARGET_okINTEGER3
6003 case FFEINFO_kindtypeINTEGER3
:
6004 error
= ffetarget_and_integer3 (ffebld_cu_ptr_integer3 (u
),
6005 ffebld_constant_integer3 (ffebld_conter (l
)),
6006 ffebld_constant_integer3 (ffebld_conter (r
)));
6007 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
6008 (ffebld_cu_val_integer3 (u
)), expr
);
6012 #if FFETARGET_okINTEGER4
6013 case FFEINFO_kindtypeINTEGER4
:
6014 error
= ffetarget_and_integer4 (ffebld_cu_ptr_integer4 (u
),
6015 ffebld_constant_integer4 (ffebld_conter (l
)),
6016 ffebld_constant_integer4 (ffebld_conter (r
)));
6017 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
6018 (ffebld_cu_val_integer4 (u
)), expr
);
6023 assert ("bad integer kind type" == NULL
);
6028 case FFEINFO_basictypeLOGICAL
:
6029 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6031 #if FFETARGET_okLOGICAL1
6032 case FFEINFO_kindtypeLOGICAL1
:
6033 error
= ffetarget_and_logical1 (ffebld_cu_ptr_logical1 (u
),
6034 ffebld_constant_logical1 (ffebld_conter (l
)),
6035 ffebld_constant_logical1 (ffebld_conter (r
)));
6036 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
6037 (ffebld_cu_val_logical1 (u
)), expr
);
6041 #if FFETARGET_okLOGICAL2
6042 case FFEINFO_kindtypeLOGICAL2
:
6043 error
= ffetarget_and_logical2 (ffebld_cu_ptr_logical2 (u
),
6044 ffebld_constant_logical2 (ffebld_conter (l
)),
6045 ffebld_constant_logical2 (ffebld_conter (r
)));
6046 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
6047 (ffebld_cu_val_logical2 (u
)), expr
);
6051 #if FFETARGET_okLOGICAL3
6052 case FFEINFO_kindtypeLOGICAL3
:
6053 error
= ffetarget_and_logical3 (ffebld_cu_ptr_logical3 (u
),
6054 ffebld_constant_logical3 (ffebld_conter (l
)),
6055 ffebld_constant_logical3 (ffebld_conter (r
)));
6056 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
6057 (ffebld_cu_val_logical3 (u
)), expr
);
6061 #if FFETARGET_okLOGICAL4
6062 case FFEINFO_kindtypeLOGICAL4
:
6063 error
= ffetarget_and_logical4 (ffebld_cu_ptr_logical4 (u
),
6064 ffebld_constant_logical4 (ffebld_conter (l
)),
6065 ffebld_constant_logical4 (ffebld_conter (r
)));
6066 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
6067 (ffebld_cu_val_logical4 (u
)), expr
);
6072 assert ("bad logical kind type" == NULL
);
6078 assert ("bad type" == NULL
);
6082 ffebld_set_info (expr
, ffeinfo_new
6087 FFEINFO_whereCONSTANT
,
6088 FFETARGET_charactersizeNONE
));
6090 if ((error
!= FFEBAD
)
6091 && ffebad_start (error
))
6093 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6100 /* ffeexpr_collapse_or -- Collapse or expr
6104 expr = ffeexpr_collapse_or(expr,token);
6106 If the result of the expr is a constant, replaces the expr with the
6107 computed constant. */
6110 ffeexpr_collapse_or (ffebld expr
, ffelexToken t
)
6112 ffebad error
= FFEBAD
;
6115 ffebldConstantUnion u
;
6116 ffeinfoBasictype bt
;
6119 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6122 l
= ffebld_left (expr
);
6123 r
= ffebld_right (expr
);
6125 if (ffebld_op (l
) != FFEBLD_opCONTER
)
6127 if (ffebld_op (r
) != FFEBLD_opCONTER
)
6130 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
6132 case FFEINFO_basictypeANY
:
6135 case FFEINFO_basictypeINTEGER
:
6136 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6138 #if FFETARGET_okINTEGER1
6139 case FFEINFO_kindtypeINTEGER1
:
6140 error
= ffetarget_or_integer1 (ffebld_cu_ptr_integer1 (u
),
6141 ffebld_constant_integer1 (ffebld_conter (l
)),
6142 ffebld_constant_integer1 (ffebld_conter (r
)));
6143 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
6144 (ffebld_cu_val_integer1 (u
)), expr
);
6148 #if FFETARGET_okINTEGER2
6149 case FFEINFO_kindtypeINTEGER2
:
6150 error
= ffetarget_or_integer2 (ffebld_cu_ptr_integer2 (u
),
6151 ffebld_constant_integer2 (ffebld_conter (l
)),
6152 ffebld_constant_integer2 (ffebld_conter (r
)));
6153 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
6154 (ffebld_cu_val_integer2 (u
)), expr
);
6158 #if FFETARGET_okINTEGER3
6159 case FFEINFO_kindtypeINTEGER3
:
6160 error
= ffetarget_or_integer3 (ffebld_cu_ptr_integer3 (u
),
6161 ffebld_constant_integer3 (ffebld_conter (l
)),
6162 ffebld_constant_integer3 (ffebld_conter (r
)));
6163 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
6164 (ffebld_cu_val_integer3 (u
)), expr
);
6168 #if FFETARGET_okINTEGER4
6169 case FFEINFO_kindtypeINTEGER4
:
6170 error
= ffetarget_or_integer4 (ffebld_cu_ptr_integer4 (u
),
6171 ffebld_constant_integer4 (ffebld_conter (l
)),
6172 ffebld_constant_integer4 (ffebld_conter (r
)));
6173 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
6174 (ffebld_cu_val_integer4 (u
)), expr
);
6179 assert ("bad integer kind type" == NULL
);
6184 case FFEINFO_basictypeLOGICAL
:
6185 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6187 #if FFETARGET_okLOGICAL1
6188 case FFEINFO_kindtypeLOGICAL1
:
6189 error
= ffetarget_or_logical1 (ffebld_cu_ptr_logical1 (u
),
6190 ffebld_constant_logical1 (ffebld_conter (l
)),
6191 ffebld_constant_logical1 (ffebld_conter (r
)));
6192 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
6193 (ffebld_cu_val_logical1 (u
)), expr
);
6197 #if FFETARGET_okLOGICAL2
6198 case FFEINFO_kindtypeLOGICAL2
:
6199 error
= ffetarget_or_logical2 (ffebld_cu_ptr_logical2 (u
),
6200 ffebld_constant_logical2 (ffebld_conter (l
)),
6201 ffebld_constant_logical2 (ffebld_conter (r
)));
6202 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
6203 (ffebld_cu_val_logical2 (u
)), expr
);
6207 #if FFETARGET_okLOGICAL3
6208 case FFEINFO_kindtypeLOGICAL3
:
6209 error
= ffetarget_or_logical3 (ffebld_cu_ptr_logical3 (u
),
6210 ffebld_constant_logical3 (ffebld_conter (l
)),
6211 ffebld_constant_logical3 (ffebld_conter (r
)));
6212 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
6213 (ffebld_cu_val_logical3 (u
)), expr
);
6217 #if FFETARGET_okLOGICAL4
6218 case FFEINFO_kindtypeLOGICAL4
:
6219 error
= ffetarget_or_logical4 (ffebld_cu_ptr_logical4 (u
),
6220 ffebld_constant_logical4 (ffebld_conter (l
)),
6221 ffebld_constant_logical4 (ffebld_conter (r
)));
6222 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
6223 (ffebld_cu_val_logical4 (u
)), expr
);
6228 assert ("bad logical kind type" == NULL
);
6234 assert ("bad type" == NULL
);
6238 ffebld_set_info (expr
, ffeinfo_new
6243 FFEINFO_whereCONSTANT
,
6244 FFETARGET_charactersizeNONE
));
6246 if ((error
!= FFEBAD
)
6247 && ffebad_start (error
))
6249 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6256 /* ffeexpr_collapse_xor -- Collapse xor expr
6260 expr = ffeexpr_collapse_xor(expr,token);
6262 If the result of the expr is a constant, replaces the expr with the
6263 computed constant. */
6266 ffeexpr_collapse_xor (ffebld expr
, ffelexToken t
)
6268 ffebad error
= FFEBAD
;
6271 ffebldConstantUnion u
;
6272 ffeinfoBasictype bt
;
6275 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6278 l
= ffebld_left (expr
);
6279 r
= ffebld_right (expr
);
6281 if (ffebld_op (l
) != FFEBLD_opCONTER
)
6283 if (ffebld_op (r
) != FFEBLD_opCONTER
)
6286 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
6288 case FFEINFO_basictypeANY
:
6291 case FFEINFO_basictypeINTEGER
:
6292 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6294 #if FFETARGET_okINTEGER1
6295 case FFEINFO_kindtypeINTEGER1
:
6296 error
= ffetarget_xor_integer1 (ffebld_cu_ptr_integer1 (u
),
6297 ffebld_constant_integer1 (ffebld_conter (l
)),
6298 ffebld_constant_integer1 (ffebld_conter (r
)));
6299 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
6300 (ffebld_cu_val_integer1 (u
)), expr
);
6304 #if FFETARGET_okINTEGER2
6305 case FFEINFO_kindtypeINTEGER2
:
6306 error
= ffetarget_xor_integer2 (ffebld_cu_ptr_integer2 (u
),
6307 ffebld_constant_integer2 (ffebld_conter (l
)),
6308 ffebld_constant_integer2 (ffebld_conter (r
)));
6309 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
6310 (ffebld_cu_val_integer2 (u
)), expr
);
6314 #if FFETARGET_okINTEGER3
6315 case FFEINFO_kindtypeINTEGER3
:
6316 error
= ffetarget_xor_integer3 (ffebld_cu_ptr_integer3 (u
),
6317 ffebld_constant_integer3 (ffebld_conter (l
)),
6318 ffebld_constant_integer3 (ffebld_conter (r
)));
6319 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
6320 (ffebld_cu_val_integer3 (u
)), expr
);
6324 #if FFETARGET_okINTEGER4
6325 case FFEINFO_kindtypeINTEGER4
:
6326 error
= ffetarget_xor_integer4 (ffebld_cu_ptr_integer4 (u
),
6327 ffebld_constant_integer4 (ffebld_conter (l
)),
6328 ffebld_constant_integer4 (ffebld_conter (r
)));
6329 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
6330 (ffebld_cu_val_integer4 (u
)), expr
);
6335 assert ("bad integer kind type" == NULL
);
6340 case FFEINFO_basictypeLOGICAL
:
6341 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6343 #if FFETARGET_okLOGICAL1
6344 case FFEINFO_kindtypeLOGICAL1
:
6345 error
= ffetarget_xor_logical1 (ffebld_cu_ptr_logical1 (u
),
6346 ffebld_constant_logical1 (ffebld_conter (l
)),
6347 ffebld_constant_logical1 (ffebld_conter (r
)));
6348 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
6349 (ffebld_cu_val_logical1 (u
)), expr
);
6353 #if FFETARGET_okLOGICAL2
6354 case FFEINFO_kindtypeLOGICAL2
:
6355 error
= ffetarget_xor_logical2 (ffebld_cu_ptr_logical2 (u
),
6356 ffebld_constant_logical2 (ffebld_conter (l
)),
6357 ffebld_constant_logical2 (ffebld_conter (r
)));
6358 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
6359 (ffebld_cu_val_logical2 (u
)), expr
);
6363 #if FFETARGET_okLOGICAL3
6364 case FFEINFO_kindtypeLOGICAL3
:
6365 error
= ffetarget_xor_logical3 (ffebld_cu_ptr_logical3 (u
),
6366 ffebld_constant_logical3 (ffebld_conter (l
)),
6367 ffebld_constant_logical3 (ffebld_conter (r
)));
6368 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
6369 (ffebld_cu_val_logical3 (u
)), expr
);
6373 #if FFETARGET_okLOGICAL4
6374 case FFEINFO_kindtypeLOGICAL4
:
6375 error
= ffetarget_xor_logical4 (ffebld_cu_ptr_logical4 (u
),
6376 ffebld_constant_logical4 (ffebld_conter (l
)),
6377 ffebld_constant_logical4 (ffebld_conter (r
)));
6378 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
6379 (ffebld_cu_val_logical4 (u
)), expr
);
6384 assert ("bad logical kind type" == NULL
);
6390 assert ("bad type" == NULL
);
6394 ffebld_set_info (expr
, ffeinfo_new
6399 FFEINFO_whereCONSTANT
,
6400 FFETARGET_charactersizeNONE
));
6402 if ((error
!= FFEBAD
)
6403 && ffebad_start (error
))
6405 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6412 /* ffeexpr_collapse_eqv -- Collapse eqv expr
6416 expr = ffeexpr_collapse_eqv(expr,token);
6418 If the result of the expr is a constant, replaces the expr with the
6419 computed constant. */
6422 ffeexpr_collapse_eqv (ffebld expr
, ffelexToken t
)
6424 ffebad error
= FFEBAD
;
6427 ffebldConstantUnion u
;
6428 ffeinfoBasictype bt
;
6431 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6434 l
= ffebld_left (expr
);
6435 r
= ffebld_right (expr
);
6437 if (ffebld_op (l
) != FFEBLD_opCONTER
)
6439 if (ffebld_op (r
) != FFEBLD_opCONTER
)
6442 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
6444 case FFEINFO_basictypeANY
:
6447 case FFEINFO_basictypeINTEGER
:
6448 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6450 #if FFETARGET_okINTEGER1
6451 case FFEINFO_kindtypeINTEGER1
:
6452 error
= ffetarget_eqv_integer1 (ffebld_cu_ptr_integer1 (u
),
6453 ffebld_constant_integer1 (ffebld_conter (l
)),
6454 ffebld_constant_integer1 (ffebld_conter (r
)));
6455 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
6456 (ffebld_cu_val_integer1 (u
)), expr
);
6460 #if FFETARGET_okINTEGER2
6461 case FFEINFO_kindtypeINTEGER2
:
6462 error
= ffetarget_eqv_integer2 (ffebld_cu_ptr_integer2 (u
),
6463 ffebld_constant_integer2 (ffebld_conter (l
)),
6464 ffebld_constant_integer2 (ffebld_conter (r
)));
6465 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
6466 (ffebld_cu_val_integer2 (u
)), expr
);
6470 #if FFETARGET_okINTEGER3
6471 case FFEINFO_kindtypeINTEGER3
:
6472 error
= ffetarget_eqv_integer3 (ffebld_cu_ptr_integer3 (u
),
6473 ffebld_constant_integer3 (ffebld_conter (l
)),
6474 ffebld_constant_integer3 (ffebld_conter (r
)));
6475 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
6476 (ffebld_cu_val_integer3 (u
)), expr
);
6480 #if FFETARGET_okINTEGER4
6481 case FFEINFO_kindtypeINTEGER4
:
6482 error
= ffetarget_eqv_integer4 (ffebld_cu_ptr_integer4 (u
),
6483 ffebld_constant_integer4 (ffebld_conter (l
)),
6484 ffebld_constant_integer4 (ffebld_conter (r
)));
6485 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
6486 (ffebld_cu_val_integer4 (u
)), expr
);
6491 assert ("bad integer kind type" == NULL
);
6496 case FFEINFO_basictypeLOGICAL
:
6497 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6499 #if FFETARGET_okLOGICAL1
6500 case FFEINFO_kindtypeLOGICAL1
:
6501 error
= ffetarget_eqv_logical1 (ffebld_cu_ptr_logical1 (u
),
6502 ffebld_constant_logical1 (ffebld_conter (l
)),
6503 ffebld_constant_logical1 (ffebld_conter (r
)));
6504 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
6505 (ffebld_cu_val_logical1 (u
)), expr
);
6509 #if FFETARGET_okLOGICAL2
6510 case FFEINFO_kindtypeLOGICAL2
:
6511 error
= ffetarget_eqv_logical2 (ffebld_cu_ptr_logical2 (u
),
6512 ffebld_constant_logical2 (ffebld_conter (l
)),
6513 ffebld_constant_logical2 (ffebld_conter (r
)));
6514 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
6515 (ffebld_cu_val_logical2 (u
)), expr
);
6519 #if FFETARGET_okLOGICAL3
6520 case FFEINFO_kindtypeLOGICAL3
:
6521 error
= ffetarget_eqv_logical3 (ffebld_cu_ptr_logical3 (u
),
6522 ffebld_constant_logical3 (ffebld_conter (l
)),
6523 ffebld_constant_logical3 (ffebld_conter (r
)));
6524 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
6525 (ffebld_cu_val_logical3 (u
)), expr
);
6529 #if FFETARGET_okLOGICAL4
6530 case FFEINFO_kindtypeLOGICAL4
:
6531 error
= ffetarget_eqv_logical4 (ffebld_cu_ptr_logical4 (u
),
6532 ffebld_constant_logical4 (ffebld_conter (l
)),
6533 ffebld_constant_logical4 (ffebld_conter (r
)));
6534 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
6535 (ffebld_cu_val_logical4 (u
)), expr
);
6540 assert ("bad logical kind type" == NULL
);
6546 assert ("bad type" == NULL
);
6550 ffebld_set_info (expr
, ffeinfo_new
6555 FFEINFO_whereCONSTANT
,
6556 FFETARGET_charactersizeNONE
));
6558 if ((error
!= FFEBAD
)
6559 && ffebad_start (error
))
6561 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6568 /* ffeexpr_collapse_neqv -- Collapse neqv expr
6572 expr = ffeexpr_collapse_neqv(expr,token);
6574 If the result of the expr is a constant, replaces the expr with the
6575 computed constant. */
6578 ffeexpr_collapse_neqv (ffebld expr
, ffelexToken t
)
6580 ffebad error
= FFEBAD
;
6583 ffebldConstantUnion u
;
6584 ffeinfoBasictype bt
;
6587 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6590 l
= ffebld_left (expr
);
6591 r
= ffebld_right (expr
);
6593 if (ffebld_op (l
) != FFEBLD_opCONTER
)
6595 if (ffebld_op (r
) != FFEBLD_opCONTER
)
6598 switch (bt
= ffeinfo_basictype (ffebld_info (expr
)))
6600 case FFEINFO_basictypeANY
:
6603 case FFEINFO_basictypeINTEGER
:
6604 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6606 #if FFETARGET_okINTEGER1
6607 case FFEINFO_kindtypeINTEGER1
:
6608 error
= ffetarget_neqv_integer1 (ffebld_cu_ptr_integer1 (u
),
6609 ffebld_constant_integer1 (ffebld_conter (l
)),
6610 ffebld_constant_integer1 (ffebld_conter (r
)));
6611 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val
6612 (ffebld_cu_val_integer1 (u
)), expr
);
6616 #if FFETARGET_okINTEGER2
6617 case FFEINFO_kindtypeINTEGER2
:
6618 error
= ffetarget_neqv_integer2 (ffebld_cu_ptr_integer2 (u
),
6619 ffebld_constant_integer2 (ffebld_conter (l
)),
6620 ffebld_constant_integer2 (ffebld_conter (r
)));
6621 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer2_val
6622 (ffebld_cu_val_integer2 (u
)), expr
);
6626 #if FFETARGET_okINTEGER3
6627 case FFEINFO_kindtypeINTEGER3
:
6628 error
= ffetarget_neqv_integer3 (ffebld_cu_ptr_integer3 (u
),
6629 ffebld_constant_integer3 (ffebld_conter (l
)),
6630 ffebld_constant_integer3 (ffebld_conter (r
)));
6631 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer3_val
6632 (ffebld_cu_val_integer3 (u
)), expr
);
6636 #if FFETARGET_okINTEGER4
6637 case FFEINFO_kindtypeINTEGER4
:
6638 error
= ffetarget_neqv_integer4 (ffebld_cu_ptr_integer4 (u
),
6639 ffebld_constant_integer4 (ffebld_conter (l
)),
6640 ffebld_constant_integer4 (ffebld_conter (r
)));
6641 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_integer4_val
6642 (ffebld_cu_val_integer4 (u
)), expr
);
6647 assert ("bad integer kind type" == NULL
);
6652 case FFEINFO_basictypeLOGICAL
:
6653 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6655 #if FFETARGET_okLOGICAL1
6656 case FFEINFO_kindtypeLOGICAL1
:
6657 error
= ffetarget_neqv_logical1 (ffebld_cu_ptr_logical1 (u
),
6658 ffebld_constant_logical1 (ffebld_conter (l
)),
6659 ffebld_constant_logical1 (ffebld_conter (r
)));
6660 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical1_val
6661 (ffebld_cu_val_logical1 (u
)), expr
);
6665 #if FFETARGET_okLOGICAL2
6666 case FFEINFO_kindtypeLOGICAL2
:
6667 error
= ffetarget_neqv_logical2 (ffebld_cu_ptr_logical2 (u
),
6668 ffebld_constant_logical2 (ffebld_conter (l
)),
6669 ffebld_constant_logical2 (ffebld_conter (r
)));
6670 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical2_val
6671 (ffebld_cu_val_logical2 (u
)), expr
);
6675 #if FFETARGET_okLOGICAL3
6676 case FFEINFO_kindtypeLOGICAL3
:
6677 error
= ffetarget_neqv_logical3 (ffebld_cu_ptr_logical3 (u
),
6678 ffebld_constant_logical3 (ffebld_conter (l
)),
6679 ffebld_constant_logical3 (ffebld_conter (r
)));
6680 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical3_val
6681 (ffebld_cu_val_logical3 (u
)), expr
);
6685 #if FFETARGET_okLOGICAL4
6686 case FFEINFO_kindtypeLOGICAL4
:
6687 error
= ffetarget_neqv_logical4 (ffebld_cu_ptr_logical4 (u
),
6688 ffebld_constant_logical4 (ffebld_conter (l
)),
6689 ffebld_constant_logical4 (ffebld_conter (r
)));
6690 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_logical4_val
6691 (ffebld_cu_val_logical4 (u
)), expr
);
6696 assert ("bad logical kind type" == NULL
);
6702 assert ("bad type" == NULL
);
6706 ffebld_set_info (expr
, ffeinfo_new
6711 FFEINFO_whereCONSTANT
,
6712 FFETARGET_charactersizeNONE
));
6714 if ((error
!= FFEBAD
)
6715 && ffebad_start (error
))
6717 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6724 /* ffeexpr_collapse_symter -- Collapse symter expr
6728 expr = ffeexpr_collapse_symter(expr,token);
6730 If the result of the expr is a constant, replaces the expr with the
6731 computed constant. */
6734 ffeexpr_collapse_symter (ffebld expr
, ffelexToken t UNUSED
)
6737 ffeinfoBasictype bt
;
6739 ffetargetCharacterSize len
;
6741 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6744 if ((r
= ffesymbol_init (ffebld_symter (expr
))) == NULL
)
6745 return expr
; /* A PARAMETER lhs in progress. */
6747 switch (ffebld_op (r
))
6749 case FFEBLD_opCONTER
:
6759 bt
= ffeinfo_basictype (ffebld_info (r
));
6760 kt
= ffeinfo_kindtype (ffebld_info (r
));
6761 len
= ffebld_size (r
);
6763 expr
= ffebld_new_conter_with_orig (ffebld_constant_copy (ffebld_conter (r
)),
6766 ffebld_set_info (expr
, ffeinfo_new
6771 FFEINFO_whereCONSTANT
,
6777 /* ffeexpr_collapse_funcref -- Collapse funcref expr
6781 expr = ffeexpr_collapse_funcref(expr,token);
6783 If the result of the expr is a constant, replaces the expr with the
6784 computed constant. */
6787 ffeexpr_collapse_funcref (ffebld expr
, ffelexToken t UNUSED
)
6789 return expr
; /* ~~someday go ahead and collapse these,
6790 though not required */
6793 /* ffeexpr_collapse_arrayref -- Collapse arrayref expr
6797 expr = ffeexpr_collapse_arrayref(expr,token);
6799 If the result of the expr is a constant, replaces the expr with the
6800 computed constant. */
6803 ffeexpr_collapse_arrayref (ffebld expr
, ffelexToken t UNUSED
)
6808 /* ffeexpr_collapse_substr -- Collapse substr expr
6812 expr = ffeexpr_collapse_substr(expr,token);
6814 If the result of the expr is a constant, replaces the expr with the
6815 computed constant. */
6818 ffeexpr_collapse_substr (ffebld expr
, ffelexToken t
)
6820 ffebad error
= FFEBAD
;
6825 ffebldConstantUnion u
;
6827 ffetargetCharacterSize len
;
6828 ffetargetIntegerDefault first
;
6829 ffetargetIntegerDefault last
;
6831 if (ffeinfo_where (ffebld_info (expr
)) != FFEINFO_whereCONSTANT
)
6834 l
= ffebld_left (expr
);
6835 r
= ffebld_right (expr
); /* opITEM. */
6837 if (ffebld_op (l
) != FFEBLD_opCONTER
)
6840 kt
= ffeinfo_kindtype (ffebld_info (l
));
6841 len
= ffebld_size (l
);
6843 start
= ffebld_head (r
);
6844 stop
= ffebld_head (ffebld_trail (r
));
6849 if ((ffebld_op (start
) != FFEBLD_opCONTER
)
6850 || (ffeinfo_basictype (ffebld_info (start
)) != FFEINFO_basictypeINTEGER
)
6851 || (ffeinfo_kindtype (ffebld_info (start
))
6852 != FFEINFO_kindtypeINTEGERDEFAULT
))
6854 first
= ffebld_constant_integerdefault (ffebld_conter (start
));
6860 if ((ffebld_op (stop
) != FFEBLD_opCONTER
)
6861 || (ffeinfo_basictype (ffebld_info (stop
)) != FFEINFO_basictypeINTEGER
)
6862 || (ffeinfo_kindtype (ffebld_info (stop
))
6863 != FFEINFO_kindtypeINTEGERDEFAULT
))
6865 last
= ffebld_constant_integerdefault (ffebld_conter (stop
));
6868 /* Handle problems that should have already been diagnosed, but
6869 left in the expression tree. */
6874 last
= first
+ len
- 1;
6876 if ((first
== 1) && (last
== len
))
6877 { /* Same as original. */
6878 expr
= ffebld_new_conter_with_orig (ffebld_constant_copy
6879 (ffebld_conter (l
)), expr
);
6880 ffebld_set_info (expr
, ffeinfo_new
6881 (FFEINFO_basictypeCHARACTER
,
6885 FFEINFO_whereCONSTANT
,
6891 switch (ffeinfo_basictype (ffebld_info (expr
)))
6893 case FFEINFO_basictypeANY
:
6896 case FFEINFO_basictypeCHARACTER
:
6897 switch (kt
= ffeinfo_kindtype (ffebld_info (expr
)))
6899 #if FFETARGET_okCHARACTER1
6900 case FFEINFO_kindtypeCHARACTER1
:
6901 error
= ffetarget_substr_character1 (ffebld_cu_ptr_character1 (u
),
6902 ffebld_constant_character1 (ffebld_conter (l
)), first
, last
,
6903 ffebld_constant_pool (), &len
);
6904 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character1_val
6905 (ffebld_cu_val_character1 (u
)), expr
);
6909 #if FFETARGET_okCHARACTER2
6910 case FFEINFO_kindtypeCHARACTER2
:
6911 error
= ffetarget_substr_character2 (ffebld_cu_ptr_character2 (u
),
6912 ffebld_constant_character2 (ffebld_conter (l
)), first
, last
,
6913 ffebld_constant_pool (), &len
);
6914 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character2_val
6915 (ffebld_cu_val_character2 (u
)), expr
);
6919 #if FFETARGET_okCHARACTER3
6920 case FFEINFO_kindtypeCHARACTER3
:
6921 error
= ffetarget_substr_character3 (ffebld_cu_ptr_character3 (u
),
6922 ffebld_constant_character3 (ffebld_conter (l
)), first
, last
,
6923 ffebld_constant_pool (), &len
);
6924 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character3_val
6925 (ffebld_cu_val_character3 (u
)), expr
);
6929 #if FFETARGET_okCHARACTER4
6930 case FFEINFO_kindtypeCHARACTER4
:
6931 error
= ffetarget_substr_character4 (ffebld_cu_ptr_character4 (u
),
6932 ffebld_constant_character4 (ffebld_conter (l
)), first
, last
,
6933 ffebld_constant_pool (), &len
);
6934 expr
= ffebld_new_conter_with_orig (ffebld_constant_new_character4_val
6935 (ffebld_cu_val_character4 (u
)), expr
);
6940 assert ("bad character kind type" == NULL
);
6946 assert ("bad type" == NULL
);
6950 ffebld_set_info (expr
, ffeinfo_new
6951 (FFEINFO_basictypeCHARACTER
,
6955 FFEINFO_whereCONSTANT
,
6958 if ((error
!= FFEBAD
)
6959 && ffebad_start (error
))
6961 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
6968 /* ffeexpr_convert -- Convert source expression to given type
6971 ffelexToken source_token;
6972 ffelexToken dest_token; // Any appropriate token for "destination".
6973 ffeinfoBasictype bt;
6975 ffetargetCharactersize sz;
6976 ffeexprContext context; // Mainly LET or DATA.
6977 source = ffeexpr_convert(source,source_token,dest_token,bt,kt,sz,context);
6979 If the expression conforms, returns the source expression. Otherwise
6980 returns source wrapped in a convert node doing the conversion, or
6981 ANY wrapped in convert if there is a conversion error (and issues an
6982 error message). Be sensitive to the context for certain aspects of
6986 ffeexpr_convert (ffebld source
, ffelexToken source_token
, ffelexToken dest_token
,
6987 ffeinfoBasictype bt
, ffeinfoKindtype kt
, ffeinfoRank rk
,
6988 ffetargetCharacterSize sz
, ffeexprContext context
)
6994 info
= ffebld_info (source
);
6995 if ((bt
!= ffeinfo_basictype (info
))
6996 || (kt
!= ffeinfo_kindtype (info
))
6997 || (rk
!= 0) /* Can't convert from or to arrays yet. */
6998 || (ffeinfo_rank (info
) != 0)
6999 || (sz
!= ffebld_size_known (source
)))
7000 #if 0 /* Nobody seems to need this spurious CONVERT node. */
7001 || ((context
!= FFEEXPR_contextLET
)
7002 && (bt
== FFEINFO_basictypeCHARACTER
)
7003 && (sz
== FFETARGET_charactersizeNONE
)))
7006 switch (ffeinfo_basictype (info
))
7008 case FFEINFO_basictypeLOGICAL
:
7011 case FFEINFO_basictypeLOGICAL
:
7015 case FFEINFO_basictypeINTEGER
:
7016 bad
= !ffe_is_ugly_logint ();
7019 case FFEINFO_basictypeCHARACTER
:
7020 bad
= ffe_is_pedantic ()
7021 || !(ffe_is_ugly_init ()
7022 && (context
== FFEEXPR_contextDATA
));
7031 case FFEINFO_basictypeINTEGER
:
7034 case FFEINFO_basictypeINTEGER
:
7035 case FFEINFO_basictypeREAL
:
7036 case FFEINFO_basictypeCOMPLEX
:
7040 case FFEINFO_basictypeLOGICAL
:
7041 bad
= !ffe_is_ugly_logint ();
7044 case FFEINFO_basictypeCHARACTER
:
7045 bad
= ffe_is_pedantic ()
7046 || !(ffe_is_ugly_init ()
7047 && (context
== FFEEXPR_contextDATA
));
7056 case FFEINFO_basictypeREAL
:
7057 case FFEINFO_basictypeCOMPLEX
:
7060 case FFEINFO_basictypeINTEGER
:
7061 case FFEINFO_basictypeREAL
:
7062 case FFEINFO_basictypeCOMPLEX
:
7066 case FFEINFO_basictypeCHARACTER
:
7076 case FFEINFO_basictypeCHARACTER
:
7077 bad
= (bt
!= FFEINFO_basictypeCHARACTER
)
7078 && (ffe_is_pedantic ()
7079 || (bt
!= FFEINFO_basictypeINTEGER
)
7080 || !(ffe_is_ugly_init ()
7081 && (context
== FFEEXPR_contextDATA
)));
7084 case FFEINFO_basictypeTYPELESS
:
7085 case FFEINFO_basictypeHOLLERITH
:
7086 bad
= ffe_is_pedantic ()
7087 || !(ffe_is_ugly_init ()
7088 && ((context
== FFEEXPR_contextDATA
)
7089 || (context
== FFEEXPR_contextLET
)));
7097 if (!bad
&& ((rk
!= 0) || (ffeinfo_rank (info
) != 0)))
7100 if (bad
&& (bt
!= FFEINFO_basictypeANY
) && (kt
!= FFEINFO_kindtypeANY
)
7101 && (ffeinfo_basictype (info
) != FFEINFO_basictypeANY
)
7102 && (ffeinfo_kindtype (info
) != FFEINFO_kindtypeANY
)
7103 && (ffeinfo_where (info
) != FFEINFO_whereANY
))
7105 if (ffebad_start (FFEBAD_BAD_TYPES
))
7107 if (dest_token
== NULL
)
7108 ffebad_here (0, ffewhere_line_unknown (),
7109 ffewhere_column_unknown ());
7111 ffebad_here (0, ffelex_token_where_line (dest_token
),
7112 ffelex_token_where_column (dest_token
));
7113 assert (source_token
!= NULL
);
7114 ffebad_here (1, ffelex_token_where_line (source_token
),
7115 ffelex_token_where_column (source_token
));
7119 source
= ffebld_new_any ();
7120 ffebld_set_info (source
, ffeinfo_new_any ());
7124 switch (ffeinfo_where (info
))
7126 case FFEINFO_whereCONSTANT
:
7127 wh
= FFEINFO_whereCONSTANT
;
7130 case FFEINFO_whereIMMEDIATE
:
7131 wh
= FFEINFO_whereIMMEDIATE
;
7135 wh
= FFEINFO_whereFLEETING
;
7138 source
= ffebld_new_convert (source
);
7139 ffebld_set_info (source
, ffeinfo_new
7146 source
= ffeexpr_collapse_convert (source
, source_token
);
7153 /* ffeexpr_convert_expr -- Convert source expr to conform to dest expr
7157 ffelexToken source_token;
7158 ffelexToken dest_token;
7159 ffeexprContext context;
7160 source = ffeexpr_convert_expr(source,source_token,dest,dest_token,context);
7162 If the expressions conform, returns the source expression. Otherwise
7163 returns source wrapped in a convert node doing the conversion, or
7164 ANY wrapped in convert if there is a conversion error (and issues an
7165 error message). Be sensitive to the context, such as LET or DATA. */
7168 ffeexpr_convert_expr (ffebld source
, ffelexToken source_token
, ffebld dest
,
7169 ffelexToken dest_token
, ffeexprContext context
)
7173 info
= ffebld_info (dest
);
7174 return ffeexpr_convert (source
, source_token
, dest_token
,
7175 ffeinfo_basictype (info
),
7176 ffeinfo_kindtype (info
),
7177 ffeinfo_rank (info
),
7178 ffebld_size_known (dest
),
7182 /* ffeexpr_convert_to_sym -- Convert source expression to conform to symbol
7186 ffelexToken source_token;
7187 ffelexToken dest_token;
7188 source = ffeexpr_convert_to_sym(source,source_token,dest,dest_token);
7190 If the expressions conform, returns the source expression. Otherwise
7191 returns source wrapped in a convert node doing the conversion, or
7192 ANY wrapped in convert if there is a conversion error (and issues an
7196 ffeexpr_convert_to_sym (ffebld source
, ffelexToken source_token
,
7197 ffesymbol dest
, ffelexToken dest_token
)
7199 return ffeexpr_convert (source
, source_token
, dest_token
, ffesymbol_basictype (dest
),
7200 ffesymbol_kindtype (dest
), ffesymbol_rank (dest
), ffesymbol_size (dest
),
7201 FFEEXPR_contextLET
);
7204 /* Initializes the module. */
7209 ffeexpr_stack_
= NULL
;
7213 /* ffeexpr_lhs -- Begin processing left-hand-side-context expression
7215 Prepares cluster for delivery of lexer tokens representing an expression
7216 in a left-hand-side context (A in A=B, for example). ffebld is used
7217 to build expressions in the given pool. The appropriate lexer-token
7218 handling routine within ffeexpr is returned. When the end of the
7219 expression is detected, mycallbackroutine is called with the resulting
7220 single ffebld object specifying the entire expression and the first
7221 lexer token that is not considered part of the expression. This caller-
7222 supplied routine itself returns a lexer-token handling routine. Thus,
7223 if necessary, ffeexpr can return several tokens as end-of-expression
7224 tokens if it needs to scan forward more than one in any instance. */
7227 ffeexpr_lhs (mallocPool pool
, ffeexprContext context
, ffeexprCallback callback
)
7231 ffebld_pool_push (pool
);
7232 s
= malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s
));
7233 s
->previous
= ffeexpr_stack_
;
7235 s
->context
= context
;
7236 s
->callback
= callback
;
7237 s
->first_token
= NULL
;
7238 s
->exprstack
= NULL
;
7241 return (ffelexHandler
) ffeexpr_token_first_lhs_
;
7244 /* ffeexpr_rhs -- Begin processing right-hand-side-context expression
7246 return ffeexpr_rhs(malloc_pool_image(),mycallbackroutine); // to lexer.
7248 Prepares cluster for delivery of lexer tokens representing an expression
7249 in a right-hand-side context (B in A=B, for example). ffebld is used
7250 to build expressions in the given pool. The appropriate lexer-token
7251 handling routine within ffeexpr is returned. When the end of the
7252 expression is detected, mycallbackroutine is called with the resulting
7253 single ffebld object specifying the entire expression and the first
7254 lexer token that is not considered part of the expression. This caller-
7255 supplied routine itself returns a lexer-token handling routine. Thus,
7256 if necessary, ffeexpr can return several tokens as end-of-expression
7257 tokens if it needs to scan forward more than one in any instance. */
7260 ffeexpr_rhs (mallocPool pool
, ffeexprContext context
, ffeexprCallback callback
)
7264 ffebld_pool_push (pool
);
7265 s
= malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR stack", sizeof (*s
));
7266 s
->previous
= ffeexpr_stack_
;
7268 s
->context
= context
;
7269 s
->callback
= callback
;
7270 s
->first_token
= NULL
;
7271 s
->exprstack
= NULL
;
7274 return (ffelexHandler
) ffeexpr_token_first_rhs_
;
7277 /* ffeexpr_cb_close_paren_ -- OPEN_PAREN expr
7279 Pass it to ffeexpr_rhs as the callback routine.
7281 Makes sure the end token is close-paren and swallows it, else issues
7282 an error message and doesn't swallow the token (passing it along instead).
7283 In either case wraps up subexpression construction by enclosing the
7284 ffebld expression in a paren. */
7286 static ffelexHandler
7287 ffeexpr_cb_close_paren_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7291 if (ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
7293 /* Oops, naughty user didn't specify the close paren! */
7295 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN
))
7297 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
7298 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
7299 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
7303 e
= ffeexpr_expr_new_ ();
7304 e
->type
= FFEEXPR_exprtypeOPERAND_
;
7305 e
->u
.operand
= ffebld_new_any ();
7306 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
7307 ffeexpr_exprstack_push_operand_ (e
);
7310 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
7312 ffeexpr_token_binary_
);
7315 if (expr
->op
== FFEBLD_opIMPDO
)
7317 if (ffest_ffebad_start (FFEBAD_IMPDO_PAREN
))
7319 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
7320 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
7326 expr
= ffebld_new_paren (expr
);
7327 ffebld_set_info (expr
, ffeinfo_use (ffebld_info (ffebld_left (expr
))));
7330 /* Now push the (parenthesized) expression as an operand onto the
7331 expression stack. */
7333 e
= ffeexpr_expr_new_ ();
7334 e
->type
= FFEEXPR_exprtypeOPERAND_
;
7335 e
->u
.operand
= expr
;
7336 e
->u
.operand
= ffeexpr_collapse_paren (e
->u
.operand
, ft
);
7337 e
->token
= ffeexpr_stack_
->tokens
[0];
7338 ffeexpr_exprstack_push_operand_ (e
);
7340 return (ffelexHandler
) ffeexpr_token_binary_
;
7343 /* ffeexpr_cb_close_paren_ambig_ -- OPEN_PAREN expr
7345 Pass it to ffeexpr_rhs as the callback routine.
7347 We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
7348 with the next token in t. If the next token is possibly a binary
7349 operator, continue processing the outer expression. If the next
7350 token is COMMA, then the expression is a unit specifier, and
7351 parentheses should not be added to it because it surrounds the
7352 I/O control list that starts with the unit specifier (and continues
7353 on from here -- we haven't seen the CLOSE_PAREN that matches the
7354 OPEN_PAREN, it is up to the callback function to expect to see it
7355 at some point). In this case, we notify the callback function that
7356 the COMMA is inside, not outside, the parens by wrapping the expression
7357 in an opITEM (with a NULL trail) -- the callback function presumably
7358 unwraps it after seeing this kludgey indicator.
7360 If the next token is CLOSE_PAREN, then we go to the _1_ state to
7361 decide what to do with the token after that.
7364 Use an extra state for the CLOSE_PAREN case to make READ &co really
7367 static ffelexHandler
7368 ffeexpr_cb_close_paren_ambig_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7370 ffeexprCallback callback
;
7373 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
7374 { /* Need to see the next token before we
7376 ffeexpr_stack_
->expr
= expr
;
7377 ffeexpr_tokens_
[0] = ffelex_token_use (ft
);
7378 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
7379 return (ffelexHandler
) ffeexpr_cb_close_paren_ambig_1_
;
7382 expr
= ffeexpr_finished_ambig_ (ft
, expr
);
7384 /* Let the callback function handle the case where t isn't COMMA. */
7386 /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
7387 that preceded the expression starts a list of expressions, and the expr
7388 hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
7389 node. The callback function should extract the real expr from the head
7390 of this opITEM node after testing it. */
7392 expr
= ffebld_new_item (expr
, NULL
);
7395 callback
= ffeexpr_stack_
->callback
;
7396 ffelex_token_kill (ffeexpr_stack_
->first_token
);
7397 s
= ffeexpr_stack_
->previous
;
7398 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
, sizeof (*ffeexpr_stack_
));
7400 return (ffelexHandler
) (*callback
) (ft
, expr
, t
);
7403 /* ffeexpr_cb_close_paren_ambig_1_ -- OPEN_PAREN expr CLOSE_PAREN
7405 See ffeexpr_cb_close_paren_ambig_.
7407 We get here in the READ/BACKEND/ENDFILE/REWIND case "READ(expr)"
7408 with the next token in t. If the next token is possibly a binary
7409 operator, continue processing the outer expression. If the next
7410 token is COMMA, the expression is a parenthesized format specifier.
7411 If the next token is not EOS or SEMICOLON, then because it is not a
7412 binary operator (it is NAME, OPEN_PAREN, &c), the expression is
7413 a unit specifier, and parentheses should not be added to it because
7414 they surround the I/O control list that consists of only the unit
7415 specifier. If the next token is EOS or SEMICOLON, the statement
7416 must be disambiguated by looking at the type of the expression -- a
7417 character expression is a parenthesized format specifier, while a
7418 non-character expression is a unit specifier.
7420 Another issue is how to do the callback so the recipient of the
7421 next token knows how to handle it if it is a COMMA. In all other
7422 cases, disambiguation is straightforward: the same approach as the
7425 EXTENSION: in COMMA case, if not pedantic, use same disambiguation
7426 as for EOS/SEMICOLON case; f2c allows "READ (cilist) [[,]iolist]"
7427 and apparently other compilers do, as well, and some code out there
7428 uses this "feature".
7431 Extend to allow COMMA as nondisambiguating by itself. Remember
7432 to not try and check info field for opSTAR, since that expr doesn't
7433 have a valid info field. */
7435 static ffelexHandler
7436 ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t
)
7438 ffeexprCallback callback
;
7441 ffelexToken orig_ft
= ffeexpr_tokens_
[0]; /* In case callback clobbers
7443 ffelexToken orig_t
= ffeexpr_tokens_
[1];
7444 ffebld expr
= ffeexpr_stack_
->expr
;
7446 switch (ffelex_token_type (t
))
7448 case FFELEX_typeCOMMA
: /* Subexpr is parenthesized format specifier. */
7449 if (ffe_is_pedantic ())
7450 goto pedantic_comma
; /* :::::::::::::::::::: */
7452 case FFELEX_typeEOS
: /* Ambiguous; use type of expr to
7454 case FFELEX_typeSEMICOLON
:
7455 if ((expr
== NULL
) || (ffebld_op (expr
) == FFEBLD_opANY
)
7456 || (ffebld_op (expr
) == FFEBLD_opSTAR
)
7457 || (ffeinfo_basictype (ffebld_info (expr
))
7458 != FFEINFO_basictypeCHARACTER
))
7459 break; /* Not a valid CHARACTER entity, can't be a
7462 default: /* Binary op (we assume; error otherwise);
7463 format specifier. */
7465 pedantic_comma
: /* :::::::::::::::::::: */
7467 switch (ffeexpr_stack_
->context
)
7469 case FFEEXPR_contextFILENUMAMBIG
:
7470 ffeexpr_stack_
->context
= FFEEXPR_contextFILENUM
;
7473 case FFEEXPR_contextFILEUNITAMBIG
:
7474 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
7478 assert ("bad context" == NULL
);
7482 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (ffeexpr_stack_
->first_token
);
7483 next
= (ffelexHandler
) ffeexpr_cb_close_paren_ (orig_ft
, expr
, orig_t
);
7484 ffelex_token_kill (orig_ft
);
7485 ffelex_token_kill (orig_t
);
7486 return (ffelexHandler
) (*next
) (t
);
7488 case FFELEX_typeOPEN_PAREN
:/* Non-binary op; beginning of I/O list. */
7489 case FFELEX_typeNAME
:
7493 expr
= ffeexpr_finished_ambig_ (orig_ft
, expr
);
7495 /* Here is a kludge whereby we tell the callback function the OPEN_PAREN
7496 that preceded the expression starts a list of expressions, and the expr
7497 hasn't been wrapped in a corresponding (and possibly collapsed) opPAREN
7498 node. The callback function should extract the real expr from the head
7499 of this opITEM node after testing it. */
7501 expr
= ffebld_new_item (expr
, NULL
);
7504 callback
= ffeexpr_stack_
->callback
;
7505 ffelex_token_kill (ffeexpr_stack_
->first_token
);
7506 s
= ffeexpr_stack_
->previous
;
7507 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
, sizeof (*ffeexpr_stack_
));
7509 next
= (ffelexHandler
) (*callback
) (orig_ft
, expr
, orig_t
);
7510 ffelex_token_kill (orig_ft
);
7511 ffelex_token_kill (orig_t
);
7512 return (ffelexHandler
) (*next
) (t
);
7515 /* ffeexpr_cb_close_paren_c_ -- OPEN_PAREN expr (possible complex)
7517 Pass it to ffeexpr_rhs as the callback routine.
7519 Makes sure the end token is close-paren and swallows it, or a comma
7520 and handles complex/implied-do possibilities, else issues
7521 an error message and doesn't swallow the token (passing it along instead). */
7523 static ffelexHandler
7524 ffeexpr_cb_close_paren_c_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7526 /* First check to see if this is a possible complex entity. It is if the
7527 token is a comma. */
7529 if (ffelex_token_type (t
) == FFELEX_typeCOMMA
)
7531 ffeexpr_stack_
->tokens
[1] = ffelex_token_use (ft
);
7532 ffeexpr_stack_
->expr
= expr
;
7533 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
7534 FFEEXPR_contextPAREN_
, ffeexpr_cb_comma_c_
);
7537 return (ffelexHandler
) ffeexpr_cb_close_paren_ (ft
, expr
, t
);
7540 /* ffeexpr_cb_comma_c_ -- OPEN_PAREN expr COMMA expr
7542 Pass it to ffeexpr_rhs as the callback routine.
7544 If this token is not a comma, we have a complex constant (or an attempt
7545 at one), so handle it accordingly, displaying error messages if the token
7546 is not a close-paren. */
7548 static ffelexHandler
7549 ffeexpr_cb_comma_c_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7552 ffeinfoBasictype lty
= (ffeexpr_stack_
->expr
== NULL
)
7553 ? FFEINFO_basictypeNONE
: ffeinfo_basictype (ffebld_info (ffeexpr_stack_
->expr
));
7554 ffeinfoBasictype rty
= (expr
== NULL
)
7555 ? FFEINFO_basictypeNONE
: ffeinfo_basictype (ffebld_info (expr
));
7556 ffeinfoKindtype lkt
;
7557 ffeinfoKindtype rkt
;
7558 ffeinfoKindtype nkt
;
7562 if ((ffeexpr_stack_
->expr
== NULL
)
7563 || (ffebld_op (ffeexpr_stack_
->expr
) != FFEBLD_opCONTER
)
7564 || (((orig
= ffebld_conter_orig (ffeexpr_stack_
->expr
)) != NULL
)
7565 && (((ffebld_op (orig
) != FFEBLD_opUMINUS
)
7566 && (ffebld_op (orig
) != FFEBLD_opUPLUS
))
7567 || (ffebld_conter_orig (ffebld_left (orig
)) != NULL
)))
7568 || ((lty
!= FFEINFO_basictypeINTEGER
)
7569 && (lty
!= FFEINFO_basictypeREAL
)))
7571 if ((lty
!= FFEINFO_basictypeANY
)
7572 && ffebad_start (FFEBAD_INVALID_COMPLEX_PART
))
7574 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[1]),
7575 ffelex_token_where_column (ffeexpr_stack_
->tokens
[1]));
7576 ffebad_string ("Real");
7582 || (ffebld_op (expr
) != FFEBLD_opCONTER
)
7583 || (((orig
= ffebld_conter_orig (expr
)) != NULL
)
7584 && (((ffebld_op (orig
) != FFEBLD_opUMINUS
)
7585 && (ffebld_op (orig
) != FFEBLD_opUPLUS
))
7586 || (ffebld_conter_orig (ffebld_left (orig
)) != NULL
)))
7587 || ((rty
!= FFEINFO_basictypeINTEGER
)
7588 && (rty
!= FFEINFO_basictypeREAL
)))
7590 if ((rty
!= FFEINFO_basictypeANY
)
7591 && ffebad_start (FFEBAD_INVALID_COMPLEX_PART
))
7593 ffebad_here (0, ffelex_token_where_line (ft
),
7594 ffelex_token_where_column (ft
));
7595 ffebad_string ("Imaginary");
7601 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
7603 /* Push the (parenthesized) expression as an operand onto the expression
7606 e
= ffeexpr_expr_new_ ();
7607 e
->type
= FFEEXPR_exprtypeOPERAND_
;
7608 e
->token
= ffeexpr_stack_
->tokens
[0];
7612 if (lty
== FFEINFO_basictypeINTEGER
)
7613 lkt
= FFEINFO_kindtypeREALDEFAULT
;
7615 lkt
= ffeinfo_kindtype (ffebld_info (ffeexpr_stack_
->expr
));
7616 if (rty
== FFEINFO_basictypeINTEGER
)
7617 rkt
= FFEINFO_kindtypeREALDEFAULT
;
7619 rkt
= ffeinfo_kindtype (ffebld_info (expr
));
7621 nkt
= ffeinfo_kindtype_max (FFEINFO_basictypeCOMPLEX
, lkt
, rkt
);
7622 ffeexpr_stack_
->expr
= ffeexpr_convert (ffeexpr_stack_
->expr
,
7623 ffeexpr_stack_
->tokens
[1], ffeexpr_stack_
->tokens
[0],
7624 FFEINFO_basictypeREAL
, nkt
, 0, FFETARGET_charactersizeNONE
,
7625 FFEEXPR_contextLET
);
7626 expr
= ffeexpr_convert (expr
,
7627 ffeexpr_stack_
->tokens
[1], ffeexpr_stack_
->tokens
[0],
7628 FFEINFO_basictypeREAL
, nkt
, 0, FFETARGET_charactersizeNONE
,
7629 FFEEXPR_contextLET
);
7632 nkt
= FFEINFO_kindtypeANY
;
7636 #if FFETARGET_okCOMPLEX1
7637 case FFEINFO_kindtypeREAL1
:
7638 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_complex1
7639 (ffebld_conter (ffeexpr_stack_
->expr
), ffebld_conter (expr
)));
7640 ffebld_set_info (e
->u
.operand
,
7641 ffeinfo_new (FFEINFO_basictypeCOMPLEX
, nkt
, 0,
7642 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
7643 FFETARGET_charactersizeNONE
));
7647 #if FFETARGET_okCOMPLEX2
7648 case FFEINFO_kindtypeREAL2
:
7649 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_complex2
7650 (ffebld_conter (ffeexpr_stack_
->expr
), ffebld_conter (expr
)));
7651 ffebld_set_info (e
->u
.operand
,
7652 ffeinfo_new (FFEINFO_basictypeCOMPLEX
, nkt
, 0,
7653 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
7654 FFETARGET_charactersizeNONE
));
7658 #if FFETARGET_okCOMPLEX3
7659 case FFEINFO_kindtypeREAL3
:
7660 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_complex3
7661 (ffebld_conter (ffeexpr_stack_
->expr
), ffebld_conter (expr
)));
7662 ffebld_set_info (e
->u
.operand
,
7663 ffeinfo_new (FFEINFO_basictypeCOMPLEX
, nkt
, 0,
7664 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
7665 FFETARGET_charactersizeNONE
));
7669 #if FFETARGET_okCOMPLEX4
7670 case FFEINFO_kindtypeREAL4
:
7671 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_complex4
7672 (ffebld_conter (ffeexpr_stack_
->expr
), ffebld_conter (expr
)));
7673 ffebld_set_info (e
->u
.operand
,
7674 ffeinfo_new (FFEINFO_basictypeCOMPLEX
, nkt
, 0,
7675 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
7676 FFETARGET_charactersizeNONE
));
7681 if (ffebad_start ((nkt
== FFEINFO_kindtypeREALDOUBLE
)
7682 ? FFEBAD_BAD_DBLCMPLX
: FFEBAD_BAD_COMPLEX
))
7684 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
7685 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
7689 case FFEINFO_kindtypeANY
:
7690 e
->u
.operand
= ffebld_new_any ();
7691 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
7694 ffeexpr_exprstack_push_operand_ (e
);
7696 /* Now, if the token is a close parenthese, we're in great shape so return
7697 the next handler. */
7699 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
7700 return (ffelexHandler
) ffeexpr_token_binary_
;
7702 /* Oops, naughty user didn't specify the close paren! */
7704 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN
))
7706 ffebad_here (0, ffelex_token_where_line (t
),
7707 ffelex_token_where_column (t
));
7708 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
7709 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
7714 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
7716 ffeexpr_token_binary_
);
7719 /* ffeexpr_cb_close_paren_ci_ -- OPEN_PAREN expr (possible complex or
7720 implied-DO construct)
7722 Pass it to ffeexpr_rhs as the callback routine.
7724 Makes sure the end token is close-paren and swallows it, or a comma
7725 and handles complex/implied-do possibilities, else issues
7726 an error message and doesn't swallow the token (passing it along instead). */
7728 static ffelexHandler
7729 ffeexpr_cb_close_paren_ci_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7733 /* First check to see if this is a possible complex or implied-DO entity.
7734 It is if the token is a comma. */
7736 if (ffelex_token_type (t
) == FFELEX_typeCOMMA
)
7738 switch (ffeexpr_stack_
->context
)
7740 case FFEEXPR_contextIOLIST
:
7741 case FFEEXPR_contextIMPDOITEM_
:
7742 ctx
= FFEEXPR_contextIMPDOITEM_
;
7745 case FFEEXPR_contextIOLISTDF
:
7746 case FFEEXPR_contextIMPDOITEMDF_
:
7747 ctx
= FFEEXPR_contextIMPDOITEMDF_
;
7751 assert ("bad context" == NULL
);
7752 ctx
= FFEEXPR_contextIMPDOITEM_
;
7756 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (ft
);
7757 ffeexpr_stack_
->expr
= expr
;
7758 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
7759 ctx
, ffeexpr_cb_comma_ci_
);
7762 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (ffeexpr_stack_
->first_token
);
7763 return (ffelexHandler
) ffeexpr_cb_close_paren_ (ft
, expr
, t
);
7766 /* ffeexpr_cb_comma_ci_ -- OPEN_PAREN expr COMMA expr
7768 Pass it to ffeexpr_rhs as the callback routine.
7770 If this token is not a comma, we have a complex constant (or an attempt
7771 at one), so handle it accordingly, displaying error messages if the token
7772 is not a close-paren. If we have a comma here, it is an attempt at an
7773 implied-DO, so start making a list accordingly. Oh, it might be an
7774 equal sign also, meaning an implied-DO with only one item in its list. */
7776 static ffelexHandler
7777 ffeexpr_cb_comma_ci_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7781 /* First check to see if this is a possible complex constant. It is if the
7782 token is not a comma or an equals sign, in which case it should be a
7785 if ((ffelex_token_type (t
) != FFELEX_typeCOMMA
)
7786 && (ffelex_token_type (t
) != FFELEX_typeEQUALS
))
7788 ffeexpr_stack_
->tokens
[1] = ffeexpr_stack_
->tokens
[0];
7789 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (ffeexpr_stack_
->first_token
);
7790 return (ffelexHandler
) ffeexpr_cb_comma_c_ (ft
, expr
, t
);
7793 /* Here we have either EQUALS or COMMA, meaning we are in an implied-DO
7794 construct. Make a list and handle accordingly. */
7796 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
7797 fexpr
= ffeexpr_stack_
->expr
;
7798 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
7799 ffebld_append_item (&ffeexpr_stack_
->bottom
, fexpr
);
7800 return (ffelexHandler
) ffeexpr_cb_comma_i_1_ (ft
, expr
, t
);
7803 /* ffeexpr_cb_comma_i_ -- OPEN_PAREN expr
7805 Pass it to ffeexpr_rhs as the callback routine.
7807 Handle first item in an implied-DO construct. */
7809 static ffelexHandler
7810 ffeexpr_cb_comma_i_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7812 if (ffelex_token_type (t
) != FFELEX_typeCOMMA
)
7814 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO
))
7816 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
7817 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
7818 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
7821 ffebld_end_list (&ffeexpr_stack_
->bottom
);
7822 ffeexpr_stack_
->expr
= ffebld_new_any ();
7823 ffebld_set_info (ffeexpr_stack_
->expr
, ffeinfo_new_any ());
7824 if (ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
7825 return (ffelexHandler
) ffeexpr_cb_comma_i_5_ (t
);
7826 return (ffelexHandler
) ffeexpr_cb_comma_i_5_
;
7829 return (ffelexHandler
) ffeexpr_cb_comma_i_1_ (ft
, expr
, t
);
7832 /* ffeexpr_cb_comma_i_1_ -- OPEN_PAREN expr
7834 Pass it to ffeexpr_rhs as the callback routine.
7836 Handle first item in an implied-DO construct. */
7838 static ffelexHandler
7839 ffeexpr_cb_comma_i_1_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
7841 ffeexprContext ctxi
;
7842 ffeexprContext ctxc
;
7844 switch (ffeexpr_stack_
->context
)
7846 case FFEEXPR_contextDATA
:
7847 case FFEEXPR_contextDATAIMPDOITEM_
:
7848 ctxi
= FFEEXPR_contextDATAIMPDOITEM_
;
7849 ctxc
= FFEEXPR_contextDATAIMPDOCTRL_
;
7852 case FFEEXPR_contextIOLIST
:
7853 case FFEEXPR_contextIMPDOITEM_
:
7854 ctxi
= FFEEXPR_contextIMPDOITEM_
;
7855 ctxc
= FFEEXPR_contextIMPDOCTRL_
;
7858 case FFEEXPR_contextIOLISTDF
:
7859 case FFEEXPR_contextIMPDOITEMDF_
:
7860 ctxi
= FFEEXPR_contextIMPDOITEMDF_
;
7861 ctxc
= FFEEXPR_contextIMPDOCTRL_
;
7865 assert ("bad context" == NULL
);
7866 ctxi
= FFEEXPR_context
;
7867 ctxc
= FFEEXPR_context
;
7871 switch (ffelex_token_type (t
))
7873 case FFELEX_typeCOMMA
:
7874 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
7875 if (ffeexpr_stack_
->is_rhs
)
7876 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
7877 ctxi
, ffeexpr_cb_comma_i_1_
);
7878 return (ffelexHandler
) ffeexpr_lhs (ffeexpr_stack_
->pool
,
7879 ctxi
, ffeexpr_cb_comma_i_1_
);
7881 case FFELEX_typeEQUALS
:
7882 ffebld_end_list (&ffeexpr_stack_
->bottom
);
7884 /* Complain if implied-DO variable in list of items to be read. */
7886 if ((ctxc
== FFEEXPR_contextIMPDOCTRL_
) && !ffeexpr_stack_
->is_rhs
)
7887 ffeexpr_check_impdo_ (ffeexpr_stack_
->expr
,
7888 ffeexpr_stack_
->first_token
, expr
, ft
);
7890 /* Set doiter flag for all appropriate SYMTERs. */
7892 ffeexpr_update_impdo_ (ffeexpr_stack_
->expr
, expr
);
7894 ffeexpr_stack_
->expr
= ffebld_new_impdo (ffeexpr_stack_
->expr
, NULL
);
7895 ffebld_set_info (ffeexpr_stack_
->expr
,
7896 ffeinfo_new (FFEINFO_basictypeNONE
,
7897 FFEINFO_kindtypeNONE
,
7901 FFETARGET_charactersizeNONE
));
7902 ffebld_init_list (&(ffebld_right (ffeexpr_stack_
->expr
)),
7903 &ffeexpr_stack_
->bottom
);
7904 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
7905 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
7906 ctxc
, ffeexpr_cb_comma_i_2_
);
7909 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO
))
7911 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
7912 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
7913 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
7916 ffebld_end_list (&ffeexpr_stack_
->bottom
);
7917 ffeexpr_stack_
->expr
= ffebld_new_any ();
7918 ffebld_set_info (ffeexpr_stack_
->expr
, ffeinfo_new_any ());
7919 if (ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
7920 return (ffelexHandler
) ffeexpr_cb_comma_i_5_ (t
);
7921 return (ffelexHandler
) ffeexpr_cb_comma_i_5_
;
7925 /* ffeexpr_cb_comma_i_2_ -- OPEN_PAREN expr-list EQUALS expr
7927 Pass it to ffeexpr_rhs as the callback routine.
7929 Handle start-value in an implied-DO construct. */
7931 static ffelexHandler
7932 ffeexpr_cb_comma_i_2_ (ffelexToken ft UNUSED
, ffebld expr
, ffelexToken t
)
7936 switch (ffeexpr_stack_
->context
)
7938 case FFEEXPR_contextDATA
:
7939 case FFEEXPR_contextDATAIMPDOITEM_
:
7940 ctx
= FFEEXPR_contextDATAIMPDOCTRL_
;
7943 case FFEEXPR_contextIOLIST
:
7944 case FFEEXPR_contextIOLISTDF
:
7945 case FFEEXPR_contextIMPDOITEM_
:
7946 case FFEEXPR_contextIMPDOITEMDF_
:
7947 ctx
= FFEEXPR_contextIMPDOCTRL_
;
7951 assert ("bad context" == NULL
);
7952 ctx
= FFEEXPR_context
;
7956 switch (ffelex_token_type (t
))
7958 case FFELEX_typeCOMMA
:
7959 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
7960 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
7961 ctx
, ffeexpr_cb_comma_i_3_
);
7965 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO
))
7967 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
7968 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
7969 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
7972 ffebld_end_list (&ffeexpr_stack_
->bottom
);
7973 ffeexpr_stack_
->expr
= ffebld_new_any ();
7974 ffebld_set_info (ffeexpr_stack_
->expr
, ffeinfo_new_any ());
7975 if (ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
7976 return (ffelexHandler
) ffeexpr_cb_comma_i_5_ (t
);
7977 return (ffelexHandler
) ffeexpr_cb_comma_i_5_
;
7981 /* ffeexpr_cb_comma_i_3_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
7983 Pass it to ffeexpr_rhs as the callback routine.
7985 Handle end-value in an implied-DO construct. */
7987 static ffelexHandler
7988 ffeexpr_cb_comma_i_3_ (ffelexToken ft UNUSED
, ffebld expr
, ffelexToken t
)
7992 switch (ffeexpr_stack_
->context
)
7994 case FFEEXPR_contextDATA
:
7995 case FFEEXPR_contextDATAIMPDOITEM_
:
7996 ctx
= FFEEXPR_contextDATAIMPDOCTRL_
;
7999 case FFEEXPR_contextIOLIST
:
8000 case FFEEXPR_contextIOLISTDF
:
8001 case FFEEXPR_contextIMPDOITEM_
:
8002 case FFEEXPR_contextIMPDOITEMDF_
:
8003 ctx
= FFEEXPR_contextIMPDOCTRL_
;
8007 assert ("bad context" == NULL
);
8008 ctx
= FFEEXPR_context
;
8012 switch (ffelex_token_type (t
))
8014 case FFELEX_typeCOMMA
:
8015 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
8016 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
8017 ctx
, ffeexpr_cb_comma_i_4_
);
8020 case FFELEX_typeCLOSE_PAREN
:
8021 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
8022 return (ffelexHandler
) ffeexpr_cb_comma_i_4_ (NULL
, NULL
, t
);
8026 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO
))
8028 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
8029 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
8030 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
8033 ffebld_end_list (&ffeexpr_stack_
->bottom
);
8034 ffeexpr_stack_
->expr
= ffebld_new_any ();
8035 ffebld_set_info (ffeexpr_stack_
->expr
, ffeinfo_new_any ());
8036 if (ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
8037 return (ffelexHandler
) ffeexpr_cb_comma_i_5_ (t
);
8038 return (ffelexHandler
) ffeexpr_cb_comma_i_5_
;
8042 /* ffeexpr_cb_comma_i_4_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
8045 Pass it to ffeexpr_rhs as the callback routine.
8047 Handle incr-value in an implied-DO construct. */
8049 static ffelexHandler
8050 ffeexpr_cb_comma_i_4_ (ffelexToken ft UNUSED
, ffebld expr
, ffelexToken t
)
8052 switch (ffelex_token_type (t
))
8054 case FFELEX_typeCLOSE_PAREN
:
8055 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
8056 ffebld_end_list (&ffeexpr_stack_
->bottom
);
8060 for (item
= ffebld_left (ffeexpr_stack_
->expr
);
8062 item
= ffebld_trail (item
))
8063 if (ffebld_op (ffebld_head (item
)) == FFEBLD_opANY
)
8064 goto replace_with_any
; /* :::::::::::::::::::: */
8066 for (item
= ffebld_right (ffeexpr_stack_
->expr
);
8068 item
= ffebld_trail (item
))
8069 if ((ffebld_head (item
) != NULL
) /* Increment may be NULL. */
8070 && (ffebld_op (ffebld_head (item
)) == FFEBLD_opANY
))
8071 goto replace_with_any
; /* :::::::::::::::::::: */
8076 if (ffest_ffebad_start (FFEBAD_BAD_IMPDO
))
8078 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
8079 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
8080 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
8083 ffebld_end_list (&ffeexpr_stack_
->bottom
);
8085 replace_with_any
: /* :::::::::::::::::::: */
8087 ffeexpr_stack_
->expr
= ffebld_new_any ();
8088 ffebld_set_info (ffeexpr_stack_
->expr
, ffeinfo_new_any ());
8092 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
8093 return (ffelexHandler
) ffeexpr_cb_comma_i_5_
;
8094 return (ffelexHandler
) ffeexpr_cb_comma_i_5_ (t
);
8097 /* ffeexpr_cb_comma_i_5_ -- OPEN_PAREN expr-list EQUALS expr COMMA expr
8098 [COMMA expr] CLOSE_PAREN
8100 Pass it to ffeexpr_rhs as the callback routine.
8102 Collects token following implied-DO construct for callback function. */
8104 static ffelexHandler
8105 ffeexpr_cb_comma_i_5_ (ffelexToken t
)
8107 ffeexprCallback callback
;
8114 switch (ffeexpr_stack_
->context
)
8116 case FFEEXPR_contextDATA
:
8117 case FFEEXPR_contextDATAIMPDOITEM_
:
8121 case FFEEXPR_contextIOLIST
:
8122 case FFEEXPR_contextIOLISTDF
:
8123 case FFEEXPR_contextIMPDOITEM_
:
8124 case FFEEXPR_contextIMPDOITEMDF_
:
8129 assert ("bad context" == NULL
);
8135 callback
= ffeexpr_stack_
->callback
;
8136 ft
= ffeexpr_stack_
->first_token
;
8137 expr
= ffeexpr_stack_
->expr
;
8138 s
= ffeexpr_stack_
->previous
;
8139 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
,
8140 sizeof (*ffeexpr_stack_
));
8142 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
8143 ffelex_token_kill (ft
);
8146 ffesymbol_drive_sfnames (ffeexpr_check_impctrl_
);
8148 if (ffeexpr_level_
== 0)
8151 return (ffelexHandler
) next
;
8154 /* ffeexpr_cb_end_loc_ -- Handle end of %LOC subexpression
8156 Makes sure the end token is close-paren and swallows it, else issues
8157 an error message and doesn't swallow the token (passing it along instead).
8158 In either case wraps up subexpression construction by enclosing the
8159 ffebld expression in a %LOC. */
8161 static ffelexHandler
8162 ffeexpr_cb_end_loc_ (ffelexToken ft UNUSED
, ffebld expr
, ffelexToken t
)
8166 /* First push the (%LOC) expression as an operand onto the expression
8169 e
= ffeexpr_expr_new_ ();
8170 e
->type
= FFEEXPR_exprtypeOPERAND_
;
8171 e
->token
= ffeexpr_stack_
->tokens
[0];
8172 e
->u
.operand
= ffebld_new_percent_loc (expr
);
8173 ffebld_set_info (e
->u
.operand
,
8174 ffeinfo_new (FFEINFO_basictypeINTEGER
,
8175 ffecom_pointer_kind (),
8178 FFEINFO_whereFLEETING
,
8179 FFETARGET_charactersizeNONE
));
8181 e
->u
.operand
= ffeexpr_collapse_percent_loc (e
->u
.operand
, ft
);
8183 ffeexpr_exprstack_push_operand_ (e
);
8185 /* Now, if the token is a close parenthese, we're in great shape so return
8186 the next handler. */
8188 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
8190 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
8191 return (ffelexHandler
) ffeexpr_token_binary_
;
8194 /* Oops, naughty user didn't specify the close paren! */
8196 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN
))
8198 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
8199 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[1]),
8200 ffelex_token_where_column (ffeexpr_stack_
->tokens
[1]));
8204 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
8206 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
8208 ffeexpr_token_binary_
);
8211 /* ffeexpr_cb_end_notloc_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
8213 Should be CLOSE_PAREN, and make sure expr isn't a %(VAL,REF,DESCR). */
8215 static ffelexHandler
8216 ffeexpr_cb_end_notloc_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
8221 /* If expression is itself a %(VAL,REF,DESCR), complain and strip off all
8222 such things until the lowest-level expression is reached. */
8224 op
= ffebld_op (expr
);
8225 if ((op
== FFEBLD_opPERCENT_VAL
) || (op
== FFEBLD_opPERCENT_REF
)
8226 || (op
== FFEBLD_opPERCENT_DESCR
))
8228 if (ffebad_start (FFEBAD_NESTED_PERCENT
))
8230 ffebad_here (0, ffelex_token_where_line (ft
),
8231 ffelex_token_where_column (ft
));
8237 expr
= ffebld_left (expr
);
8238 op
= ffebld_op (expr
);
8240 while ((op
== FFEBLD_opPERCENT_VAL
) || (op
== FFEBLD_opPERCENT_REF
)
8241 || (op
== FFEBLD_opPERCENT_DESCR
));
8244 /* Push the expression as an operand onto the expression stack. */
8246 e
= ffeexpr_expr_new_ ();
8247 e
->type
= FFEEXPR_exprtypeOPERAND_
;
8248 e
->token
= ffeexpr_stack_
->tokens
[0];
8249 switch (ffeexpr_stack_
->percent
)
8251 case FFEEXPR_percentVAL_
:
8252 e
->u
.operand
= ffebld_new_percent_val (expr
);
8255 case FFEEXPR_percentREF_
:
8256 e
->u
.operand
= ffebld_new_percent_ref (expr
);
8259 case FFEEXPR_percentDESCR_
:
8260 e
->u
.operand
= ffebld_new_percent_descr (expr
);
8264 assert ("%lossage" == NULL
);
8265 e
->u
.operand
= expr
;
8268 ffebld_set_info (e
->u
.operand
, ffebld_info (expr
));
8270 e
->u
.operand
= ffeexpr_collapse_percent_
? ? ? (e
->u
.operand
, ft
);
8272 ffeexpr_exprstack_push_operand_ (e
);
8274 /* Now, if the token is a close parenthese, we're in great shape so return
8275 the next handler. */
8277 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
8278 return (ffelexHandler
) ffeexpr_cb_end_notloc_1_
;
8280 /* Oops, naughty user didn't specify the close paren! */
8282 if (ffest_ffebad_start (FFEBAD_MISSING_CLOSE_PAREN
))
8284 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
8285 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[1]),
8286 ffelex_token_where_column (ffeexpr_stack_
->tokens
[1]));
8290 ffebld_set_op (e
->u
.operand
, FFEBLD_opPERCENT_LOC
);
8292 switch (ffeexpr_stack_
->context
)
8294 case FFEEXPR_contextACTUALARG_
:
8295 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
8298 case FFEEXPR_contextINDEXORACTUALARG_
:
8299 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
8302 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8303 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
8306 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8307 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
8311 assert ("bad context?!?!" == NULL
);
8315 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
8317 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
8319 ffeexpr_cb_end_notloc_1_
);
8322 /* ffeexpr_cb_end_notloc_1_ -- PERCENT NAME(VAL,REF,DESCR) OPEN_PAREN expr
8325 Should be COMMA or CLOSE_PAREN, else change back to %LOC. */
8327 static ffelexHandler
8328 ffeexpr_cb_end_notloc_1_ (ffelexToken t
)
8330 switch (ffelex_token_type (t
))
8332 case FFELEX_typeCOMMA
:
8333 case FFELEX_typeCLOSE_PAREN
:
8334 switch (ffeexpr_stack_
->context
)
8336 case FFEEXPR_contextACTUALARG_
:
8337 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8340 case FFEEXPR_contextINDEXORACTUALARG_
:
8341 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARG_
;
8344 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8345 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARG_
;
8349 assert ("bad context?!?!" == NULL
);
8355 if (ffebad_start (FFEBAD_INVALID_PERCENT
))
8358 ffelex_token_where_line (ffeexpr_stack_
->first_token
),
8359 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
8360 ffebad_string (ffelex_token_text (ffeexpr_stack_
->tokens
[1]));
8364 ffebld_set_op (ffeexpr_stack_
->exprstack
->u
.operand
,
8365 FFEBLD_opPERCENT_LOC
);
8367 switch (ffeexpr_stack_
->context
)
8369 case FFEEXPR_contextACTUALARG_
:
8370 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
8373 case FFEEXPR_contextINDEXORACTUALARG_
:
8374 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
8377 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8378 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
8381 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8382 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
8386 assert ("bad context?!?!" == NULL
);
8391 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
8393 (ffelexHandler
) ffeexpr_token_binary_ (t
);
8396 /* Process DATA implied-DO iterator variables as this implied-DO level
8397 terminates. At this point, ffeexpr_level_ == 1 when we see the
8398 last right-paren in "DATA (A(I),I=1,10)/.../". */
8401 ffeexpr_check_impctrl_ (ffesymbol s
)
8404 assert (ffesymbol_sfdummyparent (s
) != NULL
);
8406 switch (ffesymbol_state (s
))
8408 case FFESYMBOL_stateNONE
: /* Used as iterator already. Now let symbol
8409 be used as iterator at any level at or
8410 innermore than the outermost of the
8411 current level and the symbol's current
8413 if (ffeexpr_level_
< ffesymbol_maxentrynum (s
))
8415 ffesymbol_signal_change (s
);
8416 ffesymbol_set_maxentrynum (s
, ffeexpr_level_
);
8417 ffesymbol_signal_unreported (s
);
8421 case FFESYMBOL_stateSEEN
: /* Seen already in this or other implied-DO.
8422 Error if at outermost level, else it can
8423 still become an iterator. */
8424 if ((ffeexpr_level_
== 1)
8425 && ffebad_start (FFEBAD_BAD_IMPDCL
))
8427 ffebad_string (ffesymbol_text (s
));
8428 ffebad_here (0, ffesymbol_where_line (s
), ffesymbol_where_column (s
));
8433 case FFESYMBOL_stateUNCERTAIN
: /* Iterator. */
8434 assert (ffeexpr_level_
<= ffesymbol_maxentrynum (s
));
8435 ffesymbol_signal_change (s
);
8436 ffesymbol_set_state (s
, FFESYMBOL_stateNONE
);
8437 ffesymbol_signal_unreported (s
);
8440 case FFESYMBOL_stateUNDERSTOOD
:
8444 assert ("Sasha Foo!!" == NULL
);
8451 /* Issue diagnostic if implied-DO variable appears in list of lhs
8452 expressions (as in "READ *, (I,I=1,10)"). */
8455 ffeexpr_check_impdo_ (ffebld list
, ffelexToken list_t
,
8456 ffebld dovar
, ffelexToken dovar_t
)
8459 ffesymbol dovar_sym
;
8462 if (ffebld_op (dovar
) != FFEBLD_opSYMTER
)
8463 return; /* Presumably opANY. */
8465 dovar_sym
= ffebld_symter (dovar
);
8467 for (itemnum
= 1; list
!= NULL
; list
= ffebld_trail (list
), ++itemnum
)
8469 if (((item
= ffebld_head (list
)) != NULL
)
8470 && (ffebld_op (item
) == FFEBLD_opSYMTER
)
8471 && (ffebld_symter (item
) == dovar_sym
))
8475 sprintf (&itemno
[0], "%d", itemnum
);
8476 if (ffebad_start (FFEBAD_DOITER_IMPDO
))
8478 ffebad_here (0, ffelex_token_where_line (list_t
),
8479 ffelex_token_where_column (list_t
));
8480 ffebad_here (1, ffelex_token_where_line (dovar_t
),
8481 ffelex_token_where_column (dovar_t
));
8482 ffebad_string (ffesymbol_text (dovar_sym
));
8483 ffebad_string (itemno
);
8490 /* Decorate any SYMTERs referencing the DO variable with the "doiter"
8494 ffeexpr_update_impdo_ (ffebld list
, ffebld dovar
)
8496 ffesymbol dovar_sym
;
8498 if (ffebld_op (dovar
) != FFEBLD_opSYMTER
)
8499 return; /* Presumably opANY. */
8501 dovar_sym
= ffebld_symter (dovar
);
8503 ffeexpr_update_impdo_sym_ (list
, dovar_sym
); /* Recurse! */
8506 /* Recursive function to update any expr so SYMTERs have "doiter" flag
8507 if they refer to the given variable. */
8510 ffeexpr_update_impdo_sym_ (ffebld expr
, ffesymbol dovar
)
8512 tail_recurse
: /* :::::::::::::::::::: */
8517 switch (ffebld_op (expr
))
8519 case FFEBLD_opSYMTER
:
8520 if (ffebld_symter (expr
) == dovar
)
8521 ffebld_symter_set_is_doiter (expr
, TRUE
);
8525 ffeexpr_update_impdo_sym_ (ffebld_head (expr
), dovar
);
8526 expr
= ffebld_trail (expr
);
8527 goto tail_recurse
; /* :::::::::::::::::::: */
8533 switch (ffebld_arity (expr
))
8536 ffeexpr_update_impdo_sym_ (ffebld_left (expr
), dovar
);
8537 expr
= ffebld_right (expr
);
8538 goto tail_recurse
; /* :::::::::::::::::::: */
8541 expr
= ffebld_left (expr
);
8542 goto tail_recurse
; /* :::::::::::::::::::: */
8551 /* ffeexpr_context_outer_ -- Determine context of stack entry, skipping PARENs
8553 if (ffeexpr_context_outer_(ffeexpr_stack_) == FFEEXPR_contextIF)
8554 // After zero or more PAREN_ contexts, an IF context exists */
8556 static ffeexprContext
8557 ffeexpr_context_outer_ (ffeexprStack_ s
)
8565 case FFEEXPR_contextPAREN_
:
8566 case FFEEXPR_contextPARENFILENUM_
:
8567 case FFEEXPR_contextPARENFILEUNIT_
:
8578 /* ffeexpr_percent_ -- Look up name in list of %FOO possibilities
8582 p = ffeexpr_percent_(t);
8584 Returns the identifier for the name, or the NONE identifier. */
8586 static ffeexprPercent_
8587 ffeexpr_percent_ (ffelexToken t
)
8591 switch (ffelex_token_length (t
))
8594 switch (*(p
= ffelex_token_text (t
)))
8596 case FFESRC_CASE_MATCH_INIT ('L', 'l', match_3l
, no_match_3
):
8597 if ((ffesrc_char_match_noninit (*++p
, 'O', 'o'))
8598 && (ffesrc_char_match_noninit (*++p
, 'C', 'c')))
8599 return FFEEXPR_percentLOC_
;
8600 return FFEEXPR_percentNONE_
;
8602 case FFESRC_CASE_MATCH_INIT ('R', 'r', match_3r
, no_match_3
):
8603 if ((ffesrc_char_match_noninit (*++p
, 'E', 'e'))
8604 && (ffesrc_char_match_noninit (*++p
, 'F', 'f')))
8605 return FFEEXPR_percentREF_
;
8606 return FFEEXPR_percentNONE_
;
8608 case FFESRC_CASE_MATCH_INIT ('V', 'v', match_3v
, no_match_3
):
8609 if ((ffesrc_char_match_noninit (*++p
, 'A', 'a'))
8610 && (ffesrc_char_match_noninit (*++p
, 'L', 'l')))
8611 return FFEEXPR_percentVAL_
;
8612 return FFEEXPR_percentNONE_
;
8615 no_match_3
: /* :::::::::::::::::::: */
8616 return FFEEXPR_percentNONE_
;
8620 if (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t
), "DESCR",
8621 "descr", "Descr") == 0)
8622 return FFEEXPR_percentDESCR_
;
8623 return FFEEXPR_percentNONE_
;
8626 return FFEEXPR_percentNONE_
;
8630 /* ffeexpr_type_combine -- Binop combine types, check for mythical new COMPLEX
8634 If combining the two basictype/kindtype pairs produces a COMPLEX with an
8635 unsupported kind type, complain and use the default kind type for
8639 ffeexpr_type_combine (ffeinfoBasictype
*xnbt
, ffeinfoKindtype
*xnkt
,
8640 ffeinfoBasictype lbt
, ffeinfoKindtype lkt
,
8641 ffeinfoBasictype rbt
, ffeinfoKindtype rkt
,
8644 ffeinfoBasictype nbt
;
8645 ffeinfoKindtype nkt
;
8647 nbt
= ffeinfo_basictype_combine (lbt
, rbt
);
8648 if ((nbt
== FFEINFO_basictypeCOMPLEX
)
8649 && ((lbt
== nbt
) || (lbt
== FFEINFO_basictypeREAL
))
8650 && ((rbt
== nbt
) || (rbt
== FFEINFO_basictypeREAL
)))
8652 nkt
= ffeinfo_kindtype_max (nbt
, lkt
, rkt
);
8653 if (ffe_is_pedantic_not_90 () && (nkt
== FFEINFO_kindtypeREALDOUBLE
))
8654 nkt
= FFEINFO_kindtypeNONE
; /* Force error. */
8657 #if FFETARGET_okCOMPLEX1
8658 case FFEINFO_kindtypeREAL1
:
8660 #if FFETARGET_okCOMPLEX2
8661 case FFEINFO_kindtypeREAL2
:
8663 #if FFETARGET_okCOMPLEX3
8664 case FFEINFO_kindtypeREAL3
:
8666 #if FFETARGET_okCOMPLEX4
8667 case FFEINFO_kindtypeREAL4
:
8669 break; /* Fine and dandy. */
8674 ffebad_start ((nkt
== FFEINFO_kindtypeREALDOUBLE
)
8675 ? FFEBAD_BAD_DBLCMPLX
: FFEBAD_BAD_COMPLEX
);
8676 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
8679 nbt
= FFEINFO_basictypeNONE
;
8680 nkt
= FFEINFO_kindtypeNONE
;
8683 case FFEINFO_kindtypeANY
:
8684 nkt
= FFEINFO_kindtypeREALDEFAULT
;
8689 { /* The normal stuff. */
8693 nkt
= ffeinfo_kindtype_max (nbt
, lkt
, rkt
);
8697 else if (nbt
== rbt
)
8700 { /* Let the caller do the complaining. */
8701 nbt
= FFEINFO_basictypeNONE
;
8702 nkt
= FFEINFO_kindtypeNONE
;
8706 /* Always a good idea to avoid aliasing problems. */
8712 /* ffeexpr_token_first_lhs_ -- First state for lhs expression
8714 Return a pointer to this function to the lexer (ffelex), which will
8715 invoke it for the next token.
8717 Record line and column of first token in expression, then invoke the
8718 initial-state lhs handler. */
8720 static ffelexHandler
8721 ffeexpr_token_first_lhs_ (ffelexToken t
)
8723 ffeexpr_stack_
->first_token
= ffelex_token_use (t
);
8725 /* When changing the list of valid initial lhs tokens, check whether to
8726 update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
8727 READ (expr) <token> case -- it assumes it knows which tokens <token> can
8728 be to indicate an lhs (or implied DO), which right now is the set
8731 This comment also appears in ffeexpr_token_lhs_. */
8733 switch (ffelex_token_type (t
))
8735 case FFELEX_typeOPEN_PAREN
:
8736 switch (ffeexpr_stack_
->context
)
8738 case FFEEXPR_contextDATA
:
8740 ffeexpr_level_
= 1; /* Level of DATA implied-DO construct. */
8741 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
8742 return (ffelexHandler
) ffeexpr_lhs (ffeexpr_stack_
->pool
,
8743 FFEEXPR_contextDATAIMPDOITEM_
, ffeexpr_cb_comma_i_
);
8745 case FFEEXPR_contextDATAIMPDOITEM_
:
8746 ++ffeexpr_level_
; /* Level of DATA implied-DO construct. */
8747 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
8748 return (ffelexHandler
) ffeexpr_lhs (ffeexpr_stack_
->pool
,
8749 FFEEXPR_contextDATAIMPDOITEM_
, ffeexpr_cb_comma_i_
);
8751 case FFEEXPR_contextIOLIST
:
8752 case FFEEXPR_contextIMPDOITEM_
:
8753 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
8754 return (ffelexHandler
) ffeexpr_lhs (ffeexpr_stack_
->pool
,
8755 FFEEXPR_contextIMPDOITEM_
, ffeexpr_cb_comma_i_
);
8757 case FFEEXPR_contextIOLISTDF
:
8758 case FFEEXPR_contextIMPDOITEMDF_
:
8759 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
8760 return (ffelexHandler
) ffeexpr_lhs (ffeexpr_stack_
->pool
,
8761 FFEEXPR_contextIMPDOITEMDF_
, ffeexpr_cb_comma_i_
);
8763 case FFEEXPR_contextFILEEXTFUNC
:
8764 assert (ffeexpr_stack_
->exprstack
== NULL
);
8765 return (ffelexHandler
) ffeexpr_token_first_lhs_1_
;
8772 case FFELEX_typeNAME
:
8773 switch (ffeexpr_stack_
->context
)
8775 case FFEEXPR_contextFILENAMELIST
:
8776 assert (ffeexpr_stack_
->exprstack
== NULL
);
8777 return (ffelexHandler
) ffeexpr_token_namelist_
;
8779 case FFEEXPR_contextFILEEXTFUNC
:
8780 assert (ffeexpr_stack_
->exprstack
== NULL
);
8781 return (ffelexHandler
) ffeexpr_token_first_lhs_1_
;
8789 switch (ffeexpr_stack_
->context
)
8791 case FFEEXPR_contextFILEEXTFUNC
:
8792 assert (ffeexpr_stack_
->exprstack
== NULL
);
8793 return (ffelexHandler
) ffeexpr_token_first_lhs_1_
;
8801 return (ffelexHandler
) ffeexpr_token_lhs_ (t
);
8804 /* ffeexpr_token_first_lhs_1_ -- NAME
8806 return ffeexpr_token_first_lhs_1_; // to lexer
8808 Handle NAME as an external function (USEROPEN= VXT extension to OPEN
8811 static ffelexHandler
8812 ffeexpr_token_first_lhs_1_ (ffelexToken t
)
8814 ffeexprCallback callback
;
8818 ffesymbol sy
= NULL
;
8822 callback
= ffeexpr_stack_
->callback
;
8823 ft
= ffeexpr_stack_
->first_token
;
8824 s
= ffeexpr_stack_
->previous
;
8826 if ((ffelex_token_type (ft
) != FFELEX_typeNAME
)
8827 || (ffesymbol_attrs (sy
= ffeexpr_declare_unadorned_ (ft
, FALSE
))
8828 & FFESYMBOL_attrANY
))
8830 if ((ffelex_token_type (ft
) != FFELEX_typeNAME
)
8831 || !(ffesymbol_attrs (sy
) & FFESYMBOL_attrsANY
))
8833 ffebad_start (FFEBAD_EXPR_WRONG
);
8834 ffebad_here (0, ffelex_token_where_line (ft
),
8835 ffelex_token_where_column (ft
));
8838 expr
= ffebld_new_any ();
8839 ffebld_set_info (expr
, ffeinfo_new_any ());
8843 expr
= ffebld_new_symter (sy
, FFEINTRIN_genNONE
, FFEINTRIN_specNONE
,
8845 ffebld_set_info (expr
, ffesymbol_info (sy
));
8848 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
,
8849 sizeof (*ffeexpr_stack_
));
8852 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
8853 ffelex_token_kill (ft
);
8854 return (ffelexHandler
) next
;
8857 /* ffeexpr_token_first_rhs_ -- First state for rhs expression
8859 Record line and column of first token in expression, then invoke the
8860 initial-state rhs handler.
8863 Allow ASTERISK in PARENFILEUNIT_ case, but only on second level only
8864 (i.e. only as in READ(*), not READ((*))). */
8866 static ffelexHandler
8867 ffeexpr_token_first_rhs_ (ffelexToken t
)
8871 ffeexpr_stack_
->first_token
= ffelex_token_use (t
);
8873 switch (ffelex_token_type (t
))
8875 case FFELEX_typeASTERISK
:
8876 switch (ffeexpr_stack_
->context
)
8878 case FFEEXPR_contextFILEFORMATNML
:
8879 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
8881 case FFEEXPR_contextFILEUNIT
:
8882 case FFEEXPR_contextDIMLIST
:
8883 case FFEEXPR_contextFILEFORMAT
:
8884 case FFEEXPR_contextCHARACTERSIZE
:
8885 if (ffeexpr_stack_
->previous
!= NULL
)
8886 break; /* Valid only on first level. */
8887 assert (ffeexpr_stack_
->exprstack
== NULL
);
8888 return (ffelexHandler
) ffeexpr_token_first_rhs_1_
;
8890 case FFEEXPR_contextPARENFILEUNIT_
:
8891 if (ffeexpr_stack_
->previous
->previous
!= NULL
)
8892 break; /* Valid only on second level. */
8893 assert (ffeexpr_stack_
->exprstack
== NULL
);
8894 return (ffelexHandler
) ffeexpr_token_first_rhs_1_
;
8896 case FFEEXPR_contextACTUALARG_
:
8897 if (ffeexpr_stack_
->previous
->context
8898 != FFEEXPR_contextSUBROUTINEREF
)
8900 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
8903 assert (ffeexpr_stack_
->exprstack
== NULL
);
8904 return (ffelexHandler
) ffeexpr_token_first_rhs_3_
;
8906 case FFEEXPR_contextINDEXORACTUALARG_
:
8907 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
8910 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8911 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
8914 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8915 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
8923 case FFELEX_typeOPEN_PAREN
:
8924 switch (ffeexpr_stack_
->context
)
8926 case FFEEXPR_contextFILENUMAMBIG
:
8927 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
8928 FFEEXPR_contextPARENFILENUM_
,
8929 ffeexpr_cb_close_paren_ambig_
);
8931 case FFEEXPR_contextFILEUNITAMBIG
:
8932 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
8933 FFEEXPR_contextPARENFILEUNIT_
,
8934 ffeexpr_cb_close_paren_ambig_
);
8936 case FFEEXPR_contextIOLIST
:
8937 case FFEEXPR_contextIMPDOITEM_
:
8938 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
8939 FFEEXPR_contextIMPDOITEM_
,
8940 ffeexpr_cb_close_paren_ci_
);
8942 case FFEEXPR_contextIOLISTDF
:
8943 case FFEEXPR_contextIMPDOITEMDF_
:
8944 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
8945 FFEEXPR_contextIMPDOITEMDF_
,
8946 ffeexpr_cb_close_paren_ci_
);
8948 case FFEEXPR_contextFILEFORMATNML
:
8949 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
8952 case FFEEXPR_contextACTUALARG_
:
8953 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
8956 case FFEEXPR_contextINDEXORACTUALARG_
:
8957 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
8960 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8961 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
8964 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8965 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
8973 case FFELEX_typeNUMBER
:
8974 switch (ffeexpr_stack_
->context
)
8976 case FFEEXPR_contextFILEFORMATNML
:
8977 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
8979 case FFEEXPR_contextFILEFORMAT
:
8980 if (ffeexpr_stack_
->previous
!= NULL
)
8981 break; /* Valid only on first level. */
8982 assert (ffeexpr_stack_
->exprstack
== NULL
);
8983 return (ffelexHandler
) ffeexpr_token_first_rhs_2_
;
8985 case FFEEXPR_contextACTUALARG_
:
8986 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
8989 case FFEEXPR_contextINDEXORACTUALARG_
:
8990 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
8993 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
8994 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
8997 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
8998 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
9006 case FFELEX_typeNAME
:
9007 switch (ffeexpr_stack_
->context
)
9009 case FFEEXPR_contextFILEFORMATNML
:
9010 assert (ffeexpr_stack_
->exprstack
== NULL
);
9011 s
= ffesymbol_lookup_local (t
);
9012 if ((s
!= NULL
) && (ffesymbol_kind (s
) == FFEINFO_kindNAMELIST
))
9013 return (ffelexHandler
) ffeexpr_token_namelist_
;
9014 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
9022 case FFELEX_typePERCENT
:
9023 switch (ffeexpr_stack_
->context
)
9025 case FFEEXPR_contextACTUALARG_
:
9026 case FFEEXPR_contextINDEXORACTUALARG_
:
9027 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
9028 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
9029 return (ffelexHandler
) ffeexpr_token_first_rhs_5_
;
9031 case FFEEXPR_contextFILEFORMATNML
:
9032 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
9040 switch (ffeexpr_stack_
->context
)
9042 case FFEEXPR_contextACTUALARG_
:
9043 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
9046 case FFEEXPR_contextINDEXORACTUALARG_
:
9047 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
9050 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
9051 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
9054 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
9055 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
9058 case FFEEXPR_contextFILEFORMATNML
:
9059 ffeexpr_stack_
->context
= FFEEXPR_contextFILEFORMAT
;
9068 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
9071 /* ffeexpr_token_first_rhs_1_ -- ASTERISK
9073 return ffeexpr_token_first_rhs_1_; // to lexer
9075 Return STAR as expression. */
9077 static ffelexHandler
9078 ffeexpr_token_first_rhs_1_ (ffelexToken t
)
9081 ffeexprCallback callback
;
9086 expr
= ffebld_new_star ();
9088 callback
= ffeexpr_stack_
->callback
;
9089 ft
= ffeexpr_stack_
->first_token
;
9090 s
= ffeexpr_stack_
->previous
;
9091 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
, sizeof (*ffeexpr_stack_
));
9093 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
9094 ffelex_token_kill (ft
);
9095 return (ffelexHandler
) next
;
9098 /* ffeexpr_token_first_rhs_2_ -- NUMBER
9100 return ffeexpr_token_first_rhs_2_; // to lexer
9102 Return NULL as expression; NUMBER as first (and only) token, unless the
9103 current token is not a terminating token, in which case run normal
9104 expression handling. */
9106 static ffelexHandler
9107 ffeexpr_token_first_rhs_2_ (ffelexToken t
)
9109 ffeexprCallback callback
;
9114 switch (ffelex_token_type (t
))
9116 case FFELEX_typeCLOSE_PAREN
:
9117 case FFELEX_typeCOMMA
:
9118 case FFELEX_typeEOS
:
9119 case FFELEX_typeSEMICOLON
:
9123 next
= (ffelexHandler
) ffeexpr_token_rhs_ (ffeexpr_stack_
->first_token
);
9124 return (ffelexHandler
) (*next
) (t
);
9128 callback
= ffeexpr_stack_
->callback
;
9129 ft
= ffeexpr_stack_
->first_token
;
9130 s
= ffeexpr_stack_
->previous
;
9131 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
,
9132 sizeof (*ffeexpr_stack_
));
9134 next
= (ffelexHandler
) (*callback
) (ft
, NULL
, t
);
9135 ffelex_token_kill (ft
);
9136 return (ffelexHandler
) next
;
9139 /* ffeexpr_token_first_rhs_3_ -- ASTERISK
9141 return ffeexpr_token_first_rhs_3_; // to lexer
9143 Expect NUMBER, make LABTOK (with copy of token if not inhibited after
9144 confirming, else NULL). */
9146 static ffelexHandler
9147 ffeexpr_token_first_rhs_3_ (ffelexToken t
)
9151 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
9152 { /* An error, but let normal processing handle
9154 next
= (ffelexHandler
) ffeexpr_token_rhs_ (ffeexpr_stack_
->first_token
);
9155 return (ffelexHandler
) (*next
) (t
);
9158 /* Special case: when we see "*10" as an argument to a subroutine
9159 reference, we confirm the current statement and, if not inhibited at
9160 this point, put a copy of the token into a LABTOK node. We do this
9161 instead of just resolving the label directly via ffelab and putting it
9162 into a LABTER simply to improve error reporting and consistency in
9163 ffestc. We put NULL in the LABTOK if we're still inhibited, so ffestb
9164 doesn't have to worry about killing off any tokens when retracting. */
9167 if (ffest_is_inhibited ())
9168 ffeexpr_stack_
->expr
= ffebld_new_labtok (NULL
);
9170 ffeexpr_stack_
->expr
= ffebld_new_labtok (ffelex_token_use (t
));
9171 ffebld_set_info (ffeexpr_stack_
->expr
,
9172 ffeinfo_new (FFEINFO_basictypeNONE
,
9173 FFEINFO_kindtypeNONE
,
9177 FFETARGET_charactersizeNONE
));
9179 return (ffelexHandler
) ffeexpr_token_first_rhs_4_
;
9182 /* ffeexpr_token_first_rhs_4_ -- ASTERISK NUMBER
9184 return ffeexpr_token_first_rhs_4_; // to lexer
9186 Collect/flush appropriate stuff, send token to callback function. */
9188 static ffelexHandler
9189 ffeexpr_token_first_rhs_4_ (ffelexToken t
)
9192 ffeexprCallback callback
;
9197 expr
= ffeexpr_stack_
->expr
;
9199 callback
= ffeexpr_stack_
->callback
;
9200 ft
= ffeexpr_stack_
->first_token
;
9201 s
= ffeexpr_stack_
->previous
;
9202 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
, sizeof (*ffeexpr_stack_
));
9204 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
9205 ffelex_token_kill (ft
);
9206 return (ffelexHandler
) next
;
9209 /* ffeexpr_token_first_rhs_5_ -- PERCENT
9211 Should be NAME, or pass through original mechanism. If NAME is LOC,
9212 pass through original mechanism, otherwise must be VAL, REF, or DESCR,
9213 in which case handle the argument (in parentheses), etc. */
9215 static ffelexHandler
9216 ffeexpr_token_first_rhs_5_ (ffelexToken t
)
9220 if (ffelex_token_type (t
) == FFELEX_typeNAME
)
9222 ffeexprPercent_ p
= ffeexpr_percent_ (t
);
9226 case FFEEXPR_percentNONE_
:
9227 case FFEEXPR_percentLOC_
:
9228 break; /* Treat %LOC as any other expression. */
9230 case FFEEXPR_percentVAL_
:
9231 case FFEEXPR_percentREF_
:
9232 case FFEEXPR_percentDESCR_
:
9233 ffeexpr_stack_
->percent
= p
;
9234 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (t
);
9235 return (ffelexHandler
) ffeexpr_token_first_rhs_6_
;
9238 assert ("bad percent?!?" == NULL
);
9243 switch (ffeexpr_stack_
->context
)
9245 case FFEEXPR_contextACTUALARG_
:
9246 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
9249 case FFEEXPR_contextINDEXORACTUALARG_
:
9250 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
9253 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
9254 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
9257 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
9258 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
9262 assert ("bad context?!?!" == NULL
);
9266 next
= (ffelexHandler
) ffeexpr_token_rhs_ (ffeexpr_stack_
->first_token
);
9267 return (ffelexHandler
) (*next
) (t
);
9270 /* ffeexpr_token_first_rhs_6_ -- PERCENT NAME(VAL,REF,DESCR)
9272 Should be OPEN_PAREN, or pass through original mechanism. */
9274 static ffelexHandler
9275 ffeexpr_token_first_rhs_6_ (ffelexToken t
)
9280 if (ffelex_token_type (t
) == FFELEX_typeOPEN_PAREN
)
9282 ffeexpr_stack_
->tokens
[1] = ffelex_token_use (t
);
9283 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
9284 ffeexpr_stack_
->context
,
9285 ffeexpr_cb_end_notloc_
);
9288 switch (ffeexpr_stack_
->context
)
9290 case FFEEXPR_contextACTUALARG_
:
9291 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
9294 case FFEEXPR_contextINDEXORACTUALARG_
:
9295 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
9298 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
9299 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
9302 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
9303 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
9307 assert ("bad context?!?!" == NULL
);
9311 ft
= ffeexpr_stack_
->tokens
[0];
9312 next
= (ffelexHandler
) ffeexpr_token_rhs_ (ffeexpr_stack_
->first_token
);
9313 next
= (ffelexHandler
) (*next
) (ft
);
9314 ffelex_token_kill (ft
);
9315 return (ffelexHandler
) (*next
) (t
);
9318 /* ffeexpr_token_namelist_ -- NAME
9320 return ffeexpr_token_namelist_; // to lexer
9322 Make sure NAME was a valid namelist object, wrap it in a SYMTER and
9325 static ffelexHandler
9326 ffeexpr_token_namelist_ (ffelexToken t
)
9328 ffeexprCallback callback
;
9336 callback
= ffeexpr_stack_
->callback
;
9337 ft
= ffeexpr_stack_
->first_token
;
9338 s
= ffeexpr_stack_
->previous
;
9339 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
, sizeof (*ffeexpr_stack_
));
9342 sy
= ffesymbol_lookup_local (ft
);
9343 if ((sy
== NULL
) || (ffesymbol_kind (sy
) != FFEINFO_kindNAMELIST
))
9345 ffebad_start (FFEBAD_EXPR_WRONG
);
9346 ffebad_here (0, ffelex_token_where_line (ft
),
9347 ffelex_token_where_column (ft
));
9349 expr
= ffebld_new_any ();
9350 ffebld_set_info (expr
, ffeinfo_new_any ());
9354 expr
= ffebld_new_symter (sy
, FFEINTRIN_genNONE
, FFEINTRIN_specNONE
,
9356 ffebld_set_info (expr
, ffesymbol_info (sy
));
9358 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
9359 ffelex_token_kill (ft
);
9360 return (ffelexHandler
) next
;
9363 /* ffeexpr_expr_kill_ -- Kill an existing internal expression object
9366 ffeexpr_expr_kill_(e);
9368 Kills the ffewhere info, if necessary, then kills the object. */
9371 ffeexpr_expr_kill_ (ffeexprExpr_ e
)
9373 if (e
->token
!= NULL
)
9374 ffelex_token_kill (e
->token
);
9375 malloc_kill_ks (ffe_pool_program_unit (), e
, sizeof (*e
));
9378 /* ffeexpr_expr_new_ -- Make a new internal expression object
9381 e = ffeexpr_expr_new_();
9383 Allocates and initializes a new expression object, returns it. */
9386 ffeexpr_expr_new_ ()
9390 e
= (ffeexprExpr_
) malloc_new_ks (ffe_pool_program_unit (), "FFEEXPR expr",
9393 e
->type
= FFEEXPR_exprtypeUNKNOWN_
;
9398 /* Verify that call to global is valid, and register whatever
9399 new information about a global might be discoverable by looking
9403 ffeexpr_fulfill_call_ (ffebld
*expr
, ffelexToken t
)
9410 assert ((ffebld_op (*expr
) == FFEBLD_opSUBRREF
)
9411 || (ffebld_op (*expr
) == FFEBLD_opFUNCREF
));
9413 if (ffebld_op (ffebld_left (*expr
)) != FFEBLD_opSYMTER
)
9416 if (ffesymbol_retractable ())
9419 s
= ffebld_symter (ffebld_left (*expr
));
9420 if (ffesymbol_global (s
) == NULL
)
9423 for (n_args
= 0, list
= ffebld_right (*expr
);
9425 list
= ffebld_trail (list
), ++n_args
)
9428 if (ffeglobal_proc_ref_nargs (s
, n_args
, t
))
9430 ffeglobalArgSummary as
;
9431 ffeinfoBasictype bt
;
9436 for (n_args
= 0, list
= ffebld_right (*expr
);
9438 list
= ffebld_trail (list
), ++n_args
)
9440 item
= ffebld_head (list
);
9443 bt
= ffeinfo_basictype (ffebld_info (item
));
9444 kt
= ffeinfo_kindtype (ffebld_info (item
));
9445 array
= (ffeinfo_rank (ffebld_info (item
)) > 0);
9446 switch (ffebld_op (item
))
9448 case FFEBLD_opLABTOK
:
9449 case FFEBLD_opLABTER
:
9450 as
= FFEGLOBAL_argsummaryALTRTN
;
9454 /* No, %LOC(foo) is just like any INTEGER(KIND=7)
9455 expression, so don't treat it specially. */
9456 case FFEBLD_opPERCENT_LOC
:
9457 as
= FFEGLOBAL_argsummaryPTR
;
9461 case FFEBLD_opPERCENT_VAL
:
9462 as
= FFEGLOBAL_argsummaryVAL
;
9465 case FFEBLD_opPERCENT_REF
:
9466 as
= FFEGLOBAL_argsummaryREF
;
9469 case FFEBLD_opPERCENT_DESCR
:
9470 as
= FFEGLOBAL_argsummaryDESCR
;
9473 case FFEBLD_opFUNCREF
:
9475 /* No, LOC(foo) is just like any INTEGER(KIND=7)
9476 expression, so don't treat it specially. */
9477 if ((ffebld_op (ffebld_left (item
)) == FFEBLD_opSYMTER
)
9478 && (ffesymbol_specific (ffebld_symter (ffebld_left (item
)))
9479 == FFEINTRIN_specLOC
))
9481 as
= FFEGLOBAL_argsummaryPTR
;
9487 if (ffebld_op (item
) == FFEBLD_opSYMTER
)
9489 as
= FFEGLOBAL_argsummaryNONE
;
9491 switch (ffeinfo_kind (ffebld_info (item
)))
9493 case FFEINFO_kindFUNCTION
:
9494 as
= FFEGLOBAL_argsummaryFUNC
;
9497 case FFEINFO_kindSUBROUTINE
:
9498 as
= FFEGLOBAL_argsummarySUBR
;
9501 case FFEINFO_kindNONE
:
9502 as
= FFEGLOBAL_argsummaryPROC
;
9509 if (as
!= FFEGLOBAL_argsummaryNONE
)
9513 if (bt
== FFEINFO_basictypeCHARACTER
)
9514 as
= FFEGLOBAL_argsummaryDESCR
;
9516 as
= FFEGLOBAL_argsummaryREF
;
9523 as
= FFEGLOBAL_argsummaryNONE
;
9524 bt
= FFEINFO_basictypeNONE
;
9525 kt
= FFEINFO_kindtypeNONE
;
9528 if (! ffeglobal_proc_ref_arg (s
, n_args
, as
, bt
, kt
, array
, t
))
9535 *expr
= ffebld_new_any ();
9536 ffebld_set_info (*expr
, ffeinfo_new_any ());
9539 /* Check whether rest of string is all decimal digits. */
9542 ffeexpr_isdigits_ (const char *p
)
9544 for (; *p
!= '\0'; ++p
)
9550 /* ffeexpr_exprstack_push_ -- Push an arbitrary expression object onto the stack
9553 ffeexpr_exprstack_push_(e);
9555 Pushes the expression onto the stack without any analysis of the existing
9556 contents of the stack. */
9559 ffeexpr_exprstack_push_ (ffeexprExpr_ e
)
9561 e
->previous
= ffeexpr_stack_
->exprstack
;
9562 ffeexpr_stack_
->exprstack
= e
;
9565 /* ffeexpr_exprstack_push_operand_ -- Push an operand onto the stack, reduce?
9568 ffeexpr_exprstack_push_operand_(e);
9570 Pushes the expression already containing an operand (a constant, variable,
9571 or more complicated expression that has already been fully resolved) after
9572 analyzing the stack and checking for possible reduction (which will never
9573 happen here since the highest precedence operator is ** and it has right-
9574 to-left associativity). */
9577 ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e
)
9579 ffeexpr_exprstack_push_ (e
);
9582 /* ffeexpr_exprstack_push_unary_ -- Push a unary operator onto the stack
9585 ffeexpr_exprstack_push_unary_(e);
9587 Pushes the expression already containing a unary operator. Reduction can
9588 never happen since unary operators are themselves always R-L; that is, the
9589 top of the expression stack is not an operand, in that it is either empty,
9590 has a binary operator at the top, or a unary operator at the top. In any
9591 of these cases, reduction is impossible. */
9594 ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e
)
9596 if ((ffe_is_pedantic ()
9597 || ffe_is_warn_surprising ())
9598 && (ffeexpr_stack_
->exprstack
!= NULL
)
9599 && (ffeexpr_stack_
->exprstack
->type
!= FFEEXPR_exprtypeOPERAND_
)
9600 && (ffeexpr_stack_
->exprstack
->u
.operator.prec
9601 <= FFEEXPR_operatorprecedenceLOWARITH_
)
9602 && (e
->u
.operator.prec
<= FFEEXPR_operatorprecedenceLOWARITH_
))
9604 /* xgettext:no-c-format */
9605 ffebad_start_msg ("Two arithmetic operators in a row at %0 and %1 -- use parentheses",
9607 ? FFEBAD_severityPEDANTIC
9608 : FFEBAD_severityWARNING
);
9610 ffelex_token_where_line (ffeexpr_stack_
->exprstack
->token
),
9611 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->token
));
9613 ffelex_token_where_line (e
->token
),
9614 ffelex_token_where_column (e
->token
));
9618 ffeexpr_exprstack_push_ (e
);
9621 /* ffeexpr_exprstack_push_binary_ -- Push a binary operator onto the stack, reduce?
9624 ffeexpr_exprstack_push_binary_(e);
9626 Pushes the expression already containing a binary operator after checking
9627 whether reduction is possible. If the stack is not empty, the top of the
9628 stack must be an operand or syntactic analysis has failed somehow. If
9629 the operand is preceded by a unary operator of higher (or equal and L-R
9630 associativity) precedence than the new binary operator, then reduce that
9631 preceding operator and its operand(s) before pushing the new binary
9635 ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e
)
9639 if (ffe_is_warn_surprising ()
9640 /* These next two are always true (see assertions below). */
9641 && (ffeexpr_stack_
->exprstack
!= NULL
)
9642 && (ffeexpr_stack_
->exprstack
->type
== FFEEXPR_exprtypeOPERAND_
)
9643 /* If the previous operator is a unary minus, and the binary op
9644 is of higher precedence, might not do what user expects,
9645 e.g. "-2**2" is "-(2**2)", i.e. "-4", not "(-2)**2", which would
9647 && (ffeexpr_stack_
->exprstack
->previous
!= NULL
)
9648 && (ffeexpr_stack_
->exprstack
->previous
->type
== FFEEXPR_exprtypeUNARY_
)
9649 && (ffeexpr_stack_
->exprstack
->previous
->u
.operator.op
9650 == FFEEXPR_operatorSUBTRACT_
)
9651 && (e
->u
.operator.prec
9652 < ffeexpr_stack_
->exprstack
->previous
->u
.operator.prec
))
9654 /* xgettext:no-c-format */
9655 ffebad_start_msg ("Operator at %0 has lower precedence than that at %1 -- use parentheses", FFEBAD_severityWARNING
);
9657 ffelex_token_where_line (ffeexpr_stack_
->exprstack
->previous
->token
),
9658 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->previous
->token
));
9660 ffelex_token_where_line (e
->token
),
9661 ffelex_token_where_column (e
->token
));
9666 assert (ffeexpr_stack_
->exprstack
!= NULL
);
9667 assert (ffeexpr_stack_
->exprstack
->type
== FFEEXPR_exprtypeOPERAND_
);
9668 if ((ce
= ffeexpr_stack_
->exprstack
->previous
) != NULL
)
9670 assert (ce
->type
!= FFEEXPR_exprtypeOPERAND_
);
9671 if ((ce
->u
.operator.prec
< e
->u
.operator.prec
)
9672 || ((ce
->u
.operator.prec
== e
->u
.operator.prec
)
9673 && (e
->u
.operator.as
== FFEEXPR_operatorassociativityL2R_
)))
9676 goto again
; /* :::::::::::::::::::: */
9680 ffeexpr_exprstack_push_ (e
);
9683 /* ffeexpr_reduce_ -- Reduce highest operator w/operands on stack
9687 Converts operand binop operand or unop operand at top of stack to a
9688 single operand having the appropriate ffebld expression, and makes
9689 sure that the expression is proper (like not trying to add two character
9690 variables, not trying to concatenate two numbers). Also does the
9691 requisite type-assignment. */
9696 ffeexprExpr_ operand
; /* This is B in -B or A+B. */
9697 ffeexprExpr_ left_operand
; /* When operator is binary, this is A in A+B. */
9698 ffeexprExpr_
operator; /* This is + in A+B. */
9699 ffebld reduced
; /* This is +(A,B) in A+B or u-(B) in -B. */
9700 ffebldConstant constnode
; /* For checking magical numbers (where mag ==
9704 bool submag
= FALSE
;
9706 operand
= ffeexpr_stack_
->exprstack
;
9707 assert (operand
!= NULL
);
9708 assert (operand
->type
== FFEEXPR_exprtypeOPERAND_
);
9709 operator = operand
->previous
;
9710 assert (operator != NULL
);
9711 assert (operator->type
!= FFEEXPR_exprtypeOPERAND_
);
9712 if (operator->type
== FFEEXPR_exprtypeUNARY_
)
9714 expr
= operand
->u
.operand
;
9715 switch (operator->u
.operator.op
)
9717 case FFEEXPR_operatorADD_
:
9718 reduced
= ffebld_new_uplus (expr
);
9719 if (ffe_is_ugly_logint ())
9720 reduced
= ffeexpr_reduced_ugly1_ (reduced
, operator, operand
);
9721 reduced
= ffeexpr_reduced_math1_ (reduced
, operator, operand
);
9722 reduced
= ffeexpr_collapse_uplus (reduced
, operator->token
);
9725 case FFEEXPR_operatorSUBTRACT_
:
9726 submag
= TRUE
; /* Ok to negate a magic number. */
9727 reduced
= ffebld_new_uminus (expr
);
9728 if (ffe_is_ugly_logint ())
9729 reduced
= ffeexpr_reduced_ugly1_ (reduced
, operator, operand
);
9730 reduced
= ffeexpr_reduced_math1_ (reduced
, operator, operand
);
9731 reduced
= ffeexpr_collapse_uminus (reduced
, operator->token
);
9734 case FFEEXPR_operatorNOT_
:
9735 reduced
= ffebld_new_not (expr
);
9736 if (ffe_is_ugly_logint ())
9737 reduced
= ffeexpr_reduced_ugly1log_ (reduced
, operator, operand
);
9738 reduced
= ffeexpr_reduced_bool1_ (reduced
, operator, operand
);
9739 reduced
= ffeexpr_collapse_not (reduced
, operator->token
);
9743 assert ("unexpected unary op" != NULL
);
9748 && (ffebld_op (expr
) == FFEBLD_opCONTER
)
9749 && (ffebld_conter_orig (expr
) == NULL
)
9750 && ffebld_constant_is_magical (constnode
= ffebld_conter (expr
)))
9752 ffetarget_integer_bad_magical (operand
->token
);
9754 ffeexpr_stack_
->exprstack
= operator->previous
; /* Pops unary-op operand
9756 ffeexpr_expr_kill_ (operand
);
9757 operator->type
= FFEEXPR_exprtypeOPERAND_
; /* Convert operator, but
9759 operator->u
.operand
= reduced
; /* the line/column ffewhere info. */
9760 ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
9765 assert (operator->type
== FFEEXPR_exprtypeBINARY_
);
9766 left_operand
= operator->previous
;
9767 assert (left_operand
!= NULL
);
9768 assert (left_operand
->type
== FFEEXPR_exprtypeOPERAND_
);
9769 expr
= operand
->u
.operand
;
9770 left_expr
= left_operand
->u
.operand
;
9771 switch (operator->u
.operator.op
)
9773 case FFEEXPR_operatorADD_
:
9774 reduced
= ffebld_new_add (left_expr
, expr
);
9775 if (ffe_is_ugly_logint ())
9776 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9778 reduced
= ffeexpr_reduced_math2_ (reduced
, left_operand
, operator,
9780 reduced
= ffeexpr_collapse_add (reduced
, operator->token
);
9783 case FFEEXPR_operatorSUBTRACT_
:
9784 submag
= TRUE
; /* Just to pick the right error if magic
9786 reduced
= ffebld_new_subtract (left_expr
, expr
);
9787 if (ffe_is_ugly_logint ())
9788 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9790 reduced
= ffeexpr_reduced_math2_ (reduced
, left_operand
, operator,
9792 reduced
= ffeexpr_collapse_subtract (reduced
, operator->token
);
9795 case FFEEXPR_operatorMULTIPLY_
:
9796 reduced
= ffebld_new_multiply (left_expr
, expr
);
9797 if (ffe_is_ugly_logint ())
9798 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9800 reduced
= ffeexpr_reduced_math2_ (reduced
, left_operand
, operator,
9802 reduced
= ffeexpr_collapse_multiply (reduced
, operator->token
);
9805 case FFEEXPR_operatorDIVIDE_
:
9806 reduced
= ffebld_new_divide (left_expr
, expr
);
9807 if (ffe_is_ugly_logint ())
9808 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9810 reduced
= ffeexpr_reduced_math2_ (reduced
, left_operand
, operator,
9812 reduced
= ffeexpr_collapse_divide (reduced
, operator->token
);
9815 case FFEEXPR_operatorPOWER_
:
9816 reduced
= ffebld_new_power (left_expr
, expr
);
9817 if (ffe_is_ugly_logint ())
9818 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9820 reduced
= ffeexpr_reduced_power_ (reduced
, left_operand
, operator,
9822 reduced
= ffeexpr_collapse_power (reduced
, operator->token
);
9825 case FFEEXPR_operatorCONCATENATE_
:
9826 reduced
= ffebld_new_concatenate (left_expr
, expr
);
9827 reduced
= ffeexpr_reduced_concatenate_ (reduced
, left_operand
, operator,
9829 reduced
= ffeexpr_collapse_concatenate (reduced
, operator->token
);
9832 case FFEEXPR_operatorLT_
:
9833 reduced
= ffebld_new_lt (left_expr
, expr
);
9834 if (ffe_is_ugly_logint ())
9835 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9837 reduced
= ffeexpr_reduced_relop2_ (reduced
, left_operand
, operator,
9839 reduced
= ffeexpr_collapse_lt (reduced
, operator->token
);
9842 case FFEEXPR_operatorLE_
:
9843 reduced
= ffebld_new_le (left_expr
, expr
);
9844 if (ffe_is_ugly_logint ())
9845 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9847 reduced
= ffeexpr_reduced_relop2_ (reduced
, left_operand
, operator,
9849 reduced
= ffeexpr_collapse_le (reduced
, operator->token
);
9852 case FFEEXPR_operatorEQ_
:
9853 reduced
= ffebld_new_eq (left_expr
, expr
);
9854 if (ffe_is_ugly_logint ())
9855 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9857 reduced
= ffeexpr_reduced_eqop2_ (reduced
, left_operand
, operator,
9859 reduced
= ffeexpr_collapse_eq (reduced
, operator->token
);
9862 case FFEEXPR_operatorNE_
:
9863 reduced
= ffebld_new_ne (left_expr
, expr
);
9864 if (ffe_is_ugly_logint ())
9865 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9867 reduced
= ffeexpr_reduced_eqop2_ (reduced
, left_operand
, operator,
9869 reduced
= ffeexpr_collapse_ne (reduced
, operator->token
);
9872 case FFEEXPR_operatorGT_
:
9873 reduced
= ffebld_new_gt (left_expr
, expr
);
9874 if (ffe_is_ugly_logint ())
9875 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9877 reduced
= ffeexpr_reduced_relop2_ (reduced
, left_operand
, operator,
9879 reduced
= ffeexpr_collapse_gt (reduced
, operator->token
);
9882 case FFEEXPR_operatorGE_
:
9883 reduced
= ffebld_new_ge (left_expr
, expr
);
9884 if (ffe_is_ugly_logint ())
9885 reduced
= ffeexpr_reduced_ugly2_ (reduced
, left_operand
, operator,
9887 reduced
= ffeexpr_reduced_relop2_ (reduced
, left_operand
, operator,
9889 reduced
= ffeexpr_collapse_ge (reduced
, operator->token
);
9892 case FFEEXPR_operatorAND_
:
9893 reduced
= ffebld_new_and (left_expr
, expr
);
9894 if (ffe_is_ugly_logint ())
9895 reduced
= ffeexpr_reduced_ugly2log_ (reduced
, left_operand
, operator,
9897 reduced
= ffeexpr_reduced_bool2_ (reduced
, left_operand
, operator,
9899 reduced
= ffeexpr_collapse_and (reduced
, operator->token
);
9902 case FFEEXPR_operatorOR_
:
9903 reduced
= ffebld_new_or (left_expr
, expr
);
9904 if (ffe_is_ugly_logint ())
9905 reduced
= ffeexpr_reduced_ugly2log_ (reduced
, left_operand
, operator,
9907 reduced
= ffeexpr_reduced_bool2_ (reduced
, left_operand
, operator,
9909 reduced
= ffeexpr_collapse_or (reduced
, operator->token
);
9912 case FFEEXPR_operatorXOR_
:
9913 reduced
= ffebld_new_xor (left_expr
, expr
);
9914 if (ffe_is_ugly_logint ())
9915 reduced
= ffeexpr_reduced_ugly2log_ (reduced
, left_operand
, operator,
9917 reduced
= ffeexpr_reduced_bool2_ (reduced
, left_operand
, operator,
9919 reduced
= ffeexpr_collapse_xor (reduced
, operator->token
);
9922 case FFEEXPR_operatorEQV_
:
9923 reduced
= ffebld_new_eqv (left_expr
, expr
);
9924 if (ffe_is_ugly_logint ())
9925 reduced
= ffeexpr_reduced_ugly2log_ (reduced
, left_operand
, operator,
9927 reduced
= ffeexpr_reduced_bool2_ (reduced
, left_operand
, operator,
9929 reduced
= ffeexpr_collapse_eqv (reduced
, operator->token
);
9932 case FFEEXPR_operatorNEQV_
:
9933 reduced
= ffebld_new_neqv (left_expr
, expr
);
9934 if (ffe_is_ugly_logint ())
9935 reduced
= ffeexpr_reduced_ugly2log_ (reduced
, left_operand
, operator,
9937 reduced
= ffeexpr_reduced_bool2_ (reduced
, left_operand
, operator,
9939 reduced
= ffeexpr_collapse_neqv (reduced
, operator->token
);
9943 assert ("bad bin op" == NULL
);
9947 if ((ffebld_op (left_expr
) == FFEBLD_opCONTER
)
9948 && (ffebld_conter_orig (expr
) == NULL
)
9949 && ffebld_constant_is_magical (constnode
= ffebld_conter (left_expr
)))
9951 if ((left_operand
->previous
!= NULL
)
9952 && (left_operand
->previous
->type
!= FFEEXPR_exprtypeOPERAND_
)
9953 && (left_operand
->previous
->u
.operator.op
9954 == FFEEXPR_operatorSUBTRACT_
))
9956 if (left_operand
->previous
->type
== FFEEXPR_exprtypeUNARY_
)
9957 ffetarget_integer_bad_magical_precedence (left_operand
->token
,
9958 left_operand
->previous
->token
,
9961 ffetarget_integer_bad_magical_precedence_binary
9962 (left_operand
->token
,
9963 left_operand
->previous
->token
,
9967 ffetarget_integer_bad_magical (left_operand
->token
);
9969 if ((ffebld_op (expr
) == FFEBLD_opCONTER
)
9970 && (ffebld_conter_orig (expr
) == NULL
)
9971 && ffebld_constant_is_magical (constnode
= ffebld_conter (expr
)))
9974 ffetarget_integer_bad_magical_binary (operand
->token
,
9977 ffetarget_integer_bad_magical (operand
->token
);
9979 ffeexpr_stack_
->exprstack
= left_operand
->previous
; /* Pops binary-op
9980 operands off stack. */
9981 ffeexpr_expr_kill_ (left_operand
);
9982 ffeexpr_expr_kill_ (operand
);
9983 operator->type
= FFEEXPR_exprtypeOPERAND_
; /* Convert operator, but
9985 operator->u
.operand
= reduced
; /* the line/column ffewhere info. */
9986 ffeexpr_exprstack_push_operand_ (operator); /* Push it back on
9991 /* ffeexpr_reduced_bool1_ -- Wrap up reduction of NOT operator
9993 reduced = ffeexpr_reduced_bool1_(reduced,op,r);
9995 Makes sure the argument for reduced has basictype of
9996 LOGICAL or (ugly) INTEGER. If
9997 argument has where of CONSTANT, assign where CONSTANT to
9998 reduced, else assign where FLEETING.
10000 If these requirements cannot be met, generate error message. */
10003 ffeexpr_reduced_bool1_ (ffebld reduced
, ffeexprExpr_ op
, ffeexprExpr_ r
)
10005 ffeinfo rinfo
, ninfo
;
10006 ffeinfoBasictype rbt
;
10007 ffeinfoKindtype rkt
;
10010 ffeinfoWhere rwh
, nwh
;
10012 rinfo
= ffebld_info (ffebld_left (reduced
));
10013 rbt
= ffeinfo_basictype (rinfo
);
10014 rkt
= ffeinfo_kindtype (rinfo
);
10015 rrk
= ffeinfo_rank (rinfo
);
10016 rkd
= ffeinfo_kind (rinfo
);
10017 rwh
= ffeinfo_where (rinfo
);
10019 if (((rbt
== FFEINFO_basictypeLOGICAL
)
10020 || (ffe_is_ugly_logint () && (rbt
== FFEINFO_basictypeINTEGER
)))
10025 case FFEINFO_whereCONSTANT
:
10026 nwh
= FFEINFO_whereCONSTANT
;
10029 case FFEINFO_whereIMMEDIATE
:
10030 nwh
= FFEINFO_whereIMMEDIATE
;
10034 nwh
= FFEINFO_whereFLEETING
;
10038 ninfo
= ffeinfo_new (rbt
, rkt
, 0, FFEINFO_kindENTITY
, nwh
,
10039 FFETARGET_charactersizeNONE
);
10040 ffebld_set_info (reduced
, ninfo
);
10044 if ((rbt
!= FFEINFO_basictypeLOGICAL
)
10045 && (!ffe_is_ugly_logint () || (rbt
!= FFEINFO_basictypeINTEGER
)))
10047 if ((rbt
!= FFEINFO_basictypeANY
)
10048 && ffebad_start (FFEBAD_NOT_ARG_TYPE
))
10050 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10051 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10057 if ((rkd
!= FFEINFO_kindANY
)
10058 && ffebad_start (FFEBAD_NOT_ARG_KIND
))
10060 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10061 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10062 ffebad_string ("an array");
10067 reduced
= ffebld_new_any ();
10068 ffebld_set_info (reduced
, ffeinfo_new_any ());
10072 /* ffeexpr_reduced_bool2_ -- Wrap up reduction of boolean operators
10074 reduced = ffeexpr_reduced_bool2_(reduced,l,op,r);
10076 Makes sure the left and right arguments for reduced have basictype of
10077 LOGICAL or (ugly) INTEGER. Determine common basictype and
10078 size for reduction (flag expression for combined hollerith/typeless
10079 situations for later determination of effective basictype). If both left
10080 and right arguments have where of CONSTANT, assign where CONSTANT to
10081 reduced, else assign where FLEETING. Create CONVERT ops for args where
10082 needed. Convert typeless
10083 constants to the desired type/size explicitly.
10085 If these requirements cannot be met, generate error message. */
10088 ffeexpr_reduced_bool2_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
10091 ffeinfo linfo
, rinfo
, ninfo
;
10092 ffeinfoBasictype lbt
, rbt
, nbt
;
10093 ffeinfoKindtype lkt
, rkt
, nkt
;
10094 ffeinfoRank lrk
, rrk
;
10095 ffeinfoKind lkd
, rkd
;
10096 ffeinfoWhere lwh
, rwh
, nwh
;
10098 linfo
= ffebld_info (ffebld_left (reduced
));
10099 lbt
= ffeinfo_basictype (linfo
);
10100 lkt
= ffeinfo_kindtype (linfo
);
10101 lrk
= ffeinfo_rank (linfo
);
10102 lkd
= ffeinfo_kind (linfo
);
10103 lwh
= ffeinfo_where (linfo
);
10105 rinfo
= ffebld_info (ffebld_right (reduced
));
10106 rbt
= ffeinfo_basictype (rinfo
);
10107 rkt
= ffeinfo_kindtype (rinfo
);
10108 rrk
= ffeinfo_rank (rinfo
);
10109 rkd
= ffeinfo_kind (rinfo
);
10110 rwh
= ffeinfo_where (rinfo
);
10112 ffeexpr_type_combine (&nbt
, &nkt
, lbt
, lkt
, rbt
, rkt
, op
->token
);
10114 if (((nbt
== FFEINFO_basictypeLOGICAL
)
10115 || (ffe_is_ugly_logint () && (nbt
== FFEINFO_basictypeINTEGER
)))
10116 && (lrk
== 0) && (rrk
== 0))
10120 case FFEINFO_whereCONSTANT
:
10123 case FFEINFO_whereCONSTANT
:
10124 nwh
= FFEINFO_whereCONSTANT
;
10127 case FFEINFO_whereIMMEDIATE
:
10128 nwh
= FFEINFO_whereIMMEDIATE
;
10132 nwh
= FFEINFO_whereFLEETING
;
10137 case FFEINFO_whereIMMEDIATE
:
10140 case FFEINFO_whereCONSTANT
:
10141 case FFEINFO_whereIMMEDIATE
:
10142 nwh
= FFEINFO_whereIMMEDIATE
;
10146 nwh
= FFEINFO_whereFLEETING
;
10152 nwh
= FFEINFO_whereFLEETING
;
10156 ninfo
= ffeinfo_new (nbt
, nkt
, 0, FFEINFO_kindENTITY
, nwh
,
10157 FFETARGET_charactersizeNONE
);
10158 ffebld_set_info (reduced
, ninfo
);
10159 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
10160 l
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10161 FFEEXPR_contextLET
));
10162 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
10163 r
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10164 FFEEXPR_contextLET
));
10168 if ((lbt
!= FFEINFO_basictypeLOGICAL
)
10169 && (!ffe_is_ugly_logint () || (lbt
!= FFEINFO_basictypeINTEGER
)))
10171 if ((rbt
!= FFEINFO_basictypeLOGICAL
)
10172 && (!ffe_is_ugly_logint () || (rbt
!= FFEINFO_basictypeINTEGER
)))
10174 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
10175 && ffebad_start (FFEBAD_BOOL_ARGS_TYPE
))
10177 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10178 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10179 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10185 if ((lbt
!= FFEINFO_basictypeANY
)
10186 && ffebad_start (FFEBAD_BOOL_ARG_TYPE
))
10188 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10189 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10194 else if ((rbt
!= FFEINFO_basictypeLOGICAL
)
10195 && (!ffe_is_ugly_logint () || (rbt
!= FFEINFO_basictypeINTEGER
)))
10197 if ((rbt
!= FFEINFO_basictypeANY
)
10198 && ffebad_start (FFEBAD_BOOL_ARG_TYPE
))
10200 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10201 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10207 if ((lkd
!= FFEINFO_kindANY
)
10208 && ffebad_start (FFEBAD_BOOL_ARG_KIND
))
10210 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10211 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10212 ffebad_string ("an array");
10218 if ((rkd
!= FFEINFO_kindANY
)
10219 && ffebad_start (FFEBAD_BOOL_ARG_KIND
))
10221 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10222 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10223 ffebad_string ("an array");
10228 reduced
= ffebld_new_any ();
10229 ffebld_set_info (reduced
, ffeinfo_new_any ());
10233 /* ffeexpr_reduced_concatenate_ -- Wrap up reduction of concatenate operator
10235 reduced = ffeexpr_reduced_concatenate_(reduced,l,op,r);
10237 Makes sure the left and right arguments for reduced have basictype of
10238 CHARACTER and kind of SCALAR, FUNCTION, or STATEMENT FUNCTION. Assign
10239 basictype of CHARACTER and kind of SCALAR to reduced. Calculate effective
10240 size of concatenation and assign that size to reduced. If both left and
10241 right arguments have where of CONSTANT, assign where CONSTANT to reduced,
10242 else assign where FLEETING.
10244 If these requirements cannot be met, generate error message using the
10245 info in l, op, and r arguments and assign basictype, size, kind, and where
10249 ffeexpr_reduced_concatenate_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
10252 ffeinfo linfo
, rinfo
, ninfo
;
10253 ffeinfoBasictype lbt
, rbt
, nbt
;
10254 ffeinfoKindtype lkt
, rkt
, nkt
;
10255 ffeinfoRank lrk
, rrk
;
10256 ffeinfoKind lkd
, rkd
, nkd
;
10257 ffeinfoWhere lwh
, rwh
, nwh
;
10258 ffetargetCharacterSize lszm
, lszk
, rszm
, rszk
, nszk
;
10260 linfo
= ffebld_info (ffebld_left (reduced
));
10261 lbt
= ffeinfo_basictype (linfo
);
10262 lkt
= ffeinfo_kindtype (linfo
);
10263 lrk
= ffeinfo_rank (linfo
);
10264 lkd
= ffeinfo_kind (linfo
);
10265 lwh
= ffeinfo_where (linfo
);
10266 lszk
= ffeinfo_size (linfo
); /* Known size. */
10267 lszm
= ffebld_size_max (ffebld_left (reduced
));
10269 rinfo
= ffebld_info (ffebld_right (reduced
));
10270 rbt
= ffeinfo_basictype (rinfo
);
10271 rkt
= ffeinfo_kindtype (rinfo
);
10272 rrk
= ffeinfo_rank (rinfo
);
10273 rkd
= ffeinfo_kind (rinfo
);
10274 rwh
= ffeinfo_where (rinfo
);
10275 rszk
= ffeinfo_size (rinfo
); /* Known size. */
10276 rszm
= ffebld_size_max (ffebld_right (reduced
));
10278 if ((lbt
== FFEINFO_basictypeCHARACTER
) && (rbt
== FFEINFO_basictypeCHARACTER
)
10279 && (lkt
== rkt
) && (lrk
== 0) && (rrk
== 0)
10280 && (((lszm
!= FFETARGET_charactersizeNONE
)
10281 && (rszm
!= FFETARGET_charactersizeNONE
))
10282 || (ffeexpr_context_outer_ (ffeexpr_stack_
)
10283 == FFEEXPR_contextLET
)
10284 || (ffeexpr_context_outer_ (ffeexpr_stack_
)
10285 == FFEEXPR_contextSFUNCDEF
)))
10287 nbt
= FFEINFO_basictypeCHARACTER
;
10288 nkd
= FFEINFO_kindENTITY
;
10289 if ((lszk
== FFETARGET_charactersizeNONE
)
10290 || (rszk
== FFETARGET_charactersizeNONE
))
10291 nszk
= FFETARGET_charactersizeNONE
; /* Ok only in rhs of LET
10294 nszk
= lszk
+ rszk
;
10298 case FFEINFO_whereCONSTANT
:
10301 case FFEINFO_whereCONSTANT
:
10302 nwh
= FFEINFO_whereCONSTANT
;
10305 case FFEINFO_whereIMMEDIATE
:
10306 nwh
= FFEINFO_whereIMMEDIATE
;
10310 nwh
= FFEINFO_whereFLEETING
;
10315 case FFEINFO_whereIMMEDIATE
:
10318 case FFEINFO_whereCONSTANT
:
10319 case FFEINFO_whereIMMEDIATE
:
10320 nwh
= FFEINFO_whereIMMEDIATE
;
10324 nwh
= FFEINFO_whereFLEETING
;
10330 nwh
= FFEINFO_whereFLEETING
;
10335 ninfo
= ffeinfo_new (nbt
, nkt
, 0, nkd
, nwh
, nszk
);
10336 ffebld_set_info (reduced
, ninfo
);
10340 if ((lbt
!= FFEINFO_basictypeCHARACTER
) && (rbt
!= FFEINFO_basictypeCHARACTER
))
10342 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
10343 && ffebad_start (FFEBAD_CONCAT_ARGS_TYPE
))
10345 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10346 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10347 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10351 else if (lbt
!= FFEINFO_basictypeCHARACTER
)
10353 if ((lbt
!= FFEINFO_basictypeANY
)
10354 && ffebad_start (FFEBAD_CONCAT_ARG_TYPE
))
10356 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10357 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10361 else if (rbt
!= FFEINFO_basictypeCHARACTER
)
10363 if ((rbt
!= FFEINFO_basictypeANY
)
10364 && ffebad_start (FFEBAD_CONCAT_ARG_TYPE
))
10366 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10367 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10371 else if ((lrk
!= 0) || (lszm
== FFETARGET_charactersizeNONE
))
10373 if ((lkd
!= FFEINFO_kindANY
)
10374 && ffebad_start (FFEBAD_CONCAT_ARG_KIND
))
10381 what
= "of indeterminate length";
10382 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10383 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10384 ffebad_string (what
);
10390 if (ffebad_start (FFEBAD_CONCAT_ARG_KIND
))
10397 what
= "of indeterminate length";
10398 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10399 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10400 ffebad_string (what
);
10405 reduced
= ffebld_new_any ();
10406 ffebld_set_info (reduced
, ffeinfo_new_any ());
10410 /* ffeexpr_reduced_eqop2_ -- Wrap up reduction of EQ and NE operators
10412 reduced = ffeexpr_reduced_eqop2_(reduced,l,op,r);
10414 Makes sure the left and right arguments for reduced have basictype of
10415 INTEGER, REAL, COMPLEX, or CHARACTER. Determine common basictype and
10416 size for reduction. If both left
10417 and right arguments have where of CONSTANT, assign where CONSTANT to
10418 reduced, else assign where FLEETING. Create CONVERT ops for args where
10419 needed. Convert typeless
10420 constants to the desired type/size explicitly.
10422 If these requirements cannot be met, generate error message. */
10425 ffeexpr_reduced_eqop2_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
10428 ffeinfo linfo
, rinfo
, ninfo
;
10429 ffeinfoBasictype lbt
, rbt
, nbt
;
10430 ffeinfoKindtype lkt
, rkt
, nkt
;
10431 ffeinfoRank lrk
, rrk
;
10432 ffeinfoKind lkd
, rkd
;
10433 ffeinfoWhere lwh
, rwh
, nwh
;
10434 ffetargetCharacterSize lsz
, rsz
;
10436 linfo
= ffebld_info (ffebld_left (reduced
));
10437 lbt
= ffeinfo_basictype (linfo
);
10438 lkt
= ffeinfo_kindtype (linfo
);
10439 lrk
= ffeinfo_rank (linfo
);
10440 lkd
= ffeinfo_kind (linfo
);
10441 lwh
= ffeinfo_where (linfo
);
10442 lsz
= ffebld_size_known (ffebld_left (reduced
));
10444 rinfo
= ffebld_info (ffebld_right (reduced
));
10445 rbt
= ffeinfo_basictype (rinfo
);
10446 rkt
= ffeinfo_kindtype (rinfo
);
10447 rrk
= ffeinfo_rank (rinfo
);
10448 rkd
= ffeinfo_kind (rinfo
);
10449 rwh
= ffeinfo_where (rinfo
);
10450 rsz
= ffebld_size_known (ffebld_right (reduced
));
10452 ffeexpr_type_combine (&nbt
, &nkt
, lbt
, lkt
, rbt
, rkt
, op
->token
);
10454 if (((nbt
== FFEINFO_basictypeINTEGER
) || (nbt
== FFEINFO_basictypeREAL
)
10455 || (nbt
== FFEINFO_basictypeCOMPLEX
) || (nbt
== FFEINFO_basictypeCHARACTER
))
10456 && (lrk
== 0) && (rrk
== 0))
10460 case FFEINFO_whereCONSTANT
:
10463 case FFEINFO_whereCONSTANT
:
10464 nwh
= FFEINFO_whereCONSTANT
;
10467 case FFEINFO_whereIMMEDIATE
:
10468 nwh
= FFEINFO_whereIMMEDIATE
;
10472 nwh
= FFEINFO_whereFLEETING
;
10477 case FFEINFO_whereIMMEDIATE
:
10480 case FFEINFO_whereCONSTANT
:
10481 case FFEINFO_whereIMMEDIATE
:
10482 nwh
= FFEINFO_whereIMMEDIATE
;
10486 nwh
= FFEINFO_whereFLEETING
;
10492 nwh
= FFEINFO_whereFLEETING
;
10496 if ((lsz
!= FFETARGET_charactersizeNONE
)
10497 && (rsz
!= FFETARGET_charactersizeNONE
))
10498 lsz
= rsz
= (lsz
> rsz
) ? lsz
: rsz
;
10500 ninfo
= ffeinfo_new (FFEINFO_basictypeLOGICAL
, FFEINFO_kindtypeLOGICALDEFAULT
,
10501 0, FFEINFO_kindENTITY
, nwh
, FFETARGET_charactersizeNONE
);
10502 ffebld_set_info (reduced
, ninfo
);
10503 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
10504 l
->token
, op
->token
, nbt
, nkt
, 0, lsz
,
10505 FFEEXPR_contextLET
));
10506 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
10507 r
->token
, op
->token
, nbt
, nkt
, 0, rsz
,
10508 FFEEXPR_contextLET
));
10512 if ((lbt
== FFEINFO_basictypeLOGICAL
)
10513 && (rbt
== FFEINFO_basictypeLOGICAL
))
10515 /* xgettext:no-c-format */
10516 if (ffebad_start_msg ("Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2",
10517 FFEBAD_severityFATAL
))
10519 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10520 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10521 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10525 else if ((lbt
!= FFEINFO_basictypeINTEGER
) && (lbt
!= FFEINFO_basictypeREAL
)
10526 && (lbt
!= FFEINFO_basictypeCOMPLEX
) && (lbt
!= FFEINFO_basictypeCHARACTER
))
10528 if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
10529 && (rbt
!= FFEINFO_basictypeCOMPLEX
) && (rbt
!= FFEINFO_basictypeCHARACTER
))
10531 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
10532 && ffebad_start (FFEBAD_EQOP_ARGS_TYPE
))
10534 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10535 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10536 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10542 if ((lbt
!= FFEINFO_basictypeANY
)
10543 && ffebad_start (FFEBAD_EQOP_ARG_TYPE
))
10545 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10546 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10551 else if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
10552 && (rbt
!= FFEINFO_basictypeCOMPLEX
) && (rbt
!= FFEINFO_basictypeCHARACTER
))
10554 if ((rbt
!= FFEINFO_basictypeANY
)
10555 && ffebad_start (FFEBAD_EQOP_ARG_TYPE
))
10557 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10558 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10564 if ((lkd
!= FFEINFO_kindANY
)
10565 && ffebad_start (FFEBAD_EQOP_ARG_KIND
))
10567 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10568 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10569 ffebad_string ("an array");
10575 if ((rkd
!= FFEINFO_kindANY
)
10576 && ffebad_start (FFEBAD_EQOP_ARG_KIND
))
10578 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10579 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10580 ffebad_string ("an array");
10585 reduced
= ffebld_new_any ();
10586 ffebld_set_info (reduced
, ffeinfo_new_any ());
10590 /* ffeexpr_reduced_math1_ -- Wrap up reduction of + - unary operators
10592 reduced = ffeexpr_reduced_math1_(reduced,op,r);
10594 Makes sure the argument for reduced has basictype of
10595 INTEGER, REAL, or COMPLEX. If the argument has where of CONSTANT,
10596 assign where CONSTANT to
10597 reduced, else assign where FLEETING.
10599 If these requirements cannot be met, generate error message. */
10602 ffeexpr_reduced_math1_ (ffebld reduced
, ffeexprExpr_ op
, ffeexprExpr_ r
)
10604 ffeinfo rinfo
, ninfo
;
10605 ffeinfoBasictype rbt
;
10606 ffeinfoKindtype rkt
;
10609 ffeinfoWhere rwh
, nwh
;
10611 rinfo
= ffebld_info (ffebld_left (reduced
));
10612 rbt
= ffeinfo_basictype (rinfo
);
10613 rkt
= ffeinfo_kindtype (rinfo
);
10614 rrk
= ffeinfo_rank (rinfo
);
10615 rkd
= ffeinfo_kind (rinfo
);
10616 rwh
= ffeinfo_where (rinfo
);
10618 if (((rbt
== FFEINFO_basictypeINTEGER
) || (rbt
== FFEINFO_basictypeREAL
)
10619 || (rbt
== FFEINFO_basictypeCOMPLEX
)) && (rrk
== 0))
10623 case FFEINFO_whereCONSTANT
:
10624 nwh
= FFEINFO_whereCONSTANT
;
10627 case FFEINFO_whereIMMEDIATE
:
10628 nwh
= FFEINFO_whereIMMEDIATE
;
10632 nwh
= FFEINFO_whereFLEETING
;
10636 ninfo
= ffeinfo_new (rbt
, rkt
, 0, FFEINFO_kindENTITY
, nwh
,
10637 FFETARGET_charactersizeNONE
);
10638 ffebld_set_info (reduced
, ninfo
);
10642 if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
10643 && (rbt
!= FFEINFO_basictypeCOMPLEX
))
10645 if ((rbt
!= FFEINFO_basictypeANY
)
10646 && ffebad_start (FFEBAD_MATH_ARG_TYPE
))
10648 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10649 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10655 if ((rkd
!= FFEINFO_kindANY
)
10656 && ffebad_start (FFEBAD_MATH_ARG_KIND
))
10658 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10659 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10660 ffebad_string ("an array");
10665 reduced
= ffebld_new_any ();
10666 ffebld_set_info (reduced
, ffeinfo_new_any ());
10670 /* ffeexpr_reduced_math2_ -- Wrap up reduction of + - * / operators
10672 reduced = ffeexpr_reduced_math2_(reduced,l,op,r);
10674 Makes sure the left and right arguments for reduced have basictype of
10675 INTEGER, REAL, or COMPLEX. Determine common basictype and
10676 size for reduction (flag expression for combined hollerith/typeless
10677 situations for later determination of effective basictype). If both left
10678 and right arguments have where of CONSTANT, assign where CONSTANT to
10679 reduced, else assign where FLEETING. Create CONVERT ops for args where
10680 needed. Convert typeless
10681 constants to the desired type/size explicitly.
10683 If these requirements cannot be met, generate error message. */
10686 ffeexpr_reduced_math2_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
10689 ffeinfo linfo
, rinfo
, ninfo
;
10690 ffeinfoBasictype lbt
, rbt
, nbt
;
10691 ffeinfoKindtype lkt
, rkt
, nkt
;
10692 ffeinfoRank lrk
, rrk
;
10693 ffeinfoKind lkd
, rkd
;
10694 ffeinfoWhere lwh
, rwh
, nwh
;
10696 linfo
= ffebld_info (ffebld_left (reduced
));
10697 lbt
= ffeinfo_basictype (linfo
);
10698 lkt
= ffeinfo_kindtype (linfo
);
10699 lrk
= ffeinfo_rank (linfo
);
10700 lkd
= ffeinfo_kind (linfo
);
10701 lwh
= ffeinfo_where (linfo
);
10703 rinfo
= ffebld_info (ffebld_right (reduced
));
10704 rbt
= ffeinfo_basictype (rinfo
);
10705 rkt
= ffeinfo_kindtype (rinfo
);
10706 rrk
= ffeinfo_rank (rinfo
);
10707 rkd
= ffeinfo_kind (rinfo
);
10708 rwh
= ffeinfo_where (rinfo
);
10710 ffeexpr_type_combine (&nbt
, &nkt
, lbt
, lkt
, rbt
, rkt
, op
->token
);
10712 if (((nbt
== FFEINFO_basictypeINTEGER
) || (nbt
== FFEINFO_basictypeREAL
)
10713 || (nbt
== FFEINFO_basictypeCOMPLEX
)) && (lrk
== 0) && (rrk
== 0))
10717 case FFEINFO_whereCONSTANT
:
10720 case FFEINFO_whereCONSTANT
:
10721 nwh
= FFEINFO_whereCONSTANT
;
10724 case FFEINFO_whereIMMEDIATE
:
10725 nwh
= FFEINFO_whereIMMEDIATE
;
10729 nwh
= FFEINFO_whereFLEETING
;
10734 case FFEINFO_whereIMMEDIATE
:
10737 case FFEINFO_whereCONSTANT
:
10738 case FFEINFO_whereIMMEDIATE
:
10739 nwh
= FFEINFO_whereIMMEDIATE
;
10743 nwh
= FFEINFO_whereFLEETING
;
10749 nwh
= FFEINFO_whereFLEETING
;
10753 ninfo
= ffeinfo_new (nbt
, nkt
, 0, FFEINFO_kindENTITY
, nwh
,
10754 FFETARGET_charactersizeNONE
);
10755 ffebld_set_info (reduced
, ninfo
);
10756 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
10757 l
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10758 FFEEXPR_contextLET
));
10759 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
10760 r
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10761 FFEEXPR_contextLET
));
10765 if ((lbt
!= FFEINFO_basictypeINTEGER
) && (lbt
!= FFEINFO_basictypeREAL
)
10766 && (lbt
!= FFEINFO_basictypeCOMPLEX
))
10768 if ((rbt
!= FFEINFO_basictypeINTEGER
)
10769 && (rbt
!= FFEINFO_basictypeREAL
) && (rbt
!= FFEINFO_basictypeCOMPLEX
))
10771 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
10772 && ffebad_start (FFEBAD_MATH_ARGS_TYPE
))
10774 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10775 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10776 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10782 if ((lbt
!= FFEINFO_basictypeANY
)
10783 && ffebad_start (FFEBAD_MATH_ARG_TYPE
))
10785 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10786 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10791 else if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
10792 && (rbt
!= FFEINFO_basictypeCOMPLEX
))
10794 if ((rbt
!= FFEINFO_basictypeANY
)
10795 && ffebad_start (FFEBAD_MATH_ARG_TYPE
))
10797 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10798 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10804 if ((lkd
!= FFEINFO_kindANY
)
10805 && ffebad_start (FFEBAD_MATH_ARG_KIND
))
10807 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10808 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10809 ffebad_string ("an array");
10815 if ((rkd
!= FFEINFO_kindANY
)
10816 && ffebad_start (FFEBAD_MATH_ARG_KIND
))
10818 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10819 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10820 ffebad_string ("an array");
10825 reduced
= ffebld_new_any ();
10826 ffebld_set_info (reduced
, ffeinfo_new_any ());
10830 /* ffeexpr_reduced_power_ -- Wrap up reduction of ** operator
10832 reduced = ffeexpr_reduced_power_(reduced,l,op,r);
10834 Makes sure the left and right arguments for reduced have basictype of
10835 INTEGER, REAL, or COMPLEX. Determine common basictype and
10836 size for reduction (flag expression for combined hollerith/typeless
10837 situations for later determination of effective basictype). If both left
10838 and right arguments have where of CONSTANT, assign where CONSTANT to
10839 reduced, else assign where FLEETING. Create CONVERT ops for args where
10840 needed. Note that real**int or complex**int
10841 comes out as int = real**int etc with no conversions.
10843 If these requirements cannot be met, generate error message using the
10844 info in l, op, and r arguments and assign basictype, size, kind, and where
10848 ffeexpr_reduced_power_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
10851 ffeinfo linfo
, rinfo
, ninfo
;
10852 ffeinfoBasictype lbt
, rbt
, nbt
;
10853 ffeinfoKindtype lkt
, rkt
, nkt
;
10854 ffeinfoRank lrk
, rrk
;
10855 ffeinfoKind lkd
, rkd
;
10856 ffeinfoWhere lwh
, rwh
, nwh
;
10858 linfo
= ffebld_info (ffebld_left (reduced
));
10859 lbt
= ffeinfo_basictype (linfo
);
10860 lkt
= ffeinfo_kindtype (linfo
);
10861 lrk
= ffeinfo_rank (linfo
);
10862 lkd
= ffeinfo_kind (linfo
);
10863 lwh
= ffeinfo_where (linfo
);
10865 rinfo
= ffebld_info (ffebld_right (reduced
));
10866 rbt
= ffeinfo_basictype (rinfo
);
10867 rkt
= ffeinfo_kindtype (rinfo
);
10868 rrk
= ffeinfo_rank (rinfo
);
10869 rkd
= ffeinfo_kind (rinfo
);
10870 rwh
= ffeinfo_where (rinfo
);
10872 if ((rbt
== FFEINFO_basictypeINTEGER
)
10873 && ((lbt
== FFEINFO_basictypeREAL
)
10874 || (lbt
== FFEINFO_basictypeCOMPLEX
)))
10877 nkt
= ffeinfo_kindtype_max (nbt
, lkt
, FFEINFO_kindtypeREALDEFAULT
);
10878 if (nkt
!= FFEINFO_kindtypeREALDEFAULT
)
10880 nkt
= ffeinfo_kindtype_max (nbt
, lkt
, FFEINFO_kindtypeREALDOUBLE
);
10881 if (nkt
!= FFEINFO_kindtypeREALDOUBLE
)
10882 nkt
= FFEINFO_kindtypeREALDOUBLE
; /* Highest kt we can power! */
10884 if (rkt
== FFEINFO_kindtypeINTEGER4
)
10886 /* xgettext:no-c-format */
10887 ffebad_start_msg ("Unsupported operand for ** at %1 -- converting to default INTEGER",
10888 FFEBAD_severityWARNING
);
10889 ffebad_here (0, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10892 if (rkt
!= FFEINFO_kindtypeINTEGERDEFAULT
)
10894 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
10895 r
->token
, op
->token
,
10896 FFEINFO_basictypeINTEGER
, FFEINFO_kindtypeINTEGERDEFAULT
, 0,
10897 FFETARGET_charactersizeNONE
,
10898 FFEEXPR_contextLET
));
10899 rkt
= FFEINFO_kindtypeINTEGERDEFAULT
;
10904 ffeexpr_type_combine (&nbt
, &nkt
, lbt
, lkt
, rbt
, rkt
, op
->token
);
10906 #if 0 /* INTEGER4**INTEGER4 works now. */
10907 if ((nbt
== FFEINFO_basictypeINTEGER
)
10908 && (nkt
!= FFEINFO_kindtypeINTEGERDEFAULT
))
10909 nkt
= FFEINFO_kindtypeINTEGERDEFAULT
; /* Highest kt we can power! */
10911 if (((nbt
== FFEINFO_basictypeREAL
)
10912 || (nbt
== FFEINFO_basictypeCOMPLEX
))
10913 && (nkt
!= FFEINFO_kindtypeREALDEFAULT
))
10915 nkt
= ffeinfo_kindtype_max (nbt
, nkt
, FFEINFO_kindtypeREALDOUBLE
);
10916 if (nkt
!= FFEINFO_kindtypeREALDOUBLE
)
10917 nkt
= FFEINFO_kindtypeREALDOUBLE
; /* Highest kt we can power! */
10919 /* else Gonna turn into an error below. */
10922 if (((nbt
== FFEINFO_basictypeINTEGER
) || (nbt
== FFEINFO_basictypeREAL
)
10923 || (nbt
== FFEINFO_basictypeCOMPLEX
)) && (lrk
== 0) && (rrk
== 0))
10927 case FFEINFO_whereCONSTANT
:
10930 case FFEINFO_whereCONSTANT
:
10931 nwh
= FFEINFO_whereCONSTANT
;
10934 case FFEINFO_whereIMMEDIATE
:
10935 nwh
= FFEINFO_whereIMMEDIATE
;
10939 nwh
= FFEINFO_whereFLEETING
;
10944 case FFEINFO_whereIMMEDIATE
:
10947 case FFEINFO_whereCONSTANT
:
10948 case FFEINFO_whereIMMEDIATE
:
10949 nwh
= FFEINFO_whereIMMEDIATE
;
10953 nwh
= FFEINFO_whereFLEETING
;
10959 nwh
= FFEINFO_whereFLEETING
;
10963 ninfo
= ffeinfo_new (nbt
, nkt
, 0, FFEINFO_kindENTITY
, nwh
,
10964 FFETARGET_charactersizeNONE
);
10965 ffebld_set_info (reduced
, ninfo
);
10966 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
10967 l
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10968 FFEEXPR_contextLET
));
10969 if (rbt
!= FFEINFO_basictypeINTEGER
)
10970 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
10971 r
->token
, op
->token
, nbt
, nkt
, 0, FFETARGET_charactersizeNONE
,
10972 FFEEXPR_contextLET
));
10976 if ((lbt
!= FFEINFO_basictypeINTEGER
) && (lbt
!= FFEINFO_basictypeREAL
)
10977 && (lbt
!= FFEINFO_basictypeCOMPLEX
))
10979 if ((rbt
!= FFEINFO_basictypeINTEGER
)
10980 && (rbt
!= FFEINFO_basictypeREAL
) && (rbt
!= FFEINFO_basictypeCOMPLEX
))
10982 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
10983 && ffebad_start (FFEBAD_MATH_ARGS_TYPE
))
10985 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10986 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
10987 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
10993 if ((lbt
!= FFEINFO_basictypeANY
)
10994 && ffebad_start (FFEBAD_MATH_ARG_TYPE
))
10996 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
10997 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
11002 else if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
11003 && (rbt
!= FFEINFO_basictypeCOMPLEX
))
11005 if ((rbt
!= FFEINFO_basictypeANY
)
11006 && ffebad_start (FFEBAD_MATH_ARG_TYPE
))
11008 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11009 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
11015 if ((lkd
!= FFEINFO_kindANY
)
11016 && ffebad_start (FFEBAD_MATH_ARG_KIND
))
11018 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11019 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
11020 ffebad_string ("an array");
11026 if ((rkd
!= FFEINFO_kindANY
)
11027 && ffebad_start (FFEBAD_MATH_ARG_KIND
))
11029 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11030 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
11031 ffebad_string ("an array");
11036 reduced
= ffebld_new_any ();
11037 ffebld_set_info (reduced
, ffeinfo_new_any ());
11041 /* ffeexpr_reduced_relop2_ -- Wrap up reduction of LT, LE, GE, and GT operators
11043 reduced = ffeexpr_reduced_relop2_(reduced,l,op,r);
11045 Makes sure the left and right arguments for reduced have basictype of
11046 INTEGER, REAL, or CHARACTER. Determine common basictype and
11047 size for reduction. If both left
11048 and right arguments have where of CONSTANT, assign where CONSTANT to
11049 reduced, else assign where FLEETING. Create CONVERT ops for args where
11050 needed. Convert typeless
11051 constants to the desired type/size explicitly.
11053 If these requirements cannot be met, generate error message. */
11056 ffeexpr_reduced_relop2_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
11059 ffeinfo linfo
, rinfo
, ninfo
;
11060 ffeinfoBasictype lbt
, rbt
, nbt
;
11061 ffeinfoKindtype lkt
, rkt
, nkt
;
11062 ffeinfoRank lrk
, rrk
;
11063 ffeinfoKind lkd
, rkd
;
11064 ffeinfoWhere lwh
, rwh
, nwh
;
11065 ffetargetCharacterSize lsz
, rsz
;
11067 linfo
= ffebld_info (ffebld_left (reduced
));
11068 lbt
= ffeinfo_basictype (linfo
);
11069 lkt
= ffeinfo_kindtype (linfo
);
11070 lrk
= ffeinfo_rank (linfo
);
11071 lkd
= ffeinfo_kind (linfo
);
11072 lwh
= ffeinfo_where (linfo
);
11073 lsz
= ffebld_size_known (ffebld_left (reduced
));
11075 rinfo
= ffebld_info (ffebld_right (reduced
));
11076 rbt
= ffeinfo_basictype (rinfo
);
11077 rkt
= ffeinfo_kindtype (rinfo
);
11078 rrk
= ffeinfo_rank (rinfo
);
11079 rkd
= ffeinfo_kind (rinfo
);
11080 rwh
= ffeinfo_where (rinfo
);
11081 rsz
= ffebld_size_known (ffebld_right (reduced
));
11083 ffeexpr_type_combine (&nbt
, &nkt
, lbt
, lkt
, rbt
, rkt
, op
->token
);
11085 if (((nbt
== FFEINFO_basictypeINTEGER
) || (nbt
== FFEINFO_basictypeREAL
)
11086 || (nbt
== FFEINFO_basictypeCHARACTER
))
11087 && (lrk
== 0) && (rrk
== 0))
11091 case FFEINFO_whereCONSTANT
:
11094 case FFEINFO_whereCONSTANT
:
11095 nwh
= FFEINFO_whereCONSTANT
;
11098 case FFEINFO_whereIMMEDIATE
:
11099 nwh
= FFEINFO_whereIMMEDIATE
;
11103 nwh
= FFEINFO_whereFLEETING
;
11108 case FFEINFO_whereIMMEDIATE
:
11111 case FFEINFO_whereCONSTANT
:
11112 case FFEINFO_whereIMMEDIATE
:
11113 nwh
= FFEINFO_whereIMMEDIATE
;
11117 nwh
= FFEINFO_whereFLEETING
;
11123 nwh
= FFEINFO_whereFLEETING
;
11127 if ((lsz
!= FFETARGET_charactersizeNONE
)
11128 && (rsz
!= FFETARGET_charactersizeNONE
))
11129 lsz
= rsz
= (lsz
> rsz
) ? lsz
: rsz
;
11131 ninfo
= ffeinfo_new (FFEINFO_basictypeLOGICAL
, FFEINFO_kindtypeLOGICALDEFAULT
,
11132 0, FFEINFO_kindENTITY
, nwh
, FFETARGET_charactersizeNONE
);
11133 ffebld_set_info (reduced
, ninfo
);
11134 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11135 l
->token
, op
->token
, nbt
, nkt
, 0, lsz
,
11136 FFEEXPR_contextLET
));
11137 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
11138 r
->token
, op
->token
, nbt
, nkt
, 0, rsz
,
11139 FFEEXPR_contextLET
));
11143 if ((lbt
!= FFEINFO_basictypeINTEGER
) && (lbt
!= FFEINFO_basictypeREAL
)
11144 && (lbt
!= FFEINFO_basictypeCHARACTER
))
11146 if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
11147 && (rbt
!= FFEINFO_basictypeCHARACTER
))
11149 if ((lbt
!= FFEINFO_basictypeANY
) && (rbt
!= FFEINFO_basictypeANY
)
11150 && ffebad_start (FFEBAD_RELOP_ARGS_TYPE
))
11152 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11153 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
11154 ffebad_here (2, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
11160 if ((lbt
!= FFEINFO_basictypeANY
)
11161 && ffebad_start (FFEBAD_RELOP_ARG_TYPE
))
11163 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11164 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
11169 else if ((rbt
!= FFEINFO_basictypeINTEGER
) && (rbt
!= FFEINFO_basictypeREAL
)
11170 && (rbt
!= FFEINFO_basictypeCHARACTER
))
11172 if ((rbt
!= FFEINFO_basictypeANY
)
11173 && ffebad_start (FFEBAD_RELOP_ARG_TYPE
))
11175 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11176 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
11182 if ((lkd
!= FFEINFO_kindANY
)
11183 && ffebad_start (FFEBAD_RELOP_ARG_KIND
))
11185 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11186 ffebad_here (1, ffelex_token_where_line (l
->token
), ffelex_token_where_column (l
->token
));
11187 ffebad_string ("an array");
11193 if ((rkd
!= FFEINFO_kindANY
)
11194 && ffebad_start (FFEBAD_RELOP_ARG_KIND
))
11196 ffebad_here (0, ffelex_token_where_line (op
->token
), ffelex_token_where_column (op
->token
));
11197 ffebad_here (1, ffelex_token_where_line (r
->token
), ffelex_token_where_column (r
->token
));
11198 ffebad_string ("an array");
11203 reduced
= ffebld_new_any ();
11204 ffebld_set_info (reduced
, ffeinfo_new_any ());
11208 /* ffeexpr_reduced_ugly1_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
11210 reduced = ffeexpr_reduced_ugly1_(reduced,op,r);
11215 ffeexpr_reduced_ugly1_ (ffebld reduced
, ffeexprExpr_ op
, ffeexprExpr_ r
)
11218 ffeinfoBasictype rbt
;
11219 ffeinfoKindtype rkt
;
11224 rinfo
= ffebld_info (ffebld_left (reduced
));
11225 rbt
= ffeinfo_basictype (rinfo
);
11226 rkt
= ffeinfo_kindtype (rinfo
);
11227 rrk
= ffeinfo_rank (rinfo
);
11228 rkd
= ffeinfo_kind (rinfo
);
11229 rwh
= ffeinfo_where (rinfo
);
11231 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11232 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11234 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11235 r
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11236 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11237 FFETARGET_charactersizeNONE
,
11238 FFEEXPR_contextLET
));
11239 rinfo
= ffebld_info (ffebld_left (reduced
));
11240 rbt
= FFEINFO_basictypeINTEGER
;
11241 rkt
= FFEINFO_kindtypeINTEGERDEFAULT
;
11243 rkd
= FFEINFO_kindENTITY
;
11244 rwh
= ffeinfo_where (rinfo
);
11247 if (rbt
== FFEINFO_basictypeLOGICAL
)
11249 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11250 r
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11251 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11252 FFETARGET_charactersizeNONE
,
11253 FFEEXPR_contextLET
));
11259 /* ffeexpr_reduced_ugly1log_ -- Deal with TYPELESS and HOLLERITH
11261 reduced = ffeexpr_reduced_ugly1log_(reduced,op,r);
11266 ffeexpr_reduced_ugly1log_ (ffebld reduced
, ffeexprExpr_ op
, ffeexprExpr_ r
)
11269 ffeinfoBasictype rbt
;
11270 ffeinfoKindtype rkt
;
11275 rinfo
= ffebld_info (ffebld_left (reduced
));
11276 rbt
= ffeinfo_basictype (rinfo
);
11277 rkt
= ffeinfo_kindtype (rinfo
);
11278 rrk
= ffeinfo_rank (rinfo
);
11279 rkd
= ffeinfo_kind (rinfo
);
11280 rwh
= ffeinfo_where (rinfo
);
11282 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11283 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11285 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11286 r
->token
, op
->token
, FFEINFO_basictypeLOGICAL
, 0,
11287 FFEINFO_kindtypeLOGICALDEFAULT
,
11288 FFETARGET_charactersizeNONE
,
11289 FFEEXPR_contextLET
));
11290 rinfo
= ffebld_info (ffebld_left (reduced
));
11291 rbt
= FFEINFO_basictypeLOGICAL
;
11292 rkt
= FFEINFO_kindtypeLOGICALDEFAULT
;
11294 rkd
= FFEINFO_kindENTITY
;
11295 rwh
= ffeinfo_where (rinfo
);
11301 /* ffeexpr_reduced_ugly2_ -- Deal with TYPELESS, HOLLERITH, and LOGICAL
11303 reduced = ffeexpr_reduced_ugly2_(reduced,l,op,r);
11308 ffeexpr_reduced_ugly2_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
11311 ffeinfo linfo
, rinfo
;
11312 ffeinfoBasictype lbt
, rbt
;
11313 ffeinfoKindtype lkt
, rkt
;
11314 ffeinfoRank lrk
, rrk
;
11315 ffeinfoKind lkd
, rkd
;
11316 ffeinfoWhere lwh
, rwh
;
11318 linfo
= ffebld_info (ffebld_left (reduced
));
11319 lbt
= ffeinfo_basictype (linfo
);
11320 lkt
= ffeinfo_kindtype (linfo
);
11321 lrk
= ffeinfo_rank (linfo
);
11322 lkd
= ffeinfo_kind (linfo
);
11323 lwh
= ffeinfo_where (linfo
);
11325 rinfo
= ffebld_info (ffebld_right (reduced
));
11326 rbt
= ffeinfo_basictype (rinfo
);
11327 rkt
= ffeinfo_kindtype (rinfo
);
11328 rrk
= ffeinfo_rank (rinfo
);
11329 rkd
= ffeinfo_kind (rinfo
);
11330 rwh
= ffeinfo_where (rinfo
);
11332 if ((lbt
== FFEINFO_basictypeTYPELESS
)
11333 || (lbt
== FFEINFO_basictypeHOLLERITH
))
11335 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11336 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11338 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11339 l
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11340 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11341 FFETARGET_charactersizeNONE
,
11342 FFEEXPR_contextLET
));
11343 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
11344 r
->token
, op
->token
, FFEINFO_basictypeINTEGER
, 0,
11345 FFEINFO_kindtypeINTEGERDEFAULT
,
11346 FFETARGET_charactersizeNONE
,
11347 FFEEXPR_contextLET
));
11348 linfo
= ffebld_info (ffebld_left (reduced
));
11349 rinfo
= ffebld_info (ffebld_right (reduced
));
11350 lbt
= rbt
= FFEINFO_basictypeINTEGER
;
11351 lkt
= rkt
= FFEINFO_kindtypeINTEGERDEFAULT
;
11353 lkd
= rkd
= FFEINFO_kindENTITY
;
11354 lwh
= ffeinfo_where (linfo
);
11355 rwh
= ffeinfo_where (rinfo
);
11359 ffebld_set_left (reduced
, ffeexpr_convert_expr (ffebld_left (reduced
),
11360 l
->token
, ffebld_right (reduced
), r
->token
,
11361 FFEEXPR_contextLET
));
11362 linfo
= ffebld_info (ffebld_left (reduced
));
11363 lbt
= ffeinfo_basictype (linfo
);
11364 lkt
= ffeinfo_kindtype (linfo
);
11365 lrk
= ffeinfo_rank (linfo
);
11366 lkd
= ffeinfo_kind (linfo
);
11367 lwh
= ffeinfo_where (linfo
);
11372 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11373 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11375 ffebld_set_right (reduced
, ffeexpr_convert_expr (ffebld_right (reduced
),
11376 r
->token
, ffebld_left (reduced
), l
->token
,
11377 FFEEXPR_contextLET
));
11378 rinfo
= ffebld_info (ffebld_right (reduced
));
11379 rbt
= ffeinfo_basictype (rinfo
);
11380 rkt
= ffeinfo_kindtype (rinfo
);
11381 rrk
= ffeinfo_rank (rinfo
);
11382 rkd
= ffeinfo_kind (rinfo
);
11383 rwh
= ffeinfo_where (rinfo
);
11385 /* else Leave it alone. */
11388 if (lbt
== FFEINFO_basictypeLOGICAL
)
11390 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11391 l
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11392 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11393 FFETARGET_charactersizeNONE
,
11394 FFEEXPR_contextLET
));
11397 if (rbt
== FFEINFO_basictypeLOGICAL
)
11399 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
11400 r
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11401 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11402 FFETARGET_charactersizeNONE
,
11403 FFEEXPR_contextLET
));
11409 /* ffeexpr_reduced_ugly2log_ -- Deal with TYPELESS and HOLLERITH
11411 reduced = ffeexpr_reduced_ugly2log_(reduced,l,op,r);
11416 ffeexpr_reduced_ugly2log_ (ffebld reduced
, ffeexprExpr_ l
, ffeexprExpr_ op
,
11419 ffeinfo linfo
, rinfo
;
11420 ffeinfoBasictype lbt
, rbt
;
11421 ffeinfoKindtype lkt
, rkt
;
11422 ffeinfoRank lrk
, rrk
;
11423 ffeinfoKind lkd
, rkd
;
11424 ffeinfoWhere lwh
, rwh
;
11426 linfo
= ffebld_info (ffebld_left (reduced
));
11427 lbt
= ffeinfo_basictype (linfo
);
11428 lkt
= ffeinfo_kindtype (linfo
);
11429 lrk
= ffeinfo_rank (linfo
);
11430 lkd
= ffeinfo_kind (linfo
);
11431 lwh
= ffeinfo_where (linfo
);
11433 rinfo
= ffebld_info (ffebld_right (reduced
));
11434 rbt
= ffeinfo_basictype (rinfo
);
11435 rkt
= ffeinfo_kindtype (rinfo
);
11436 rrk
= ffeinfo_rank (rinfo
);
11437 rkd
= ffeinfo_kind (rinfo
);
11438 rwh
= ffeinfo_where (rinfo
);
11440 if ((lbt
== FFEINFO_basictypeTYPELESS
)
11441 || (lbt
== FFEINFO_basictypeHOLLERITH
))
11443 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11444 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11446 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11447 l
->token
, op
->token
, FFEINFO_basictypeLOGICAL
,
11448 FFEINFO_kindtypeLOGICALDEFAULT
, 0,
11449 FFETARGET_charactersizeNONE
,
11450 FFEEXPR_contextLET
));
11451 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
11452 r
->token
, op
->token
, FFEINFO_basictypeLOGICAL
,
11453 FFEINFO_kindtypeLOGICALDEFAULT
, 0,
11454 FFETARGET_charactersizeNONE
,
11455 FFEEXPR_contextLET
));
11456 linfo
= ffebld_info (ffebld_left (reduced
));
11457 rinfo
= ffebld_info (ffebld_right (reduced
));
11458 lbt
= rbt
= FFEINFO_basictypeLOGICAL
;
11459 lkt
= rkt
= FFEINFO_kindtypeLOGICALDEFAULT
;
11461 lkd
= rkd
= FFEINFO_kindENTITY
;
11462 lwh
= ffeinfo_where (linfo
);
11463 rwh
= ffeinfo_where (rinfo
);
11467 ffebld_set_left (reduced
, ffeexpr_convert_expr (ffebld_left (reduced
),
11468 l
->token
, ffebld_right (reduced
), r
->token
,
11469 FFEEXPR_contextLET
));
11470 linfo
= ffebld_info (ffebld_left (reduced
));
11471 lbt
= ffeinfo_basictype (linfo
);
11472 lkt
= ffeinfo_kindtype (linfo
);
11473 lrk
= ffeinfo_rank (linfo
);
11474 lkd
= ffeinfo_kind (linfo
);
11475 lwh
= ffeinfo_where (linfo
);
11480 if ((rbt
== FFEINFO_basictypeTYPELESS
)
11481 || (rbt
== FFEINFO_basictypeHOLLERITH
))
11483 ffebld_set_right (reduced
, ffeexpr_convert_expr (ffebld_right (reduced
),
11484 r
->token
, ffebld_left (reduced
), l
->token
,
11485 FFEEXPR_contextLET
));
11486 rinfo
= ffebld_info (ffebld_right (reduced
));
11487 rbt
= ffeinfo_basictype (rinfo
);
11488 rkt
= ffeinfo_kindtype (rinfo
);
11489 rrk
= ffeinfo_rank (rinfo
);
11490 rkd
= ffeinfo_kind (rinfo
);
11491 rwh
= ffeinfo_where (rinfo
);
11493 /* else Leave it alone. */
11496 if (lbt
== FFEINFO_basictypeLOGICAL
)
11498 ffebld_set_left (reduced
, ffeexpr_convert (ffebld_left (reduced
),
11499 l
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11500 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11501 FFETARGET_charactersizeNONE
,
11502 FFEEXPR_contextLET
));
11505 if (rbt
== FFEINFO_basictypeLOGICAL
)
11507 ffebld_set_right (reduced
, ffeexpr_convert (ffebld_right (reduced
),
11508 r
->token
, op
->token
, FFEINFO_basictypeINTEGER
,
11509 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
11510 FFETARGET_charactersizeNONE
,
11511 FFEEXPR_contextLET
));
11517 /* Fumble through tokens until a nonmatching CLOSE_PAREN, EOS, or SEMICOLON
11520 The idea is to process the tokens as they would be done by normal
11521 expression processing, with the key things being telling the lexer
11522 when hollerith/character constants are about to happen, until the
11523 true closing token is found. */
11525 static ffelexHandler
11526 ffeexpr_find_close_paren_ (ffelexToken t
,
11527 ffelexHandler after
)
11529 ffeexpr_find_
.after
= after
;
11530 ffeexpr_find_
.level
= 1;
11531 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11534 static ffelexHandler
11535 ffeexpr_nil_finished_ (ffelexToken t
)
11537 switch (ffelex_token_type (t
))
11539 case FFELEX_typeCLOSE_PAREN
:
11540 if (--ffeexpr_find_
.level
== 0)
11541 return (ffelexHandler
) ffeexpr_find_
.after
;
11542 return (ffelexHandler
) ffeexpr_nil_binary_
;
11544 case FFELEX_typeCOMMA
:
11545 case FFELEX_typeCOLON
:
11546 case FFELEX_typeEQUALS
:
11547 case FFELEX_typePOINTS
:
11548 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11551 if (--ffeexpr_find_
.level
== 0)
11552 return (ffelexHandler
) ffeexpr_find_
.after (t
);
11553 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11557 static ffelexHandler
11558 ffeexpr_nil_rhs_ (ffelexToken t
)
11560 switch (ffelex_token_type (t
))
11562 case FFELEX_typeQUOTE
:
11564 return (ffelexHandler
) ffeexpr_nil_quote_
;
11565 ffelex_set_expecting_hollerith (-1, '\"',
11566 ffelex_token_where_line (t
),
11567 ffelex_token_where_column (t
));
11568 return (ffelexHandler
) ffeexpr_nil_apostrophe_
;
11570 case FFELEX_typeAPOSTROPHE
:
11571 ffelex_set_expecting_hollerith (-1, '\'',
11572 ffelex_token_where_line (t
),
11573 ffelex_token_where_column (t
));
11574 return (ffelexHandler
) ffeexpr_nil_apostrophe_
;
11576 case FFELEX_typePERCENT
:
11577 return (ffelexHandler
) ffeexpr_nil_percent_
;
11579 case FFELEX_typeOPEN_PAREN
:
11580 ++ffeexpr_find_
.level
;
11581 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11583 case FFELEX_typePLUS
:
11584 case FFELEX_typeMINUS
:
11585 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11587 case FFELEX_typePERIOD
:
11588 return (ffelexHandler
) ffeexpr_nil_period_
;
11590 case FFELEX_typeNUMBER
:
11591 ffeexpr_hollerith_count_
= atol (ffelex_token_text (t
));
11592 if (ffeexpr_hollerith_count_
> 0)
11593 ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_
,
11595 ffelex_token_where_line (t
),
11596 ffelex_token_where_column (t
));
11597 return (ffelexHandler
) ffeexpr_nil_number_
;
11599 case FFELEX_typeNAME
:
11600 case FFELEX_typeNAMES
:
11601 return (ffelexHandler
) ffeexpr_nil_name_rhs_
;
11603 case FFELEX_typeASTERISK
:
11604 case FFELEX_typeSLASH
:
11605 case FFELEX_typePOWER
:
11606 case FFELEX_typeCONCAT
:
11607 case FFELEX_typeREL_EQ
:
11608 case FFELEX_typeREL_NE
:
11609 case FFELEX_typeREL_LE
:
11610 case FFELEX_typeREL_GE
:
11611 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11614 return (ffelexHandler
) ffeexpr_nil_finished_ (t
);
11618 static ffelexHandler
11619 ffeexpr_nil_period_ (ffelexToken t
)
11621 switch (ffelex_token_type (t
))
11623 case FFELEX_typeNAME
:
11624 case FFELEX_typeNAMES
:
11625 ffeexpr_current_dotdot_
= ffestr_other (t
);
11626 switch (ffeexpr_current_dotdot_
)
11628 case FFESTR_otherNone
:
11629 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11631 case FFESTR_otherTRUE
:
11632 case FFESTR_otherFALSE
:
11633 case FFESTR_otherNOT
:
11634 return (ffelexHandler
) ffeexpr_nil_end_period_
;
11637 return (ffelexHandler
) ffeexpr_nil_swallow_period_
;
11639 break; /* Nothing really reaches here. */
11641 case FFELEX_typeNUMBER
:
11642 return (ffelexHandler
) ffeexpr_nil_real_
;
11645 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11649 static ffelexHandler
11650 ffeexpr_nil_end_period_ (ffelexToken t
)
11652 switch (ffeexpr_current_dotdot_
)
11654 case FFESTR_otherNOT
:
11655 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
11656 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11657 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11659 case FFESTR_otherTRUE
:
11660 case FFESTR_otherFALSE
:
11661 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
11662 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11663 return (ffelexHandler
) ffeexpr_nil_binary_
;
11666 assert ("Bad [nil] unary dotdot in ffeexpr_current_dotdot_" == NULL
);
11672 static ffelexHandler
11673 ffeexpr_nil_swallow_period_ (ffelexToken t
)
11675 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
11676 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11677 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11680 static ffelexHandler
11681 ffeexpr_nil_real_ (ffelexToken t
)
11686 if (((ffelex_token_type (t
) != FFELEX_typeNAME
)
11687 && (ffelex_token_type (t
) != FFELEX_typeNAMES
))
11688 || !(((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
11690 || ffesrc_char_match_init (d
, 'E', 'e')
11691 || ffesrc_char_match_init (d
, 'Q', 'q')))
11692 && ffeexpr_isdigits_ (++p
)))
11693 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11696 return (ffelexHandler
) ffeexpr_nil_real_exponent_
;
11697 return (ffelexHandler
) ffeexpr_nil_binary_
;
11700 static ffelexHandler
11701 ffeexpr_nil_real_exponent_ (ffelexToken t
)
11703 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
11704 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
11705 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11707 return (ffelexHandler
) ffeexpr_nil_real_exp_sign_
;
11710 static ffelexHandler
11711 ffeexpr_nil_real_exp_sign_ (ffelexToken t
)
11713 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
11714 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11715 return (ffelexHandler
) ffeexpr_nil_binary_
;
11718 static ffelexHandler
11719 ffeexpr_nil_number_ (ffelexToken t
)
11724 if (ffeexpr_hollerith_count_
> 0)
11725 ffelex_set_expecting_hollerith (0, '\0',
11726 ffewhere_line_unknown (),
11727 ffewhere_column_unknown ());
11729 switch (ffelex_token_type (t
))
11731 case FFELEX_typeNAME
:
11732 case FFELEX_typeNAMES
:
11733 if ((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
11735 || ffesrc_char_match_init (d
, 'E', 'e')
11736 || ffesrc_char_match_init (d
, 'Q', 'q'))
11737 && ffeexpr_isdigits_ (++p
))
11741 ffeexpr_find_
.t
= ffelex_token_use (t
);
11742 return (ffelexHandler
) ffeexpr_nil_number_exponent_
;
11744 return (ffelexHandler
) ffeexpr_nil_binary_
;
11748 case FFELEX_typePERIOD
:
11749 ffeexpr_find_
.t
= ffelex_token_use (t
);
11750 return (ffelexHandler
) ffeexpr_nil_number_period_
;
11752 case FFELEX_typeHOLLERITH
:
11753 return (ffelexHandler
) ffeexpr_nil_binary_
;
11758 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11761 /* Expects ffeexpr_find_.t. */
11763 static ffelexHandler
11764 ffeexpr_nil_number_exponent_ (ffelexToken t
)
11766 ffelexHandler nexthandler
;
11768 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
11769 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
11772 = (ffelexHandler
) ffeexpr_nil_binary_ (ffeexpr_find_
.t
);
11773 ffelex_token_kill (ffeexpr_find_
.t
);
11774 return (ffelexHandler
) (*nexthandler
) (t
);
11777 ffelex_token_kill (ffeexpr_find_
.t
);
11778 return (ffelexHandler
) ffeexpr_nil_number_exp_sign_
;
11781 static ffelexHandler
11782 ffeexpr_nil_number_exp_sign_ (ffelexToken t
)
11784 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
11785 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11787 return (ffelexHandler
) ffeexpr_nil_binary_
;
11790 /* Expects ffeexpr_find_.t. */
11792 static ffelexHandler
11793 ffeexpr_nil_number_period_ (ffelexToken t
)
11795 ffelexHandler nexthandler
;
11799 switch (ffelex_token_type (t
))
11801 case FFELEX_typeNAME
:
11802 case FFELEX_typeNAMES
:
11803 if ((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
11805 || ffesrc_char_match_init (d
, 'E', 'e')
11806 || ffesrc_char_match_init (d
, 'Q', 'q'))
11807 && ffeexpr_isdigits_ (++p
))
11810 return (ffelexHandler
) ffeexpr_nil_number_per_exp_
;
11811 ffelex_token_kill (ffeexpr_find_
.t
);
11812 return (ffelexHandler
) ffeexpr_nil_binary_
;
11815 = (ffelexHandler
) ffeexpr_nil_binary_ (ffeexpr_find_
.t
);
11816 ffelex_token_kill (ffeexpr_find_
.t
);
11817 return (ffelexHandler
) (*nexthandler
) (t
);
11819 case FFELEX_typeNUMBER
:
11820 ffelex_token_kill (ffeexpr_find_
.t
);
11821 return (ffelexHandler
) ffeexpr_nil_number_real_
;
11826 ffelex_token_kill (ffeexpr_find_
.t
);
11827 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11830 /* Expects ffeexpr_find_.t. */
11832 static ffelexHandler
11833 ffeexpr_nil_number_per_exp_ (ffelexToken t
)
11835 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
11836 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
11838 ffelexHandler nexthandler
;
11841 = (ffelexHandler
) ffeexpr_nil_binary_ (ffeexpr_find_
.t
);
11842 ffelex_token_kill (ffeexpr_find_
.t
);
11843 return (ffelexHandler
) (*nexthandler
) (t
);
11846 ffelex_token_kill (ffeexpr_find_
.t
);
11847 return (ffelexHandler
) ffeexpr_nil_num_per_exp_sign_
;
11850 static ffelexHandler
11851 ffeexpr_nil_number_real_ (ffelexToken t
)
11856 if (((ffelex_token_type (t
) != FFELEX_typeNAME
)
11857 && (ffelex_token_type (t
) != FFELEX_typeNAMES
))
11858 || !(((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
11860 || ffesrc_char_match_init (d
, 'E', 'e')
11861 || ffesrc_char_match_init (d
, 'Q', 'q')))
11862 && ffeexpr_isdigits_ (++p
)))
11863 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11866 return (ffelexHandler
) ffeexpr_nil_number_real_exp_
;
11868 return (ffelexHandler
) ffeexpr_nil_binary_
;
11871 static ffelexHandler
11872 ffeexpr_nil_num_per_exp_sign_ (ffelexToken t
)
11874 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
11875 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11876 return (ffelexHandler
) ffeexpr_nil_binary_
;
11879 static ffelexHandler
11880 ffeexpr_nil_number_real_exp_ (ffelexToken t
)
11882 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
11883 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
11884 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11885 return (ffelexHandler
) ffeexpr_nil_num_real_exp_sn_
;
11888 static ffelexHandler
11889 ffeexpr_nil_num_real_exp_sn_ (ffelexToken t
)
11891 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
11892 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11893 return (ffelexHandler
) ffeexpr_nil_binary_
;
11896 static ffelexHandler
11897 ffeexpr_nil_binary_ (ffelexToken t
)
11899 switch (ffelex_token_type (t
))
11901 case FFELEX_typePLUS
:
11902 case FFELEX_typeMINUS
:
11903 case FFELEX_typeASTERISK
:
11904 case FFELEX_typeSLASH
:
11905 case FFELEX_typePOWER
:
11906 case FFELEX_typeCONCAT
:
11907 case FFELEX_typeOPEN_ANGLE
:
11908 case FFELEX_typeCLOSE_ANGLE
:
11909 case FFELEX_typeREL_EQ
:
11910 case FFELEX_typeREL_NE
:
11911 case FFELEX_typeREL_GE
:
11912 case FFELEX_typeREL_LE
:
11913 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11915 case FFELEX_typePERIOD
:
11916 return (ffelexHandler
) ffeexpr_nil_binary_period_
;
11919 return (ffelexHandler
) ffeexpr_nil_finished_ (t
);
11923 static ffelexHandler
11924 ffeexpr_nil_binary_period_ (ffelexToken t
)
11926 switch (ffelex_token_type (t
))
11928 case FFELEX_typeNAME
:
11929 case FFELEX_typeNAMES
:
11930 ffeexpr_current_dotdot_
= ffestr_other (t
);
11931 switch (ffeexpr_current_dotdot_
)
11933 case FFESTR_otherTRUE
:
11934 case FFESTR_otherFALSE
:
11935 case FFESTR_otherNOT
:
11936 return (ffelexHandler
) ffeexpr_nil_binary_sw_per_
;
11939 return (ffelexHandler
) ffeexpr_nil_binary_end_per_
;
11941 break; /* Nothing really reaches here. */
11944 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11948 static ffelexHandler
11949 ffeexpr_nil_binary_end_per_ (ffelexToken t
)
11951 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
11952 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11953 return (ffelexHandler
) ffeexpr_nil_rhs_
;
11956 static ffelexHandler
11957 ffeexpr_nil_binary_sw_per_ (ffelexToken t
)
11959 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
11960 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
11961 return (ffelexHandler
) ffeexpr_nil_binary_
;
11964 static ffelexHandler
11965 ffeexpr_nil_quote_ (ffelexToken t
)
11967 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
11968 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11969 return (ffelexHandler
) ffeexpr_nil_binary_
;
11972 static ffelexHandler
11973 ffeexpr_nil_apostrophe_ (ffelexToken t
)
11975 assert (ffelex_token_type (t
) == FFELEX_typeCHARACTER
);
11976 return (ffelexHandler
) ffeexpr_nil_apos_char_
;
11979 static ffelexHandler
11980 ffeexpr_nil_apos_char_ (ffelexToken t
)
11984 if ((ffelex_token_type (t
) == FFELEX_typeNAME
)
11985 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
11987 if ((ffelex_token_length (t
) == 1)
11988 && (ffesrc_char_match_init ((c
= ffelex_token_text (t
)[0]),
11990 || ffesrc_char_match_init (c
, 'O', 'o')
11991 || ffesrc_char_match_init (c
, 'X', 'x')
11992 || ffesrc_char_match_init (c
, 'Z', 'z')))
11993 return (ffelexHandler
) ffeexpr_nil_binary_
;
11995 if ((ffelex_token_type (t
) == FFELEX_typeNAME
)
11996 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
11997 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
11998 return (ffelexHandler
) ffeexpr_nil_substrp_ (t
);
12001 static ffelexHandler
12002 ffeexpr_nil_name_rhs_ (ffelexToken t
)
12004 switch (ffelex_token_type (t
))
12006 case FFELEX_typeQUOTE
:
12007 case FFELEX_typeAPOSTROPHE
:
12008 ffelex_set_hexnum (TRUE
);
12009 return (ffelexHandler
) ffeexpr_nil_name_apos_
;
12011 case FFELEX_typeOPEN_PAREN
:
12012 ++ffeexpr_find_
.level
;
12013 return (ffelexHandler
) ffeexpr_nil_rhs_
;
12016 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
12020 static ffelexHandler
12021 ffeexpr_nil_name_apos_ (ffelexToken t
)
12023 if (ffelex_token_type (t
) == FFELEX_typeNAME
)
12024 return (ffelexHandler
) ffeexpr_nil_name_apos_name_
;
12025 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
12028 static ffelexHandler
12029 ffeexpr_nil_name_apos_name_ (ffelexToken t
)
12031 switch (ffelex_token_type (t
))
12033 case FFELEX_typeAPOSTROPHE
:
12034 case FFELEX_typeQUOTE
:
12035 return (ffelexHandler
) ffeexpr_nil_finished_
;
12038 return (ffelexHandler
) ffeexpr_nil_finished_ (t
);
12042 static ffelexHandler
12043 ffeexpr_nil_percent_ (ffelexToken t
)
12045 switch (ffelex_token_type (t
))
12047 case FFELEX_typeNAME
:
12048 case FFELEX_typeNAMES
:
12049 ffeexpr_stack_
->percent
= ffeexpr_percent_ (t
);
12050 ffeexpr_find_
.t
= ffelex_token_use (t
);
12051 return (ffelexHandler
) ffeexpr_nil_percent_name_
;
12054 return (ffelexHandler
) ffeexpr_nil_rhs_ (t
);
12058 /* Expects ffeexpr_find_.t. */
12060 static ffelexHandler
12061 ffeexpr_nil_percent_name_ (ffelexToken t
)
12063 ffelexHandler nexthandler
;
12065 if (ffelex_token_type (t
) != FFELEX_typeOPEN_PAREN
)
12068 = (ffelexHandler
) ffeexpr_nil_rhs_ (ffeexpr_find_
.t
);
12069 ffelex_token_kill (ffeexpr_find_
.t
);
12070 return (ffelexHandler
) (*nexthandler
) (t
);
12073 ffelex_token_kill (ffeexpr_find_
.t
);
12074 ++ffeexpr_find_
.level
;
12075 return (ffelexHandler
) ffeexpr_nil_rhs_
;
12078 static ffelexHandler
12079 ffeexpr_nil_substrp_ (ffelexToken t
)
12081 if (ffelex_token_type (t
) != FFELEX_typeOPEN_PAREN
)
12082 return (ffelexHandler
) ffeexpr_nil_binary_ (t
);
12084 ++ffeexpr_find_
.level
;
12085 return (ffelexHandler
) ffeexpr_nil_rhs_
;
12088 /* ffeexpr_finished_ -- Reduce expression stack to one expr, finish
12091 return ffeexpr_finished_(t);
12093 Reduces expression stack to one (or zero) elements by repeatedly reducing
12094 the top operator on the stack (or, if the top element on the stack is
12095 itself an operator, issuing an error message and discarding it). Calls
12096 finishing routine with the expression, returning the ffelexHandler it
12097 returns to the caller. */
12099 static ffelexHandler
12100 ffeexpr_finished_ (ffelexToken t
)
12102 ffeexprExpr_ operand
; /* This is B in -B or A+B. */
12104 ffeexprCallback callback
;
12106 ffebldConstant constnode
; /* For detecting magical number. */
12107 ffelexToken ft
; /* Temporary copy of first token in
12109 ffelexHandler next
;
12111 bool error
= FALSE
;
12113 while (((operand
= ffeexpr_stack_
->exprstack
) != NULL
)
12114 && ((operand
->previous
!= NULL
) || (operand
->type
!= FFEEXPR_exprtypeOPERAND_
)))
12116 if (operand
->type
== FFEEXPR_exprtypeOPERAND_
)
12117 ffeexpr_reduce_ ();
12120 if (ffest_ffebad_start (FFEBAD_MISSING_OPERAND_FOR_OPERATOR
))
12122 ffebad_here (0, ffelex_token_where_line (t
),
12123 ffelex_token_where_column (t
));
12124 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->exprstack
->token
),
12125 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->token
));
12128 ffeexpr_stack_
->exprstack
= operand
->previous
; /* Pop the useless
12130 ffeexpr_expr_kill_ (operand
);
12134 assert ((operand
== NULL
) || (operand
->previous
== NULL
));
12136 ffebld_pool_pop ();
12137 if (operand
== NULL
)
12141 expr
= operand
->u
.operand
;
12142 info
= ffebld_info (expr
);
12143 if ((ffebld_op (expr
) == FFEBLD_opCONTER
)
12144 && (ffebld_conter_orig (expr
) == NULL
)
12145 && ffebld_constant_is_magical (constnode
= ffebld_conter (expr
)))
12147 ffetarget_integer_bad_magical (operand
->token
);
12149 ffeexpr_expr_kill_ (operand
);
12150 ffeexpr_stack_
->exprstack
= NULL
;
12153 ft
= ffeexpr_stack_
->first_token
;
12155 again
: /* :::::::::::::::::::: */
12156 switch (ffeexpr_stack_
->context
)
12158 case FFEEXPR_contextLET
:
12159 case FFEEXPR_contextSFUNCDEF
:
12160 error
= (expr
== NULL
)
12161 || (ffeinfo_rank (info
) != 0);
12164 case FFEEXPR_contextPAREN_
:
12165 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12167 switch (ffeinfo_basictype (info
))
12169 case FFEINFO_basictypeHOLLERITH
:
12170 case FFEINFO_basictypeTYPELESS
:
12171 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12172 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12173 FFEEXPR_contextLET
);
12181 case FFEEXPR_contextPARENFILENUM_
:
12182 if (ffelex_token_type (t
) != FFELEX_typeCOMMA
)
12183 ffeexpr_stack_
->context
= FFEEXPR_contextPAREN_
;
12185 ffeexpr_stack_
->context
= FFEEXPR_contextFILENUM
;
12186 goto again
; /* :::::::::::::::::::: */
12188 case FFEEXPR_contextPARENFILEUNIT_
:
12189 if (ffelex_token_type (t
) != FFELEX_typeCOMMA
)
12190 ffeexpr_stack_
->context
= FFEEXPR_contextPAREN_
;
12192 ffeexpr_stack_
->context
= FFEEXPR_contextFILEUNIT
;
12193 goto again
; /* :::::::::::::::::::: */
12195 case FFEEXPR_contextACTUALARGEXPR_
:
12196 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
12197 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12198 : ffeinfo_basictype (info
))
12200 case FFEINFO_basictypeHOLLERITH
:
12201 case FFEINFO_basictypeTYPELESS
:
12202 if (!ffe_is_ugly_args ()
12203 && ffebad_start (FFEBAD_ACTUALARG
))
12205 ffebad_here (0, ffelex_token_where_line (ft
),
12206 ffelex_token_where_column (ft
));
12214 error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0);
12217 case FFEEXPR_contextACTUALARG_
:
12218 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
12219 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12220 : ffeinfo_basictype (info
))
12222 case FFEINFO_basictypeHOLLERITH
:
12223 case FFEINFO_basictypeTYPELESS
:
12224 #if 0 /* Should never get here. */
12225 expr
= ffeexpr_convert (expr
, ft
, ft
,
12226 FFEINFO_basictypeINTEGER
,
12227 FFEINFO_kindtypeINTEGERDEFAULT
,
12229 FFETARGET_charactersizeNONE
,
12230 FFEEXPR_contextLET
);
12232 assert ("why hollerith/typeless in actualarg_?" == NULL
);
12239 switch ((expr
== NULL
) ? FFEBLD_opANY
: ffebld_op (expr
))
12241 case FFEBLD_opSYMTER
:
12242 case FFEBLD_opPERCENT_LOC
:
12243 case FFEBLD_opPERCENT_VAL
:
12244 case FFEBLD_opPERCENT_REF
:
12245 case FFEBLD_opPERCENT_DESCR
:
12250 error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0);
12255 ffeinfoWhere where
;
12260 && (ffebld_op (expr
) == FFEBLD_opSYMTER
)
12261 && ((s
= ffebld_symter (expr
)), (where
= ffesymbol_where (s
)),
12262 (where
== FFEINFO_whereINTRINSIC
)
12263 || (where
== FFEINFO_whereGLOBAL
)
12264 || ((where
== FFEINFO_whereDUMMY
)
12265 && ((kind
= ffesymbol_kind (s
)),
12266 (kind
== FFEINFO_kindFUNCTION
)
12267 || (kind
== FFEINFO_kindSUBROUTINE
))))
12268 && !ffesymbol_explicitwhere (s
))
12270 ffebad_start (where
== FFEINFO_whereINTRINSIC
12271 ? FFEBAD_NEED_INTRINSIC
: FFEBAD_NEED_EXTERNAL
);
12272 ffebad_here (0, ffelex_token_where_line (ft
),
12273 ffelex_token_where_column (ft
));
12274 ffebad_string (ffesymbol_text (s
));
12276 ffesymbol_signal_change (s
);
12277 ffesymbol_set_explicitwhere (s
, TRUE
);
12278 ffesymbol_signal_unreported (s
);
12283 case FFEEXPR_contextINDEX_
:
12284 case FFEEXPR_contextSFUNCDEFINDEX_
:
12285 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12287 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12288 : ffeinfo_basictype (info
))
12290 case FFEINFO_basictypeNONE
:
12294 case FFEINFO_basictypeLOGICAL
:
12295 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12296 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12297 FFEEXPR_contextLET
);
12298 /* Fall through. */
12299 case FFEINFO_basictypeREAL
:
12300 case FFEINFO_basictypeCOMPLEX
:
12301 if (ffe_is_pedantic ())
12306 /* Fall through. */
12307 case FFEINFO_basictypeHOLLERITH
:
12308 case FFEINFO_basictypeTYPELESS
:
12310 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12311 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12312 FFEEXPR_contextLET
);
12315 case FFEINFO_basictypeINTEGER
:
12316 /* Specifically, allow INTEGER(KIND=2), aka INTEGER*8, through
12317 unmolested. Leave it to downstream to handle kinds. */
12324 break; /* expr==NULL ok for substring; element case
12325 caught by callback. */
12327 case FFEEXPR_contextRETURN
:
12328 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12330 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12331 : ffeinfo_basictype (info
))
12333 case FFEINFO_basictypeNONE
:
12337 case FFEINFO_basictypeLOGICAL
:
12338 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12339 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12340 FFEEXPR_contextLET
);
12341 /* Fall through. */
12342 case FFEINFO_basictypeREAL
:
12343 case FFEINFO_basictypeCOMPLEX
:
12344 if (ffe_is_pedantic ())
12349 /* Fall through. */
12350 case FFEINFO_basictypeINTEGER
:
12351 case FFEINFO_basictypeHOLLERITH
:
12352 case FFEINFO_basictypeTYPELESS
:
12354 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12355 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12356 FFEEXPR_contextLET
);
12365 case FFEEXPR_contextDO
:
12366 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12368 switch (ffeinfo_basictype (info
))
12370 case FFEINFO_basictypeLOGICAL
:
12371 error
= !ffe_is_ugly_logint ();
12372 if (!ffeexpr_stack_
->is_rhs
)
12373 break; /* Don't convert lhs variable. */
12374 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12375 ffeinfo_kindtype (ffebld_info (expr
)), 0,
12376 FFETARGET_charactersizeNONE
,
12377 FFEEXPR_contextLET
);
12380 case FFEINFO_basictypeHOLLERITH
:
12381 case FFEINFO_basictypeTYPELESS
:
12382 if (!ffeexpr_stack_
->is_rhs
)
12385 break; /* Don't convert lhs variable. */
12389 case FFEINFO_basictypeINTEGER
:
12390 case FFEINFO_basictypeREAL
:
12397 if (!ffeexpr_stack_
->is_rhs
12398 && (ffebld_op (expr
) != FFEBLD_opSYMTER
))
12402 case FFEEXPR_contextDOWHILE
:
12403 case FFEEXPR_contextIF
:
12404 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12406 switch (ffeinfo_basictype (info
))
12408 case FFEINFO_basictypeINTEGER
:
12410 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12411 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12412 FFEEXPR_contextLET
);
12413 /* Fall through. */
12414 case FFEINFO_basictypeLOGICAL
:
12415 case FFEINFO_basictypeHOLLERITH
:
12416 case FFEINFO_basictypeTYPELESS
:
12418 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12419 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12420 FFEEXPR_contextLET
);
12429 case FFEEXPR_contextASSIGN
:
12430 case FFEEXPR_contextAGOTO
:
12431 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12432 : ffeinfo_basictype (info
))
12434 case FFEINFO_basictypeINTEGER
:
12435 error
= (ffeinfo_kindtype (info
) != ffecom_label_kind ());
12438 case FFEINFO_basictypeLOGICAL
:
12439 error
= !ffe_is_ugly_logint ()
12440 || (ffeinfo_kindtype (info
) != ffecom_label_kind ());
12447 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0)
12448 || (ffebld_op (expr
) != FFEBLD_opSYMTER
))
12452 case FFEEXPR_contextCGOTO
:
12453 case FFEEXPR_contextFORMAT
:
12454 case FFEEXPR_contextDIMLIST
:
12455 case FFEEXPR_contextFILENUM
: /* See equiv code in _ambig_. */
12456 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12458 switch (ffeinfo_basictype (info
))
12460 case FFEINFO_basictypeLOGICAL
:
12461 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12462 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12463 FFEEXPR_contextLET
);
12464 /* Fall through. */
12465 case FFEINFO_basictypeREAL
:
12466 case FFEINFO_basictypeCOMPLEX
:
12467 if (ffe_is_pedantic ())
12472 /* Fall through. */
12473 case FFEINFO_basictypeINTEGER
:
12474 case FFEINFO_basictypeHOLLERITH
:
12475 case FFEINFO_basictypeTYPELESS
:
12477 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12478 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12479 FFEEXPR_contextLET
);
12488 case FFEEXPR_contextARITHIF
:
12489 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12491 switch (ffeinfo_basictype (info
))
12493 case FFEINFO_basictypeLOGICAL
:
12494 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12495 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12496 FFEEXPR_contextLET
);
12497 if (ffe_is_pedantic ())
12502 /* Fall through. */
12503 case FFEINFO_basictypeHOLLERITH
:
12504 case FFEINFO_basictypeTYPELESS
:
12505 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12506 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12507 FFEEXPR_contextLET
);
12508 /* Fall through. */
12509 case FFEINFO_basictypeINTEGER
:
12510 case FFEINFO_basictypeREAL
:
12520 case FFEEXPR_contextSTOP
:
12521 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12523 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12524 : ffeinfo_basictype (info
))
12526 case FFEINFO_basictypeINTEGER
:
12527 error
= (ffeinfo_kindtype (info
) != FFEINFO_kindtypeINTEGERDEFAULT
);
12530 case FFEINFO_basictypeCHARACTER
:
12531 error
= (ffeinfo_kindtype (info
) != FFEINFO_kindtypeCHARACTERDEFAULT
);
12534 case FFEINFO_basictypeHOLLERITH
:
12535 case FFEINFO_basictypeTYPELESS
:
12537 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12538 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12539 FFEEXPR_contextLET
);
12542 case FFEINFO_basictypeNONE
:
12550 if ((expr
!= NULL
) && ((ffebld_op (expr
) != FFEBLD_opCONTER
)
12551 || (ffebld_conter_orig (expr
) != NULL
)))
12555 case FFEEXPR_contextINCLUDE
:
12556 error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)
12557 || (ffeinfo_basictype (info
) != FFEINFO_basictypeCHARACTER
)
12558 || (ffebld_op (expr
) != FFEBLD_opCONTER
)
12559 || (ffebld_conter_orig (expr
) != NULL
);
12562 case FFEEXPR_contextSELECTCASE
:
12563 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12565 switch (ffeinfo_basictype (info
))
12567 case FFEINFO_basictypeINTEGER
:
12568 case FFEINFO_basictypeCHARACTER
:
12569 case FFEINFO_basictypeLOGICAL
:
12573 case FFEINFO_basictypeHOLLERITH
:
12574 case FFEINFO_basictypeTYPELESS
:
12576 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12577 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12578 FFEEXPR_contextLET
);
12587 case FFEEXPR_contextCASE
:
12588 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12590 switch ((expr
== NULL
) ? FFEINFO_basictypeINTEGER
12591 : ffeinfo_basictype (info
))
12593 case FFEINFO_basictypeINTEGER
:
12594 case FFEINFO_basictypeCHARACTER
:
12595 case FFEINFO_basictypeLOGICAL
:
12599 case FFEINFO_basictypeHOLLERITH
:
12600 case FFEINFO_basictypeTYPELESS
:
12602 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12603 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12604 FFEEXPR_contextLET
);
12611 if ((expr
!= NULL
) && (ffebld_op (expr
) != FFEBLD_opCONTER
))
12615 case FFEEXPR_contextCHARACTERSIZE
:
12616 case FFEEXPR_contextKINDTYPE
:
12617 case FFEEXPR_contextDIMLISTCOMMON
:
12618 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12620 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12621 : ffeinfo_basictype (info
))
12623 case FFEINFO_basictypeLOGICAL
:
12624 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12625 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12626 FFEEXPR_contextLET
);
12627 /* Fall through. */
12628 case FFEINFO_basictypeREAL
:
12629 case FFEINFO_basictypeCOMPLEX
:
12630 if (ffe_is_pedantic ())
12635 /* Fall through. */
12636 case FFEINFO_basictypeINTEGER
:
12637 case FFEINFO_basictypeHOLLERITH
:
12638 case FFEINFO_basictypeTYPELESS
:
12640 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12641 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12642 FFEEXPR_contextLET
);
12649 if ((expr
!= NULL
) && (ffebld_op (expr
) != FFEBLD_opCONTER
))
12653 case FFEEXPR_contextEQVINDEX_
:
12654 if ((error
= (expr
!= NULL
) && (ffeinfo_rank (info
) != 0)))
12656 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12657 : ffeinfo_basictype (info
))
12659 case FFEINFO_basictypeNONE
:
12663 case FFEINFO_basictypeLOGICAL
:
12664 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12665 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12666 FFEEXPR_contextLET
);
12667 /* Fall through. */
12668 case FFEINFO_basictypeREAL
:
12669 case FFEINFO_basictypeCOMPLEX
:
12670 if (ffe_is_pedantic ())
12675 /* Fall through. */
12676 case FFEINFO_basictypeINTEGER
:
12677 case FFEINFO_basictypeHOLLERITH
:
12678 case FFEINFO_basictypeTYPELESS
:
12680 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12681 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12682 FFEEXPR_contextLET
);
12689 if ((expr
!= NULL
) && (ffebld_op (expr
) != FFEBLD_opCONTER
))
12693 case FFEEXPR_contextPARAMETER
:
12694 if (ffeexpr_stack_
->is_rhs
)
12695 error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)
12696 || (ffebld_op (expr
) != FFEBLD_opCONTER
);
12698 error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)
12699 || (ffebld_op (expr
) != FFEBLD_opSYMTER
);
12702 case FFEEXPR_contextINDEXORACTUALARG_
:
12703 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
12704 ffeexpr_stack_
->context
= FFEEXPR_contextINDEX_
;
12706 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARG_
;
12707 goto again
; /* :::::::::::::::::::: */
12709 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
12710 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
12711 ffeexpr_stack_
->context
= FFEEXPR_contextINDEX_
;
12713 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
12714 goto again
; /* :::::::::::::::::::: */
12716 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
12717 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
12718 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEX_
;
12720 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARG_
;
12721 goto again
; /* :::::::::::::::::::: */
12723 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
12724 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
12725 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFINDEX_
;
12727 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
12728 goto again
; /* :::::::::::::::::::: */
12730 case FFEEXPR_contextIMPDOCTRL_
:
12731 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12733 if (!ffeexpr_stack_
->is_rhs
12734 && (ffebld_op (expr
) != FFEBLD_opSYMTER
))
12736 switch (ffeinfo_basictype (info
))
12738 case FFEINFO_basictypeLOGICAL
:
12739 if (! ffe_is_ugly_logint ())
12741 if (! ffeexpr_stack_
->is_rhs
)
12743 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12744 ffeinfo_kindtype (info
), 0,
12745 FFETARGET_charactersizeNONE
,
12746 FFEEXPR_contextLET
);
12749 case FFEINFO_basictypeINTEGER
:
12750 case FFEINFO_basictypeHOLLERITH
:
12751 case FFEINFO_basictypeTYPELESS
:
12754 case FFEINFO_basictypeREAL
:
12755 if (!ffeexpr_stack_
->is_rhs
12756 && ffe_is_warn_surprising ()
12759 ffebad_start (FFEBAD_DO_REAL
); /* See error message!!! */
12760 ffebad_here (0, ffelex_token_where_line (ft
),
12761 ffelex_token_where_column (ft
));
12762 ffebad_string (ffelex_token_text (ft
));
12773 case FFEEXPR_contextDATAIMPDOCTRL_
:
12774 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12776 if (ffeexpr_stack_
->is_rhs
)
12778 if ((ffebld_op (expr
) != FFEBLD_opCONTER
)
12779 && (ffeinfo_where (info
) != FFEINFO_whereIMMEDIATE
))
12782 else if ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
12783 || (ffeinfo_where (info
) != FFEINFO_whereIMMEDIATE
))
12785 switch (ffeinfo_basictype (info
))
12787 case FFEINFO_basictypeLOGICAL
:
12788 if (! ffeexpr_stack_
->is_rhs
)
12790 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12791 ffeinfo_kindtype (info
), 0,
12792 FFETARGET_charactersizeNONE
,
12793 FFEEXPR_contextLET
);
12794 /* Fall through. */
12795 case FFEINFO_basictypeINTEGER
:
12796 if (ffeexpr_stack_
->is_rhs
12797 && (ffeinfo_kindtype (ffebld_info (expr
))
12798 != FFEINFO_kindtypeINTEGERDEFAULT
))
12799 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12800 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
12801 FFETARGET_charactersizeNONE
,
12802 FFEEXPR_contextLET
);
12805 case FFEINFO_basictypeHOLLERITH
:
12806 case FFEINFO_basictypeTYPELESS
:
12807 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12808 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12809 FFEEXPR_contextLET
);
12812 case FFEINFO_basictypeREAL
:
12813 if (!ffeexpr_stack_
->is_rhs
12814 && ffe_is_warn_surprising ()
12817 ffebad_start (FFEBAD_DO_REAL
); /* See error message!!! */
12818 ffebad_here (0, ffelex_token_where_line (ft
),
12819 ffelex_token_where_column (ft
));
12820 ffebad_string (ffelex_token_text (ft
));
12831 case FFEEXPR_contextIMPDOITEM_
:
12832 if (ffelex_token_type (t
) == FFELEX_typeEQUALS
)
12834 ffeexpr_stack_
->is_rhs
= FALSE
;
12835 ffeexpr_stack_
->context
= FFEEXPR_contextIMPDOCTRL_
;
12836 goto again
; /* :::::::::::::::::::: */
12838 /* Fall through. */
12839 case FFEEXPR_contextIOLIST
:
12840 case FFEEXPR_contextFILEVXTCODE
:
12841 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12842 : ffeinfo_basictype (info
))
12844 case FFEINFO_basictypeHOLLERITH
:
12845 case FFEINFO_basictypeTYPELESS
:
12846 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12847 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12848 FFEEXPR_contextLET
);
12854 error
= (expr
== NULL
)
12855 || ((ffeinfo_rank (info
) != 0)
12856 && ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
12857 || (ffesymbol_arraysize (ffebld_symter (expr
)) == NULL
)
12858 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr
)))
12859 == FFEBLD_opSTAR
))); /* Bad if null expr, or if
12860 array that is not a SYMTER
12861 (can't happen yet, I
12862 think) or has a NULL or
12863 STAR (assumed) array
12867 case FFEEXPR_contextIMPDOITEMDF_
:
12868 if (ffelex_token_type (t
) == FFELEX_typeEQUALS
)
12870 ffeexpr_stack_
->is_rhs
= FALSE
;
12871 ffeexpr_stack_
->context
= FFEEXPR_contextIMPDOCTRL_
;
12872 goto again
; /* :::::::::::::::::::: */
12874 /* Fall through. */
12875 case FFEEXPR_contextIOLISTDF
:
12876 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12877 : ffeinfo_basictype (info
))
12879 case FFEINFO_basictypeHOLLERITH
:
12880 case FFEINFO_basictypeTYPELESS
:
12881 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12882 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12883 FFEEXPR_contextLET
);
12891 || ((ffeinfo_basictype (info
) == FFEINFO_basictypeCHARACTER
)
12892 && (ffeinfo_kindtype (info
) != FFEINFO_kindtypeCHARACTERDEFAULT
))
12893 || ((ffeinfo_rank (info
) != 0)
12894 && ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
12895 || (ffesymbol_arraysize (ffebld_symter (expr
)) == NULL
)
12896 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr
)))
12897 == FFEBLD_opSTAR
))); /* Bad if null expr,
12898 non-default-kindtype
12899 character expr, or if
12900 array that is not a SYMTER
12901 (can't happen yet, I
12902 think) or has a NULL or
12903 STAR (assumed) array
12907 case FFEEXPR_contextDATAIMPDOITEM_
:
12908 error
= (expr
== NULL
)
12909 || (ffebld_op (expr
) != FFEBLD_opARRAYREF
)
12910 || ((ffeinfo_where (info
) != FFEINFO_whereFLEETING_CADDR
)
12911 && (ffeinfo_where (info
) != FFEINFO_whereFLEETING_IADDR
));
12914 case FFEEXPR_contextDATAIMPDOINDEX_
:
12915 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
12917 switch (ffeinfo_basictype (info
))
12919 case FFEINFO_basictypeLOGICAL
:
12920 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
12921 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12922 FFEEXPR_contextLET
);
12923 /* Fall through. */
12924 case FFEINFO_basictypeREAL
:
12925 case FFEINFO_basictypeCOMPLEX
:
12926 if (ffe_is_pedantic ())
12931 /* Fall through. */
12932 case FFEINFO_basictypeINTEGER
:
12933 case FFEINFO_basictypeHOLLERITH
:
12934 case FFEINFO_basictypeTYPELESS
:
12936 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
12937 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
12938 FFEEXPR_contextLET
);
12945 if ((ffeinfo_where (info
) != FFEINFO_whereCONSTANT
)
12946 && (ffeinfo_where (info
) != FFEINFO_whereIMMEDIATE
))
12950 case FFEEXPR_contextDATA
:
12953 else if (ffeexpr_stack_
->is_rhs
)
12954 error
= (ffebld_op (expr
) != FFEBLD_opCONTER
);
12955 else if (ffebld_op (expr
) == FFEBLD_opSYMTER
)
12958 error
= (ffeinfo_where (info
) != FFEINFO_whereFLEETING_CADDR
);
12961 case FFEEXPR_contextINITVAL
:
12962 error
= (expr
== NULL
) || (ffebld_op (expr
) != FFEBLD_opCONTER
);
12965 case FFEEXPR_contextEQUIVALENCE
:
12968 else if (ffebld_op (expr
) == FFEBLD_opSYMTER
)
12971 error
= (ffeinfo_where (info
) != FFEINFO_whereFLEETING_CADDR
);
12974 case FFEEXPR_contextFILEASSOC
:
12975 case FFEEXPR_contextFILEINT
:
12976 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12977 : ffeinfo_basictype (info
))
12979 case FFEINFO_basictypeINTEGER
:
12980 /* Maybe this should be supported someday, but, right now,
12981 g77 can't generate a call to libf2c to write to an
12982 integer other than the default size. */
12983 error
= ((! ffeexpr_stack_
->is_rhs
)
12984 && ffeinfo_kindtype (info
) != FFEINFO_kindtypeINTEGERDEFAULT
);
12991 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0))
12995 case FFEEXPR_contextFILEDFINT
:
12996 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
12997 : ffeinfo_basictype (info
))
12999 case FFEINFO_basictypeINTEGER
:
13000 error
= (ffeinfo_kindtype (info
) != FFEINFO_kindtypeINTEGERDEFAULT
);
13007 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0))
13011 case FFEEXPR_contextFILELOG
:
13012 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13013 : ffeinfo_basictype (info
))
13015 case FFEINFO_basictypeLOGICAL
:
13023 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0))
13027 case FFEEXPR_contextFILECHAR
:
13028 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13029 : ffeinfo_basictype (info
))
13031 case FFEINFO_basictypeCHARACTER
:
13039 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0))
13043 case FFEEXPR_contextFILENUMCHAR
:
13044 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
13046 switch (ffeinfo_basictype (info
))
13048 case FFEINFO_basictypeLOGICAL
:
13049 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
13050 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13051 FFEEXPR_contextLET
);
13052 /* Fall through. */
13053 case FFEINFO_basictypeREAL
:
13054 case FFEINFO_basictypeCOMPLEX
:
13055 if (ffe_is_pedantic ())
13060 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
13061 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13062 FFEEXPR_contextLET
);
13065 case FFEINFO_basictypeINTEGER
:
13066 case FFEINFO_basictypeCHARACTER
:
13076 case FFEEXPR_contextFILEDFCHAR
:
13077 if ((error
= (expr
== NULL
) || (ffeinfo_rank (info
) != 0)))
13079 switch (ffeinfo_basictype (info
))
13081 case FFEINFO_basictypeCHARACTER
:
13083 = (ffeinfo_kindtype (info
)
13084 != FFEINFO_kindtypeCHARACTERDEFAULT
);
13091 if (!ffeexpr_stack_
->is_rhs
13092 && (ffebld_op (expr
) == FFEBLD_opSUBSTR
))
13096 case FFEEXPR_contextFILEUNIT
: /* See equiv code in _ambig_. */
13097 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13098 : ffeinfo_basictype (info
))
13100 case FFEINFO_basictypeLOGICAL
:
13101 if ((error
= (ffeinfo_rank (info
) != 0)))
13103 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
13104 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13105 FFEEXPR_contextLET
);
13106 /* Fall through. */
13107 case FFEINFO_basictypeREAL
:
13108 case FFEINFO_basictypeCOMPLEX
:
13109 if ((error
= (ffeinfo_rank (info
) != 0)))
13111 if (ffe_is_pedantic ())
13116 /* Fall through. */
13117 case FFEINFO_basictypeINTEGER
:
13118 case FFEINFO_basictypeHOLLERITH
:
13119 case FFEINFO_basictypeTYPELESS
:
13120 if ((error
= (ffeinfo_rank (info
) != 0)))
13122 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
13123 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13124 FFEEXPR_contextLET
);
13127 case FFEINFO_basictypeCHARACTER
:
13128 switch (ffebld_op (expr
))
13129 { /* As if _lhs had been called instead of
13131 case FFEBLD_opSYMTER
:
13133 = (ffeinfo_where (ffebld_info (expr
)) == FFEINFO_whereCONSTANT
);
13136 case FFEBLD_opSUBSTR
:
13137 error
= (ffeinfo_where (ffebld_info (expr
))
13138 == FFEINFO_whereCONSTANT_SUBOBJECT
);
13141 case FFEBLD_opARRAYREF
:
13150 && ((ffeinfo_kindtype (info
) != FFEINFO_kindtypeCHARACTERDEFAULT
)
13151 || ((ffeinfo_rank (info
) != 0)
13152 && ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
13153 || (ffesymbol_arraysize (ffebld_symter (expr
)) == NULL
)
13154 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr
)))
13155 == FFEBLD_opSTAR
))))) /* Bad if
13156 non-default-kindtype
13157 character expr, or if
13158 array that is not a SYMTER
13159 (can't happen yet, I
13160 think), or has a NULL or
13161 STAR (assumed) array
13172 case FFEEXPR_contextFILEFORMAT
:
13173 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13174 : ffeinfo_basictype (info
))
13176 case FFEINFO_basictypeINTEGER
:
13177 error
= (expr
== NULL
)
13178 || ((ffeinfo_rank (info
) != 0) ?
13179 ffe_is_pedantic () /* F77 C5. */
13180 : (bool) (ffeinfo_kindtype (info
) != ffecom_label_kind ()))
13181 || (ffebld_op (expr
) != FFEBLD_opSYMTER
);
13184 case FFEINFO_basictypeLOGICAL
:
13185 case FFEINFO_basictypeREAL
:
13186 case FFEINFO_basictypeCOMPLEX
:
13187 /* F77 C5 -- must be an array of hollerith. */
13189 = ffe_is_pedantic ()
13190 || (ffeinfo_rank (info
) == 0);
13193 case FFEINFO_basictypeCHARACTER
:
13194 if ((ffeinfo_kindtype (info
) != FFEINFO_kindtypeCHARACTERDEFAULT
)
13195 || ((ffeinfo_rank (info
) != 0)
13196 && ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
13197 || (ffesymbol_arraysize (ffebld_symter (expr
)) == NULL
)
13198 || (ffebld_op (ffesymbol_arraysize (ffebld_symter (expr
)))
13199 == FFEBLD_opSTAR
)))) /* Bad if
13200 non-default-kindtype
13201 character expr, or if
13202 array that is not a SYMTER
13203 (can't happen yet, I
13204 think), or has a NULL or
13205 STAR (assumed) array
13218 case FFEEXPR_contextLOC_
:
13219 /* See also ffeintrin_check_loc_. */
13221 || (ffeinfo_kind (info
) != FFEINFO_kindENTITY
)
13222 || ((ffebld_op (expr
) != FFEBLD_opSYMTER
)
13223 && (ffebld_op (expr
) != FFEBLD_opSUBSTR
)
13224 && (ffebld_op (expr
) != FFEBLD_opARRAYREF
)))
13233 if (error
&& ((expr
== NULL
) || (ffebld_op (expr
) != FFEBLD_opANY
)))
13235 ffebad_start (FFEBAD_EXPR_WRONG
);
13236 ffebad_here (0, ffelex_token_where_line (ft
),
13237 ffelex_token_where_column (ft
));
13239 expr
= ffebld_new_any ();
13240 ffebld_set_info (expr
, ffeinfo_new_any ());
13243 callback
= ffeexpr_stack_
->callback
;
13244 s
= ffeexpr_stack_
->previous
;
13245 malloc_kill_ks (ffe_pool_program_unit (), ffeexpr_stack_
,
13246 sizeof (*ffeexpr_stack_
));
13247 ffeexpr_stack_
= s
;
13248 next
= (ffelexHandler
) (*callback
) (ft
, expr
, t
);
13249 ffelex_token_kill (ft
);
13250 return (ffelexHandler
) next
;
13253 /* ffeexpr_finished_ambig_ -- Check validity of ambiguous unit/form spec
13256 expr = ffeexpr_finished_ambig_(expr);
13258 Replicates a bit of ffeexpr_finished_'s task when in a context
13259 of UNIT or FORMAT. */
13262 ffeexpr_finished_ambig_ (ffelexToken ft
, ffebld expr
)
13264 ffeinfo info
= ffebld_info (expr
);
13267 switch (ffeexpr_stack_
->context
)
13269 case FFEEXPR_contextFILENUMAMBIG
: /* Same as FILENUM in _finished_. */
13270 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13271 : ffeinfo_basictype (info
))
13273 case FFEINFO_basictypeLOGICAL
:
13274 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
13275 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13276 FFEEXPR_contextLET
);
13277 /* Fall through. */
13278 case FFEINFO_basictypeREAL
:
13279 case FFEINFO_basictypeCOMPLEX
:
13280 if (ffe_is_pedantic ())
13285 /* Fall through. */
13286 case FFEINFO_basictypeINTEGER
:
13287 case FFEINFO_basictypeHOLLERITH
:
13288 case FFEINFO_basictypeTYPELESS
:
13290 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
13291 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13292 FFEEXPR_contextLET
);
13299 if ((expr
== NULL
) || (ffeinfo_rank (info
) != 0))
13303 case FFEEXPR_contextFILEUNITAMBIG
: /* Same as FILEUNIT in _finished_. */
13304 if ((expr
!= NULL
) && (ffebld_op (expr
) == FFEBLD_opSTAR
))
13309 switch ((expr
== NULL
) ? FFEINFO_basictypeNONE
13310 : ffeinfo_basictype (info
))
13312 case FFEINFO_basictypeLOGICAL
:
13313 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeLOGICAL
,
13314 FFEINFO_kindtypeLOGICALDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13315 FFEEXPR_contextLET
);
13316 /* Fall through. */
13317 case FFEINFO_basictypeREAL
:
13318 case FFEINFO_basictypeCOMPLEX
:
13319 if (ffe_is_pedantic ())
13324 /* Fall through. */
13325 case FFEINFO_basictypeINTEGER
:
13326 case FFEINFO_basictypeHOLLERITH
:
13327 case FFEINFO_basictypeTYPELESS
:
13328 error
= (ffeinfo_rank (info
) != 0);
13329 expr
= ffeexpr_convert (expr
, ft
, ft
, FFEINFO_basictypeINTEGER
,
13330 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFETARGET_charactersizeNONE
,
13331 FFEEXPR_contextLET
);
13334 case FFEINFO_basictypeCHARACTER
:
13335 switch (ffebld_op (expr
))
13336 { /* As if _lhs had been called instead of
13338 case FFEBLD_opSYMTER
:
13340 = (ffeinfo_where (ffebld_info (expr
)) == FFEINFO_whereCONSTANT
);
13343 case FFEBLD_opSUBSTR
:
13344 error
= (ffeinfo_where (ffebld_info (expr
))
13345 == FFEINFO_whereCONSTANT_SUBOBJECT
);
13348 case FFEBLD_opARRAYREF
:
13365 assert ("bad context" == NULL
);
13370 if (error
&& ((expr
== NULL
) || (ffebld_op (expr
) != FFEBLD_opANY
)))
13372 ffebad_start (FFEBAD_EXPR_WRONG
);
13373 ffebad_here (0, ffelex_token_where_line (ft
),
13374 ffelex_token_where_column (ft
));
13376 expr
= ffebld_new_any ();
13377 ffebld_set_info (expr
, ffeinfo_new_any ());
13383 /* ffeexpr_token_lhs_ -- Initial state for lhs expression
13385 Return a pointer to this function to the lexer (ffelex), which will
13386 invoke it for the next token.
13388 Basically a smaller version of _rhs_; keep them both in sync, of course. */
13390 static ffelexHandler
13391 ffeexpr_token_lhs_ (ffelexToken t
)
13394 /* When changing the list of valid initial lhs tokens, check whether to
13395 update a corresponding list in ffeexpr_cb_close_paren_ambig_1_ for the
13396 READ (expr) <token> case -- it assumes it knows which tokens <token> can
13397 be to indicate an lhs (or implied DO), which right now is the set
13400 This comment also appears in ffeexpr_token_first_lhs_. */
13402 switch (ffelex_token_type (t
))
13404 case FFELEX_typeNAME
:
13405 case FFELEX_typeNAMES
:
13406 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13407 return (ffelexHandler
) ffeexpr_token_name_lhs_
;
13410 return (ffelexHandler
) ffeexpr_finished_ (t
);
13414 /* ffeexpr_token_rhs_ -- Initial state for rhs expression
13416 Return a pointer to this function to the lexer (ffelex), which will
13417 invoke it for the next token.
13419 The initial state and the post-binary-operator state are the same and
13420 both handled here, with the expression stack used to distinguish
13421 between them. Binary operators are invalid here; unary operators,
13422 constants, subexpressions, and name references are valid. */
13424 static ffelexHandler
13425 ffeexpr_token_rhs_ (ffelexToken t
)
13429 switch (ffelex_token_type (t
))
13431 case FFELEX_typeQUOTE
:
13434 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13435 return (ffelexHandler
) ffeexpr_token_quote_
;
13437 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13438 ffelex_set_expecting_hollerith (-1, '\"',
13439 ffelex_token_where_line (t
),
13440 ffelex_token_where_column (t
));
13441 /* Don't have to unset this one. */
13442 return (ffelexHandler
) ffeexpr_token_apostrophe_
;
13444 case FFELEX_typeAPOSTROPHE
:
13445 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13446 ffelex_set_expecting_hollerith (-1, '\'',
13447 ffelex_token_where_line (t
),
13448 ffelex_token_where_column (t
));
13449 /* Don't have to unset this one. */
13450 return (ffelexHandler
) ffeexpr_token_apostrophe_
;
13452 case FFELEX_typePERCENT
:
13453 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13454 return (ffelexHandler
) ffeexpr_token_percent_
;
13456 case FFELEX_typeOPEN_PAREN
:
13457 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (t
);
13458 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
13459 FFEEXPR_contextPAREN_
,
13460 ffeexpr_cb_close_paren_c_
);
13462 case FFELEX_typePLUS
:
13463 e
= ffeexpr_expr_new_ ();
13464 e
->type
= FFEEXPR_exprtypeUNARY_
;
13465 e
->token
= ffelex_token_use (t
);
13466 e
->u
.operator.op
= FFEEXPR_operatorADD_
;
13467 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceADD_
;
13468 e
->u
.operator.as
= FFEEXPR_operatorassociativityADD_
;
13469 ffeexpr_exprstack_push_unary_ (e
);
13470 return (ffelexHandler
) ffeexpr_token_rhs_
;
13472 case FFELEX_typeMINUS
:
13473 e
= ffeexpr_expr_new_ ();
13474 e
->type
= FFEEXPR_exprtypeUNARY_
;
13475 e
->token
= ffelex_token_use (t
);
13476 e
->u
.operator.op
= FFEEXPR_operatorSUBTRACT_
;
13477 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceSUBTRACT_
;
13478 e
->u
.operator.as
= FFEEXPR_operatorassociativitySUBTRACT_
;
13479 ffeexpr_exprstack_push_unary_ (e
);
13480 return (ffelexHandler
) ffeexpr_token_rhs_
;
13482 case FFELEX_typePERIOD
:
13483 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13484 return (ffelexHandler
) ffeexpr_token_period_
;
13486 case FFELEX_typeNUMBER
:
13487 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13488 ffeexpr_hollerith_count_
= atol (ffelex_token_text (t
));
13489 if (ffeexpr_hollerith_count_
> 0)
13490 ffelex_set_expecting_hollerith (ffeexpr_hollerith_count_
,
13492 ffelex_token_where_line (t
),
13493 ffelex_token_where_column (t
));
13494 return (ffelexHandler
) ffeexpr_token_number_
;
13496 case FFELEX_typeNAME
:
13497 case FFELEX_typeNAMES
:
13498 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
13499 switch (ffeexpr_stack_
->context
)
13501 case FFEEXPR_contextACTUALARG_
:
13502 case FFEEXPR_contextINDEXORACTUALARG_
:
13503 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
13504 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
13505 return (ffelexHandler
) ffeexpr_token_name_arg_
;
13508 return (ffelexHandler
) ffeexpr_token_name_rhs_
;
13511 case FFELEX_typeASTERISK
:
13512 case FFELEX_typeSLASH
:
13513 case FFELEX_typePOWER
:
13514 case FFELEX_typeCONCAT
:
13515 case FFELEX_typeREL_EQ
:
13516 case FFELEX_typeREL_NE
:
13517 case FFELEX_typeREL_LE
:
13518 case FFELEX_typeREL_GE
:
13519 if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND
))
13521 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13524 return (ffelexHandler
) ffeexpr_token_rhs_
;
13527 case FFELEX_typeEQUALS
:
13528 case FFELEX_typePOINTS
:
13529 case FFELEX_typeCLOSE_ANGLE
:
13530 case FFELEX_typeCLOSE_PAREN
:
13531 case FFELEX_typeCOMMA
:
13532 case FFELEX_typeCOLON
:
13533 case FFELEX_typeEOS
:
13534 case FFELEX_typeSEMICOLON
:
13537 return (ffelexHandler
) ffeexpr_finished_ (t
);
13541 /* ffeexpr_token_period_ -- Rhs PERIOD
13543 Return a pointer to this function to the lexer (ffelex), which will
13544 invoke it for the next token.
13546 Handle a period detected at rhs (expecting unary op or operand) state.
13547 Must begin a floating-point value (as in .12) or a dot-dot name, of
13548 which only .NOT., .TRUE., and .FALSE. are truly valid. Other sort-of-
13549 valid names represent binary operators, which are invalid here because
13550 there isn't an operand at the top of the stack. */
13552 static ffelexHandler
13553 ffeexpr_token_period_ (ffelexToken t
)
13555 switch (ffelex_token_type (t
))
13557 case FFELEX_typeNAME
:
13558 case FFELEX_typeNAMES
:
13559 ffeexpr_current_dotdot_
= ffestr_other (t
);
13560 switch (ffeexpr_current_dotdot_
)
13562 case FFESTR_otherNone
:
13563 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD
))
13565 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
13566 ffelex_token_where_column (ffeexpr_tokens_
[0]));
13569 ffelex_token_kill (ffeexpr_tokens_
[0]);
13570 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
13572 case FFESTR_otherTRUE
:
13573 case FFESTR_otherFALSE
:
13574 case FFESTR_otherNOT
:
13575 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
13576 return (ffelexHandler
) ffeexpr_token_end_period_
;
13579 if (ffest_ffebad_start (FFEBAD_MISSING_FIRST_BINARY_OPERAND
))
13581 ffebad_here (0, ffelex_token_where_line (t
),
13582 ffelex_token_where_column (t
));
13585 ffelex_token_kill (ffeexpr_tokens_
[0]);
13586 return (ffelexHandler
) ffeexpr_token_swallow_period_
;
13588 break; /* Nothing really reaches here. */
13590 case FFELEX_typeNUMBER
:
13591 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
13592 return (ffelexHandler
) ffeexpr_token_real_
;
13595 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD
))
13597 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
13598 ffelex_token_where_column (ffeexpr_tokens_
[0]));
13601 ffelex_token_kill (ffeexpr_tokens_
[0]);
13602 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
13606 /* ffeexpr_token_end_period_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
13608 Return a pointer to this function to the lexer (ffelex), which will
13609 invoke it for the next token.
13611 Expecting a period to close a .NOT, .TRUE, or .FALSE at rhs (unary op
13612 or operator) state. If period isn't found, issue a diagnostic but
13613 pretend we saw one. ffeexpr_current_dotdot_ must already contained the
13614 dotdot representation of the name in between the two PERIOD tokens. */
13616 static ffelexHandler
13617 ffeexpr_token_end_period_ (ffelexToken t
)
13621 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
13623 if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD
))
13625 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
13626 ffelex_token_where_column (ffeexpr_tokens_
[0]));
13627 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13628 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[1]));
13633 ffelex_token_kill (ffeexpr_tokens_
[1]); /* Kill "NOT"/"TRUE"/"FALSE"
13636 e
= ffeexpr_expr_new_ ();
13637 e
->token
= ffeexpr_tokens_
[0];
13639 switch (ffeexpr_current_dotdot_
)
13641 case FFESTR_otherNOT
:
13642 e
->type
= FFEEXPR_exprtypeUNARY_
;
13643 e
->u
.operator.op
= FFEEXPR_operatorNOT_
;
13644 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceNOT_
;
13645 e
->u
.operator.as
= FFEEXPR_operatorassociativityNOT_
;
13646 ffeexpr_exprstack_push_unary_ (e
);
13647 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
13648 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
13649 return (ffelexHandler
) ffeexpr_token_rhs_
;
13651 case FFESTR_otherTRUE
:
13652 e
->type
= FFEEXPR_exprtypeOPERAND_
;
13654 = ffebld_new_conter (ffebld_constant_new_logicaldefault (TRUE
));
13655 ffebld_set_info (e
->u
.operand
,
13656 ffeinfo_new (FFEINFO_basictypeLOGICAL
, FFEINFO_kindtypeLOGICALDEFAULT
,
13657 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
13658 ffeexpr_exprstack_push_operand_ (e
);
13659 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
13660 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13661 return (ffelexHandler
) ffeexpr_token_binary_
;
13663 case FFESTR_otherFALSE
:
13664 e
->type
= FFEEXPR_exprtypeOPERAND_
;
13666 = ffebld_new_conter (ffebld_constant_new_logicaldefault (FALSE
));
13667 ffebld_set_info (e
->u
.operand
,
13668 ffeinfo_new (FFEINFO_basictypeLOGICAL
, FFEINFO_kindtypeLOGICALDEFAULT
,
13669 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
13670 ffeexpr_exprstack_push_operand_ (e
);
13671 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
13672 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13673 return (ffelexHandler
) ffeexpr_token_binary_
;
13676 assert ("Bad unary dotdot in ffeexpr_current_dotdot_" == NULL
);
13682 /* ffeexpr_token_swallow_period_ -- Rhs PERIOD NAME(not NOT, TRUE, or FALSE)
13684 Return a pointer to this function to the lexer (ffelex), which will
13685 invoke it for the next token.
13687 A diagnostic has already been issued; just swallow a period if there is
13688 one, then continue with ffeexpr_token_rhs_. */
13690 static ffelexHandler
13691 ffeexpr_token_swallow_period_ (ffelexToken t
)
13693 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
13694 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
13696 return (ffelexHandler
) ffeexpr_token_rhs_
;
13699 /* ffeexpr_token_real_ -- Rhs PERIOD NUMBER
13701 Return a pointer to this function to the lexer (ffelex), which will
13702 invoke it for the next token.
13704 After a period and a string of digits, check next token for possible
13705 exponent designation (D, E, or Q as first/only character) and continue
13706 real-number handling accordingly. Else form basic real constant, push
13707 onto expression stack, and enter binary state using current token (which,
13708 if it is a name not beginning with D, E, or Q, will certainly result
13709 in an error, but that's not for this routine to deal with). */
13711 static ffelexHandler
13712 ffeexpr_token_real_ (ffelexToken t
)
13717 if (((ffelex_token_type (t
) != FFELEX_typeNAME
)
13718 && (ffelex_token_type (t
) != FFELEX_typeNAMES
))
13719 || !(((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
13721 || ffesrc_char_match_init (d
, 'E', 'e')
13722 || ffesrc_char_match_init (d
, 'Q', 'q')))
13723 && ffeexpr_isdigits_ (++p
)))
13726 /* This code has been removed because it seems inconsistent to
13727 produce a diagnostic in this case, but not all of the other
13728 ones that look for an exponent and cannot recognize one. */
13729 if (((ffelex_token_type (t
) == FFELEX_typeNAME
)
13730 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
13731 && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT
))
13735 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13736 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_
[0]),
13737 ffelex_token_where_column (ffeexpr_tokens_
[0]));
13740 ffebad_string (bad
);
13744 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL
,
13745 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
13748 ffelex_token_kill (ffeexpr_tokens_
[0]);
13749 ffelex_token_kill (ffeexpr_tokens_
[1]);
13750 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13753 /* Just exponent character by itself? In which case, PLUS or MINUS must
13754 surely be next, followed by a NUMBER token. */
13758 ffeexpr_tokens_
[2] = ffelex_token_use (t
);
13759 return (ffelexHandler
) ffeexpr_token_real_exponent_
;
13762 ffeexpr_make_float_const_ (d
, NULL
, ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
13765 ffelex_token_kill (ffeexpr_tokens_
[0]);
13766 ffelex_token_kill (ffeexpr_tokens_
[1]);
13767 return (ffelexHandler
) ffeexpr_token_binary_
;
13770 /* ffeexpr_token_real_exponent_ -- Rhs PERIOD NUMBER NAME(D, E, or Q)
13772 Return a pointer to this function to the lexer (ffelex), which will
13773 invoke it for the next token.
13775 Ensures this token is PLUS or MINUS, preserves it, goes to final state
13776 for real number (exponent digits). Else issues diagnostic, assumes a
13777 zero exponent field for number, passes token on to binary state as if
13778 previous token had been "E0" instead of "E", for example. */
13780 static ffelexHandler
13781 ffeexpr_token_real_exponent_ (ffelexToken t
)
13783 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
13784 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
13786 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
13788 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[2]),
13789 ffelex_token_where_column (ffeexpr_tokens_
[2]));
13790 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13794 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL
,
13795 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
13798 ffelex_token_kill (ffeexpr_tokens_
[0]);
13799 ffelex_token_kill (ffeexpr_tokens_
[1]);
13800 ffelex_token_kill (ffeexpr_tokens_
[2]);
13801 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13804 ffeexpr_tokens_
[3] = ffelex_token_use (t
);
13805 return (ffelexHandler
) ffeexpr_token_real_exp_sign_
;
13808 /* ffeexpr_token_real_exp_sign_ -- Rhs PERIOD NUMBER NAME(D,E,Q) PLUS/MINUS
13810 Return a pointer to this function to the lexer (ffelex), which will
13811 invoke it for the next token.
13813 Make sure token is a NUMBER, make a real constant out of all we have and
13814 push it onto the expression stack. Else issue diagnostic and pretend
13815 exponent field was a zero. */
13817 static ffelexHandler
13818 ffeexpr_token_real_exp_sign_ (ffelexToken t
)
13820 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
13822 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
13824 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[2]),
13825 ffelex_token_where_column (ffeexpr_tokens_
[2]));
13826 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13830 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'), NULL
,
13831 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
13834 ffelex_token_kill (ffeexpr_tokens_
[0]);
13835 ffelex_token_kill (ffeexpr_tokens_
[1]);
13836 ffelex_token_kill (ffeexpr_tokens_
[2]);
13837 ffelex_token_kill (ffeexpr_tokens_
[3]);
13838 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13841 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_
[2])[0], NULL
,
13842 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1], ffeexpr_tokens_
[2],
13843 ffeexpr_tokens_
[3], t
);
13845 ffelex_token_kill (ffeexpr_tokens_
[0]);
13846 ffelex_token_kill (ffeexpr_tokens_
[1]);
13847 ffelex_token_kill (ffeexpr_tokens_
[2]);
13848 ffelex_token_kill (ffeexpr_tokens_
[3]);
13849 return (ffelexHandler
) ffeexpr_token_binary_
;
13852 /* ffeexpr_token_number_ -- Rhs NUMBER
13854 Return a pointer to this function to the lexer (ffelex), which will
13855 invoke it for the next token.
13857 If the token is a period, we may have a floating-point number, or an
13858 integer followed by a dotdot binary operator. If the token is a name
13859 beginning with D, E, or Q, we definitely have a floating-point number.
13860 If the token is a hollerith constant, that's what we've got, so push
13861 it onto the expression stack and continue with the binary state.
13863 Otherwise, we have an integer followed by something the binary state
13864 should be able to swallow. */
13866 static ffelexHandler
13867 ffeexpr_token_number_ (ffelexToken t
)
13874 if (ffeexpr_hollerith_count_
> 0)
13875 ffelex_set_expecting_hollerith (0, '\0',
13876 ffewhere_line_unknown (),
13877 ffewhere_column_unknown ());
13879 /* See if we've got a floating-point number here. */
13881 switch (ffelex_token_type (t
))
13883 case FFELEX_typeNAME
:
13884 case FFELEX_typeNAMES
:
13885 if ((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
13887 || ffesrc_char_match_init (d
, 'E', 'e')
13888 || ffesrc_char_match_init (d
, 'Q', 'q'))
13889 && ffeexpr_isdigits_ (++p
))
13892 /* Just exponent character by itself? In which case, PLUS or MINUS
13893 must surely be next, followed by a NUMBER token. */
13897 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
13898 return (ffelexHandler
) ffeexpr_token_number_exponent_
;
13900 ffeexpr_make_float_const_ (d
, ffeexpr_tokens_
[0], NULL
, NULL
, t
,
13903 ffelex_token_kill (ffeexpr_tokens_
[0]);
13904 return (ffelexHandler
) ffeexpr_token_binary_
;
13908 case FFELEX_typePERIOD
:
13909 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
13910 return (ffelexHandler
) ffeexpr_token_number_period_
;
13912 case FFELEX_typeHOLLERITH
:
13913 e
= ffeexpr_expr_new_ ();
13914 e
->type
= FFEEXPR_exprtypeOPERAND_
;
13915 e
->token
= ffeexpr_tokens_
[0];
13916 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_hollerith (t
));
13917 ni
= ffeinfo_new (FFEINFO_basictypeHOLLERITH
, FFEINFO_kindtypeNONE
,
13918 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
13919 ffelex_token_length (t
));
13920 ffebld_set_info (e
->u
.operand
, ni
);
13921 ffeexpr_exprstack_push_operand_ (e
);
13922 return (ffelexHandler
) ffeexpr_token_binary_
;
13928 /* Nothing specific we were looking for, so make an integer and pass the
13929 current token to the binary state. */
13931 ffeexpr_make_float_const_ ('I', ffeexpr_tokens_
[0], NULL
, NULL
,
13933 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
13936 /* ffeexpr_token_number_exponent_ -- Rhs NUMBER NAME(D, E, or Q)
13938 Return a pointer to this function to the lexer (ffelex), which will
13939 invoke it for the next token.
13941 Ensures this token is PLUS or MINUS, preserves it, goes to final state
13942 for real number (exponent digits). Else treats number as integer, passes
13943 name to binary, passes current token to subsequent handler. */
13945 static ffelexHandler
13946 ffeexpr_token_number_exponent_ (ffelexToken t
)
13948 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
13949 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
13952 ffelexHandler nexthandler
;
13954 e
= ffeexpr_expr_new_ ();
13955 e
->type
= FFEEXPR_exprtypeOPERAND_
;
13956 e
->token
= ffeexpr_tokens_
[0];
13957 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerdefault
13958 (ffeexpr_tokens_
[0]));
13959 ffebld_set_info (e
->u
.operand
,
13960 ffeinfo_new (FFEINFO_basictypeINTEGER
, FFEINFO_kindtypeINTEGERDEFAULT
,
13961 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
13962 ffeexpr_exprstack_push_operand_ (e
);
13963 nexthandler
= (ffelexHandler
) ffeexpr_token_binary_ (ffeexpr_tokens_
[1]);
13964 ffelex_token_kill (ffeexpr_tokens_
[1]);
13965 return (ffelexHandler
) (*nexthandler
) (t
);
13968 ffeexpr_tokens_
[2] = ffelex_token_use (t
);
13969 return (ffelexHandler
) ffeexpr_token_number_exp_sign_
;
13972 /* ffeexpr_token_number_exp_sign_ -- Rhs NUMBER NAME(D,E,Q) PLUS/MINUS
13974 Return a pointer to this function to the lexer (ffelex), which will
13975 invoke it for the next token.
13977 Make sure token is a NUMBER, make a real constant out of all we have and
13978 push it onto the expression stack. Else issue diagnostic and pretend
13979 exponent field was a zero. */
13981 static ffelexHandler
13982 ffeexpr_token_number_exp_sign_ (ffelexToken t
)
13984 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
13986 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
13988 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[1]),
13989 ffelex_token_where_column (ffeexpr_tokens_
[1]));
13990 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
13994 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_
[1])[0],
13995 ffeexpr_tokens_
[0], NULL
, NULL
,
13996 ffeexpr_tokens_
[1], ffeexpr_tokens_
[2],
13999 ffelex_token_kill (ffeexpr_tokens_
[0]);
14000 ffelex_token_kill (ffeexpr_tokens_
[1]);
14001 ffelex_token_kill (ffeexpr_tokens_
[2]);
14002 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14005 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_
[1])[0],
14006 ffeexpr_tokens_
[0], NULL
, NULL
,
14007 ffeexpr_tokens_
[1], ffeexpr_tokens_
[2], t
);
14009 ffelex_token_kill (ffeexpr_tokens_
[0]);
14010 ffelex_token_kill (ffeexpr_tokens_
[1]);
14011 ffelex_token_kill (ffeexpr_tokens_
[2]);
14012 return (ffelexHandler
) ffeexpr_token_binary_
;
14015 /* ffeexpr_token_number_period_ -- Rhs NUMBER PERIOD
14017 Return a pointer to this function to the lexer (ffelex), which will
14018 invoke it for the next token.
14020 Handle a period detected following a number at rhs state. Must begin a
14021 floating-point value (as in 1., 1.2, 1.E3, or 1.E+3) or a dot-dot name. */
14023 static ffelexHandler
14024 ffeexpr_token_number_period_ (ffelexToken t
)
14027 ffelexHandler nexthandler
;
14031 switch (ffelex_token_type (t
))
14033 case FFELEX_typeNAME
:
14034 case FFELEX_typeNAMES
:
14035 if ((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
14037 || ffesrc_char_match_init (d
, 'E', 'e')
14038 || ffesrc_char_match_init (d
, 'Q', 'q'))
14039 && ffeexpr_isdigits_ (++p
))
14042 /* Just exponent character by itself? In which case, PLUS or MINUS
14043 must surely be next, followed by a NUMBER token. */
14047 ffeexpr_tokens_
[2] = ffelex_token_use (t
);
14048 return (ffelexHandler
) ffeexpr_token_number_per_exp_
;
14050 ffeexpr_make_float_const_ (d
, ffeexpr_tokens_
[0],
14051 ffeexpr_tokens_
[1], NULL
, t
, NULL
,
14054 ffelex_token_kill (ffeexpr_tokens_
[0]);
14055 ffelex_token_kill (ffeexpr_tokens_
[1]);
14056 return (ffelexHandler
) ffeexpr_token_binary_
;
14058 /* A name not representing an exponent, so assume it will be something
14059 like EQ, make an integer from the number, pass the period to binary
14060 state and the current token to the resulting state. */
14062 e
= ffeexpr_expr_new_ ();
14063 e
->type
= FFEEXPR_exprtypeOPERAND_
;
14064 e
->token
= ffeexpr_tokens_
[0];
14065 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerdefault
14066 (ffeexpr_tokens_
[0]));
14067 ffebld_set_info (e
->u
.operand
,
14068 ffeinfo_new (FFEINFO_basictypeINTEGER
,
14069 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
14070 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
14071 FFETARGET_charactersizeNONE
));
14072 ffeexpr_exprstack_push_operand_ (e
);
14073 nexthandler
= (ffelexHandler
) ffeexpr_token_binary_
14074 (ffeexpr_tokens_
[1]);
14075 ffelex_token_kill (ffeexpr_tokens_
[1]);
14076 return (ffelexHandler
) (*nexthandler
) (t
);
14078 case FFELEX_typeNUMBER
:
14079 ffeexpr_tokens_
[2] = ffelex_token_use (t
);
14080 return (ffelexHandler
) ffeexpr_token_number_real_
;
14086 /* Nothing specific we were looking for, so make a real number and pass the
14087 period and then the current token to the binary state. */
14089 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14090 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14091 NULL
, NULL
, NULL
, NULL
);
14093 ffelex_token_kill (ffeexpr_tokens_
[0]);
14094 ffelex_token_kill (ffeexpr_tokens_
[1]);
14095 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14098 /* ffeexpr_token_number_per_exp_ -- Rhs NUMBER PERIOD NAME(D, E, or Q)
14100 Return a pointer to this function to the lexer (ffelex), which will
14101 invoke it for the next token.
14103 Ensures this token is PLUS or MINUS, preserves it, goes to final state
14104 for real number (exponent digits). Else treats number as real, passes
14105 name to binary, passes current token to subsequent handler. */
14107 static ffelexHandler
14108 ffeexpr_token_number_per_exp_ (ffelexToken t
)
14110 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
14111 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
14113 ffelexHandler nexthandler
;
14115 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14116 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14117 NULL
, NULL
, NULL
, NULL
);
14119 ffelex_token_kill (ffeexpr_tokens_
[0]);
14120 ffelex_token_kill (ffeexpr_tokens_
[1]);
14121 nexthandler
= (ffelexHandler
) ffeexpr_token_binary_ (ffeexpr_tokens_
[2]);
14122 ffelex_token_kill (ffeexpr_tokens_
[2]);
14123 return (ffelexHandler
) (*nexthandler
) (t
);
14126 ffeexpr_tokens_
[3] = ffelex_token_use (t
);
14127 return (ffelexHandler
) ffeexpr_token_num_per_exp_sign_
;
14130 /* ffeexpr_token_number_real_ -- Rhs NUMBER PERIOD NUMBER
14132 Return a pointer to this function to the lexer (ffelex), which will
14133 invoke it for the next token.
14135 After a number, period, and number, check next token for possible
14136 exponent designation (D, E, or Q as first/only character) and continue
14137 real-number handling accordingly. Else form basic real constant, push
14138 onto expression stack, and enter binary state using current token (which,
14139 if it is a name not beginning with D, E, or Q, will certainly result
14140 in an error, but that's not for this routine to deal with). */
14142 static ffelexHandler
14143 ffeexpr_token_number_real_ (ffelexToken t
)
14148 if (((ffelex_token_type (t
) != FFELEX_typeNAME
)
14149 && (ffelex_token_type (t
) != FFELEX_typeNAMES
))
14150 || !(((ffesrc_char_match_init ((d
= *(p
= ffelex_token_text (t
))),
14152 || ffesrc_char_match_init (d
, 'E', 'e')
14153 || ffesrc_char_match_init (d
, 'Q', 'q')))
14154 && ffeexpr_isdigits_ (++p
)))
14157 /* This code has been removed because it seems inconsistent to
14158 produce a diagnostic in this case, but not all of the other
14159 ones that look for an exponent and cannot recognize one. */
14160 if (((ffelex_token_type (t
) == FFELEX_typeNAME
)
14161 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
14162 && ffest_ffebad_start (FFEBAD_INVALID_EXPONENT
))
14166 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14167 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14168 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14171 ffebad_string (bad
);
14175 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14176 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14177 ffeexpr_tokens_
[2], NULL
, NULL
, NULL
);
14179 ffelex_token_kill (ffeexpr_tokens_
[0]);
14180 ffelex_token_kill (ffeexpr_tokens_
[1]);
14181 ffelex_token_kill (ffeexpr_tokens_
[2]);
14182 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14185 /* Just exponent character by itself? In which case, PLUS or MINUS must
14186 surely be next, followed by a NUMBER token. */
14190 ffeexpr_tokens_
[3] = ffelex_token_use (t
);
14191 return (ffelexHandler
) ffeexpr_token_number_real_exp_
;
14194 ffeexpr_make_float_const_ (d
, ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14195 ffeexpr_tokens_
[2], t
, NULL
, NULL
);
14197 ffelex_token_kill (ffeexpr_tokens_
[0]);
14198 ffelex_token_kill (ffeexpr_tokens_
[1]);
14199 ffelex_token_kill (ffeexpr_tokens_
[2]);
14200 return (ffelexHandler
) ffeexpr_token_binary_
;
14203 /* ffeexpr_token_num_per_exp_sign_ -- Rhs NUMBER PERIOD NAME(D,E,Q) PLUS/MINUS
14205 Return a pointer to this function to the lexer (ffelex), which will
14206 invoke it for the next token.
14208 Make sure token is a NUMBER, make a real constant out of all we have and
14209 push it onto the expression stack. Else issue diagnostic and pretend
14210 exponent field was a zero. */
14212 static ffelexHandler
14213 ffeexpr_token_num_per_exp_sign_ (ffelexToken t
)
14215 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
14217 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
14219 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[2]),
14220 ffelex_token_where_column (ffeexpr_tokens_
[2]));
14221 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14225 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14226 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14227 NULL
, NULL
, NULL
, NULL
);
14229 ffelex_token_kill (ffeexpr_tokens_
[0]);
14230 ffelex_token_kill (ffeexpr_tokens_
[1]);
14231 ffelex_token_kill (ffeexpr_tokens_
[2]);
14232 ffelex_token_kill (ffeexpr_tokens_
[3]);
14233 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14236 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_
[2])[0],
14237 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1], NULL
,
14238 ffeexpr_tokens_
[2], ffeexpr_tokens_
[3], t
);
14240 ffelex_token_kill (ffeexpr_tokens_
[0]);
14241 ffelex_token_kill (ffeexpr_tokens_
[1]);
14242 ffelex_token_kill (ffeexpr_tokens_
[2]);
14243 ffelex_token_kill (ffeexpr_tokens_
[3]);
14244 return (ffelexHandler
) ffeexpr_token_binary_
;
14247 /* ffeexpr_token_number_real_exp_ -- Rhs NUMBER PERIOD NUMBER NAME(D, E, or Q)
14249 Return a pointer to this function to the lexer (ffelex), which will
14250 invoke it for the next token.
14252 Ensures this token is PLUS or MINUS, preserves it, goes to final state
14253 for real number (exponent digits). Else issues diagnostic, assumes a
14254 zero exponent field for number, passes token on to binary state as if
14255 previous token had been "E0" instead of "E", for example. */
14257 static ffelexHandler
14258 ffeexpr_token_number_real_exp_ (ffelexToken t
)
14260 if ((ffelex_token_type (t
) != FFELEX_typePLUS
)
14261 && (ffelex_token_type (t
) != FFELEX_typeMINUS
))
14263 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
14265 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[3]),
14266 ffelex_token_where_column (ffeexpr_tokens_
[3]));
14267 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14271 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14272 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14273 ffeexpr_tokens_
[2], NULL
, NULL
, NULL
);
14275 ffelex_token_kill (ffeexpr_tokens_
[0]);
14276 ffelex_token_kill (ffeexpr_tokens_
[1]);
14277 ffelex_token_kill (ffeexpr_tokens_
[2]);
14278 ffelex_token_kill (ffeexpr_tokens_
[3]);
14279 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14282 ffeexpr_tokens_
[4] = ffelex_token_use (t
);
14283 return (ffelexHandler
) ffeexpr_token_num_real_exp_sn_
;
14286 /* ffeexpr_token_num_real_exp_sn_ -- Rhs NUMBER PERIOD NUMBER NAME(D,E,Q)
14289 Return a pointer to this function to the lexer (ffelex), which will
14290 invoke it for the next token.
14292 Make sure token is a NUMBER, make a real constant out of all we have and
14293 push it onto the expression stack. Else issue diagnostic and pretend
14294 exponent field was a zero. */
14296 static ffelexHandler
14297 ffeexpr_token_num_real_exp_sn_ (ffelexToken t
)
14299 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
14301 if (ffest_ffebad_start (FFEBAD_MISSING_EXPONENT_VALUE
))
14303 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[3]),
14304 ffelex_token_where_column (ffeexpr_tokens_
[3]));
14305 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14309 ffeexpr_make_float_const_ (ffesrc_char_internal_init ('E', 'e'),
14310 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14311 ffeexpr_tokens_
[2], NULL
, NULL
, NULL
);
14313 ffelex_token_kill (ffeexpr_tokens_
[0]);
14314 ffelex_token_kill (ffeexpr_tokens_
[1]);
14315 ffelex_token_kill (ffeexpr_tokens_
[2]);
14316 ffelex_token_kill (ffeexpr_tokens_
[3]);
14317 ffelex_token_kill (ffeexpr_tokens_
[4]);
14318 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14321 ffeexpr_make_float_const_ (ffelex_token_text (ffeexpr_tokens_
[3])[0],
14322 ffeexpr_tokens_
[0], ffeexpr_tokens_
[1],
14323 ffeexpr_tokens_
[2], ffeexpr_tokens_
[3],
14324 ffeexpr_tokens_
[4], t
);
14326 ffelex_token_kill (ffeexpr_tokens_
[0]);
14327 ffelex_token_kill (ffeexpr_tokens_
[1]);
14328 ffelex_token_kill (ffeexpr_tokens_
[2]);
14329 ffelex_token_kill (ffeexpr_tokens_
[3]);
14330 ffelex_token_kill (ffeexpr_tokens_
[4]);
14331 return (ffelexHandler
) ffeexpr_token_binary_
;
14334 /* ffeexpr_token_binary_ -- Handle binary operator possibility
14336 Return a pointer to this function to the lexer (ffelex), which will
14337 invoke it for the next token.
14339 The possibility of a binary operator is handled here, meaning the previous
14340 token was an operand. */
14342 static ffelexHandler
14343 ffeexpr_token_binary_ (ffelexToken t
)
14347 if (!ffeexpr_stack_
->is_rhs
)
14348 return (ffelexHandler
) ffeexpr_finished_ (t
); /* For now. */
14350 switch (ffelex_token_type (t
))
14352 case FFELEX_typePLUS
:
14353 e
= ffeexpr_expr_new_ ();
14354 e
->type
= FFEEXPR_exprtypeBINARY_
;
14355 e
->token
= ffelex_token_use (t
);
14356 e
->u
.operator.op
= FFEEXPR_operatorADD_
;
14357 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceADD_
;
14358 e
->u
.operator.as
= FFEEXPR_operatorassociativityADD_
;
14359 ffeexpr_exprstack_push_binary_ (e
);
14360 return (ffelexHandler
) ffeexpr_token_rhs_
;
14362 case FFELEX_typeMINUS
:
14363 e
= ffeexpr_expr_new_ ();
14364 e
->type
= FFEEXPR_exprtypeBINARY_
;
14365 e
->token
= ffelex_token_use (t
);
14366 e
->u
.operator.op
= FFEEXPR_operatorSUBTRACT_
;
14367 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceSUBTRACT_
;
14368 e
->u
.operator.as
= FFEEXPR_operatorassociativitySUBTRACT_
;
14369 ffeexpr_exprstack_push_binary_ (e
);
14370 return (ffelexHandler
) ffeexpr_token_rhs_
;
14372 case FFELEX_typeASTERISK
:
14373 switch (ffeexpr_stack_
->context
)
14375 case FFEEXPR_contextDATA
:
14376 return (ffelexHandler
) ffeexpr_finished_ (t
);
14381 e
= ffeexpr_expr_new_ ();
14382 e
->type
= FFEEXPR_exprtypeBINARY_
;
14383 e
->token
= ffelex_token_use (t
);
14384 e
->u
.operator.op
= FFEEXPR_operatorMULTIPLY_
;
14385 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceMULTIPLY_
;
14386 e
->u
.operator.as
= FFEEXPR_operatorassociativityMULTIPLY_
;
14387 ffeexpr_exprstack_push_binary_ (e
);
14388 return (ffelexHandler
) ffeexpr_token_rhs_
;
14390 case FFELEX_typeSLASH
:
14391 switch (ffeexpr_stack_
->context
)
14393 case FFEEXPR_contextDATA
:
14394 return (ffelexHandler
) ffeexpr_finished_ (t
);
14399 e
= ffeexpr_expr_new_ ();
14400 e
->type
= FFEEXPR_exprtypeBINARY_
;
14401 e
->token
= ffelex_token_use (t
);
14402 e
->u
.operator.op
= FFEEXPR_operatorDIVIDE_
;
14403 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceDIVIDE_
;
14404 e
->u
.operator.as
= FFEEXPR_operatorassociativityDIVIDE_
;
14405 ffeexpr_exprstack_push_binary_ (e
);
14406 return (ffelexHandler
) ffeexpr_token_rhs_
;
14408 case FFELEX_typePOWER
:
14409 e
= ffeexpr_expr_new_ ();
14410 e
->type
= FFEEXPR_exprtypeBINARY_
;
14411 e
->token
= ffelex_token_use (t
);
14412 e
->u
.operator.op
= FFEEXPR_operatorPOWER_
;
14413 e
->u
.operator.prec
= FFEEXPR_operatorprecedencePOWER_
;
14414 e
->u
.operator.as
= FFEEXPR_operatorassociativityPOWER_
;
14415 ffeexpr_exprstack_push_binary_ (e
);
14416 return (ffelexHandler
) ffeexpr_token_rhs_
;
14418 case FFELEX_typeCONCAT
:
14419 e
= ffeexpr_expr_new_ ();
14420 e
->type
= FFEEXPR_exprtypeBINARY_
;
14421 e
->token
= ffelex_token_use (t
);
14422 e
->u
.operator.op
= FFEEXPR_operatorCONCATENATE_
;
14423 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceCONCATENATE_
;
14424 e
->u
.operator.as
= FFEEXPR_operatorassociativityCONCATENATE_
;
14425 ffeexpr_exprstack_push_binary_ (e
);
14426 return (ffelexHandler
) ffeexpr_token_rhs_
;
14428 case FFELEX_typeOPEN_ANGLE
:
14429 switch (ffeexpr_stack_
->context
)
14431 case FFEEXPR_contextFORMAT
:
14432 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN
);
14433 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14440 e
= ffeexpr_expr_new_ ();
14441 e
->type
= FFEEXPR_exprtypeBINARY_
;
14442 e
->token
= ffelex_token_use (t
);
14443 e
->u
.operator.op
= FFEEXPR_operatorLT_
;
14444 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceLT_
;
14445 e
->u
.operator.as
= FFEEXPR_operatorassociativityLT_
;
14446 ffeexpr_exprstack_push_binary_ (e
);
14447 return (ffelexHandler
) ffeexpr_token_rhs_
;
14449 case FFELEX_typeCLOSE_ANGLE
:
14450 switch (ffeexpr_stack_
->context
)
14452 case FFEEXPR_contextFORMAT
:
14453 return ffeexpr_finished_ (t
);
14458 e
= ffeexpr_expr_new_ ();
14459 e
->type
= FFEEXPR_exprtypeBINARY_
;
14460 e
->token
= ffelex_token_use (t
);
14461 e
->u
.operator.op
= FFEEXPR_operatorGT_
;
14462 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceGT_
;
14463 e
->u
.operator.as
= FFEEXPR_operatorassociativityGT_
;
14464 ffeexpr_exprstack_push_binary_ (e
);
14465 return (ffelexHandler
) ffeexpr_token_rhs_
;
14467 case FFELEX_typeREL_EQ
:
14468 switch (ffeexpr_stack_
->context
)
14470 case FFEEXPR_contextFORMAT
:
14471 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN
);
14472 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14479 e
= ffeexpr_expr_new_ ();
14480 e
->type
= FFEEXPR_exprtypeBINARY_
;
14481 e
->token
= ffelex_token_use (t
);
14482 e
->u
.operator.op
= FFEEXPR_operatorEQ_
;
14483 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceEQ_
;
14484 e
->u
.operator.as
= FFEEXPR_operatorassociativityEQ_
;
14485 ffeexpr_exprstack_push_binary_ (e
);
14486 return (ffelexHandler
) ffeexpr_token_rhs_
;
14488 case FFELEX_typeREL_NE
:
14489 switch (ffeexpr_stack_
->context
)
14491 case FFEEXPR_contextFORMAT
:
14492 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN
);
14493 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14500 e
= ffeexpr_expr_new_ ();
14501 e
->type
= FFEEXPR_exprtypeBINARY_
;
14502 e
->token
= ffelex_token_use (t
);
14503 e
->u
.operator.op
= FFEEXPR_operatorNE_
;
14504 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceNE_
;
14505 e
->u
.operator.as
= FFEEXPR_operatorassociativityNE_
;
14506 ffeexpr_exprstack_push_binary_ (e
);
14507 return (ffelexHandler
) ffeexpr_token_rhs_
;
14509 case FFELEX_typeREL_LE
:
14510 switch (ffeexpr_stack_
->context
)
14512 case FFEEXPR_contextFORMAT
:
14513 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN
);
14514 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14521 e
= ffeexpr_expr_new_ ();
14522 e
->type
= FFEEXPR_exprtypeBINARY_
;
14523 e
->token
= ffelex_token_use (t
);
14524 e
->u
.operator.op
= FFEEXPR_operatorLE_
;
14525 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceLE_
;
14526 e
->u
.operator.as
= FFEEXPR_operatorassociativityLE_
;
14527 ffeexpr_exprstack_push_binary_ (e
);
14528 return (ffelexHandler
) ffeexpr_token_rhs_
;
14530 case FFELEX_typeREL_GE
:
14531 switch (ffeexpr_stack_
->context
)
14533 case FFEEXPR_contextFORMAT
:
14534 ffebad_start (FFEBAD_FORMAT_EXPR_TOKEN
);
14535 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14542 e
= ffeexpr_expr_new_ ();
14543 e
->type
= FFEEXPR_exprtypeBINARY_
;
14544 e
->token
= ffelex_token_use (t
);
14545 e
->u
.operator.op
= FFEEXPR_operatorGE_
;
14546 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceGE_
;
14547 e
->u
.operator.as
= FFEEXPR_operatorassociativityGE_
;
14548 ffeexpr_exprstack_push_binary_ (e
);
14549 return (ffelexHandler
) ffeexpr_token_rhs_
;
14551 case FFELEX_typePERIOD
:
14552 ffeexpr_tokens_
[0] = ffelex_token_use (t
);
14553 return (ffelexHandler
) ffeexpr_token_binary_period_
;
14556 case FFELEX_typeOPEN_PAREN
:
14557 case FFELEX_typeCLOSE_PAREN
:
14558 case FFELEX_typeEQUALS
:
14559 case FFELEX_typePOINTS
:
14560 case FFELEX_typeCOMMA
:
14561 case FFELEX_typeCOLON
:
14562 case FFELEX_typeEOS
:
14563 case FFELEX_typeSEMICOLON
:
14564 case FFELEX_typeNAME
:
14565 case FFELEX_typeNAMES
:
14568 return (ffelexHandler
) ffeexpr_finished_ (t
);
14572 /* ffeexpr_token_binary_period_ -- Binary PERIOD
14574 Return a pointer to this function to the lexer (ffelex), which will
14575 invoke it for the next token.
14577 Handle a period detected at binary (expecting binary op or end) state.
14578 Must begin a dot-dot name, of which .NOT., .TRUE., and .FALSE. are not
14581 static ffelexHandler
14582 ffeexpr_token_binary_period_ (ffelexToken t
)
14584 ffeexprExpr_ operand
;
14586 switch (ffelex_token_type (t
))
14588 case FFELEX_typeNAME
:
14589 case FFELEX_typeNAMES
:
14590 ffeexpr_current_dotdot_
= ffestr_other (t
);
14591 switch (ffeexpr_current_dotdot_
)
14593 case FFESTR_otherTRUE
:
14594 case FFESTR_otherFALSE
:
14595 case FFESTR_otherNOT
:
14596 if (ffest_ffebad_start (FFEBAD_MISSING_BINARY_OPERATOR
))
14598 operand
= ffeexpr_stack_
->exprstack
;
14599 assert (operand
!= NULL
);
14600 assert (operand
->type
== FFEEXPR_exprtypeOPERAND_
);
14601 ffebad_here (0, ffelex_token_where_line (operand
->token
), ffelex_token_where_column (operand
->token
));
14602 ffebad_here (1, ffelex_token_where_line (t
),
14603 ffelex_token_where_column (t
));
14606 ffelex_token_kill (ffeexpr_tokens_
[0]);
14607 return (ffelexHandler
) ffeexpr_token_binary_sw_per_
;
14610 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
14611 return (ffelexHandler
) ffeexpr_token_binary_end_per_
;
14613 break; /* Nothing really reaches here. */
14616 if (ffest_ffebad_start (FFEBAD_IGNORING_PERIOD
))
14618 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14619 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14622 ffelex_token_kill (ffeexpr_tokens_
[0]);
14623 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14627 /* ffeexpr_token_binary_end_per_ -- Binary PERIOD NAME(not NOT, TRUE, or FALSE)
14629 Return a pointer to this function to the lexer (ffelex), which will
14630 invoke it for the next token.
14632 Expecting a period to close a dot-dot at binary (binary op
14633 or operator) state. If period isn't found, issue a diagnostic but
14634 pretend we saw one. ffeexpr_current_dotdot_ must already contained the
14635 dotdot representation of the name in between the two PERIOD tokens. */
14637 static ffelexHandler
14638 ffeexpr_token_binary_end_per_ (ffelexToken t
)
14642 e
= ffeexpr_expr_new_ ();
14643 e
->type
= FFEEXPR_exprtypeBINARY_
;
14644 e
->token
= ffeexpr_tokens_
[0];
14646 switch (ffeexpr_current_dotdot_
)
14648 case FFESTR_otherAND
:
14649 e
->u
.operator.op
= FFEEXPR_operatorAND_
;
14650 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceAND_
;
14651 e
->u
.operator.as
= FFEEXPR_operatorassociativityAND_
;
14654 case FFESTR_otherOR
:
14655 e
->u
.operator.op
= FFEEXPR_operatorOR_
;
14656 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceOR_
;
14657 e
->u
.operator.as
= FFEEXPR_operatorassociativityOR_
;
14660 case FFESTR_otherXOR
:
14661 e
->u
.operator.op
= FFEEXPR_operatorXOR_
;
14662 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceXOR_
;
14663 e
->u
.operator.as
= FFEEXPR_operatorassociativityXOR_
;
14666 case FFESTR_otherEQV
:
14667 e
->u
.operator.op
= FFEEXPR_operatorEQV_
;
14668 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceEQV_
;
14669 e
->u
.operator.as
= FFEEXPR_operatorassociativityEQV_
;
14672 case FFESTR_otherNEQV
:
14673 e
->u
.operator.op
= FFEEXPR_operatorNEQV_
;
14674 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceNEQV_
;
14675 e
->u
.operator.as
= FFEEXPR_operatorassociativityNEQV_
;
14678 case FFESTR_otherLT
:
14679 e
->u
.operator.op
= FFEEXPR_operatorLT_
;
14680 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceLT_
;
14681 e
->u
.operator.as
= FFEEXPR_operatorassociativityLT_
;
14684 case FFESTR_otherLE
:
14685 e
->u
.operator.op
= FFEEXPR_operatorLE_
;
14686 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceLE_
;
14687 e
->u
.operator.as
= FFEEXPR_operatorassociativityLE_
;
14690 case FFESTR_otherEQ
:
14691 e
->u
.operator.op
= FFEEXPR_operatorEQ_
;
14692 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceEQ_
;
14693 e
->u
.operator.as
= FFEEXPR_operatorassociativityEQ_
;
14696 case FFESTR_otherNE
:
14697 e
->u
.operator.op
= FFEEXPR_operatorNE_
;
14698 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceNE_
;
14699 e
->u
.operator.as
= FFEEXPR_operatorassociativityNE_
;
14702 case FFESTR_otherGT
:
14703 e
->u
.operator.op
= FFEEXPR_operatorGT_
;
14704 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceGT_
;
14705 e
->u
.operator.as
= FFEEXPR_operatorassociativityGT_
;
14708 case FFESTR_otherGE
:
14709 e
->u
.operator.op
= FFEEXPR_operatorGE_
;
14710 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceGE_
;
14711 e
->u
.operator.as
= FFEEXPR_operatorassociativityGE_
;
14715 if (ffest_ffebad_start (FFEBAD_INVALID_DOTDOT
))
14717 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14718 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14719 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[1]));
14722 e
->u
.operator.op
= FFEEXPR_operatorEQ_
;
14723 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceEQ_
;
14724 e
->u
.operator.as
= FFEEXPR_operatorassociativityEQ_
;
14728 ffeexpr_exprstack_push_binary_ (e
);
14730 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
14732 if (ffest_ffebad_start (FFEBAD_INSERTING_PERIOD
))
14734 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14735 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14736 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14737 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[1]));
14740 ffelex_token_kill (ffeexpr_tokens_
[1]); /* Kill dot-dot token. */
14741 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
14744 ffelex_token_kill (ffeexpr_tokens_
[1]); /* Kill dot-dot token. */
14745 return (ffelexHandler
) ffeexpr_token_rhs_
;
14748 /* ffeexpr_token_binary_sw_per_ -- Rhs PERIOD NAME(NOT, TRUE, or FALSE)
14750 Return a pointer to this function to the lexer (ffelex), which will
14751 invoke it for the next token.
14753 A diagnostic has already been issued; just swallow a period if there is
14754 one, then continue with ffeexpr_token_binary_. */
14756 static ffelexHandler
14757 ffeexpr_token_binary_sw_per_ (ffelexToken t
)
14759 if (ffelex_token_type (t
) != FFELEX_typePERIOD
)
14760 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
14762 return (ffelexHandler
) ffeexpr_token_binary_
;
14765 /* ffeexpr_token_quote_ -- Rhs QUOTE
14767 Return a pointer to this function to the lexer (ffelex), which will
14768 invoke it for the next token.
14770 Expecting a NUMBER that we'll treat as an octal integer. */
14772 static ffelexHandler
14773 ffeexpr_token_quote_ (ffelexToken t
)
14778 if (ffelex_token_type (t
) != FFELEX_typeNUMBER
)
14780 if (ffest_ffebad_start (FFEBAD_QUOTE_MISSES_DIGITS
))
14782 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14783 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14784 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14787 ffelex_token_kill (ffeexpr_tokens_
[0]);
14788 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
14791 /* This is kind of a kludge to prevent any whining about magical numbers
14792 that start out as these octal integers, so "20000000000 (on a 32-bit
14793 2's-complement machine) by itself won't produce an error. */
14795 anyexpr
= ffebld_new_any ();
14796 ffebld_set_info (anyexpr
, ffeinfo_new_any ());
14798 e
= ffeexpr_expr_new_ ();
14799 e
->type
= FFEEXPR_exprtypeOPERAND_
;
14800 e
->token
= ffeexpr_tokens_
[0];
14801 e
->u
.operand
= ffebld_new_conter_with_orig
14802 (ffebld_constant_new_integeroctal (t
), anyexpr
);
14803 ffebld_set_info (e
->u
.operand
, ffeinfo_new (FFEINFO_basictypeINTEGER
,
14804 FFEINFO_kindtypeINTEGERDEFAULT
, 0, FFEINFO_kindENTITY
,
14805 FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
14806 ffeexpr_exprstack_push_operand_ (e
);
14807 return (ffelexHandler
) ffeexpr_token_binary_
;
14810 /* ffeexpr_token_apostrophe_ -- Rhs APOSTROPHE
14812 Return a pointer to this function to the lexer (ffelex), which will
14813 invoke it for the next token.
14815 Handle an open-apostrophe, which begins either a character ('char-const'),
14816 typeless octal ('octal-const'O), or typeless hexadecimal ('hex-const'Z or
14817 'hex-const'X) constant. */
14819 static ffelexHandler
14820 ffeexpr_token_apostrophe_ (ffelexToken t
)
14822 assert (ffelex_token_type (t
) == FFELEX_typeCHARACTER
);
14823 if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t
) == 0))
14825 ffebad_start (FFEBAD_NULL_CHAR_CONST
);
14826 ffebad_here (0, ffelex_token_where_line (t
),
14827 ffelex_token_where_column (t
));
14830 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
14831 return (ffelexHandler
) ffeexpr_token_apos_char_
;
14834 /* ffeexpr_token_apos_char_ -- Rhs APOSTROPHE CHARACTER
14836 Return a pointer to this function to the lexer (ffelex), which will
14837 invoke it for the next token.
14839 Close-apostrophe is implicit; if this token is NAME, it is a possible
14840 typeless-constant radix specifier. */
14842 static ffelexHandler
14843 ffeexpr_token_apos_char_ (ffelexToken t
)
14848 ffetargetCharacterSize size
;
14850 if ((ffelex_token_type (t
) == FFELEX_typeNAME
)
14851 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
14853 if ((ffelex_token_length (t
) == 1)
14854 && (ffesrc_char_match_init ((c
= ffelex_token_text (t
)[0]), 'B',
14856 || ffesrc_char_match_init (c
, 'O', 'o')
14857 || ffesrc_char_match_init (c
, 'X', 'x')
14858 || ffesrc_char_match_init (c
, 'Z', 'z')))
14860 e
= ffeexpr_expr_new_ ();
14861 e
->type
= FFEEXPR_exprtypeOPERAND_
;
14862 e
->token
= ffeexpr_tokens_
[0];
14865 case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b
, no_match
):
14866 e
->u
.operand
= ffebld_new_conter
14867 (ffebld_constant_new_typeless_bv (ffeexpr_tokens_
[1]));
14868 size
= ffetarget_size_typeless_binary (ffeexpr_tokens_
[1]);
14871 case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o
, no_match
):
14872 e
->u
.operand
= ffebld_new_conter
14873 (ffebld_constant_new_typeless_ov (ffeexpr_tokens_
[1]));
14874 size
= ffetarget_size_typeless_octal (ffeexpr_tokens_
[1]);
14877 case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x
, no_match
):
14878 e
->u
.operand
= ffebld_new_conter
14879 (ffebld_constant_new_typeless_hxv (ffeexpr_tokens_
[1]));
14880 size
= ffetarget_size_typeless_hex (ffeexpr_tokens_
[1]);
14883 case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z
, no_match
):
14884 e
->u
.operand
= ffebld_new_conter
14885 (ffebld_constant_new_typeless_hzv (ffeexpr_tokens_
[1]));
14886 size
= ffetarget_size_typeless_hex (ffeexpr_tokens_
[1]);
14890 no_match
: /* :::::::::::::::::::: */
14891 assert ("not BOXZ!" == NULL
);
14895 ffebld_set_info (e
->u
.operand
,
14896 ffeinfo_new (FFEINFO_basictypeTYPELESS
, FFEINFO_kindtypeNONE
,
14897 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, size
));
14898 ffeexpr_exprstack_push_operand_ (e
);
14899 ffelex_token_kill (ffeexpr_tokens_
[1]);
14900 return (ffelexHandler
) ffeexpr_token_binary_
;
14903 e
= ffeexpr_expr_new_ ();
14904 e
->type
= FFEEXPR_exprtypeOPERAND_
;
14905 e
->token
= ffeexpr_tokens_
[0];
14906 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_characterdefault
14907 (ffeexpr_tokens_
[1]));
14908 ni
= ffeinfo_new (FFEINFO_basictypeCHARACTER
, FFEINFO_kindtypeCHARACTERDEFAULT
,
14909 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
14910 ffelex_token_length (ffeexpr_tokens_
[1]));
14911 ffebld_set_info (e
->u
.operand
, ni
);
14912 ffelex_token_kill (ffeexpr_tokens_
[1]);
14913 ffeexpr_exprstack_push_operand_ (e
);
14914 if ((ffelex_token_type (t
) == FFELEX_typeNAME
)
14915 || (ffelex_token_type (t
) == FFELEX_typeNAMES
))
14917 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER
))
14919 ffebad_string (ffelex_token_text (t
));
14920 ffebad_here (0, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
14921 ffebad_here (1, ffelex_token_where_line (ffeexpr_tokens_
[0]),
14922 ffelex_token_where_column (ffeexpr_tokens_
[0]));
14925 e
= ffeexpr_expr_new_ ();
14926 e
->type
= FFEEXPR_exprtypeBINARY_
;
14927 e
->token
= ffelex_token_use (t
);
14928 e
->u
.operator.op
= FFEEXPR_operatorCONCATENATE_
;
14929 e
->u
.operator.prec
= FFEEXPR_operatorprecedenceCONCATENATE_
;
14930 e
->u
.operator.as
= FFEEXPR_operatorassociativityCONCATENATE_
;
14931 ffeexpr_exprstack_push_binary_ (e
);
14932 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
14934 ffeexpr_is_substr_ok_
= !ffe_is_pedantic_not_90 (); /* Allow "'hello'(3:5)". */
14935 return (ffelexHandler
) ffeexpr_token_substrp_ (t
);
14938 /* ffeexpr_token_name_lhs_ -- Lhs NAME
14940 Return a pointer to this function to the lexer (ffelex), which will
14941 invoke it for the next token.
14943 Handle a name followed by open-paren, period (RECORD.MEMBER), percent
14944 (RECORD%MEMBER), or nothing at all. */
14946 static ffelexHandler
14947 ffeexpr_token_name_lhs_ (ffelexToken t
)
14950 ffeexprParenType_ paren_type
;
14955 switch (ffelex_token_type (t
))
14957 case FFELEX_typeOPEN_PAREN
:
14958 switch (ffeexpr_stack_
->context
)
14960 case FFEEXPR_contextASSIGN
:
14961 case FFEEXPR_contextAGOTO
:
14962 case FFEEXPR_contextFILEUNIT_DF
:
14963 goto just_name
; /* :::::::::::::::::::: */
14968 e
= ffeexpr_expr_new_ ();
14969 e
->type
= FFEEXPR_exprtypeOPERAND_
;
14970 e
->token
= ffelex_token_use (ffeexpr_tokens_
[0]);
14971 s
= ffeexpr_declare_parenthesized_ (ffeexpr_tokens_
[0], FALSE
,
14974 switch (ffesymbol_where (s
))
14976 case FFEINFO_whereLOCAL
:
14977 if (ffeexpr_stack_
->context
== FFEEXPR_contextSUBROUTINEREF
)
14978 ffesymbol_error (s
, ffeexpr_tokens_
[0]); /* Recursion. */
14981 case FFEINFO_whereINTRINSIC
:
14982 case FFEINFO_whereGLOBAL
:
14983 if (ffeexpr_stack_
->context
!= FFEEXPR_contextSUBROUTINEREF
)
14984 ffesymbol_error (s
, ffeexpr_tokens_
[0]); /* Can call intrin. */
14987 case FFEINFO_whereCOMMON
:
14988 case FFEINFO_whereDUMMY
:
14989 case FFEINFO_whereRESULT
:
14992 case FFEINFO_whereNONE
:
14993 case FFEINFO_whereANY
:
14997 ffesymbol_error (s
, ffeexpr_tokens_
[0]);
15001 if (ffesymbol_attrs (s
) & FFESYMBOL_attrsANY
)
15003 e
->u
.operand
= ffebld_new_any ();
15004 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
15008 e
->u
.operand
= ffebld_new_symter (s
,
15009 ffesymbol_generic (s
),
15010 ffesymbol_specific (s
),
15011 ffesymbol_implementation (s
));
15012 ffebld_set_info (e
->u
.operand
, ffesymbol_info (s
));
15014 ffeexpr_exprstack_push_ (e
); /* Not a complete operand yet. */
15015 ffeexpr_stack_
->tokens
[0] = ffeexpr_tokens_
[0];
15016 switch (paren_type
)
15018 case FFEEXPR_parentypeSUBROUTINE_
:
15019 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
15022 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15023 FFEEXPR_contextACTUALARG_
,
15024 ffeexpr_token_arguments_
);
15026 case FFEEXPR_parentypeARRAY_
:
15027 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
15028 ffeexpr_stack_
->bound_list
= ffesymbol_dims (s
);
15029 ffeexpr_stack_
->rank
= 0;
15030 ffeexpr_stack_
->constant
= TRUE
;
15031 ffeexpr_stack_
->immediate
= TRUE
;
15032 switch (ffeexpr_stack_
->context
)
15034 case FFEEXPR_contextDATAIMPDOITEM_
:
15037 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15038 FFEEXPR_contextDATAIMPDOINDEX_
,
15039 ffeexpr_token_elements_
);
15041 case FFEEXPR_contextEQUIVALENCE
:
15044 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15045 FFEEXPR_contextEQVINDEX_
,
15046 ffeexpr_token_elements_
);
15051 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15052 FFEEXPR_contextINDEX_
,
15053 ffeexpr_token_elements_
);
15056 case FFEEXPR_parentypeSUBSTRING_
:
15057 e
->u
.operand
= ffeexpr_collapse_symter (e
->u
.operand
,
15058 ffeexpr_tokens_
[0]);
15061 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15062 FFEEXPR_contextINDEX_
,
15063 ffeexpr_token_substring_
);
15065 case FFEEXPR_parentypeEQUIVALENCE_
:
15066 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
15067 ffeexpr_stack_
->bound_list
= ffesymbol_dims (s
);
15068 ffeexpr_stack_
->rank
= 0;
15069 ffeexpr_stack_
->constant
= TRUE
;
15070 ffeexpr_stack_
->immediate
= TRUE
;
15073 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15074 FFEEXPR_contextEQVINDEX_
,
15075 ffeexpr_token_equivalence_
);
15077 case FFEEXPR_parentypeFUNCTION_
: /* Invalid case. */
15078 case FFEEXPR_parentypeFUNSUBSTR_
: /* Invalid case. */
15079 ffesymbol_error (s
, ffeexpr_tokens_
[0]);
15080 /* Fall through. */
15081 case FFEEXPR_parentypeANY_
:
15082 e
->u
.operand
= ffebld_new_any ();
15083 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
15086 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15087 FFEEXPR_contextACTUALARG_
,
15088 ffeexpr_token_anything_
);
15091 assert ("bad paren type" == NULL
);
15095 case FFELEX_typeEQUALS
: /* As in "VAR=". */
15096 switch (ffeexpr_stack_
->context
)
15098 case FFEEXPR_contextIMPDOITEM_
: /* within
15099 "(,VAR=start,end[,incr])". */
15100 case FFEEXPR_contextIMPDOITEMDF_
:
15101 ffeexpr_stack_
->context
= FFEEXPR_contextIMPDOCTRL_
;
15104 case FFEEXPR_contextDATAIMPDOITEM_
:
15105 ffeexpr_stack_
->context
= FFEEXPR_contextDATAIMPDOCTRL_
;
15114 case FFELEX_typePERIOD
:
15115 case FFELEX_typePERCENT
:
15116 assert ("FOO%, FOO. not yet supported!~~" == NULL
);
15124 just_name
: /* :::::::::::::::::::: */
15125 e
= ffeexpr_expr_new_ ();
15126 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15127 e
->token
= ffeexpr_tokens_
[0];
15128 s
= ffeexpr_declare_unadorned_ (ffeexpr_tokens_
[0],
15129 (ffeexpr_stack_
->context
15130 == FFEEXPR_contextSUBROUTINEREF
));
15132 switch (ffesymbol_where (s
))
15134 case FFEINFO_whereCONSTANT
:
15135 if ((ffeexpr_stack_
->context
!= FFEEXPR_contextPARAMETER
)
15136 || (ffesymbol_kind (s
) != FFEINFO_kindENTITY
))
15137 ffesymbol_error (s
, ffeexpr_tokens_
[0]);
15140 case FFEINFO_whereIMMEDIATE
:
15141 if ((ffeexpr_stack_
->context
!= FFEEXPR_contextDATAIMPDOCTRL_
)
15142 && (ffeexpr_stack_
->context
!= FFEEXPR_contextDATAIMPDOINDEX_
))
15143 ffesymbol_error (s
, ffeexpr_tokens_
[0]);
15146 case FFEINFO_whereLOCAL
:
15147 if (ffeexpr_stack_
->context
== FFEEXPR_contextSUBROUTINEREF
)
15148 ffesymbol_error (s
, ffeexpr_tokens_
[0]); /* Recurse!. */
15151 case FFEINFO_whereINTRINSIC
:
15152 if (ffeexpr_stack_
->context
!= FFEEXPR_contextSUBROUTINEREF
)
15153 ffesymbol_error (s
, ffeexpr_tokens_
[0]); /* Can call intrin. */
15160 if (ffesymbol_attrs (s
) & FFESYMBOL_attrsANY
)
15162 expr
= ffebld_new_any ();
15163 info
= ffeinfo_new_any ();
15164 ffebld_set_info (expr
, info
);
15168 expr
= ffebld_new_symter (s
,
15169 ffesymbol_generic (s
),
15170 ffesymbol_specific (s
),
15171 ffesymbol_implementation (s
));
15172 info
= ffesymbol_info (s
);
15173 ffebld_set_info (expr
, info
);
15174 if (ffesymbol_is_doiter (s
))
15176 ffebad_start (FFEBAD_DOITER
);
15177 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15178 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15179 ffest_ffebad_here_doiter (1, s
);
15180 ffebad_string (ffesymbol_text (s
));
15183 expr
= ffeexpr_collapse_symter (expr
, ffeexpr_tokens_
[0]);
15186 if (ffeexpr_stack_
->context
== FFEEXPR_contextSUBROUTINEREF
)
15188 if (ffebld_op (expr
) == FFEBLD_opANY
)
15190 expr
= ffebld_new_any ();
15191 ffebld_set_info (expr
, ffeinfo_new_any ());
15195 expr
= ffebld_new_subrref (expr
, NULL
); /* No argument list. */
15196 if (ffesymbol_generic (s
) != FFEINTRIN_genNONE
)
15197 ffeintrin_fulfill_generic (&expr
, &info
, e
->token
);
15198 else if (ffesymbol_specific (s
) != FFEINTRIN_specNONE
)
15199 ffeintrin_fulfill_specific (&expr
, &info
, NULL
, e
->token
);
15201 ffeexpr_fulfill_call_ (&expr
, e
->token
);
15203 if (ffebld_op (expr
) != FFEBLD_opANY
)
15204 ffebld_set_info (expr
,
15205 ffeinfo_new (ffeinfo_basictype (info
),
15206 ffeinfo_kindtype (info
),
15208 FFEINFO_kindENTITY
,
15209 FFEINFO_whereFLEETING
,
15210 ffeinfo_size (info
)));
15212 ffebld_set_info (expr
, ffeinfo_new_any ());
15216 e
->u
.operand
= expr
;
15217 ffeexpr_exprstack_push_operand_ (e
);
15218 return (ffelexHandler
) ffeexpr_finished_ (t
);
15221 /* ffeexpr_token_name_arg_ -- Rhs NAME
15223 Return a pointer to this function to the lexer (ffelex), which will
15224 invoke it for the next token.
15226 Handle first token in an actual-arg (or possible actual-arg) context
15227 being a NAME, and use second token to refine the context. */
15229 static ffelexHandler
15230 ffeexpr_token_name_arg_ (ffelexToken t
)
15232 switch (ffelex_token_type (t
))
15234 case FFELEX_typeCLOSE_PAREN
:
15235 case FFELEX_typeCOMMA
:
15236 switch (ffeexpr_stack_
->context
)
15238 case FFEEXPR_contextINDEXORACTUALARG_
:
15239 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARG_
;
15242 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
15243 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARG_
;
15252 switch (ffeexpr_stack_
->context
)
15254 case FFEEXPR_contextACTUALARG_
:
15255 ffeexpr_stack_
->context
= FFEEXPR_contextACTUALARGEXPR_
;
15258 case FFEEXPR_contextINDEXORACTUALARG_
:
15259 ffeexpr_stack_
->context
= FFEEXPR_contextINDEXORACTUALARGEXPR_
;
15262 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
15263 ffeexpr_stack_
->context
= FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
;
15266 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
15267 ffeexpr_stack_
->context
15268 = FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
;
15272 assert ("bad context in _name_arg_" == NULL
);
15278 return (ffelexHandler
) ffeexpr_token_name_rhs_ (t
);
15281 /* ffeexpr_token_name_rhs_ -- Rhs NAME
15283 Return a pointer to this function to the lexer (ffelex), which will
15284 invoke it for the next token.
15286 Handle a name followed by open-paren, apostrophe (O'octal-const',
15287 Z'hex-const', or X'hex-const'), period (RECORD.MEMBER).
15290 When followed by apostrophe or quote, set lex hexnum flag on so
15291 [0-9] as first char of next token seen as starting a potentially
15294 In case of intrinsic, decorate its SYMTER with the type info for
15295 the specific intrinsic. */
15297 static ffelexHandler
15298 ffeexpr_token_name_rhs_ (ffelexToken t
)
15301 ffeexprParenType_ paren_type
;
15305 switch (ffelex_token_type (t
))
15307 case FFELEX_typeQUOTE
:
15308 case FFELEX_typeAPOSTROPHE
:
15309 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
15310 ffelex_set_hexnum (TRUE
);
15311 return (ffelexHandler
) ffeexpr_token_name_apos_
;
15313 case FFELEX_typeOPEN_PAREN
:
15314 e
= ffeexpr_expr_new_ ();
15315 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15316 e
->token
= ffelex_token_use (ffeexpr_tokens_
[0]);
15317 s
= ffeexpr_declare_parenthesized_ (ffeexpr_tokens_
[0], TRUE
,
15319 if (ffesymbol_attrs (s
) & FFESYMBOL_attrsANY
)
15320 e
->u
.operand
= ffebld_new_any ();
15322 e
->u
.operand
= ffebld_new_symter (s
, ffesymbol_generic (s
),
15323 ffesymbol_specific (s
),
15324 ffesymbol_implementation (s
));
15325 ffeexpr_exprstack_push_ (e
); /* Not a complete operand yet. */
15326 ffeexpr_stack_
->tokens
[0] = ffeexpr_tokens_
[0];
15327 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
15329 case FFEEXPR_contextSFUNCDEF
:
15330 case FFEEXPR_contextSFUNCDEFINDEX_
:
15331 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
15332 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
15336 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
15337 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
15338 assert ("weird context!" == NULL
);
15346 switch (paren_type
)
15348 case FFEEXPR_parentypeFUNCTION_
:
15349 ffebld_set_info (e
->u
.operand
, ffesymbol_info (s
));
15350 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
15351 if (ffesymbol_where (s
) == FFEINFO_whereCONSTANT
)
15352 { /* A statement function. */
15353 ffeexpr_stack_
->num_args
15354 = ffebld_list_length
15355 (ffeexpr_stack_
->next_dummy
15356 = ffesymbol_dummyargs (s
));
15357 ffeexpr_stack_
->tokens
[1] = NULL
; /* !=NULL when > num_args. */
15359 else if ((ffesymbol_where (s
) == FFEINFO_whereINTRINSIC
)
15360 && !ffe_is_pedantic_not_90 ()
15361 && ((ffesymbol_implementation (s
)
15362 == FFEINTRIN_impICHAR
)
15363 || (ffesymbol_implementation (s
)
15364 == FFEINTRIN_impIACHAR
)
15365 || (ffesymbol_implementation (s
)
15366 == FFEINTRIN_impLEN
)))
15367 { /* Allow arbitrary concatenations. */
15370 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15372 ? FFEEXPR_contextSFUNCDEF
15373 : FFEEXPR_contextLET
,
15374 ffeexpr_token_arguments_
);
15378 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15380 ? FFEEXPR_contextSFUNCDEFACTUALARG_
15381 : FFEEXPR_contextACTUALARG_
,
15382 ffeexpr_token_arguments_
);
15384 case FFEEXPR_parentypeARRAY_
:
15385 ffebld_set_info (e
->u
.operand
,
15386 ffesymbol_info (ffebld_symter (e
->u
.operand
)));
15387 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
15388 ffeexpr_stack_
->bound_list
= ffesymbol_dims (s
);
15389 ffeexpr_stack_
->rank
= 0;
15390 ffeexpr_stack_
->constant
= TRUE
;
15391 ffeexpr_stack_
->immediate
= TRUE
;
15392 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
15394 ? FFEEXPR_contextSFUNCDEFINDEX_
15395 : FFEEXPR_contextINDEX_
,
15396 ffeexpr_token_elements_
);
15398 case FFEEXPR_parentypeSUBSTRING_
:
15399 ffebld_set_info (e
->u
.operand
,
15400 ffesymbol_info (ffebld_symter (e
->u
.operand
)));
15401 e
->u
.operand
= ffeexpr_collapse_symter (e
->u
.operand
,
15402 ffeexpr_tokens_
[0]);
15405 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15407 ? FFEEXPR_contextSFUNCDEFINDEX_
15408 : FFEEXPR_contextINDEX_
,
15409 ffeexpr_token_substring_
);
15411 case FFEEXPR_parentypeFUNSUBSTR_
:
15414 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15416 ? FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
15417 : FFEEXPR_contextINDEXORACTUALARG_
,
15418 ffeexpr_token_funsubstr_
);
15420 case FFEEXPR_parentypeANY_
:
15421 ffebld_set_info (e
->u
.operand
, ffesymbol_info (s
));
15424 ffeexpr_rhs (ffeexpr_stack_
->pool
,
15426 ? FFEEXPR_contextSFUNCDEFACTUALARG_
15427 : FFEEXPR_contextACTUALARG_
,
15428 ffeexpr_token_anything_
);
15431 assert ("bad paren type" == NULL
);
15435 case FFELEX_typeEQUALS
: /* As in "VAR=". */
15436 switch (ffeexpr_stack_
->context
)
15438 case FFEEXPR_contextIMPDOITEM_
: /* "(,VAR=start,end[,incr])". */
15439 case FFEEXPR_contextIMPDOITEMDF_
:
15440 ffeexpr_stack_
->is_rhs
= FALSE
; /* Really an lhs construct. */
15441 ffeexpr_stack_
->context
= FFEEXPR_contextIMPDOCTRL_
;
15450 case FFELEX_typePERIOD
:
15451 case FFELEX_typePERCENT
:
15452 ~~Support these two someday
, though
not required
15453 assert ("FOO%, FOO. not yet supported!~~" == NULL
);
15461 switch (ffeexpr_stack_
->context
)
15463 case FFEEXPR_contextINDEXORACTUALARG_
:
15464 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
15465 assert ("strange context" == NULL
);
15472 e
= ffeexpr_expr_new_ ();
15473 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15474 e
->token
= ffeexpr_tokens_
[0];
15475 s
= ffeexpr_declare_unadorned_ (ffeexpr_tokens_
[0], FALSE
);
15476 if (ffesymbol_attrs (s
) & FFESYMBOL_attrsANY
)
15478 e
->u
.operand
= ffebld_new_any ();
15479 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
15483 e
->u
.operand
= ffebld_new_symter (s
, FFEINTRIN_genNONE
,
15484 ffesymbol_specific (s
),
15485 ffesymbol_implementation (s
));
15486 if (ffesymbol_specific (s
) == FFEINTRIN_specNONE
)
15487 ffebld_set_info (e
->u
.operand
, ffeinfo_use (ffesymbol_info (s
)));
15489 { /* Decorate the SYMTER with the actual type
15490 of the intrinsic. */
15491 ffebld_set_info (e
->u
.operand
, ffeinfo_new
15492 (ffeintrin_basictype (ffesymbol_specific (s
)),
15493 ffeintrin_kindtype (ffesymbol_specific (s
)),
15495 ffesymbol_kind (s
),
15496 ffesymbol_where (s
),
15497 FFETARGET_charactersizeNONE
));
15499 if (ffesymbol_is_doiter (s
))
15500 ffebld_symter_set_is_doiter (e
->u
.operand
, TRUE
);
15501 e
->u
.operand
= ffeexpr_collapse_symter (e
->u
.operand
,
15502 ffeexpr_tokens_
[0]);
15504 ffeexpr_exprstack_push_operand_ (e
);
15505 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
15508 /* ffeexpr_token_name_apos_ -- Rhs NAME APOSTROPHE
15510 Return a pointer to this function to the lexer (ffelex), which will
15511 invoke it for the next token.
15513 Expecting a NAME token, analyze the previous NAME token to see what kind,
15514 if any, typeless constant we've got.
15517 Expect a NAME instead of CHARACTER in this situation. */
15519 static ffelexHandler
15520 ffeexpr_token_name_apos_ (ffelexToken t
)
15524 ffelex_set_hexnum (FALSE
);
15526 switch (ffelex_token_type (t
))
15528 case FFELEX_typeNAME
:
15529 ffeexpr_tokens_
[2] = ffelex_token_use (t
);
15530 return (ffelexHandler
) ffeexpr_token_name_apos_name_
;
15536 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER
))
15538 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[0]));
15539 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15540 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15541 ffebad_here (1, ffelex_token_where_line (t
),
15542 ffelex_token_where_column (t
));
15546 ffelex_token_kill (ffeexpr_tokens_
[1]);
15548 e
= ffeexpr_expr_new_ ();
15549 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15550 e
->u
.operand
= ffebld_new_any ();
15551 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
15552 e
->token
= ffeexpr_tokens_
[0];
15553 ffeexpr_exprstack_push_operand_ (e
);
15555 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
15558 /* ffeexpr_token_name_apos_name_ -- Rhs NAME APOSTROPHE NAME
15560 Return a pointer to this function to the lexer (ffelex), which will
15561 invoke it for the next token.
15563 Expecting an APOSTROPHE token, analyze the previous NAME token to see
15564 what kind, if any, typeless constant we've got. */
15566 static ffelexHandler
15567 ffeexpr_token_name_apos_name_ (ffelexToken t
)
15572 e
= ffeexpr_expr_new_ ();
15573 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15574 e
->token
= ffeexpr_tokens_
[0];
15576 if ((ffelex_token_type (t
) == ffelex_token_type (ffeexpr_tokens_
[1]))
15577 && (ffelex_token_length (ffeexpr_tokens_
[0]) == 1)
15578 && (ffesrc_char_match_init ((c
= ffelex_token_text (ffeexpr_tokens_
[0])[0]),
15580 || ffesrc_char_match_init (c
, 'O', 'o')
15581 || ffesrc_char_match_init (c
, 'X', 'x')
15582 || ffesrc_char_match_init (c
, 'Z', 'z')))
15584 ffetargetCharacterSize size
;
15586 if (!ffe_is_typeless_boz ()) {
15590 case FFESRC_CASE_MATCH_INIT ('B', 'b', imatch_b
, no_imatch
):
15591 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerbinary
15592 (ffeexpr_tokens_
[2]));
15595 case FFESRC_CASE_MATCH_INIT ('O', 'o', imatch_o
, no_imatch
):
15596 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integeroctal
15597 (ffeexpr_tokens_
[2]));
15600 case FFESRC_CASE_MATCH_INIT ('X', 'x', imatch_x
, no_imatch
):
15601 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerhex
15602 (ffeexpr_tokens_
[2]));
15605 case FFESRC_CASE_MATCH_INIT ('Z', 'z', imatch_z
, no_imatch
):
15606 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerhex
15607 (ffeexpr_tokens_
[2]));
15611 no_imatch
: /* :::::::::::::::::::: */
15612 assert ("not BOXZ!" == NULL
);
15616 ffebld_set_info (e
->u
.operand
,
15617 ffeinfo_new (FFEINFO_basictypeINTEGER
,
15618 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
15619 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
15620 FFETARGET_charactersizeNONE
));
15621 ffeexpr_exprstack_push_operand_ (e
);
15622 ffelex_token_kill (ffeexpr_tokens_
[1]);
15623 ffelex_token_kill (ffeexpr_tokens_
[2]);
15624 return (ffelexHandler
) ffeexpr_token_binary_
;
15629 case FFESRC_CASE_MATCH_INIT ('B', 'b', match_b
, no_match
):
15630 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_typeless_bm
15631 (ffeexpr_tokens_
[2]));
15632 size
= ffetarget_size_typeless_binary (ffeexpr_tokens_
[2]);
15635 case FFESRC_CASE_MATCH_INIT ('O', 'o', match_o
, no_match
):
15636 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_typeless_om
15637 (ffeexpr_tokens_
[2]));
15638 size
= ffetarget_size_typeless_octal (ffeexpr_tokens_
[2]);
15641 case FFESRC_CASE_MATCH_INIT ('X', 'x', match_x
, no_match
):
15642 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_typeless_hxm
15643 (ffeexpr_tokens_
[2]));
15644 size
= ffetarget_size_typeless_hex (ffeexpr_tokens_
[2]);
15647 case FFESRC_CASE_MATCH_INIT ('Z', 'z', match_z
, no_match
):
15648 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_typeless_hzm
15649 (ffeexpr_tokens_
[2]));
15650 size
= ffetarget_size_typeless_hex (ffeexpr_tokens_
[2]);
15654 no_match
: /* :::::::::::::::::::: */
15655 assert ("not BOXZ!" == NULL
);
15656 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_typeless_hzm
15657 (ffeexpr_tokens_
[2]));
15658 size
= ffetarget_size_typeless_hex (ffeexpr_tokens_
[2]);
15661 ffebld_set_info (e
->u
.operand
,
15662 ffeinfo_new (FFEINFO_basictypeTYPELESS
, FFEINFO_kindtypeNONE
,
15663 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, size
));
15664 ffeexpr_exprstack_push_operand_ (e
);
15665 ffelex_token_kill (ffeexpr_tokens_
[1]);
15666 ffelex_token_kill (ffeexpr_tokens_
[2]);
15667 return (ffelexHandler
) ffeexpr_token_binary_
;
15670 if (ffest_ffebad_start (FFEBAD_INVALID_RADIX_SPECIFIER
))
15672 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[0]));
15673 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15674 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15675 ffebad_here (1, ffelex_token_where_line (t
), ffelex_token_where_column (t
));
15679 ffelex_token_kill (ffeexpr_tokens_
[1]);
15680 ffelex_token_kill (ffeexpr_tokens_
[2]);
15682 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15683 e
->u
.operand
= ffebld_new_any ();
15684 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
15685 e
->token
= ffeexpr_tokens_
[0];
15686 ffeexpr_exprstack_push_operand_ (e
);
15688 switch (ffelex_token_type (t
))
15690 case FFELEX_typeAPOSTROPHE
:
15691 case FFELEX_typeQUOTE
:
15692 return (ffelexHandler
) ffeexpr_token_binary_
;
15695 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
15699 /* ffeexpr_token_percent_ -- Rhs PERCENT
15701 Handle a percent sign possibly followed by "LOC". If followed instead
15702 by "VAL", "REF", or "DESCR", issue an error message and substitute
15703 "LOC". If followed by something else, treat the percent sign as a
15704 spurious incorrect token and reprocess the token via _rhs_. */
15706 static ffelexHandler
15707 ffeexpr_token_percent_ (ffelexToken t
)
15709 switch (ffelex_token_type (t
))
15711 case FFELEX_typeNAME
:
15712 case FFELEX_typeNAMES
:
15713 ffeexpr_stack_
->percent
= ffeexpr_percent_ (t
);
15714 ffeexpr_tokens_
[1] = ffelex_token_use (t
);
15715 return (ffelexHandler
) ffeexpr_token_percent_name_
;
15718 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION
))
15720 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15721 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15722 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
15723 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
15726 ffelex_token_kill (ffeexpr_tokens_
[0]);
15727 return (ffelexHandler
) ffeexpr_token_rhs_ (t
);
15731 /* ffeexpr_token_percent_name_ -- Rhs PERCENT NAME
15733 Make sure the token is OPEN_PAREN and prepare for the one-item list of
15734 LHS expressions. Else display an error message. */
15736 static ffelexHandler
15737 ffeexpr_token_percent_name_ (ffelexToken t
)
15739 ffelexHandler nexthandler
;
15741 if (ffelex_token_type (t
) != FFELEX_typeOPEN_PAREN
)
15743 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION
))
15745 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15746 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15747 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->first_token
),
15748 ffelex_token_where_column (ffeexpr_stack_
->first_token
));
15751 ffelex_token_kill (ffeexpr_tokens_
[0]);
15752 nexthandler
= (ffelexHandler
) ffeexpr_token_rhs_ (ffeexpr_tokens_
[1]);
15753 ffelex_token_kill (ffeexpr_tokens_
[1]);
15754 return (ffelexHandler
) (*nexthandler
) (t
);
15757 switch (ffeexpr_stack_
->percent
)
15760 if (ffest_ffebad_start (FFEBAD_INVALID_PERCENT
))
15762 ffebad_here (0, ffelex_token_where_line (ffeexpr_tokens_
[0]),
15763 ffelex_token_where_column (ffeexpr_tokens_
[0]));
15764 ffebad_string (ffelex_token_text (ffeexpr_tokens_
[1]));
15767 ffeexpr_stack_
->percent
= FFEEXPR_percentLOC_
;
15768 /* Fall through. */
15769 case FFEEXPR_percentLOC_
:
15770 ffeexpr_stack_
->tokens
[0] = ffeexpr_tokens_
[0];
15771 ffelex_token_kill (ffeexpr_tokens_
[1]);
15772 ffeexpr_stack_
->tokens
[1] = ffelex_token_use (t
);
15773 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
15774 FFEEXPR_contextLOC_
,
15775 ffeexpr_cb_end_loc_
);
15779 /* ffeexpr_make_float_const_ -- Make a floating-point constant
15783 Pass 'E', 'D', or 'Q' for exponent letter. */
15786 ffeexpr_make_float_const_ (char exp_letter
, ffelexToken integer
,
15787 ffelexToken decimal
, ffelexToken fraction
,
15788 ffelexToken exponent
, ffelexToken exponent_sign
,
15789 ffelexToken exponent_digits
)
15793 e
= ffeexpr_expr_new_ ();
15794 e
->type
= FFEEXPR_exprtypeOPERAND_
;
15795 if (integer
!= NULL
)
15796 e
->token
= ffelex_token_use (integer
);
15799 assert (decimal
!= NULL
);
15800 e
->token
= ffelex_token_use (decimal
);
15803 switch (exp_letter
)
15805 #if !FFETARGET_okREALQUAD
15806 case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q
, no_match
):
15807 if (ffebad_start (FFEBAD_QUAD_UNSUPPORTED
))
15809 ffebad_here (0, ffelex_token_where_line (e
->token
),
15810 ffelex_token_where_column (e
->token
));
15813 goto match_d
; /* The FFESRC_CASE_* macros don't
15814 allow fall-through! */
15817 case FFESRC_CASE_MATCH_INIT ('D', 'd', match_d
, no_match
):
15818 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_realdouble
15819 (integer
, decimal
, fraction
, exponent
, exponent_sign
, exponent_digits
));
15820 ffebld_set_info (e
->u
.operand
,
15821 ffeinfo_new (FFEINFO_basictypeREAL
, FFEINFO_kindtypeREALDOUBLE
,
15822 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
15825 case FFESRC_CASE_MATCH_INIT ('E', 'e', match_e
, no_match
):
15826 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_realdefault
15827 (integer
, decimal
, fraction
, exponent
, exponent_sign
, exponent_digits
));
15828 ffebld_set_info (e
->u
.operand
, ffeinfo_new (FFEINFO_basictypeREAL
,
15829 FFEINFO_kindtypeREALDEFAULT
, 0, FFEINFO_kindENTITY
,
15830 FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
15833 #if FFETARGET_okREALQUAD
15834 case FFESRC_CASE_MATCH_INIT ('Q', 'q', match_q
, no_match
):
15835 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_realquad
15836 (integer
, decimal
, fraction
, exponent
, exponent_sign
, exponent_digits
));
15837 ffebld_set_info (e
->u
.operand
,
15838 ffeinfo_new (FFEINFO_basictypeREAL
, FFEINFO_kindtypeREALQUAD
,
15839 0, FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
, FFETARGET_charactersizeNONE
));
15843 case 'I': /* Make an integer. */
15844 e
->u
.operand
= ffebld_new_conter (ffebld_constant_new_integerdefault
15845 (ffeexpr_tokens_
[0]));
15846 ffebld_set_info (e
->u
.operand
,
15847 ffeinfo_new (FFEINFO_basictypeINTEGER
,
15848 FFEINFO_kindtypeINTEGERDEFAULT
, 0,
15849 FFEINFO_kindENTITY
, FFEINFO_whereCONSTANT
,
15850 FFETARGET_charactersizeNONE
));
15854 no_match
: /* :::::::::::::::::::: */
15855 assert ("Lost the exponent letter!" == NULL
);
15858 ffeexpr_exprstack_push_operand_ (e
);
15861 /* Just like ffesymbol_declare_local, except performs any implicit info
15862 assignment necessary. */
15865 ffeexpr_declare_unadorned_ (ffelexToken t
, bool maybe_intrin
)
15871 s
= ffesymbol_declare_local (t
, maybe_intrin
);
15873 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
15874 /* Special-case these since they can involve a different concept
15875 of "state" (in the stmtfunc name space). */
15877 case FFEEXPR_contextDATAIMPDOINDEX_
:
15878 case FFEEXPR_contextDATAIMPDOCTRL_
:
15879 if (ffeexpr_context_outer_ (ffeexpr_stack_
)
15880 == FFEEXPR_contextDATAIMPDOINDEX_
)
15881 s
= ffeexpr_sym_impdoitem_ (s
, t
);
15883 if (ffeexpr_stack_
->is_rhs
)
15884 s
= ffeexpr_sym_impdoitem_ (s
, t
);
15886 s
= ffeexpr_sym_lhs_impdoctrl_ (s
, t
);
15887 bad
= (ffesymbol_kind (s
) != FFEINFO_kindENTITY
)
15888 || ((ffesymbol_where (s
) != FFEINFO_whereCONSTANT
)
15889 && (ffesymbol_where (s
) != FFEINFO_whereIMMEDIATE
));
15890 if (bad
&& (ffesymbol_kind (s
) != FFEINFO_kindANY
))
15891 ffesymbol_error (s
, t
);
15898 switch ((ffesymbol_sfdummyparent (s
) == NULL
)
15899 ? ffesymbol_state (s
)
15900 : FFESYMBOL_stateUNDERSTOOD
)
15902 case FFESYMBOL_stateNONE
: /* Before first exec, not seen in expr
15904 if (!ffest_seen_first_exec ())
15905 goto seen
; /* :::::::::::::::::::: */
15906 /* Fall through. */
15907 case FFESYMBOL_stateUNCERTAIN
: /* Unseen since first exec. */
15908 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
15910 case FFEEXPR_contextSUBROUTINEREF
:
15911 s
= ffeexpr_sym_lhs_call_ (s
, t
);
15914 case FFEEXPR_contextFILEEXTFUNC
:
15915 s
= ffeexpr_sym_lhs_extfunc_ (s
, t
);
15918 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
15919 s
= ffecom_sym_exec_transition (s
);
15920 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
15921 goto understood
; /* :::::::::::::::::::: */
15922 /* Fall through. */
15923 case FFEEXPR_contextACTUALARG_
:
15924 s
= ffeexpr_sym_rhs_actualarg_ (s
, t
);
15927 case FFEEXPR_contextDATA
:
15928 if (ffeexpr_stack_
->is_rhs
)
15929 s
= ffeexpr_sym_rhs_let_ (s
, t
);
15931 s
= ffeexpr_sym_lhs_data_ (s
, t
);
15934 case FFEEXPR_contextDATAIMPDOITEM_
:
15935 s
= ffeexpr_sym_lhs_data_ (s
, t
);
15938 case FFEEXPR_contextSFUNCDEF
:
15939 case FFEEXPR_contextSFUNCDEFINDEX_
:
15940 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
15941 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
15942 s
= ffecom_sym_exec_transition (s
);
15943 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
15944 goto understood
; /* :::::::::::::::::::: */
15945 /* Fall through. */
15946 case FFEEXPR_contextLET
:
15947 case FFEEXPR_contextPAREN_
:
15948 case FFEEXPR_contextACTUALARGEXPR_
:
15949 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
15950 case FFEEXPR_contextASSIGN
:
15951 case FFEEXPR_contextIOLIST
:
15952 case FFEEXPR_contextIOLISTDF
:
15953 case FFEEXPR_contextDO
:
15954 case FFEEXPR_contextDOWHILE
:
15955 case FFEEXPR_contextAGOTO
:
15956 case FFEEXPR_contextCGOTO
:
15957 case FFEEXPR_contextIF
:
15958 case FFEEXPR_contextARITHIF
:
15959 case FFEEXPR_contextFORMAT
:
15960 case FFEEXPR_contextSTOP
:
15961 case FFEEXPR_contextRETURN
:
15962 case FFEEXPR_contextSELECTCASE
:
15963 case FFEEXPR_contextCASE
:
15964 case FFEEXPR_contextFILEASSOC
:
15965 case FFEEXPR_contextFILEINT
:
15966 case FFEEXPR_contextFILEDFINT
:
15967 case FFEEXPR_contextFILELOG
:
15968 case FFEEXPR_contextFILENUM
:
15969 case FFEEXPR_contextFILENUMAMBIG
:
15970 case FFEEXPR_contextFILECHAR
:
15971 case FFEEXPR_contextFILENUMCHAR
:
15972 case FFEEXPR_contextFILEDFCHAR
:
15973 case FFEEXPR_contextFILEKEY
:
15974 case FFEEXPR_contextFILEUNIT
:
15975 case FFEEXPR_contextFILEUNIT_DF
:
15976 case FFEEXPR_contextFILEUNITAMBIG
:
15977 case FFEEXPR_contextFILEFORMAT
:
15978 case FFEEXPR_contextFILENAMELIST
:
15979 case FFEEXPR_contextFILEVXTCODE
:
15980 case FFEEXPR_contextINDEX_
:
15981 case FFEEXPR_contextIMPDOITEM_
:
15982 case FFEEXPR_contextIMPDOITEMDF_
:
15983 case FFEEXPR_contextIMPDOCTRL_
:
15984 case FFEEXPR_contextLOC_
:
15985 if (ffeexpr_stack_
->is_rhs
)
15986 s
= ffeexpr_sym_rhs_let_ (s
, t
);
15988 s
= ffeexpr_sym_lhs_let_ (s
, t
);
15991 case FFEEXPR_contextCHARACTERSIZE
:
15992 case FFEEXPR_contextEQUIVALENCE
:
15993 case FFEEXPR_contextINCLUDE
:
15994 case FFEEXPR_contextPARAMETER
:
15995 case FFEEXPR_contextDIMLIST
:
15996 case FFEEXPR_contextDIMLISTCOMMON
:
15997 case FFEEXPR_contextKINDTYPE
:
15998 case FFEEXPR_contextINITVAL
:
15999 case FFEEXPR_contextEQVINDEX_
:
16000 break; /* Will turn into errors below. */
16003 ffesymbol_error (s
, t
);
16006 /* Fall through. */
16007 case FFESYMBOL_stateUNDERSTOOD
: /* Nothing much more to learn. */
16008 understood
: /* :::::::::::::::::::: */
16009 k
= ffesymbol_kind (s
);
16010 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
16012 case FFEEXPR_contextSUBROUTINEREF
:
16013 bad
= ((k
!= FFEINFO_kindSUBROUTINE
)
16014 && ((ffesymbol_where (s
) != FFEINFO_whereINTRINSIC
)
16015 || (k
!= FFEINFO_kindNONE
)));
16018 case FFEEXPR_contextFILEEXTFUNC
:
16019 bad
= (k
!= FFEINFO_kindFUNCTION
)
16020 || (ffesymbol_where (s
) != FFEINFO_whereGLOBAL
);
16023 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
16024 case FFEEXPR_contextACTUALARG_
:
16027 case FFEINFO_kindENTITY
:
16031 case FFEINFO_kindFUNCTION
:
16032 case FFEINFO_kindSUBROUTINE
:
16034 = ((ffesymbol_where (s
) != FFEINFO_whereGLOBAL
)
16035 && (ffesymbol_where (s
) != FFEINFO_whereDUMMY
)
16036 && ((ffesymbol_where (s
) != FFEINFO_whereINTRINSIC
)
16037 || !ffeintrin_is_actualarg (ffesymbol_specific (s
))));
16040 case FFEINFO_kindNONE
:
16041 if (ffesymbol_where (s
) == FFEINFO_whereINTRINSIC
)
16043 bad
= !(ffeintrin_is_actualarg (ffesymbol_specific (s
)));
16047 /* If state is UNDERSTOOD here, it's CHAR*(*) or attrsANY,
16048 and in the former case, attrsTYPE is set, so we
16049 see this as an error as we should, since CHAR*(*)
16050 cannot be actually referenced in a main/block data
16053 if ((ffesymbol_attrs (s
) & (FFESYMBOL_attrsANY
16054 | FFESYMBOL_attrsEXTERNAL
16055 | FFESYMBOL_attrsTYPE
))
16056 == FFESYMBOL_attrsEXTERNAL
)
16068 case FFEEXPR_contextDATA
:
16069 if (ffeexpr_stack_
->is_rhs
)
16070 bad
= (k
!= FFEINFO_kindENTITY
)
16071 || (ffesymbol_where (s
) != FFEINFO_whereCONSTANT
);
16073 bad
= (k
!= FFEINFO_kindENTITY
)
16074 || ((ffesymbol_where (s
) != FFEINFO_whereNONE
)
16075 && (ffesymbol_where (s
) != FFEINFO_whereLOCAL
)
16076 && (ffesymbol_where (s
) != FFEINFO_whereCOMMON
));
16079 case FFEEXPR_contextDATAIMPDOITEM_
:
16080 bad
= TRUE
; /* Unadorned item never valid. */
16083 case FFEEXPR_contextSFUNCDEF
:
16084 case FFEEXPR_contextSFUNCDEFINDEX_
:
16085 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
16086 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
16087 case FFEEXPR_contextLET
:
16088 case FFEEXPR_contextPAREN_
:
16089 case FFEEXPR_contextACTUALARGEXPR_
:
16090 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
16091 case FFEEXPR_contextASSIGN
:
16092 case FFEEXPR_contextIOLIST
:
16093 case FFEEXPR_contextIOLISTDF
:
16094 case FFEEXPR_contextDO
:
16095 case FFEEXPR_contextDOWHILE
:
16096 case FFEEXPR_contextAGOTO
:
16097 case FFEEXPR_contextCGOTO
:
16098 case FFEEXPR_contextIF
:
16099 case FFEEXPR_contextARITHIF
:
16100 case FFEEXPR_contextFORMAT
:
16101 case FFEEXPR_contextSTOP
:
16102 case FFEEXPR_contextRETURN
:
16103 case FFEEXPR_contextSELECTCASE
:
16104 case FFEEXPR_contextCASE
:
16105 case FFEEXPR_contextFILEASSOC
:
16106 case FFEEXPR_contextFILEINT
:
16107 case FFEEXPR_contextFILEDFINT
:
16108 case FFEEXPR_contextFILELOG
:
16109 case FFEEXPR_contextFILENUM
:
16110 case FFEEXPR_contextFILENUMAMBIG
:
16111 case FFEEXPR_contextFILECHAR
:
16112 case FFEEXPR_contextFILENUMCHAR
:
16113 case FFEEXPR_contextFILEDFCHAR
:
16114 case FFEEXPR_contextFILEKEY
:
16115 case FFEEXPR_contextFILEUNIT
:
16116 case FFEEXPR_contextFILEUNIT_DF
:
16117 case FFEEXPR_contextFILEUNITAMBIG
:
16118 case FFEEXPR_contextFILEFORMAT
:
16119 case FFEEXPR_contextFILENAMELIST
:
16120 case FFEEXPR_contextFILEVXTCODE
:
16121 case FFEEXPR_contextINDEX_
:
16122 case FFEEXPR_contextIMPDOITEM_
:
16123 case FFEEXPR_contextIMPDOITEMDF_
:
16124 case FFEEXPR_contextIMPDOCTRL_
:
16125 case FFEEXPR_contextLOC_
:
16126 bad
= (k
!= FFEINFO_kindENTITY
); /* This catches "SUBROUTINE
16127 X(A);EXTERNAL A;CALL
16128 Y(A);B=A", for example. */
16131 case FFEEXPR_contextCHARACTERSIZE
:
16132 case FFEEXPR_contextEQUIVALENCE
:
16133 case FFEEXPR_contextPARAMETER
:
16134 case FFEEXPR_contextDIMLIST
:
16135 case FFEEXPR_contextDIMLISTCOMMON
:
16136 case FFEEXPR_contextKINDTYPE
:
16137 case FFEEXPR_contextINITVAL
:
16138 case FFEEXPR_contextEQVINDEX_
:
16139 bad
= (k
!= FFEINFO_kindENTITY
)
16140 || (ffesymbol_where (s
) != FFEINFO_whereCONSTANT
);
16143 case FFEEXPR_contextINCLUDE
:
16151 if (bad
&& (k
!= FFEINFO_kindANY
))
16152 ffesymbol_error (s
, t
);
16155 case FFESYMBOL_stateSEEN
: /* Seen but not yet in exec portion. */
16156 seen
: /* :::::::::::::::::::: */
16157 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
16159 case FFEEXPR_contextPARAMETER
:
16160 if (ffeexpr_stack_
->is_rhs
)
16161 ffesymbol_error (s
, t
);
16163 s
= ffeexpr_sym_lhs_parameter_ (s
, t
);
16166 case FFEEXPR_contextDATA
:
16167 s
= ffecom_sym_exec_transition (s
);
16168 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
16169 goto understood
; /* :::::::::::::::::::: */
16170 if (ffeexpr_stack_
->is_rhs
)
16171 ffesymbol_error (s
, t
);
16173 s
= ffeexpr_sym_lhs_data_ (s
, t
);
16174 goto understood
; /* :::::::::::::::::::: */
16176 case FFEEXPR_contextDATAIMPDOITEM_
:
16177 s
= ffecom_sym_exec_transition (s
);
16178 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
16179 goto understood
; /* :::::::::::::::::::: */
16180 s
= ffeexpr_sym_lhs_data_ (s
, t
);
16181 goto understood
; /* :::::::::::::::::::: */
16183 case FFEEXPR_contextEQUIVALENCE
:
16184 s
= ffeexpr_sym_lhs_equivalence_ (s
, t
);
16187 case FFEEXPR_contextDIMLIST
:
16188 s
= ffeexpr_sym_rhs_dimlist_ (s
, t
);
16191 case FFEEXPR_contextCHARACTERSIZE
:
16192 case FFEEXPR_contextKINDTYPE
:
16193 case FFEEXPR_contextDIMLISTCOMMON
:
16194 case FFEEXPR_contextINITVAL
:
16195 case FFEEXPR_contextEQVINDEX_
:
16196 ffesymbol_error (s
, t
);
16199 case FFEEXPR_contextINCLUDE
:
16200 ffesymbol_error (s
, t
);
16203 case FFEEXPR_contextACTUALARG_
: /* E.g. I in REAL A(Y(I)). */
16204 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
16205 s
= ffecom_sym_exec_transition (s
);
16206 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
16207 goto understood
; /* :::::::::::::::::::: */
16208 s
= ffeexpr_sym_rhs_actualarg_ (s
, t
);
16209 goto understood
; /* :::::::::::::::::::: */
16211 case FFEEXPR_contextINDEX_
:
16212 case FFEEXPR_contextACTUALARGEXPR_
:
16213 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
16214 case FFEEXPR_contextSFUNCDEF
:
16215 case FFEEXPR_contextSFUNCDEFINDEX_
:
16216 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
16217 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
16218 assert (ffeexpr_stack_
->is_rhs
);
16219 s
= ffecom_sym_exec_transition (s
);
16220 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
16221 goto understood
; /* :::::::::::::::::::: */
16222 s
= ffeexpr_sym_rhs_let_ (s
, t
);
16223 goto understood
; /* :::::::::::::::::::: */
16226 ffesymbol_error (s
, t
);
16232 assert ("bad symbol state" == NULL
);
16238 /* Have FOO in DATA (XYZ(FOO),...)/.../ or DATA (...,XYZ=FOO,BAR,BLETCH).
16239 Could be found via the "statement-function" name space (in which case
16240 it should become an iterator) or the local name space (in which case
16241 it should be either a named constant, or a variable that will have an
16242 sfunc name space sibling that should become an iterator). */
16245 ffeexpr_sym_impdoitem_ (ffesymbol sp
, ffelexToken t
)
16253 ffeinfoWhere where
;
16255 ss
= ffesymbol_state (sp
);
16257 if (ffesymbol_sfdummyparent (sp
) != NULL
)
16258 { /* Have symbol in sfunc name space. */
16261 case FFESYMBOL_stateNONE
: /* Used as iterator already. */
16262 if (ffeexpr_level_
< ffesymbol_maxentrynum (sp
))
16263 ffesymbol_error (sp
, t
); /* Can't use dead iterator. */
16265 { /* Can use dead iterator because we're at at
16266 least an innermore (higher-numbered) level
16267 than the iterator's outermost
16268 (lowest-numbered) level. */
16269 ffesymbol_signal_change (sp
);
16270 ffesymbol_set_state (sp
, FFESYMBOL_stateSEEN
);
16271 ffesymbol_set_maxentrynum (sp
, ffeexpr_level_
);
16272 ffesymbol_signal_unreported (sp
);
16276 case FFESYMBOL_stateSEEN
: /* Seen already in this or other
16277 implied-DO. Set symbol level
16278 number to outermost value, as that
16279 tells us we can see it as iterator
16280 at that level at the innermost. */
16281 if (ffeexpr_level_
< ffesymbol_maxentrynum (sp
))
16283 ffesymbol_signal_change (sp
);
16284 ffesymbol_set_maxentrynum (sp
, ffeexpr_level_
);
16285 ffesymbol_signal_unreported (sp
);
16289 case FFESYMBOL_stateUNCERTAIN
: /* Iterator. */
16290 assert (ffeexpr_level_
== ffesymbol_maxentrynum (sp
));
16291 ffesymbol_error (sp
, t
); /* (,,,I=I,10). */
16294 case FFESYMBOL_stateUNDERSTOOD
:
16298 assert ("Foo Bar!!" == NULL
);
16305 /* Got symbol in local name space, so we haven't seen it in impdo yet.
16306 First, if it is brand-new and we're in executable statements, set the
16307 attributes and exec-transition it to set state UNCERTAIN or UNDERSTOOD.
16308 Second, if it is now a constant (PARAMETER), then just return it, it
16309 can't be an implied-do iterator. If it is understood, complain if it is
16310 not a valid variable, but make the inner name space iterator anyway and
16311 return that. If it is not understood, improve understanding of the
16312 symbol accordingly, complain accordingly, in either case make the inner
16313 name space iterator and return that. */
16315 sa
= ffesymbol_attrs (sp
);
16317 if (ffesymbol_state_is_specable (ss
)
16318 && ffest_seen_first_exec ())
16320 assert (sa
== FFESYMBOL_attrsetNONE
);
16321 ffesymbol_signal_change (sp
);
16322 ffesymbol_set_state (sp
, FFESYMBOL_stateSEEN
);
16323 ffesymbol_resolve_intrin (sp
);
16324 if (ffeimplic_establish_symbol (sp
))
16325 ffesymbol_set_attr (sp
, FFESYMBOL_attrSFARG
);
16327 ffesymbol_error (sp
, t
);
16329 /* After the exec transition, the state will either be UNCERTAIN (could
16330 be a dummy or local var) or UNDERSTOOD (local var, because this is a
16331 PROGRAM/BLOCKDATA program unit). */
16333 sp
= ffecom_sym_exec_transition (sp
);
16334 sa
= ffesymbol_attrs (sp
);
16335 ss
= ffesymbol_state (sp
);
16339 kind
= ffesymbol_kind (sp
);
16340 where
= ffesymbol_where (sp
);
16342 if (ss
== FFESYMBOL_stateUNDERSTOOD
)
16344 if (kind
!= FFEINFO_kindENTITY
)
16345 ffesymbol_error (sp
, t
);
16346 if (where
== FFEINFO_whereCONSTANT
)
16351 /* Enhance understanding of local symbol. This used to imply exec
16352 transition, but that doesn't seem necessary, since the local symbol
16353 doesn't actually get put into an ffebld tree here -- we just learn
16354 more about it, just like when we see a local symbol's name in the
16355 dummy-arg list of a statement function. */
16357 if (ss
!= FFESYMBOL_stateUNCERTAIN
)
16359 /* Figure out what kind of object we've got based on previous
16360 declarations of or references to the object. */
16362 ns
= FFESYMBOL_stateSEEN
;
16364 if (sa
& FFESYMBOL_attrsANY
)
16366 else if (!(sa
& ~(FFESYMBOL_attrsADJUSTS
16367 | FFESYMBOL_attrsANY
16368 | FFESYMBOL_attrsCOMMON
16369 | FFESYMBOL_attrsDUMMY
16370 | FFESYMBOL_attrsEQUIV
16371 | FFESYMBOL_attrsINIT
16372 | FFESYMBOL_attrsNAMELIST
16373 | FFESYMBOL_attrsRESULT
16374 | FFESYMBOL_attrsSAVE
16375 | FFESYMBOL_attrsSFARG
16376 | FFESYMBOL_attrsTYPE
)))
16377 na
= sa
| FFESYMBOL_attrsSFARG
;
16379 na
= FFESYMBOL_attrsetNONE
;
16382 { /* stateUNCERTAIN. */
16383 na
= sa
| FFESYMBOL_attrsSFARG
;
16384 ns
= FFESYMBOL_stateUNDERSTOOD
;
16386 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16387 | FFESYMBOL_attrsADJUSTABLE
16388 | FFESYMBOL_attrsANYLEN
16389 | FFESYMBOL_attrsARRAY
16390 | FFESYMBOL_attrsDUMMY
16391 | FFESYMBOL_attrsEXTERNAL
16392 | FFESYMBOL_attrsSFARG
16393 | FFESYMBOL_attrsTYPE
)));
16395 if (sa
& FFESYMBOL_attrsEXTERNAL
)
16397 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16398 | FFESYMBOL_attrsDUMMY
16399 | FFESYMBOL_attrsEXTERNAL
16400 | FFESYMBOL_attrsTYPE
)));
16402 na
= FFESYMBOL_attrsetNONE
;
16404 else if (sa
& FFESYMBOL_attrsDUMMY
)
16406 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
16407 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
16408 | FFESYMBOL_attrsEXTERNAL
16409 | FFESYMBOL_attrsTYPE
)));
16411 kind
= FFEINFO_kindENTITY
;
16413 else if (sa
& FFESYMBOL_attrsARRAY
)
16415 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
16416 | FFESYMBOL_attrsADJUSTABLE
16417 | FFESYMBOL_attrsTYPE
)));
16419 na
= FFESYMBOL_attrsetNONE
;
16421 else if (sa
& FFESYMBOL_attrsSFARG
)
16423 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
16424 | FFESYMBOL_attrsTYPE
)));
16426 ns
= FFESYMBOL_stateUNCERTAIN
;
16428 else if (sa
& FFESYMBOL_attrsTYPE
)
16430 assert (!(sa
& (FFESYMBOL_attrsARRAY
16431 | FFESYMBOL_attrsDUMMY
16432 | FFESYMBOL_attrsEXTERNAL
16433 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
16434 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
16435 | FFESYMBOL_attrsADJUSTABLE
16436 | FFESYMBOL_attrsANYLEN
16437 | FFESYMBOL_attrsARRAY
16438 | FFESYMBOL_attrsDUMMY
16439 | FFESYMBOL_attrsEXTERNAL
16440 | FFESYMBOL_attrsSFARG
)));
16442 kind
= FFEINFO_kindENTITY
;
16444 if (sa
& (FFESYMBOL_attrsADJUSTABLE
| FFESYMBOL_attrsANYLEN
))
16445 na
= FFESYMBOL_attrsetNONE
;
16446 else if (ffest_is_entry_valid ())
16447 ns
= FFESYMBOL_stateUNCERTAIN
; /* Could be DUMMY or LOCAL. */
16449 where
= FFEINFO_whereLOCAL
;
16452 na
= FFESYMBOL_attrsetNONE
; /* Error. */
16455 /* Now see what we've got for a new object: NONE means a new error
16456 cropped up; ANY means an old error to be ignored; otherwise,
16457 everything's ok, update the object (symbol) and continue on. */
16459 if (na
== FFESYMBOL_attrsetNONE
)
16460 ffesymbol_error (sp
, t
);
16461 else if (!(na
& FFESYMBOL_attrsANY
))
16463 ffesymbol_signal_change (sp
); /* May need to back up to previous
16465 if (!ffeimplic_establish_symbol (sp
))
16466 ffesymbol_error (sp
, t
);
16469 ffesymbol_set_info (sp
,
16470 ffeinfo_new (ffesymbol_basictype (sp
),
16471 ffesymbol_kindtype (sp
),
16472 ffesymbol_rank (sp
),
16475 ffesymbol_size (sp
)));
16476 ffesymbol_set_attrs (sp
, na
);
16477 ffesymbol_set_state (sp
, ns
);
16478 ffesymbol_resolve_intrin (sp
);
16479 if (!ffesymbol_state_is_specable (ns
))
16480 sp
= ffecom_sym_learned (sp
);
16481 ffesymbol_signal_unreported (sp
); /* For debugging purposes. */
16486 /* Here we create the sfunc-name-space symbol representing what should
16487 become an iterator in this name space at this or an outermore (lower-
16488 numbered) expression level, else the implied-DO construct is in error. */
16490 s
= ffesymbol_declare_sfdummy (t
); /* Sets maxentrynum to 0 for new obj;
16491 also sets sfa_dummy_parent to
16493 assert (sp
== ffesymbol_sfdummyparent (s
));
16495 ffesymbol_signal_change (s
);
16496 ffesymbol_set_state (s
, FFESYMBOL_stateSEEN
);
16497 ffesymbol_set_maxentrynum (s
, ffeexpr_level_
);
16498 ffesymbol_set_info (s
,
16499 ffeinfo_new (FFEINFO_basictypeINTEGER
,
16500 FFEINFO_kindtypeINTEGERDEFAULT
,
16502 FFEINFO_kindENTITY
,
16503 FFEINFO_whereIMMEDIATE
,
16504 FFETARGET_charactersizeNONE
));
16505 ffesymbol_signal_unreported (s
);
16507 if ((ffesymbol_basictype (sp
) != FFEINFO_basictypeINTEGER
)
16508 && (ffesymbol_basictype (sp
) != FFEINFO_basictypeANY
))
16509 ffesymbol_error (s
, t
);
16514 /* Have FOO in CALL FOO. Local name space, executable context only. */
16517 ffeexpr_sym_lhs_call_ (ffesymbol s
, ffelexToken t
)
16522 ffeinfoWhere where
;
16524 ffeintrinSpec spec
;
16526 bool error
= FALSE
;
16528 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
16529 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
16531 na
= sa
= ffesymbol_attrs (s
);
16533 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16534 | FFESYMBOL_attrsADJUSTABLE
16535 | FFESYMBOL_attrsANYLEN
16536 | FFESYMBOL_attrsARRAY
16537 | FFESYMBOL_attrsDUMMY
16538 | FFESYMBOL_attrsEXTERNAL
16539 | FFESYMBOL_attrsSFARG
16540 | FFESYMBOL_attrsTYPE
)));
16542 kind
= ffesymbol_kind (s
);
16543 where
= ffesymbol_where (s
);
16545 /* Figure out what kind of object we've got based on previous declarations
16546 of or references to the object. */
16548 if (sa
& FFESYMBOL_attrsEXTERNAL
)
16550 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16551 | FFESYMBOL_attrsDUMMY
16552 | FFESYMBOL_attrsEXTERNAL
16553 | FFESYMBOL_attrsTYPE
)));
16555 if (sa
& FFESYMBOL_attrsTYPE
)
16560 kind
= FFEINFO_kindSUBROUTINE
;
16562 if (sa
& FFESYMBOL_attrsDUMMY
)
16564 else if (sa
& FFESYMBOL_attrsACTUALARG
)
16565 ; /* Not DUMMY or TYPE. */
16566 else /* Not ACTUALARG, DUMMY, or TYPE. */
16567 where
= FFEINFO_whereGLOBAL
;
16570 else if (sa
& FFESYMBOL_attrsDUMMY
)
16572 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
16573 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
16574 | FFESYMBOL_attrsEXTERNAL
16575 | FFESYMBOL_attrsTYPE
)));
16577 if (sa
& FFESYMBOL_attrsTYPE
)
16580 kind
= FFEINFO_kindSUBROUTINE
;
16582 else if (sa
& FFESYMBOL_attrsARRAY
)
16584 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
16585 | FFESYMBOL_attrsADJUSTABLE
16586 | FFESYMBOL_attrsTYPE
)));
16590 else if (sa
& FFESYMBOL_attrsSFARG
)
16592 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
16593 | FFESYMBOL_attrsTYPE
)));
16597 else if (sa
& FFESYMBOL_attrsTYPE
)
16599 assert (!(sa
& (FFESYMBOL_attrsARRAY
16600 | FFESYMBOL_attrsDUMMY
16601 | FFESYMBOL_attrsEXTERNAL
16602 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
16603 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
16604 | FFESYMBOL_attrsADJUSTABLE
16605 | FFESYMBOL_attrsANYLEN
16606 | FFESYMBOL_attrsARRAY
16607 | FFESYMBOL_attrsDUMMY
16608 | FFESYMBOL_attrsEXTERNAL
16609 | FFESYMBOL_attrsSFARG
)));
16613 else if (sa
== FFESYMBOL_attrsetNONE
)
16615 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
16617 if (ffeintrin_is_intrinsic (ffesymbol_text (s
), t
, FALSE
,
16618 &gen
, &spec
, &imp
))
16620 ffesymbol_signal_change (s
); /* May need to back up to previous
16622 ffesymbol_set_generic (s
, gen
);
16623 ffesymbol_set_specific (s
, spec
);
16624 ffesymbol_set_implementation (s
, imp
);
16625 ffesymbol_set_info (s
,
16626 ffeinfo_new (FFEINFO_basictypeNONE
,
16627 FFEINFO_kindtypeNONE
,
16629 FFEINFO_kindSUBROUTINE
,
16630 FFEINFO_whereINTRINSIC
,
16631 FFETARGET_charactersizeNONE
));
16632 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
16633 ffesymbol_resolve_intrin (s
);
16634 ffesymbol_reference (s
, t
, FALSE
);
16635 s
= ffecom_sym_learned (s
);
16636 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
16641 kind
= FFEINFO_kindSUBROUTINE
;
16642 where
= FFEINFO_whereGLOBAL
;
16647 /* Now see what we've got for a new object: NONE means a new error cropped
16648 up; ANY means an old error to be ignored; otherwise, everything's ok,
16649 update the object (symbol) and continue on. */
16652 ffesymbol_error (s
, t
);
16653 else if (!(na
& FFESYMBOL_attrsANY
))
16655 ffesymbol_signal_change (s
); /* May need to back up to previous
16657 ffesymbol_set_info (s
,
16658 ffeinfo_new (ffesymbol_basictype (s
),
16659 ffesymbol_kindtype (s
),
16660 ffesymbol_rank (s
),
16661 kind
, /* SUBROUTINE. */
16662 where
, /* GLOBAL or DUMMY. */
16663 ffesymbol_size (s
)));
16664 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
16665 ffesymbol_resolve_intrin (s
);
16666 ffesymbol_reference (s
, t
, FALSE
);
16667 s
= ffecom_sym_learned (s
);
16668 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
16674 /* Have FOO in DATA FOO/.../. Local name space and executable context
16675 only. (This will change in the future when DATA FOO may be followed
16676 by COMMON FOO or even INTEGER FOO(10), etc.) */
16679 ffeexpr_sym_lhs_data_ (ffesymbol s
, ffelexToken t
)
16684 ffeinfoWhere where
;
16685 bool error
= FALSE
;
16687 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
16688 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
16690 na
= sa
= ffesymbol_attrs (s
);
16692 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16693 | FFESYMBOL_attrsADJUSTABLE
16694 | FFESYMBOL_attrsANYLEN
16695 | FFESYMBOL_attrsARRAY
16696 | FFESYMBOL_attrsDUMMY
16697 | FFESYMBOL_attrsEXTERNAL
16698 | FFESYMBOL_attrsSFARG
16699 | FFESYMBOL_attrsTYPE
)));
16701 kind
= ffesymbol_kind (s
);
16702 where
= ffesymbol_where (s
);
16704 /* Figure out what kind of object we've got based on previous declarations
16705 of or references to the object. */
16707 if (sa
& FFESYMBOL_attrsEXTERNAL
)
16709 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16710 | FFESYMBOL_attrsDUMMY
16711 | FFESYMBOL_attrsEXTERNAL
16712 | FFESYMBOL_attrsTYPE
)));
16716 else if (sa
& FFESYMBOL_attrsDUMMY
)
16718 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
16719 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
16720 | FFESYMBOL_attrsEXTERNAL
16721 | FFESYMBOL_attrsTYPE
)));
16725 else if (sa
& FFESYMBOL_attrsARRAY
)
16727 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
16728 | FFESYMBOL_attrsADJUSTABLE
16729 | FFESYMBOL_attrsTYPE
)));
16731 if (sa
& FFESYMBOL_attrsADJUSTABLE
)
16733 where
= FFEINFO_whereLOCAL
;
16735 else if (sa
& FFESYMBOL_attrsSFARG
)
16737 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
16738 | FFESYMBOL_attrsTYPE
)));
16740 where
= FFEINFO_whereLOCAL
;
16742 else if (sa
& FFESYMBOL_attrsTYPE
)
16744 assert (!(sa
& (FFESYMBOL_attrsARRAY
16745 | FFESYMBOL_attrsDUMMY
16746 | FFESYMBOL_attrsEXTERNAL
16747 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
16748 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
16749 | FFESYMBOL_attrsADJUSTABLE
16750 | FFESYMBOL_attrsANYLEN
16751 | FFESYMBOL_attrsARRAY
16752 | FFESYMBOL_attrsDUMMY
16753 | FFESYMBOL_attrsEXTERNAL
16754 | FFESYMBOL_attrsSFARG
)));
16756 if (sa
& (FFESYMBOL_attrsADJUSTABLE
| FFESYMBOL_attrsANYLEN
))
16760 kind
= FFEINFO_kindENTITY
;
16761 where
= FFEINFO_whereLOCAL
;
16764 else if (sa
== FFESYMBOL_attrsetNONE
)
16766 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
16767 kind
= FFEINFO_kindENTITY
;
16768 where
= FFEINFO_whereLOCAL
;
16773 /* Now see what we've got for a new object: NONE means a new error cropped
16774 up; ANY means an old error to be ignored; otherwise, everything's ok,
16775 update the object (symbol) and continue on. */
16778 ffesymbol_error (s
, t
);
16779 else if (!(na
& FFESYMBOL_attrsANY
))
16781 ffesymbol_signal_change (s
); /* May need to back up to previous
16783 if (!ffeimplic_establish_symbol (s
))
16785 ffesymbol_error (s
, t
);
16788 ffesymbol_set_info (s
,
16789 ffeinfo_new (ffesymbol_basictype (s
),
16790 ffesymbol_kindtype (s
),
16791 ffesymbol_rank (s
),
16792 kind
, /* ENTITY. */
16793 where
, /* LOCAL. */
16794 ffesymbol_size (s
)));
16795 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
16796 ffesymbol_resolve_intrin (s
);
16797 s
= ffecom_sym_learned (s
);
16798 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
16804 /* Have FOO in EQUIVALENCE (...,FOO,...). Does not include
16805 EQUIVALENCE (...,BAR(FOO),...). */
16808 ffeexpr_sym_lhs_equivalence_ (ffesymbol s
, ffelexToken t
)
16813 ffeinfoWhere where
;
16815 na
= sa
= ffesymbol_attrs (s
);
16816 kind
= FFEINFO_kindENTITY
;
16817 where
= ffesymbol_where (s
);
16819 /* Figure out what kind of object we've got based on previous declarations
16820 of or references to the object. */
16822 if (!(sa
& ~(FFESYMBOL_attrsADJUSTS
16823 | FFESYMBOL_attrsARRAY
16824 | FFESYMBOL_attrsCOMMON
16825 | FFESYMBOL_attrsEQUIV
16826 | FFESYMBOL_attrsINIT
16827 | FFESYMBOL_attrsNAMELIST
16828 | FFESYMBOL_attrsSAVE
16829 | FFESYMBOL_attrsSFARG
16830 | FFESYMBOL_attrsTYPE
)))
16831 na
= sa
| FFESYMBOL_attrsEQUIV
;
16833 na
= FFESYMBOL_attrsetNONE
;
16835 /* Don't know why we're bothering to set kind and where in this code, but
16836 added the following to make it complete, in case it's really important.
16837 Generally this is left up to symbol exec transition. */
16839 if (where
== FFEINFO_whereNONE
)
16841 if (na
& (FFESYMBOL_attrsADJUSTS
16842 | FFESYMBOL_attrsCOMMON
))
16843 where
= FFEINFO_whereCOMMON
;
16844 else if (na
& FFESYMBOL_attrsSAVE
)
16845 where
= FFEINFO_whereLOCAL
;
16848 /* Now see what we've got for a new object: NONE means a new error cropped
16849 up; ANY means an old error to be ignored; otherwise, everything's ok,
16850 update the object (symbol) and continue on. */
16852 if (na
== FFESYMBOL_attrsetNONE
)
16853 ffesymbol_error (s
, t
);
16854 else if (!(na
& FFESYMBOL_attrsANY
))
16856 ffesymbol_signal_change (s
); /* May need to back up to previous
16858 ffesymbol_set_info (s
,
16859 ffeinfo_new (ffesymbol_basictype (s
),
16860 ffesymbol_kindtype (s
),
16861 ffesymbol_rank (s
),
16862 kind
, /* Always ENTITY. */
16863 where
, /* NONE, COMMON, or LOCAL. */
16864 ffesymbol_size (s
)));
16865 ffesymbol_set_attrs (s
, na
);
16866 ffesymbol_set_state (s
, FFESYMBOL_stateSEEN
);
16867 ffesymbol_resolve_intrin (s
);
16868 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
16874 /* Have FOO in OPEN(...,USEROPEN=FOO,...). Executable context only.
16876 Note that I think this should be considered semantically similar to
16877 doing CALL XYZ(FOO), in that it should be considered like an
16878 ACTUALARG context. In particular, without EXTERNAL being specified,
16879 it should not be allowed. */
16882 ffeexpr_sym_lhs_extfunc_ (ffesymbol s
, ffelexToken t
)
16887 ffeinfoWhere where
;
16888 bool needs_type
= FALSE
;
16889 bool error
= FALSE
;
16891 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
16892 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
16894 na
= sa
= ffesymbol_attrs (s
);
16896 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16897 | FFESYMBOL_attrsADJUSTABLE
16898 | FFESYMBOL_attrsANYLEN
16899 | FFESYMBOL_attrsARRAY
16900 | FFESYMBOL_attrsDUMMY
16901 | FFESYMBOL_attrsEXTERNAL
16902 | FFESYMBOL_attrsSFARG
16903 | FFESYMBOL_attrsTYPE
)));
16905 kind
= ffesymbol_kind (s
);
16906 where
= ffesymbol_where (s
);
16908 /* Figure out what kind of object we've got based on previous declarations
16909 of or references to the object. */
16911 if (sa
& FFESYMBOL_attrsEXTERNAL
)
16913 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
16914 | FFESYMBOL_attrsDUMMY
16915 | FFESYMBOL_attrsEXTERNAL
16916 | FFESYMBOL_attrsTYPE
)));
16918 if (sa
& FFESYMBOL_attrsTYPE
)
16919 where
= FFEINFO_whereGLOBAL
;
16923 kind
= FFEINFO_kindFUNCTION
;
16926 if (sa
& FFESYMBOL_attrsDUMMY
)
16928 else if (sa
& FFESYMBOL_attrsACTUALARG
)
16929 ; /* Not DUMMY or TYPE. */
16930 else /* Not ACTUALARG, DUMMY, or TYPE. */
16931 where
= FFEINFO_whereGLOBAL
;
16934 else if (sa
& FFESYMBOL_attrsDUMMY
)
16936 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
16937 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
16938 | FFESYMBOL_attrsEXTERNAL
16939 | FFESYMBOL_attrsTYPE
)));
16941 kind
= FFEINFO_kindFUNCTION
;
16942 if (!(sa
& FFESYMBOL_attrsTYPE
))
16945 else if (sa
& FFESYMBOL_attrsARRAY
)
16947 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
16948 | FFESYMBOL_attrsADJUSTABLE
16949 | FFESYMBOL_attrsTYPE
)));
16953 else if (sa
& FFESYMBOL_attrsSFARG
)
16955 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
16956 | FFESYMBOL_attrsTYPE
)));
16960 else if (sa
& FFESYMBOL_attrsTYPE
)
16962 assert (!(sa
& (FFESYMBOL_attrsARRAY
16963 | FFESYMBOL_attrsDUMMY
16964 | FFESYMBOL_attrsEXTERNAL
16965 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
16966 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
16967 | FFESYMBOL_attrsADJUSTABLE
16968 | FFESYMBOL_attrsANYLEN
16969 | FFESYMBOL_attrsARRAY
16970 | FFESYMBOL_attrsDUMMY
16971 | FFESYMBOL_attrsEXTERNAL
16972 | FFESYMBOL_attrsSFARG
)));
16974 if (sa
& (FFESYMBOL_attrsADJUSTABLE
| FFESYMBOL_attrsANYLEN
))
16978 kind
= FFEINFO_kindFUNCTION
;
16979 where
= FFEINFO_whereGLOBAL
;
16982 else if (sa
== FFESYMBOL_attrsetNONE
)
16984 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
16985 kind
= FFEINFO_kindFUNCTION
;
16986 where
= FFEINFO_whereGLOBAL
;
16992 /* Now see what we've got for a new object: NONE means a new error cropped
16993 up; ANY means an old error to be ignored; otherwise, everything's ok,
16994 update the object (symbol) and continue on. */
16997 ffesymbol_error (s
, t
);
16998 else if (!(na
& FFESYMBOL_attrsANY
))
17000 ffesymbol_signal_change (s
); /* May need to back up to previous
17002 if (needs_type
&& !ffeimplic_establish_symbol (s
))
17004 ffesymbol_error (s
, t
);
17007 if (!ffesymbol_explicitwhere (s
))
17009 ffebad_start (FFEBAD_NEED_EXTERNAL
);
17010 ffebad_here (0, ffelex_token_where_line (t
),
17011 ffelex_token_where_column (t
));
17012 ffebad_string (ffesymbol_text (s
));
17014 ffesymbol_set_explicitwhere (s
, TRUE
);
17016 ffesymbol_set_info (s
,
17017 ffeinfo_new (ffesymbol_basictype (s
),
17018 ffesymbol_kindtype (s
),
17019 ffesymbol_rank (s
),
17020 kind
, /* FUNCTION. */
17021 where
, /* GLOBAL or DUMMY. */
17022 ffesymbol_size (s
)));
17023 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
17024 ffesymbol_resolve_intrin (s
);
17025 ffesymbol_reference (s
, t
, FALSE
);
17026 s
= ffecom_sym_learned (s
);
17027 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
17033 /* Have FOO in DATA (stuff,FOO=1,10)/.../. */
17036 ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s
, ffelexToken t
)
17040 /* If the symbol isn't in the sfunc name space, pretend as though we saw a
17041 reference to it already within the imp-DO construct at this level, so as
17042 to get a symbol that is in the sfunc name space. But this is an
17043 erroneous construct, and should be caught elsewhere. */
17045 if (ffesymbol_sfdummyparent (s
) == NULL
)
17047 s
= ffeexpr_sym_impdoitem_ (s
, t
);
17048 if (ffesymbol_sfdummyparent (s
) == NULL
)
17049 { /* PARAMETER FOO...DATA (A(I),FOO=...). */
17050 ffesymbol_error (s
, t
);
17055 ss
= ffesymbol_state (s
);
17059 case FFESYMBOL_stateNONE
: /* Used as iterator already. */
17060 if (ffeexpr_level_
< ffesymbol_maxentrynum (s
))
17061 ffesymbol_error (s
, t
); /* Can't reuse dead iterator. F90 disallows
17062 this; F77 allows it but it is a stupid
17065 { /* Can use dead iterator because we're at at
17066 least a innermore (higher-numbered) level
17067 than the iterator's outermost
17068 (lowest-numbered) level. This should be
17069 diagnosed later, because it means an item
17070 in this list didn't reference this
17073 ffesymbol_error (s
, t
); /* For now, complain. */
17074 #else /* Someday will detect all cases where initializer doesn't reference
17075 all applicable iterators, in which case reenable this code. */
17076 ffesymbol_signal_change (s
);
17077 ffesymbol_set_state (s
, FFESYMBOL_stateUNCERTAIN
);
17078 ffesymbol_set_maxentrynum (s
, ffeexpr_level_
);
17079 ffesymbol_signal_unreported (s
);
17084 case FFESYMBOL_stateSEEN
: /* Seen already in this or other implied-DO.
17085 If seen in outermore level, can't be an
17086 iterator here, so complain. If not seen
17087 at current level, complain for now,
17088 because that indicates something F90
17089 rejects (though we currently don't detect
17090 all such cases for now). */
17091 if (ffeexpr_level_
<= ffesymbol_maxentrynum (s
))
17093 ffesymbol_signal_change (s
);
17094 ffesymbol_set_state (s
, FFESYMBOL_stateUNCERTAIN
);
17095 ffesymbol_signal_unreported (s
);
17098 ffesymbol_error (s
, t
);
17101 case FFESYMBOL_stateUNCERTAIN
: /* Already iterator! */
17102 assert ("DATA implied-DO control var seen twice!!" == NULL
);
17103 ffesymbol_error (s
, t
);
17106 case FFESYMBOL_stateUNDERSTOOD
:
17110 assert ("Foo Bletch!!" == NULL
);
17117 /* Have FOO in PARAMETER (FOO=...). */
17120 ffeexpr_sym_lhs_parameter_ (ffesymbol s
, ffelexToken t
)
17124 sa
= ffesymbol_attrs (s
);
17126 /* Figure out what kind of object we've got based on previous declarations
17127 of or references to the object. */
17129 if (sa
& ~(FFESYMBOL_attrsANYLEN
17130 | FFESYMBOL_attrsTYPE
))
17132 if (!(sa
& FFESYMBOL_attrsANY
))
17133 ffesymbol_error (s
, t
);
17137 ffesymbol_signal_change (s
); /* May need to back up to previous
17139 if (!ffeimplic_establish_symbol (s
))
17141 ffesymbol_error (s
, t
);
17144 ffesymbol_set_info (s
,
17145 ffeinfo_new (ffesymbol_basictype (s
),
17146 ffesymbol_kindtype (s
),
17147 ffesymbol_rank (s
),
17148 FFEINFO_kindENTITY
,
17149 FFEINFO_whereCONSTANT
,
17150 ffesymbol_size (s
)));
17151 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
17152 ffesymbol_resolve_intrin (s
);
17153 s
= ffecom_sym_learned (s
);
17154 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
17160 /* Have FOO in CALL XYZ(...,FOO,...). Does not include any other
17161 embedding of FOO, such as CALL XYZ((FOO)) or CALL XYZ(FOO+1). */
17164 ffeexpr_sym_rhs_actualarg_ (ffesymbol s
, ffelexToken t
)
17169 ffeinfoWhere where
;
17171 bool needs_type
= FALSE
;
17173 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
17174 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
17176 na
= sa
= ffesymbol_attrs (s
);
17178 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
17179 | FFESYMBOL_attrsADJUSTABLE
17180 | FFESYMBOL_attrsANYLEN
17181 | FFESYMBOL_attrsARRAY
17182 | FFESYMBOL_attrsDUMMY
17183 | FFESYMBOL_attrsEXTERNAL
17184 | FFESYMBOL_attrsSFARG
17185 | FFESYMBOL_attrsTYPE
)));
17187 kind
= ffesymbol_kind (s
);
17188 where
= ffesymbol_where (s
);
17190 /* Figure out what kind of object we've got based on previous declarations
17191 of or references to the object. */
17193 ns
= FFESYMBOL_stateUNDERSTOOD
;
17195 if (sa
& FFESYMBOL_attrsEXTERNAL
)
17197 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
17198 | FFESYMBOL_attrsDUMMY
17199 | FFESYMBOL_attrsEXTERNAL
17200 | FFESYMBOL_attrsTYPE
)));
17202 if (sa
& FFESYMBOL_attrsTYPE
)
17203 where
= FFEINFO_whereGLOBAL
;
17207 ns
= FFESYMBOL_stateUNCERTAIN
;
17209 if (sa
& FFESYMBOL_attrsDUMMY
)
17210 assert (kind
== FFEINFO_kindNONE
); /* FUNCTION, SUBROUTINE. */
17211 else if (sa
& FFESYMBOL_attrsACTUALARG
)
17212 ; /* Not DUMMY or TYPE. */
17214 /* Not ACTUALARG, DUMMY, or TYPE. */
17216 assert (kind
== FFEINFO_kindNONE
); /* FUNCTION, SUBROUTINE. */
17217 na
|= FFESYMBOL_attrsACTUALARG
;
17218 where
= FFEINFO_whereGLOBAL
;
17222 else if (sa
& FFESYMBOL_attrsDUMMY
)
17224 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
17225 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
17226 | FFESYMBOL_attrsEXTERNAL
17227 | FFESYMBOL_attrsTYPE
)));
17229 kind
= FFEINFO_kindENTITY
;
17230 if (!(sa
& FFESYMBOL_attrsTYPE
))
17233 else if (sa
& FFESYMBOL_attrsARRAY
)
17235 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
17236 | FFESYMBOL_attrsADJUSTABLE
17237 | FFESYMBOL_attrsTYPE
)));
17239 where
= FFEINFO_whereLOCAL
;
17241 else if (sa
& FFESYMBOL_attrsSFARG
)
17243 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
17244 | FFESYMBOL_attrsTYPE
)));
17246 where
= FFEINFO_whereLOCAL
;
17248 else if (sa
& FFESYMBOL_attrsTYPE
)
17250 assert (!(sa
& (FFESYMBOL_attrsARRAY
17251 | FFESYMBOL_attrsDUMMY
17252 | FFESYMBOL_attrsEXTERNAL
17253 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
17254 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
17255 | FFESYMBOL_attrsADJUSTABLE
17256 | FFESYMBOL_attrsANYLEN
17257 | FFESYMBOL_attrsARRAY
17258 | FFESYMBOL_attrsDUMMY
17259 | FFESYMBOL_attrsEXTERNAL
17260 | FFESYMBOL_attrsSFARG
)));
17262 if (sa
& FFESYMBOL_attrsANYLEN
)
17263 ns
= FFESYMBOL_stateNONE
;
17266 kind
= FFEINFO_kindENTITY
;
17267 where
= FFEINFO_whereLOCAL
;
17270 else if (sa
== FFESYMBOL_attrsetNONE
)
17272 /* New state is left empty because there isn't any state flag to
17273 set for this case, and it's UNDERSTOOD after all. */
17274 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
17275 kind
= FFEINFO_kindENTITY
;
17276 where
= FFEINFO_whereLOCAL
;
17280 ns
= FFESYMBOL_stateNONE
; /* Error. */
17282 /* Now see what we've got for a new object: NONE means a new error cropped
17283 up; ANY means an old error to be ignored; otherwise, everything's ok,
17284 update the object (symbol) and continue on. */
17286 if (ns
== FFESYMBOL_stateNONE
)
17287 ffesymbol_error (s
, t
);
17288 else if (!(na
& FFESYMBOL_attrsANY
))
17290 ffesymbol_signal_change (s
); /* May need to back up to previous
17292 if (needs_type
&& !ffeimplic_establish_symbol (s
))
17294 ffesymbol_error (s
, t
);
17297 ffesymbol_set_info (s
,
17298 ffeinfo_new (ffesymbol_basictype (s
),
17299 ffesymbol_kindtype (s
),
17300 ffesymbol_rank (s
),
17303 ffesymbol_size (s
)));
17304 ffesymbol_set_attrs (s
, na
);
17305 ffesymbol_set_state (s
, ns
);
17306 s
= ffecom_sym_learned (s
);
17307 ffesymbol_reference (s
, t
, FALSE
);
17308 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
17314 /* Have FOO in DIMENSION XYZ(FOO) or any array declarator containing
17315 a reference to FOO. */
17318 ffeexpr_sym_rhs_dimlist_ (ffesymbol s
, ffelexToken t
)
17323 ffeinfoWhere where
;
17325 na
= sa
= ffesymbol_attrs (s
);
17326 kind
= FFEINFO_kindENTITY
;
17327 where
= ffesymbol_where (s
);
17329 /* Figure out what kind of object we've got based on previous declarations
17330 of or references to the object. */
17332 if (!(sa
& ~(FFESYMBOL_attrsADJUSTS
17333 | FFESYMBOL_attrsCOMMON
17334 | FFESYMBOL_attrsDUMMY
17335 | FFESYMBOL_attrsEQUIV
17336 | FFESYMBOL_attrsINIT
17337 | FFESYMBOL_attrsNAMELIST
17338 | FFESYMBOL_attrsSFARG
17339 | FFESYMBOL_attrsARRAY
17340 | FFESYMBOL_attrsTYPE
)))
17341 na
= sa
| FFESYMBOL_attrsADJUSTS
;
17343 na
= FFESYMBOL_attrsetNONE
;
17345 /* Since this symbol definitely is going into an expression (the
17346 dimension-list for some dummy array, presumably), figure out WHERE if
17349 if (where
== FFEINFO_whereNONE
)
17351 if (na
& (FFESYMBOL_attrsCOMMON
17352 | FFESYMBOL_attrsEQUIV
17353 | FFESYMBOL_attrsINIT
17354 | FFESYMBOL_attrsNAMELIST
))
17355 where
= FFEINFO_whereCOMMON
;
17356 else if (na
& FFESYMBOL_attrsDUMMY
)
17357 where
= FFEINFO_whereDUMMY
;
17360 /* Now see what we've got for a new object: NONE means a new error cropped
17361 up; ANY means an old error to be ignored; otherwise, everything's ok,
17362 update the object (symbol) and continue on. */
17364 if (na
== FFESYMBOL_attrsetNONE
)
17365 ffesymbol_error (s
, t
);
17366 else if (!(na
& FFESYMBOL_attrsANY
))
17368 ffesymbol_signal_change (s
); /* May need to back up to previous
17370 if (!ffeimplic_establish_symbol (s
))
17372 ffesymbol_error (s
, t
);
17375 ffesymbol_set_info (s
,
17376 ffeinfo_new (ffesymbol_basictype (s
),
17377 ffesymbol_kindtype (s
),
17378 ffesymbol_rank (s
),
17379 kind
, /* Always ENTITY. */
17380 where
, /* NONE, COMMON, or DUMMY. */
17381 ffesymbol_size (s
)));
17382 ffesymbol_set_attrs (s
, na
);
17383 ffesymbol_set_state (s
, FFESYMBOL_stateSEEN
);
17384 ffesymbol_resolve_intrin (s
);
17385 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
17391 /* Have FOO in XYZ = ...FOO.... Does not include cases like FOO in
17392 XYZ = BAR(FOO), as such cases are handled elsewhere. */
17395 ffeexpr_sym_rhs_let_ (ffesymbol s
, ffelexToken t
)
17400 ffeinfoWhere where
;
17401 bool error
= FALSE
;
17403 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
17404 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
17406 na
= sa
= ffesymbol_attrs (s
);
17408 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
17409 | FFESYMBOL_attrsADJUSTABLE
17410 | FFESYMBOL_attrsANYLEN
17411 | FFESYMBOL_attrsARRAY
17412 | FFESYMBOL_attrsDUMMY
17413 | FFESYMBOL_attrsEXTERNAL
17414 | FFESYMBOL_attrsSFARG
17415 | FFESYMBOL_attrsTYPE
)));
17417 kind
= ffesymbol_kind (s
);
17418 where
= ffesymbol_where (s
);
17420 /* Figure out what kind of object we've got based on previous declarations
17421 of or references to the object. */
17423 if (sa
& FFESYMBOL_attrsEXTERNAL
)
17425 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
17426 | FFESYMBOL_attrsDUMMY
17427 | FFESYMBOL_attrsEXTERNAL
17428 | FFESYMBOL_attrsTYPE
)));
17432 else if (sa
& FFESYMBOL_attrsDUMMY
)
17434 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
17435 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
17436 | FFESYMBOL_attrsEXTERNAL
17437 | FFESYMBOL_attrsTYPE
)));
17439 kind
= FFEINFO_kindENTITY
;
17441 else if (sa
& FFESYMBOL_attrsARRAY
)
17443 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
17444 | FFESYMBOL_attrsADJUSTABLE
17445 | FFESYMBOL_attrsTYPE
)));
17447 where
= FFEINFO_whereLOCAL
;
17449 else if (sa
& FFESYMBOL_attrsSFARG
)
17451 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
17452 | FFESYMBOL_attrsTYPE
)));
17454 where
= FFEINFO_whereLOCAL
;
17456 else if (sa
& FFESYMBOL_attrsTYPE
)
17458 assert (!(sa
& (FFESYMBOL_attrsARRAY
17459 | FFESYMBOL_attrsDUMMY
17460 | FFESYMBOL_attrsEXTERNAL
17461 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
17462 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
17463 | FFESYMBOL_attrsADJUSTABLE
17464 | FFESYMBOL_attrsANYLEN
17465 | FFESYMBOL_attrsARRAY
17466 | FFESYMBOL_attrsDUMMY
17467 | FFESYMBOL_attrsEXTERNAL
17468 | FFESYMBOL_attrsSFARG
)));
17470 if (sa
& FFESYMBOL_attrsANYLEN
)
17474 kind
= FFEINFO_kindENTITY
;
17475 where
= FFEINFO_whereLOCAL
;
17478 else if (sa
== FFESYMBOL_attrsetNONE
)
17480 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
17481 kind
= FFEINFO_kindENTITY
;
17482 where
= FFEINFO_whereLOCAL
;
17487 /* Now see what we've got for a new object: NONE means a new error cropped
17488 up; ANY means an old error to be ignored; otherwise, everything's ok,
17489 update the object (symbol) and continue on. */
17492 ffesymbol_error (s
, t
);
17493 else if (!(na
& FFESYMBOL_attrsANY
))
17495 ffesymbol_signal_change (s
); /* May need to back up to previous
17497 if (!ffeimplic_establish_symbol (s
))
17499 ffesymbol_error (s
, t
);
17502 ffesymbol_set_info (s
,
17503 ffeinfo_new (ffesymbol_basictype (s
),
17504 ffesymbol_kindtype (s
),
17505 ffesymbol_rank (s
),
17506 kind
, /* ENTITY. */
17507 where
, /* LOCAL. */
17508 ffesymbol_size (s
)));
17509 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
17510 ffesymbol_resolve_intrin (s
);
17511 s
= ffecom_sym_learned (s
);
17512 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
17518 /* ffeexpr_declare_parenthesized_ -- ffesymbol wrapper for NAME(...) operand
17522 ffeexprParenType_ paren_type;
17524 s = ffeexpr_declare_parenthesized_ (t, maybe_intrin, &paren_type);
17526 Just like ffesymbol_declare_local, except performs any implicit info
17527 assignment necessary, and it returns the type of the parenthesized list
17528 (list of function args, list of array args, or substring spec). */
17531 ffeexpr_declare_parenthesized_ (ffelexToken t
, bool maybe_intrin
,
17532 ffeexprParenType_
*paren_type
)
17535 ffesymbolState st
; /* Effective state. */
17539 if (maybe_intrin
&& ffesrc_check_symbol ())
17540 { /* Knock off some easy cases. */
17541 switch (ffeexpr_stack_
->context
)
17543 case FFEEXPR_contextSUBROUTINEREF
:
17544 case FFEEXPR_contextDATA
:
17545 case FFEEXPR_contextDATAIMPDOINDEX_
:
17546 case FFEEXPR_contextSFUNCDEF
:
17547 case FFEEXPR_contextSFUNCDEFINDEX_
:
17548 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
17549 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
17550 case FFEEXPR_contextLET
:
17551 case FFEEXPR_contextPAREN_
:
17552 case FFEEXPR_contextACTUALARGEXPR_
:
17553 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
17554 case FFEEXPR_contextIOLIST
:
17555 case FFEEXPR_contextIOLISTDF
:
17556 case FFEEXPR_contextDO
:
17557 case FFEEXPR_contextDOWHILE
:
17558 case FFEEXPR_contextACTUALARG_
:
17559 case FFEEXPR_contextCGOTO
:
17560 case FFEEXPR_contextIF
:
17561 case FFEEXPR_contextARITHIF
:
17562 case FFEEXPR_contextFORMAT
:
17563 case FFEEXPR_contextSTOP
:
17564 case FFEEXPR_contextRETURN
:
17565 case FFEEXPR_contextSELECTCASE
:
17566 case FFEEXPR_contextCASE
:
17567 case FFEEXPR_contextFILEASSOC
:
17568 case FFEEXPR_contextFILEINT
:
17569 case FFEEXPR_contextFILEDFINT
:
17570 case FFEEXPR_contextFILELOG
:
17571 case FFEEXPR_contextFILENUM
:
17572 case FFEEXPR_contextFILENUMAMBIG
:
17573 case FFEEXPR_contextFILECHAR
:
17574 case FFEEXPR_contextFILENUMCHAR
:
17575 case FFEEXPR_contextFILEDFCHAR
:
17576 case FFEEXPR_contextFILEKEY
:
17577 case FFEEXPR_contextFILEUNIT
:
17578 case FFEEXPR_contextFILEUNIT_DF
:
17579 case FFEEXPR_contextFILEUNITAMBIG
:
17580 case FFEEXPR_contextFILEFORMAT
:
17581 case FFEEXPR_contextFILENAMELIST
:
17582 case FFEEXPR_contextFILEVXTCODE
:
17583 case FFEEXPR_contextINDEX_
:
17584 case FFEEXPR_contextIMPDOITEM_
:
17585 case FFEEXPR_contextIMPDOITEMDF_
:
17586 case FFEEXPR_contextIMPDOCTRL_
:
17587 case FFEEXPR_contextDATAIMPDOCTRL_
:
17588 case FFEEXPR_contextCHARACTERSIZE
:
17589 case FFEEXPR_contextPARAMETER
:
17590 case FFEEXPR_contextDIMLIST
:
17591 case FFEEXPR_contextDIMLISTCOMMON
:
17592 case FFEEXPR_contextKINDTYPE
:
17593 case FFEEXPR_contextINITVAL
:
17594 case FFEEXPR_contextEQVINDEX_
:
17595 break; /* These could be intrinsic invocations. */
17597 case FFEEXPR_contextAGOTO
:
17598 case FFEEXPR_contextFILEFORMATNML
:
17599 case FFEEXPR_contextALLOCATE
:
17600 case FFEEXPR_contextDEALLOCATE
:
17601 case FFEEXPR_contextHEAPSTAT
:
17602 case FFEEXPR_contextNULLIFY
:
17603 case FFEEXPR_contextINCLUDE
:
17604 case FFEEXPR_contextDATAIMPDOITEM_
:
17605 case FFEEXPR_contextLOC_
:
17606 case FFEEXPR_contextINDEXORACTUALARG_
:
17607 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
17608 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
17609 case FFEEXPR_contextPARENFILENUM_
:
17610 case FFEEXPR_contextPARENFILEUNIT_
:
17611 maybe_intrin
= FALSE
;
17612 break; /* Can't be intrinsic invocation. */
17615 assert ("blah! blah! waaauuggh!" == NULL
);
17620 s
= ffesymbol_declare_local (t
, maybe_intrin
);
17622 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
17623 /* Special-case these since they can involve a different concept
17624 of "state" (in the stmtfunc name space). */
17626 case FFEEXPR_contextDATAIMPDOINDEX_
:
17627 case FFEEXPR_contextDATAIMPDOCTRL_
:
17628 if (ffeexpr_context_outer_ (ffeexpr_stack_
)
17629 == FFEEXPR_contextDATAIMPDOINDEX_
)
17630 s
= ffeexpr_sym_impdoitem_ (s
, t
);
17632 if (ffeexpr_stack_
->is_rhs
)
17633 s
= ffeexpr_sym_impdoitem_ (s
, t
);
17635 s
= ffeexpr_sym_lhs_impdoctrl_ (s
, t
);
17636 if (ffesymbol_kind (s
) != FFEINFO_kindANY
)
17637 ffesymbol_error (s
, t
);
17644 switch ((ffesymbol_sfdummyparent (s
) == NULL
)
17645 ? ffesymbol_state (s
)
17646 : FFESYMBOL_stateUNDERSTOOD
)
17648 case FFESYMBOL_stateNONE
: /* Before first exec, not seen in expr
17650 if (!ffest_seen_first_exec ())
17651 goto seen
; /* :::::::::::::::::::: */
17652 /* Fall through. */
17653 case FFESYMBOL_stateUNCERTAIN
: /* Unseen since first exec. */
17654 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
17656 case FFEEXPR_contextSUBROUTINEREF
:
17657 s
= ffeexpr_sym_lhs_call_ (s
, t
); /* "CALL FOO"=="CALL
17661 case FFEEXPR_contextDATA
:
17662 if (ffeexpr_stack_
->is_rhs
)
17663 s
= ffeexpr_sym_rhs_let_ (s
, t
);
17665 s
= ffeexpr_sym_lhs_data_ (s
, t
);
17668 case FFEEXPR_contextDATAIMPDOITEM_
:
17669 s
= ffeexpr_sym_lhs_data_ (s
, t
);
17672 case FFEEXPR_contextSFUNCDEF
:
17673 case FFEEXPR_contextSFUNCDEFINDEX_
:
17674 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
17675 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
17676 s
= ffecom_sym_exec_transition (s
);
17677 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
17678 goto understood
; /* :::::::::::::::::::: */
17679 /* Fall through. */
17680 case FFEEXPR_contextLET
:
17681 case FFEEXPR_contextPAREN_
:
17682 case FFEEXPR_contextACTUALARGEXPR_
:
17683 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
17684 case FFEEXPR_contextIOLIST
:
17685 case FFEEXPR_contextIOLISTDF
:
17686 case FFEEXPR_contextDO
:
17687 case FFEEXPR_contextDOWHILE
:
17688 case FFEEXPR_contextACTUALARG_
:
17689 case FFEEXPR_contextCGOTO
:
17690 case FFEEXPR_contextIF
:
17691 case FFEEXPR_contextARITHIF
:
17692 case FFEEXPR_contextFORMAT
:
17693 case FFEEXPR_contextSTOP
:
17694 case FFEEXPR_contextRETURN
:
17695 case FFEEXPR_contextSELECTCASE
:
17696 case FFEEXPR_contextCASE
:
17697 case FFEEXPR_contextFILEASSOC
:
17698 case FFEEXPR_contextFILEINT
:
17699 case FFEEXPR_contextFILEDFINT
:
17700 case FFEEXPR_contextFILELOG
:
17701 case FFEEXPR_contextFILENUM
:
17702 case FFEEXPR_contextFILENUMAMBIG
:
17703 case FFEEXPR_contextFILECHAR
:
17704 case FFEEXPR_contextFILENUMCHAR
:
17705 case FFEEXPR_contextFILEDFCHAR
:
17706 case FFEEXPR_contextFILEKEY
:
17707 case FFEEXPR_contextFILEUNIT
:
17708 case FFEEXPR_contextFILEUNIT_DF
:
17709 case FFEEXPR_contextFILEUNITAMBIG
:
17710 case FFEEXPR_contextFILEFORMAT
:
17711 case FFEEXPR_contextFILENAMELIST
:
17712 case FFEEXPR_contextFILEVXTCODE
:
17713 case FFEEXPR_contextINDEX_
:
17714 case FFEEXPR_contextIMPDOITEM_
:
17715 case FFEEXPR_contextIMPDOITEMDF_
:
17716 case FFEEXPR_contextIMPDOCTRL_
:
17717 case FFEEXPR_contextLOC_
:
17718 if (ffeexpr_stack_
->is_rhs
)
17719 s
= ffeexpr_paren_rhs_let_ (s
, t
);
17721 s
= ffeexpr_paren_lhs_let_ (s
, t
);
17724 case FFEEXPR_contextASSIGN
:
17725 case FFEEXPR_contextAGOTO
:
17726 case FFEEXPR_contextCHARACTERSIZE
:
17727 case FFEEXPR_contextEQUIVALENCE
:
17728 case FFEEXPR_contextINCLUDE
:
17729 case FFEEXPR_contextPARAMETER
:
17730 case FFEEXPR_contextDIMLIST
:
17731 case FFEEXPR_contextDIMLISTCOMMON
:
17732 case FFEEXPR_contextKINDTYPE
:
17733 case FFEEXPR_contextINITVAL
:
17734 case FFEEXPR_contextEQVINDEX_
:
17735 break; /* Will turn into errors below. */
17738 ffesymbol_error (s
, t
);
17741 /* Fall through. */
17742 case FFESYMBOL_stateUNDERSTOOD
: /* Nothing much more to learn. */
17743 understood
: /* :::::::::::::::::::: */
17745 /* State might have changed, update it. */
17746 st
= ((ffesymbol_sfdummyparent (s
) == NULL
)
17747 ? ffesymbol_state (s
)
17748 : FFESYMBOL_stateUNDERSTOOD
);
17750 k
= ffesymbol_kind (s
);
17751 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
17753 case FFEEXPR_contextSUBROUTINEREF
:
17754 bad
= ((k
!= FFEINFO_kindSUBROUTINE
)
17755 && ((ffesymbol_where (s
) != FFEINFO_whereINTRINSIC
)
17756 || (k
!= FFEINFO_kindNONE
)));
17759 case FFEEXPR_contextDATA
:
17760 if (ffeexpr_stack_
->is_rhs
)
17761 bad
= (k
!= FFEINFO_kindENTITY
)
17762 || (ffesymbol_where (s
) != FFEINFO_whereCONSTANT
);
17764 bad
= (k
!= FFEINFO_kindENTITY
)
17765 || ((ffesymbol_where (s
) != FFEINFO_whereNONE
)
17766 && (ffesymbol_where (s
) != FFEINFO_whereLOCAL
)
17767 && (ffesymbol_where (s
) != FFEINFO_whereCOMMON
));
17770 case FFEEXPR_contextDATAIMPDOITEM_
:
17771 bad
= (k
!= FFEINFO_kindENTITY
) || (ffesymbol_rank (s
) == 0)
17772 || ((ffesymbol_where (s
) != FFEINFO_whereNONE
)
17773 && (ffesymbol_where (s
) != FFEINFO_whereLOCAL
)
17774 && (ffesymbol_where (s
) != FFEINFO_whereCOMMON
));
17777 case FFEEXPR_contextSFUNCDEF
:
17778 case FFEEXPR_contextSFUNCDEFINDEX_
:
17779 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
17780 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
17781 case FFEEXPR_contextLET
:
17782 case FFEEXPR_contextPAREN_
:
17783 case FFEEXPR_contextACTUALARGEXPR_
:
17784 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
17785 case FFEEXPR_contextIOLIST
:
17786 case FFEEXPR_contextIOLISTDF
:
17787 case FFEEXPR_contextDO
:
17788 case FFEEXPR_contextDOWHILE
:
17789 case FFEEXPR_contextACTUALARG_
:
17790 case FFEEXPR_contextCGOTO
:
17791 case FFEEXPR_contextIF
:
17792 case FFEEXPR_contextARITHIF
:
17793 case FFEEXPR_contextFORMAT
:
17794 case FFEEXPR_contextSTOP
:
17795 case FFEEXPR_contextRETURN
:
17796 case FFEEXPR_contextSELECTCASE
:
17797 case FFEEXPR_contextCASE
:
17798 case FFEEXPR_contextFILEASSOC
:
17799 case FFEEXPR_contextFILEINT
:
17800 case FFEEXPR_contextFILEDFINT
:
17801 case FFEEXPR_contextFILELOG
:
17802 case FFEEXPR_contextFILENUM
:
17803 case FFEEXPR_contextFILENUMAMBIG
:
17804 case FFEEXPR_contextFILECHAR
:
17805 case FFEEXPR_contextFILENUMCHAR
:
17806 case FFEEXPR_contextFILEDFCHAR
:
17807 case FFEEXPR_contextFILEKEY
:
17808 case FFEEXPR_contextFILEUNIT
:
17809 case FFEEXPR_contextFILEUNIT_DF
:
17810 case FFEEXPR_contextFILEUNITAMBIG
:
17811 case FFEEXPR_contextFILEFORMAT
:
17812 case FFEEXPR_contextFILENAMELIST
:
17813 case FFEEXPR_contextFILEVXTCODE
:
17814 case FFEEXPR_contextINDEX_
:
17815 case FFEEXPR_contextIMPDOITEM_
:
17816 case FFEEXPR_contextIMPDOITEMDF_
:
17817 case FFEEXPR_contextIMPDOCTRL_
:
17818 case FFEEXPR_contextLOC_
:
17819 bad
= FALSE
; /* Let paren-switch handle the cases. */
17822 case FFEEXPR_contextASSIGN
:
17823 case FFEEXPR_contextAGOTO
:
17824 case FFEEXPR_contextCHARACTERSIZE
:
17825 case FFEEXPR_contextEQUIVALENCE
:
17826 case FFEEXPR_contextPARAMETER
:
17827 case FFEEXPR_contextDIMLIST
:
17828 case FFEEXPR_contextDIMLISTCOMMON
:
17829 case FFEEXPR_contextKINDTYPE
:
17830 case FFEEXPR_contextINITVAL
:
17831 case FFEEXPR_contextEQVINDEX_
:
17832 bad
= (k
!= FFEINFO_kindENTITY
)
17833 || (ffesymbol_where (s
) != FFEINFO_whereCONSTANT
);
17836 case FFEEXPR_contextINCLUDE
:
17845 switch (bad
? FFEINFO_kindANY
: k
)
17847 case FFEINFO_kindNONE
: /* Case "CHARACTER X,Y; Y=X(?". */
17848 if (ffesymbol_where (s
) == FFEINFO_whereINTRINSIC
)
17850 if (ffeexpr_context_outer_ (ffeexpr_stack_
)
17851 == FFEEXPR_contextSUBROUTINEREF
)
17852 *paren_type
= FFEEXPR_parentypeSUBROUTINE_
;
17854 *paren_type
= FFEEXPR_parentypeFUNCTION_
;
17857 if (st
== FFESYMBOL_stateUNDERSTOOD
)
17860 *paren_type
= FFEEXPR_parentypeANY_
;
17863 *paren_type
= FFEEXPR_parentypeFUNSUBSTR_
;
17866 case FFEINFO_kindFUNCTION
:
17867 *paren_type
= FFEEXPR_parentypeFUNCTION_
;
17868 switch (ffesymbol_where (s
))
17870 case FFEINFO_whereLOCAL
:
17871 bad
= TRUE
; /* Attempt to recurse! */
17874 case FFEINFO_whereCONSTANT
:
17875 bad
= ((ffesymbol_sfexpr (s
) == NULL
)
17876 || (ffebld_op (ffesymbol_sfexpr (s
))
17877 == FFEBLD_opANY
)); /* Attempt to recurse! */
17885 case FFEINFO_kindSUBROUTINE
:
17886 if ((ffeexpr_stack_
->context
!= FFEEXPR_contextSUBROUTINEREF
)
17887 || (ffeexpr_stack_
->previous
!= NULL
))
17890 *paren_type
= FFEEXPR_parentypeANY_
;
17894 *paren_type
= FFEEXPR_parentypeSUBROUTINE_
;
17895 switch (ffesymbol_where (s
))
17897 case FFEINFO_whereLOCAL
:
17898 case FFEINFO_whereCONSTANT
:
17899 bad
= TRUE
; /* Attempt to recurse! */
17907 case FFEINFO_kindENTITY
:
17908 if (ffesymbol_rank (s
) == 0)
17910 if (ffesymbol_basictype (s
) == FFEINFO_basictypeCHARACTER
)
17911 *paren_type
= FFEEXPR_parentypeSUBSTRING_
;
17915 *paren_type
= FFEEXPR_parentypeANY_
;
17919 *paren_type
= FFEEXPR_parentypeARRAY_
;
17923 case FFEINFO_kindANY
:
17925 *paren_type
= FFEEXPR_parentypeANY_
;
17931 if (k
== FFEINFO_kindANY
)
17934 ffesymbol_error (s
, t
);
17939 case FFESYMBOL_stateSEEN
: /* Seen but not yet in exec portion. */
17940 seen
: /* :::::::::::::::::::: */
17942 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
17944 case FFEEXPR_contextPARAMETER
:
17945 if (ffeexpr_stack_
->is_rhs
)
17946 ffesymbol_error (s
, t
);
17948 s
= ffeexpr_sym_lhs_parameter_ (s
, t
);
17951 case FFEEXPR_contextDATA
:
17952 s
= ffecom_sym_exec_transition (s
);
17953 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
17954 goto understood
; /* :::::::::::::::::::: */
17955 if (ffeexpr_stack_
->is_rhs
)
17956 ffesymbol_error (s
, t
);
17958 s
= ffeexpr_sym_lhs_data_ (s
, t
);
17959 goto understood
; /* :::::::::::::::::::: */
17961 case FFEEXPR_contextDATAIMPDOITEM_
:
17962 s
= ffecom_sym_exec_transition (s
);
17963 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
17964 goto understood
; /* :::::::::::::::::::: */
17965 s
= ffeexpr_sym_lhs_data_ (s
, t
);
17966 goto understood
; /* :::::::::::::::::::: */
17968 case FFEEXPR_contextEQUIVALENCE
:
17969 s
= ffeexpr_sym_lhs_equivalence_ (s
, t
);
17973 case FFEEXPR_contextDIMLIST
:
17974 s
= ffeexpr_sym_rhs_dimlist_ (s
, t
);
17978 case FFEEXPR_contextCHARACTERSIZE
:
17979 case FFEEXPR_contextKINDTYPE
:
17980 case FFEEXPR_contextDIMLISTCOMMON
:
17981 case FFEEXPR_contextINITVAL
:
17982 case FFEEXPR_contextEQVINDEX_
:
17985 case FFEEXPR_contextINCLUDE
:
17988 case FFEEXPR_contextINDEX_
:
17989 case FFEEXPR_contextACTUALARGEXPR_
:
17990 case FFEEXPR_contextINDEXORACTUALARGEXPR_
:
17991 case FFEEXPR_contextSFUNCDEF
:
17992 case FFEEXPR_contextSFUNCDEFINDEX_
:
17993 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
17994 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
17995 assert (ffeexpr_stack_
->is_rhs
);
17996 s
= ffecom_sym_exec_transition (s
);
17997 if (ffesymbol_state (s
) == FFESYMBOL_stateUNDERSTOOD
)
17998 goto understood
; /* :::::::::::::::::::: */
17999 s
= ffeexpr_paren_rhs_let_ (s
, t
);
18000 goto understood
; /* :::::::::::::::::::: */
18005 k
= ffesymbol_kind (s
);
18006 switch (bad
? FFEINFO_kindANY
: k
)
18008 case FFEINFO_kindNONE
: /* Case "CHARACTER X,Y; Y=X(?". */
18009 *paren_type
= FFEEXPR_parentypeFUNSUBSTR_
;
18012 case FFEINFO_kindFUNCTION
:
18013 *paren_type
= FFEEXPR_parentypeFUNCTION_
;
18014 switch (ffesymbol_where (s
))
18016 case FFEINFO_whereLOCAL
:
18017 bad
= TRUE
; /* Attempt to recurse! */
18020 case FFEINFO_whereCONSTANT
:
18021 bad
= ((ffesymbol_sfexpr (s
) == NULL
)
18022 || (ffebld_op (ffesymbol_sfexpr (s
))
18023 == FFEBLD_opANY
)); /* Attempt to recurse! */
18031 case FFEINFO_kindSUBROUTINE
:
18032 *paren_type
= FFEEXPR_parentypeANY_
;
18033 bad
= TRUE
; /* Cannot possibly be in
18034 contextSUBROUTINEREF. */
18037 case FFEINFO_kindENTITY
:
18038 if (ffesymbol_rank (s
) == 0)
18040 if (ffeexpr_stack_
->context
== FFEEXPR_contextEQUIVALENCE
)
18041 *paren_type
= FFEEXPR_parentypeEQUIVALENCE_
;
18042 else if (ffesymbol_basictype (s
) == FFEINFO_basictypeCHARACTER
)
18043 *paren_type
= FFEEXPR_parentypeSUBSTRING_
;
18047 *paren_type
= FFEEXPR_parentypeANY_
;
18051 *paren_type
= FFEEXPR_parentypeARRAY_
;
18055 case FFEINFO_kindANY
:
18057 *paren_type
= FFEEXPR_parentypeANY_
;
18063 if (k
== FFEINFO_kindANY
)
18066 ffesymbol_error (s
, t
);
18072 assert ("bad symbol state" == NULL
);
18077 /* Have FOO in XYZ = ...FOO(...).... Executable context only. */
18080 ffeexpr_paren_rhs_let_ (ffesymbol s
, ffelexToken t
)
18085 ffeinfoWhere where
;
18087 ffeintrinSpec spec
;
18089 bool maybe_ambig
= FALSE
;
18090 bool error
= FALSE
;
18092 assert ((ffesymbol_state (s
) == FFESYMBOL_stateNONE
)
18093 || (ffesymbol_state (s
) == FFESYMBOL_stateUNCERTAIN
));
18095 na
= sa
= ffesymbol_attrs (s
);
18097 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
18098 | FFESYMBOL_attrsADJUSTABLE
18099 | FFESYMBOL_attrsANYLEN
18100 | FFESYMBOL_attrsARRAY
18101 | FFESYMBOL_attrsDUMMY
18102 | FFESYMBOL_attrsEXTERNAL
18103 | FFESYMBOL_attrsSFARG
18104 | FFESYMBOL_attrsTYPE
)));
18106 kind
= ffesymbol_kind (s
);
18107 where
= ffesymbol_where (s
);
18109 /* Figure out what kind of object we've got based on previous declarations
18110 of or references to the object. */
18112 if (sa
& FFESYMBOL_attrsEXTERNAL
)
18114 assert (!(sa
& ~(FFESYMBOL_attrsACTUALARG
18115 | FFESYMBOL_attrsDUMMY
18116 | FFESYMBOL_attrsEXTERNAL
18117 | FFESYMBOL_attrsTYPE
)));
18119 if (sa
& FFESYMBOL_attrsTYPE
)
18120 where
= FFEINFO_whereGLOBAL
;
18124 kind
= FFEINFO_kindFUNCTION
;
18126 if (sa
& FFESYMBOL_attrsDUMMY
)
18128 else if (sa
& FFESYMBOL_attrsACTUALARG
)
18129 ; /* Not DUMMY or TYPE. */
18130 else /* Not ACTUALARG, DUMMY, or TYPE. */
18131 where
= FFEINFO_whereGLOBAL
;
18134 else if (sa
& FFESYMBOL_attrsDUMMY
)
18136 assert (!(sa
& FFESYMBOL_attrsEXTERNAL
)); /* Handled above. */
18137 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
18138 | FFESYMBOL_attrsEXTERNAL
18139 | FFESYMBOL_attrsTYPE
)));
18141 kind
= FFEINFO_kindFUNCTION
;
18142 maybe_ambig
= TRUE
; /* If basictypeCHARACTER, can't be sure; kind
18143 could be ENTITY w/substring ref. */
18145 else if (sa
& FFESYMBOL_attrsARRAY
)
18147 assert (!(sa
& ~(FFESYMBOL_attrsARRAY
18148 | FFESYMBOL_attrsADJUSTABLE
18149 | FFESYMBOL_attrsTYPE
)));
18151 where
= FFEINFO_whereLOCAL
;
18153 else if (sa
& FFESYMBOL_attrsSFARG
)
18155 assert (!(sa
& ~(FFESYMBOL_attrsSFARG
18156 | FFESYMBOL_attrsTYPE
)));
18158 where
= FFEINFO_whereLOCAL
; /* Actually an error, but at least we
18159 know it's a local var. */
18161 else if (sa
& FFESYMBOL_attrsTYPE
)
18163 assert (!(sa
& (FFESYMBOL_attrsARRAY
18164 | FFESYMBOL_attrsDUMMY
18165 | FFESYMBOL_attrsEXTERNAL
18166 | FFESYMBOL_attrsSFARG
))); /* Handled above. */
18167 assert (!(sa
& ~(FFESYMBOL_attrsTYPE
18168 | FFESYMBOL_attrsADJUSTABLE
18169 | FFESYMBOL_attrsANYLEN
18170 | FFESYMBOL_attrsARRAY
18171 | FFESYMBOL_attrsDUMMY
18172 | FFESYMBOL_attrsEXTERNAL
18173 | FFESYMBOL_attrsSFARG
)));
18175 if (ffeintrin_is_intrinsic (ffesymbol_text (s
), t
, FALSE
,
18176 &gen
, &spec
, &imp
))
18178 if (!(sa
& FFESYMBOL_attrsANYLEN
)
18179 && (ffeimplic_peek_symbol_type (s
, NULL
)
18180 == FFEINFO_basictypeCHARACTER
))
18181 return s
; /* Haven't learned anything yet. */
18183 ffesymbol_signal_change (s
); /* May need to back up to previous
18185 ffesymbol_set_generic (s
, gen
);
18186 ffesymbol_set_specific (s
, spec
);
18187 ffesymbol_set_implementation (s
, imp
);
18188 ffesymbol_set_info (s
,
18189 ffeinfo_new (ffesymbol_basictype (s
),
18190 ffesymbol_kindtype (s
),
18192 FFEINFO_kindFUNCTION
,
18193 FFEINFO_whereINTRINSIC
,
18194 ffesymbol_size (s
)));
18195 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
18196 ffesymbol_resolve_intrin (s
);
18197 ffesymbol_reference (s
, t
, FALSE
);
18198 s
= ffecom_sym_learned (s
);
18199 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
18203 if (sa
& FFESYMBOL_attrsANYLEN
)
18204 error
= TRUE
; /* Error, since the only way we can,
18205 given CHARACTER*(*) FOO, accept
18206 FOO(...) is for FOO to be a dummy
18207 arg or constant, but it can't
18208 become either now. */
18209 else if (sa
& FFESYMBOL_attrsADJUSTABLE
)
18211 kind
= FFEINFO_kindENTITY
;
18212 where
= FFEINFO_whereLOCAL
;
18216 kind
= FFEINFO_kindFUNCTION
;
18217 where
= FFEINFO_whereGLOBAL
;
18218 maybe_ambig
= TRUE
; /* If basictypeCHARACTER, can't be sure;
18219 could be ENTITY/LOCAL w/substring ref. */
18222 else if (sa
== FFESYMBOL_attrsetNONE
)
18224 assert (ffesymbol_state (s
) == FFESYMBOL_stateNONE
);
18226 if (ffeintrin_is_intrinsic (ffesymbol_text (s
), t
, FALSE
,
18227 &gen
, &spec
, &imp
))
18229 if (ffeimplic_peek_symbol_type (s
, NULL
)
18230 == FFEINFO_basictypeCHARACTER
)
18231 return s
; /* Haven't learned anything yet. */
18233 ffesymbol_signal_change (s
); /* May need to back up to previous
18235 ffesymbol_set_generic (s
, gen
);
18236 ffesymbol_set_specific (s
, spec
);
18237 ffesymbol_set_implementation (s
, imp
);
18238 ffesymbol_set_info (s
,
18239 ffeinfo_new (ffesymbol_basictype (s
),
18240 ffesymbol_kindtype (s
),
18242 FFEINFO_kindFUNCTION
,
18243 FFEINFO_whereINTRINSIC
,
18244 ffesymbol_size (s
)));
18245 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
18246 ffesymbol_resolve_intrin (s
);
18247 s
= ffecom_sym_learned (s
);
18248 ffesymbol_reference (s
, t
, FALSE
);
18249 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
18253 kind
= FFEINFO_kindFUNCTION
;
18254 where
= FFEINFO_whereGLOBAL
;
18255 maybe_ambig
= TRUE
; /* If basictypeCHARACTER, can't be sure;
18256 could be ENTITY/LOCAL w/substring ref. */
18261 /* Now see what we've got for a new object: NONE means a new error cropped
18262 up; ANY means an old error to be ignored; otherwise, everything's ok,
18263 update the object (symbol) and continue on. */
18266 ffesymbol_error (s
, t
);
18267 else if (!(na
& FFESYMBOL_attrsANY
))
18269 ffesymbol_signal_change (s
); /* May need to back up to previous
18271 if (!ffeimplic_establish_symbol (s
))
18273 ffesymbol_error (s
, t
);
18277 && (ffesymbol_basictype (s
) == FFEINFO_basictypeCHARACTER
))
18278 return s
; /* Still not sure, let caller deal with it
18281 ffesymbol_set_info (s
,
18282 ffeinfo_new (ffesymbol_basictype (s
),
18283 ffesymbol_kindtype (s
),
18284 ffesymbol_rank (s
),
18287 ffesymbol_size (s
)));
18288 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
18289 ffesymbol_resolve_intrin (s
);
18290 s
= ffecom_sym_learned (s
);
18291 ffesymbol_reference (s
, t
, FALSE
);
18292 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
18298 /* ffeexpr_token_arguments_ -- OPEN_PAREN [expr COMMA]...expr
18300 Return a pointer to this function to the lexer (ffelex), which will
18301 invoke it for the next token.
18303 Handle expression (which might be null) and COMMA or CLOSE_PAREN. */
18305 static ffelexHandler
18306 ffeexpr_token_arguments_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
18308 ffeexprExpr_ procedure
;
18311 ffeexprContext ctx
;
18312 bool check_intrin
= FALSE
; /* Set TRUE if intrinsic is REAL(Z) or AIMAG(Z). */
18314 procedure
= ffeexpr_stack_
->exprstack
;
18315 info
= ffebld_info (procedure
->u
.operand
);
18317 /* Is there an expression to add? If the expression is nil,
18318 it might still be an argument. It is if:
18320 - The current token is comma, or
18322 - The -fugly-comma flag was specified *and* the procedure
18323 being invoked is external.
18325 Otherwise, if neither of the above is the case, just
18326 ignore this (nil) expression. */
18329 || (ffelex_token_type (t
) == FFELEX_typeCOMMA
)
18330 || (ffe_is_ugly_comma ()
18331 && (ffeinfo_where (info
) == FFEINFO_whereGLOBAL
)))
18333 /* This expression, even if nil, is apparently intended as an argument. */
18335 /* Internal procedure (CONTAINS, or statement function)? */
18337 if (ffeinfo_where (info
) == FFEINFO_whereCONSTANT
)
18340 && ffebad_start (FFEBAD_NULL_ARGUMENT
))
18342 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18343 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18344 ffebad_here (1, ffelex_token_where_line (t
),
18345 ffelex_token_where_column (t
));
18353 if (ffeexpr_stack_
->next_dummy
== NULL
)
18354 { /* Report later which was the first extra argument. */
18355 if (ffeexpr_stack_
->tokens
[1] == NULL
)
18357 ffeexpr_stack_
->tokens
[1] = ffelex_token_use (ft
);
18358 ffeexpr_stack_
->num_args
= 0;
18360 ++ffeexpr_stack_
->num_args
; /* Count # of extra arguments. */
18364 if ((ffeinfo_rank (ffebld_info (expr
)) != 0)
18365 && ffebad_start (FFEBAD_ARRAY_AS_SFARG
))
18368 ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18369 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18370 ffebad_here (1, ffelex_token_where_line (ft
),
18371 ffelex_token_where_column (ft
));
18372 ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent
18373 (ffebld_symter (ffebld_head
18374 (ffeexpr_stack_
->next_dummy
)))));
18379 expr
= ffeexpr_convert_expr (expr
, ft
,
18380 ffebld_head (ffeexpr_stack_
->next_dummy
),
18381 ffeexpr_stack_
->tokens
[0],
18382 FFEEXPR_contextLET
);
18383 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18385 --ffeexpr_stack_
->num_args
; /* Count down # of args. */
18386 ffeexpr_stack_
->next_dummy
18387 = ffebld_trail (ffeexpr_stack_
->next_dummy
);
18394 && ffe_is_pedantic ()
18395 && ffebad_start (FFEBAD_NULL_ARGUMENT_W
))
18397 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18398 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18399 ffebad_here (1, ffelex_token_where_line (t
),
18400 ffelex_token_where_column (t
));
18403 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18407 switch (ffelex_token_type (t
))
18409 case FFELEX_typeCOMMA
:
18410 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
18412 case FFEEXPR_contextSFUNCDEF
:
18413 case FFEEXPR_contextSFUNCDEFACTUALARGEXPR_
:
18414 case FFEEXPR_contextSFUNCDEFINDEX_
:
18415 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARGEXPR_
:
18416 ctx
= FFEEXPR_contextSFUNCDEFACTUALARG_
;
18419 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
18420 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
18421 assert ("bad context" == NULL
);
18422 ctx
= FFEEXPR_context
;
18426 ctx
= FFEEXPR_contextACTUALARG_
;
18429 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
, ctx
,
18430 ffeexpr_token_arguments_
);
18436 if ((ffeinfo_where (info
) == FFEINFO_whereCONSTANT
)
18437 && (ffeexpr_stack_
->next_dummy
!= NULL
))
18438 { /* Too few arguments. */
18439 if (ffebad_start (FFEBAD_TOO_FEW_ARGUMENTS
))
18443 sprintf (num
, "%" ffebldListLength_f
"u", ffeexpr_stack_
->num_args
);
18445 ffebad_here (0, ffelex_token_where_line (t
),
18446 ffelex_token_where_column (t
));
18447 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18448 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18449 ffebad_string (num
);
18450 ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent (ffebld_symter
18451 (ffebld_head (ffeexpr_stack_
->next_dummy
)))));
18455 ffeexpr_stack_
->next_dummy
!= NULL
;
18456 ffeexpr_stack_
->next_dummy
18457 = ffebld_trail (ffeexpr_stack_
->next_dummy
))
18459 expr
= ffebld_new_conter (ffebld_constant_new_integerdefault_val (0));
18460 ffebld_set_info (expr
, ffeinfo_new_any ());
18461 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18465 if ((ffeinfo_where (info
) == FFEINFO_whereCONSTANT
)
18466 && (ffeexpr_stack_
->tokens
[1] != NULL
))
18467 { /* Too many arguments to statement function. */
18468 if (ffebad_start (FFEBAD_TOO_MANY_ARGUMENTS
))
18472 sprintf (num
, "%" ffebldListLength_f
"u", ffeexpr_stack_
->num_args
);
18474 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[1]),
18475 ffelex_token_where_column (ffeexpr_stack_
->tokens
[1]));
18476 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18477 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18478 ffebad_string (num
);
18481 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
18483 ffebld_end_list (&ffeexpr_stack_
->bottom
);
18485 if (ffebld_op (procedure
->u
.operand
) == FFEBLD_opANY
)
18487 reduced
= ffebld_new_any ();
18488 ffebld_set_info (reduced
, ffeinfo_new_any ());
18492 if (ffeexpr_stack_
->context
!= FFEEXPR_contextSUBROUTINEREF
)
18493 reduced
= ffebld_new_funcref (procedure
->u
.operand
,
18494 ffeexpr_stack_
->expr
);
18496 reduced
= ffebld_new_subrref (procedure
->u
.operand
,
18497 ffeexpr_stack_
->expr
);
18498 if (ffebld_symter_generic (procedure
->u
.operand
) != FFEINTRIN_genNONE
)
18499 ffeintrin_fulfill_generic (&reduced
, &info
, ffeexpr_stack_
->tokens
[0]);
18500 else if (ffebld_symter_specific (procedure
->u
.operand
)
18501 != FFEINTRIN_specNONE
)
18502 ffeintrin_fulfill_specific (&reduced
, &info
, &check_intrin
,
18503 ffeexpr_stack_
->tokens
[0]);
18505 ffeexpr_fulfill_call_ (&reduced
, ffeexpr_stack_
->tokens
[0]);
18507 if (ffebld_op (reduced
) != FFEBLD_opANY
)
18508 ffebld_set_info (reduced
,
18509 ffeinfo_new (ffeinfo_basictype (info
),
18510 ffeinfo_kindtype (info
),
18512 FFEINFO_kindENTITY
,
18513 FFEINFO_whereFLEETING
,
18514 ffeinfo_size (info
)));
18516 ffebld_set_info (reduced
, ffeinfo_new_any ());
18518 if (ffebld_op (reduced
) == FFEBLD_opFUNCREF
)
18519 reduced
= ffeexpr_collapse_funcref (reduced
, ffeexpr_stack_
->tokens
[0]);
18520 ffeexpr_stack_
->exprstack
= procedure
->previous
; /* Pops
18521 not-quite-operand off
18523 procedure
->u
.operand
= reduced
; /* Save the line/column ffewhere
18525 ffeexpr_exprstack_push_operand_ (procedure
); /* Push it back on stack. */
18526 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
18528 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
18529 ffeexpr_is_substr_ok_
= FALSE
; /* Nobody likes "FUNC(3)(1:1)".... */
18531 /* If the intrinsic needs checking (is REAL(Z) or AIMAG(Z), where
18532 Z is DOUBLE COMPLEX), and a command-line option doesn't already
18533 establish interpretation, probably complain. */
18537 && !ffe_is_ugly_complex ())
18539 /* If the outer expression is REAL(me...), issue diagnostic
18540 only if next token isn't the close-paren for REAL(me). */
18542 if ((ffeexpr_stack_
->previous
!= NULL
)
18543 && (ffeexpr_stack_
->previous
->exprstack
!= NULL
)
18544 && (ffeexpr_stack_
->previous
->exprstack
->type
== FFEEXPR_exprtypeOPERAND_
)
18545 && ((reduced
= ffeexpr_stack_
->previous
->exprstack
->u
.operand
) != NULL
)
18546 && (ffebld_op (reduced
) == FFEBLD_opSYMTER
)
18547 && (ffebld_symter_implementation (reduced
) == FFEINTRIN_impREAL
))
18548 return (ffelexHandler
) ffeexpr_token_intrincheck_
;
18550 /* Diagnose the ambiguity now. */
18552 if (ffebad_start (FFEBAD_INTRINSIC_CMPAMBIG
))
18554 ffebad_string (ffeintrin_name_implementation
18555 (ffebld_symter_implementation
18557 (ffeexpr_stack_
->exprstack
->u
.operand
))));
18558 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->exprstack
->token
),
18559 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->token
));
18563 return (ffelexHandler
) ffeexpr_token_substrp_
;
18566 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION
))
18568 ffebad_here (0, ffelex_token_where_line (t
),
18569 ffelex_token_where_column (t
));
18570 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18571 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18574 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
18575 ffeexpr_is_substr_ok_
= FALSE
;/* Nobody likes "FUNC(3)(1:1)".... */
18577 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
18579 ffeexpr_token_substrp_
);
18582 /* ffeexpr_token_elements_ -- OPEN_PAREN [expr COMMA]...expr
18584 Return a pointer to this array to the lexer (ffelex), which will
18585 invoke it for the next token.
18587 Handle expression and COMMA or CLOSE_PAREN. */
18589 static ffelexHandler
18590 ffeexpr_token_elements_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
18592 ffeexprExpr_ array
;
18595 ffeinfoWhere where
;
18596 ffetargetIntegerDefault val
;
18597 ffetargetIntegerDefault lval
= 0;
18598 ffetargetIntegerDefault uval
= 0;
18604 array
= ffeexpr_stack_
->exprstack
;
18605 info
= ffebld_info (array
->u
.operand
);
18607 if ((expr
== NULL
) /* && ((ffeexpr_stack_->rank != 0) ||
18608 (ffelex_token_type(t) ==
18609 FFELEX_typeCOMMA)) */ )
18611 if (ffebad_start (FFEBAD_NULL_ELEMENT
))
18613 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18614 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18615 ffebad_here (1, ffelex_token_where_line (t
),
18616 ffelex_token_where_column (t
));
18619 if (ffeexpr_stack_
->rank
< ffeinfo_rank (info
))
18620 { /* Don't bother if we're going to complain
18622 expr
= ffebld_new_conter (ffebld_constant_new_integerdefault_val (1));
18623 ffebld_set_info (expr
, ffeinfo_new_any ());
18629 else if (ffeinfo_rank (info
) == 0)
18630 { /* In EQUIVALENCE context, ffeinfo_rank(info)
18632 ++ffeexpr_stack_
->rank
; /* Track anyway, may need for new VXT
18634 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18638 ++ffeexpr_stack_
->rank
;
18639 if (ffeexpr_stack_
->rank
> ffeinfo_rank (info
))
18640 { /* Report later which was the first extra
18642 if (ffeexpr_stack_
->rank
== ffeinfo_rank (info
) + 1)
18643 ffeexpr_stack_
->tokens
[1] = ffelex_token_use (ft
);
18647 switch (ffeinfo_where (ffebld_info (expr
)))
18649 case FFEINFO_whereCONSTANT
:
18652 case FFEINFO_whereIMMEDIATE
:
18653 ffeexpr_stack_
->constant
= FALSE
;
18657 ffeexpr_stack_
->constant
= FALSE
;
18658 ffeexpr_stack_
->immediate
= FALSE
;
18661 if (ffebld_op (expr
) == FFEBLD_opCONTER
18662 && ffebld_kindtype (expr
) == FFEINFO_kindtypeINTEGERDEFAULT
)
18664 val
= ffebld_constant_integerdefault (ffebld_conter (expr
));
18666 lbound
= ffebld_left (ffebld_head (ffeexpr_stack_
->bound_list
));
18667 if (lbound
== NULL
)
18672 else if (ffebld_op (lbound
) == FFEBLD_opCONTER
)
18675 lval
= ffebld_constant_integerdefault (ffebld_conter (lbound
));
18680 ubound
= ffebld_right (ffebld_head (ffeexpr_stack_
->bound_list
));
18681 assert (ubound
!= NULL
);
18682 if (ffebld_op (ubound
) == FFEBLD_opCONTER
)
18685 uval
= ffebld_constant_integerdefault (ffebld_conter (ubound
));
18690 if ((lcheck
&& (val
< lval
)) || (ucheck
&& (val
> uval
)))
18692 ffebad_start (FFEBAD_RANGE_ARRAY
);
18693 ffebad_here (0, ffelex_token_where_line (ft
),
18694 ffelex_token_where_column (ft
));
18698 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18699 ffeexpr_stack_
->bound_list
= ffebld_trail (ffeexpr_stack_
->bound_list
);
18703 switch (ffelex_token_type (t
))
18705 case FFELEX_typeCOMMA
:
18706 switch (ffeexpr_context_outer_ (ffeexpr_stack_
))
18708 case FFEEXPR_contextDATAIMPDOITEM_
:
18709 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
18710 FFEEXPR_contextDATAIMPDOINDEX_
,
18711 ffeexpr_token_elements_
);
18713 case FFEEXPR_contextEQUIVALENCE
:
18714 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
18715 FFEEXPR_contextEQVINDEX_
,
18716 ffeexpr_token_elements_
);
18718 case FFEEXPR_contextSFUNCDEF
:
18719 case FFEEXPR_contextSFUNCDEFINDEX_
:
18720 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
18721 FFEEXPR_contextSFUNCDEFINDEX_
,
18722 ffeexpr_token_elements_
);
18724 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
18725 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
18726 assert ("bad context" == NULL
);
18730 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
18731 FFEEXPR_contextINDEX_
,
18732 ffeexpr_token_elements_
);
18739 if ((ffeexpr_stack_
->rank
!= ffeinfo_rank (info
))
18740 && (ffeinfo_rank (info
) != 0))
18744 if (ffeexpr_stack_
->rank
< ffeinfo_rank (info
))
18746 if (ffebad_start (FFEBAD_TOO_FEW_ELEMENTS
))
18748 sprintf (num
, "%d",
18749 (int) (ffeinfo_rank (info
) - ffeexpr_stack_
->rank
));
18751 ffebad_here (0, ffelex_token_where_line (t
),
18752 ffelex_token_where_column (t
));
18754 ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18755 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18756 ffebad_string (num
);
18762 if (ffebad_start (FFEBAD_TOO_MANY_ELEMENTS
))
18764 sprintf (num
, "%d",
18765 (int) (ffeexpr_stack_
->rank
- ffeinfo_rank (info
)));
18768 ffelex_token_where_line (ffeexpr_stack_
->tokens
[1]),
18769 ffelex_token_where_column (ffeexpr_stack_
->tokens
[1]));
18771 ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18772 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18773 ffebad_string (num
);
18776 ffelex_token_kill (ffeexpr_stack_
->tokens
[1]);
18778 while (ffeexpr_stack_
->rank
++ < ffeinfo_rank (info
))
18780 expr
= ffebld_new_conter (ffebld_constant_new_integerdefault_val (1));
18781 ffebld_set_info (expr
, ffeinfo_new (FFEINFO_basictypeINTEGER
,
18782 FFEINFO_kindtypeINTEGERDEFAULT
,
18783 0, FFEINFO_kindENTITY
,
18784 FFEINFO_whereCONSTANT
,
18785 FFETARGET_charactersizeNONE
));
18786 ffebld_append_item (&ffeexpr_stack_
->bottom
, expr
);
18789 ffebld_end_list (&ffeexpr_stack_
->bottom
);
18791 if (ffebld_op (array
->u
.operand
) == FFEBLD_opANY
)
18793 reduced
= ffebld_new_any ();
18794 ffebld_set_info (reduced
, ffeinfo_new_any ());
18798 reduced
= ffebld_new_arrayref (array
->u
.operand
, ffeexpr_stack_
->expr
);
18799 if (ffeexpr_stack_
->constant
)
18800 where
= FFEINFO_whereFLEETING_CADDR
;
18801 else if (ffeexpr_stack_
->immediate
)
18802 where
= FFEINFO_whereFLEETING_IADDR
;
18804 where
= FFEINFO_whereFLEETING
;
18805 ffebld_set_info (reduced
,
18806 ffeinfo_new (ffeinfo_basictype (info
),
18807 ffeinfo_kindtype (info
),
18809 FFEINFO_kindENTITY
,
18811 ffeinfo_size (info
)));
18812 reduced
= ffeexpr_collapse_arrayref (reduced
, ffeexpr_stack_
->tokens
[0]);
18815 ffeexpr_stack_
->exprstack
= array
->previous
; /* Pops not-quite-operand off
18817 array
->u
.operand
= reduced
; /* Save the line/column ffewhere info. */
18818 ffeexpr_exprstack_push_operand_ (array
); /* Push it back on stack. */
18820 switch (ffeinfo_basictype (info
))
18822 case FFEINFO_basictypeCHARACTER
:
18823 ffeexpr_is_substr_ok_
= TRUE
; /* Everyone likes "FOO(3)(1:1)".... */
18826 case FFEINFO_basictypeNONE
:
18827 ffeexpr_is_substr_ok_
= TRUE
;
18828 assert (ffeexpr_stack_
->context
== FFEEXPR_contextEQUIVALENCE
);
18832 ffeexpr_is_substr_ok_
= FALSE
;
18836 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
18838 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
18839 return (ffelexHandler
) ffeexpr_token_substrp_
;
18842 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION
))
18844 ffebad_here (0, ffelex_token_where_line (t
),
18845 ffelex_token_where_column (t
));
18846 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18847 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18850 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
18852 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
18854 ffeexpr_token_substrp_
);
18857 /* ffeexpr_token_equivalence_ -- OPEN_PAREN expr
18859 Return a pointer to this array to the lexer (ffelex), which will
18860 invoke it for the next token.
18862 If token is COLON, pass off to _substr_, else init list and pass off
18863 to _elements_. This handles the case "EQUIVALENCE (FOO(expr?", where
18864 ? marks the token, and where FOO's rank/type has not yet been established,
18865 meaning we could be in a list of indices or in a substring
18868 static ffelexHandler
18869 ffeexpr_token_equivalence_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
18871 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
18872 return ffeexpr_token_substring_ (ft
, expr
, t
);
18874 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
18875 return ffeexpr_token_elements_ (ft
, expr
, t
);
18878 /* ffeexpr_token_substring_ -- NAME(of kindENTITY) OPEN_PAREN expr
18880 Return a pointer to this function to the lexer (ffelex), which will
18881 invoke it for the next token.
18883 Handle expression (which may be null) and COLON. */
18885 static ffelexHandler
18886 ffeexpr_token_substring_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
18888 ffeexprExpr_ string
;
18890 ffetargetIntegerDefault i
;
18891 ffeexprContext ctx
;
18892 ffetargetCharacterSize size
;
18894 string
= ffeexpr_stack_
->exprstack
;
18895 info
= ffebld_info (string
->u
.operand
);
18896 size
= ffebld_size_max (string
->u
.operand
);
18898 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
18901 && (ffebld_op (expr
) == FFEBLD_opCONTER
)
18902 && (((i
= ffebld_constant_integerdefault (ffebld_conter (expr
)))
18904 || ((size
!= FFETARGET_charactersizeNONE
) && (i
> size
))))
18906 ffebad_start (FFEBAD_RANGE_SUBSTR
);
18907 ffebad_here (0, ffelex_token_where_line (ft
),
18908 ffelex_token_where_column (ft
));
18911 ffeexpr_stack_
->expr
= expr
;
18913 switch (ffeexpr_stack_
->context
)
18915 case FFEEXPR_contextSFUNCDEF
:
18916 case FFEEXPR_contextSFUNCDEFINDEX_
:
18917 ctx
= FFEEXPR_contextSFUNCDEFINDEX_
;
18920 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
18921 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
18922 assert ("bad context" == NULL
);
18923 ctx
= FFEEXPR_context
;
18927 ctx
= FFEEXPR_contextINDEX_
;
18931 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
, ctx
,
18932 ffeexpr_token_substring_1_
);
18935 if (ffest_ffebad_start (FFEBAD_MISSING_COLON_IN_SUBSTR
))
18937 ffebad_here (0, ffelex_token_where_line (t
),
18938 ffelex_token_where_column (t
));
18939 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
18940 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
18944 ffeexpr_stack_
->expr
= NULL
;
18945 return (ffelexHandler
) ffeexpr_token_substring_1_ (ft
, expr
, t
);
18948 /* ffeexpr_token_substring_1_ -- NAME OPEN_PAREN [expr COMMA]...expr
18950 Return a pointer to this function to the lexer (ffelex), which will
18951 invoke it for the next token.
18953 Handle expression (which might be null) and CLOSE_PAREN. */
18955 static ffelexHandler
18956 ffeexpr_token_substring_1_ (ffelexToken ft
, ffebld last
, ffelexToken t
)
18958 ffeexprExpr_ string
;
18961 ffebld first
= ffeexpr_stack_
->expr
;
18966 ffeinfoWhere where
;
18967 ffeinfoKindtype first_kt
;
18968 ffeinfoKindtype last_kt
;
18969 ffetargetIntegerDefault first_val
;
18970 ffetargetIntegerDefault last_val
;
18971 ffetargetCharacterSize size
;
18972 ffetargetCharacterSize strop_size_max
;
18975 string
= ffeexpr_stack_
->exprstack
;
18976 strop
= string
->u
.operand
;
18977 info
= ffebld_info (strop
);
18980 || (ffebld_op (first
) == FFEBLD_opCONTER
18981 && ffebld_kindtype (first
) == FFEINFO_kindtypeINTEGERDEFAULT
))
18982 { /* The starting point is known. */
18983 first_val
= (first
== NULL
) ? 1
18984 : ffebld_constant_integerdefault (ffebld_conter (first
));
18985 first_known
= TRUE
;
18988 { /* Assume start of the entity. */
18990 first_known
= FALSE
;
18994 && (ffebld_op (last
) == FFEBLD_opCONTER
18995 && ffebld_kindtype (last
) == FFEINFO_kindtypeINTEGERDEFAULT
))
18996 { /* The ending point is known. */
18997 last_val
= ffebld_constant_integerdefault (ffebld_conter (last
));
19000 { /* The beginning point is a constant. */
19001 if (first_val
<= last_val
)
19002 size
= last_val
- first_val
+ 1;
19005 if (0 && ffe_is_90 ())
19010 ffebad_start (FFEBAD_ZERO_SIZE
);
19011 ffebad_here (0, ffelex_token_where_line (ft
),
19012 ffelex_token_where_column (ft
));
19018 size
= FFETARGET_charactersizeNONE
;
19020 strop_size_max
= ffebld_size_max (strop
);
19022 if ((strop_size_max
!= FFETARGET_charactersizeNONE
)
19023 && (last_val
> strop_size_max
))
19024 { /* Beyond maximum possible end of string. */
19025 ffebad_start (FFEBAD_RANGE_SUBSTR
);
19026 ffebad_here (0, ffelex_token_where_line (ft
),
19027 ffelex_token_where_column (ft
));
19032 size
= FFETARGET_charactersizeNONE
; /* The size is not known. */
19034 #if 0 /* Don't do this, or "is size of target
19035 known?" would no longer be easily
19036 answerable. To see if there is a max
19037 size, use ffebld_size_max; to get only the
19038 known size, else NONE, use
19039 ffebld_size_known; use ffebld_size if
19040 values are sure to be the same (not
19041 opSUBSTR or opCONCATENATE or known to have
19042 known length). By getting rid of this
19043 "useful info" stuff, we don't end up
19044 blank-padding the constant in the
19045 assignment "A(I:J)='XYZ'" to the known
19047 if (size
== FFETARGET_charactersizeNONE
)
19048 size
= strop_size_max
; /* Assume we use the entire string. */
19062 lwh
= FFEINFO_whereCONSTANT
;
19064 lwh
= ffeinfo_where (ffebld_info (first
));
19066 rwh
= FFEINFO_whereCONSTANT
;
19068 rwh
= ffeinfo_where (ffebld_info (last
));
19072 case FFEINFO_whereCONSTANT
:
19075 case FFEINFO_whereCONSTANT
:
19076 where
= FFEINFO_whereCONSTANT
;
19079 case FFEINFO_whereIMMEDIATE
:
19080 where
= FFEINFO_whereIMMEDIATE
;
19084 where
= FFEINFO_whereFLEETING
;
19089 case FFEINFO_whereIMMEDIATE
:
19092 case FFEINFO_whereCONSTANT
:
19093 case FFEINFO_whereIMMEDIATE
:
19094 where
= FFEINFO_whereIMMEDIATE
;
19098 where
= FFEINFO_whereFLEETING
;
19104 where
= FFEINFO_whereFLEETING
;
19109 first_kt
= FFEINFO_kindtypeINTEGERDEFAULT
;
19111 first_kt
= ffeinfo_kindtype (ffebld_info (first
));
19113 last_kt
= FFEINFO_kindtypeINTEGERDEFAULT
;
19115 last_kt
= ffeinfo_kindtype (ffebld_info (last
));
19119 case FFEINFO_whereCONSTANT
:
19120 switch (ffeinfo_where (info
))
19122 case FFEINFO_whereCONSTANT
:
19125 case FFEINFO_whereIMMEDIATE
: /* Not possible, actually. */
19126 where
= FFEINFO_whereIMMEDIATE
;
19130 where
= FFEINFO_whereFLEETING_CADDR
;
19135 case FFEINFO_whereIMMEDIATE
:
19136 switch (ffeinfo_where (info
))
19138 case FFEINFO_whereCONSTANT
:
19139 case FFEINFO_whereIMMEDIATE
: /* Not possible, actually. */
19143 where
= FFEINFO_whereFLEETING_IADDR
;
19149 switch (ffeinfo_where (info
))
19151 case FFEINFO_whereCONSTANT
:
19152 where
= FFEINFO_whereCONSTANT_SUBOBJECT
; /* An F90 concept. */
19155 case FFEINFO_whereIMMEDIATE
: /* Not possible, actually. */
19157 where
= FFEINFO_whereFLEETING
;
19163 if (ffebld_op (strop
) == FFEBLD_opANY
)
19165 reduced
= ffebld_new_any ();
19166 ffebld_set_info (reduced
, ffeinfo_new_any ());
19170 reduced
= ffebld_new_substr (strop
, substrlist
);
19171 ffebld_set_info (reduced
, ffeinfo_new
19172 (FFEINFO_basictypeCHARACTER
,
19173 ffeinfo_kindtype (info
),
19175 FFEINFO_kindENTITY
,
19178 reduced
= ffeexpr_collapse_substr (reduced
, ffeexpr_stack_
->tokens
[0]);
19181 ffeexpr_stack_
->exprstack
= string
->previous
; /* Pops not-quite-operand off
19183 string
->u
.operand
= reduced
; /* Save the line/column ffewhere info. */
19184 ffeexpr_exprstack_push_operand_ (string
); /* Push it back on stack. */
19186 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
19188 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
19189 ffeexpr_is_substr_ok_
= FALSE
; /* Nobody likes "FOO(3:5)(1:1)".... */
19190 return (ffelexHandler
) ffeexpr_token_substrp_
;
19193 if (ffest_ffebad_start (FFEBAD_INVALID_TOKEN_IN_EXPRESSION
))
19195 ffebad_here (0, ffelex_token_where_line (t
),
19196 ffelex_token_where_column (t
));
19197 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->tokens
[0]),
19198 ffelex_token_where_column (ffeexpr_stack_
->tokens
[0]));
19202 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
19203 ffeexpr_is_substr_ok_
= FALSE
;/* Nobody likes "FOO(3:5)(1:1)".... */
19205 (ffelexHandler
) ffeexpr_find_close_paren_ (t
,
19207 ffeexpr_token_substrp_
);
19210 /* ffeexpr_token_substrp_ -- Rhs <character entity>
19212 Return a pointer to this function to the lexer (ffelex), which will
19213 invoke it for the next token.
19215 If OPEN_PAREN, treat as start of a substring ("(3:4)") construct, and
19216 issue error message if flag (serves as argument) is set. Else, just
19217 forward token to binary_. */
19219 static ffelexHandler
19220 ffeexpr_token_substrp_ (ffelexToken t
)
19222 ffeexprContext ctx
;
19224 if (ffelex_token_type (t
) != FFELEX_typeOPEN_PAREN
)
19225 return (ffelexHandler
) ffeexpr_token_binary_ (t
);
19227 ffeexpr_stack_
->tokens
[0] = ffelex_token_use (t
);
19229 switch (ffeexpr_stack_
->context
)
19231 case FFEEXPR_contextSFUNCDEF
:
19232 case FFEEXPR_contextSFUNCDEFINDEX_
:
19233 ctx
= FFEEXPR_contextSFUNCDEFINDEX_
;
19236 case FFEEXPR_contextSFUNCDEFACTUALARG_
:
19237 case FFEEXPR_contextSFUNCDEFINDEXORACTUALARG_
:
19238 assert ("bad context" == NULL
);
19239 ctx
= FFEEXPR_context
;
19243 ctx
= FFEEXPR_contextINDEX_
;
19247 if (!ffeexpr_is_substr_ok_
)
19249 if (ffebad_start (FFEBAD_BAD_SUBSTR
))
19251 ffebad_here (0, ffelex_token_where_line (t
),
19252 ffelex_token_where_column (t
));
19253 ffebad_here (1, ffelex_token_where_line (ffeexpr_stack_
->exprstack
->token
),
19254 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->token
));
19258 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
, ctx
,
19259 ffeexpr_token_anything_
);
19262 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
, ctx
,
19263 ffeexpr_token_substring_
);
19266 static ffelexHandler
19267 ffeexpr_token_intrincheck_ (ffelexToken t
)
19269 if ((ffelex_token_type (t
) != FFELEX_typeCLOSE_PAREN
)
19270 && ffebad_start (FFEBAD_INTRINSIC_CMPAMBIG
))
19272 ffebad_string (ffeintrin_name_implementation
19273 (ffebld_symter_implementation
19275 (ffeexpr_stack_
->exprstack
->u
.operand
))));
19276 ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_
->exprstack
->token
),
19277 ffelex_token_where_column (ffeexpr_stack_
->exprstack
->token
));
19281 return (ffelexHandler
) ffeexpr_token_substrp_ (t
);
19284 /* ffeexpr_token_funsubstr_ -- NAME OPEN_PAREN expr
19286 Return a pointer to this function to the lexer (ffelex), which will
19287 invoke it for the next token.
19289 If COLON, do everything we would have done since _parenthesized_ if
19290 we had known NAME represented a kindENTITY instead of a kindFUNCTION.
19291 If not COLON, do likewise for kindFUNCTION instead. */
19293 static ffelexHandler
19294 ffeexpr_token_funsubstr_ (ffelexToken ft
, ffebld expr
, ffelexToken t
)
19296 ffeinfoWhere where
;
19299 ffebld symter
= ffeexpr_stack_
->exprstack
->u
.operand
;
19302 ffeintrinSpec spec
;
19305 s
= ffebld_symter (symter
);
19306 sa
= ffesymbol_attrs (s
);
19307 where
= ffesymbol_where (s
);
19309 /* We get here only if we don't already know enough about FOO when seeing a
19310 FOO(stuff) reference, and FOO might turn out to be a CHARACTER type. If
19311 "stuff" is a substring reference, then FOO is a CHARACTER scalar type.
19312 Else FOO is a function, either intrinsic or external. If intrinsic, it
19313 wouldn't necessarily be CHARACTER type, so unless it has already been
19314 declared DUMMY, it hasn't had its type established yet. It can't be
19315 CHAR*(*) in any case, though it can have an explicit CHAR*n type. */
19317 assert (!(sa
& ~(FFESYMBOL_attrsDUMMY
19318 | FFESYMBOL_attrsTYPE
)));
19320 needs_type
= !(ffesymbol_attrs (s
) & FFESYMBOL_attrsDUMMY
);
19322 ffesymbol_signal_change (s
); /* Probably already done, but in case.... */
19324 if (ffelex_token_type (t
) == FFELEX_typeCOLON
)
19325 { /* Definitely an ENTITY (char substring). */
19326 if (needs_type
&& !ffeimplic_establish_symbol (s
))
19328 ffesymbol_error (s
, ffeexpr_stack_
->tokens
[0]);
19329 return (ffelexHandler
) ffeexpr_token_arguments_ (ft
, expr
, t
);
19332 ffesymbol_set_info (s
,
19333 ffeinfo_new (ffesymbol_basictype (s
),
19334 ffesymbol_kindtype (s
),
19335 ffesymbol_rank (s
),
19336 FFEINFO_kindENTITY
,
19337 (where
== FFEINFO_whereNONE
)
19338 ? FFEINFO_whereLOCAL
19340 ffesymbol_size (s
)));
19341 ffebld_set_info (symter
, ffeinfo_use (ffesymbol_info (s
)));
19343 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
19344 ffesymbol_resolve_intrin (s
);
19345 s
= ffecom_sym_learned (s
);
19346 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
19348 ffeexpr_stack_
->exprstack
->u
.operand
19349 = ffeexpr_collapse_symter (symter
, ffeexpr_tokens_
[0]);
19351 return (ffelexHandler
) ffeexpr_token_substring_ (ft
, expr
, t
);
19354 /* The "stuff" isn't a substring notation, so we now know the overall
19355 reference is to a function. */
19357 if (ffeintrin_is_intrinsic (ffesymbol_text (s
), ffeexpr_stack_
->tokens
[0],
19358 FALSE
, &gen
, &spec
, &imp
))
19360 ffebld_symter_set_generic (symter
, gen
);
19361 ffebld_symter_set_specific (symter
, spec
);
19362 ffebld_symter_set_implementation (symter
, imp
);
19363 ffesymbol_set_generic (s
, gen
);
19364 ffesymbol_set_specific (s
, spec
);
19365 ffesymbol_set_implementation (s
, imp
);
19366 ffesymbol_set_info (s
,
19367 ffeinfo_new (ffesymbol_basictype (s
),
19368 ffesymbol_kindtype (s
),
19370 FFEINFO_kindFUNCTION
,
19371 FFEINFO_whereINTRINSIC
,
19372 ffesymbol_size (s
)));
19375 { /* Not intrinsic, now needs CHAR type. */
19376 if (!ffeimplic_establish_symbol (s
))
19378 ffesymbol_error (s
, ffeexpr_stack_
->tokens
[0]);
19379 return (ffelexHandler
) ffeexpr_token_arguments_ (ft
, expr
, t
);
19382 ffesymbol_set_info (s
,
19383 ffeinfo_new (ffesymbol_basictype (s
),
19384 ffesymbol_kindtype (s
),
19385 ffesymbol_rank (s
),
19386 FFEINFO_kindFUNCTION
,
19387 (where
== FFEINFO_whereNONE
)
19388 ? FFEINFO_whereGLOBAL
19390 ffesymbol_size (s
)));
19393 ffebld_set_info (symter
, ffeinfo_use (ffesymbol_info (s
)));
19395 ffesymbol_set_state (s
, FFESYMBOL_stateUNDERSTOOD
);
19396 ffesymbol_resolve_intrin (s
);
19397 s
= ffecom_sym_learned (s
);
19398 ffesymbol_reference (s
, ffeexpr_stack_
->tokens
[0], FALSE
);
19399 ffesymbol_signal_unreported (s
); /* For debugging purposes. */
19400 ffebld_init_list (&ffeexpr_stack_
->expr
, &ffeexpr_stack_
->bottom
);
19401 return (ffelexHandler
) ffeexpr_token_arguments_ (ft
, expr
, t
);
19404 /* ffeexpr_token_anything_ -- NAME OPEN_PAREN any-expr
19406 Handle basically any expression, looking for CLOSE_PAREN. */
19408 static ffelexHandler
19409 ffeexpr_token_anything_ (ffelexToken ft UNUSED
, ffebld expr UNUSED
,
19412 ffeexprExpr_ e
= ffeexpr_stack_
->exprstack
;
19414 switch (ffelex_token_type (t
))
19416 case FFELEX_typeCOMMA
:
19417 case FFELEX_typeCOLON
:
19418 return (ffelexHandler
) ffeexpr_rhs (ffeexpr_stack_
->pool
,
19419 FFEEXPR_contextACTUALARG_
,
19420 ffeexpr_token_anything_
);
19423 e
->u
.operand
= ffebld_new_any ();
19424 ffebld_set_info (e
->u
.operand
, ffeinfo_new_any ());
19425 ffelex_token_kill (ffeexpr_stack_
->tokens
[0]);
19426 ffeexpr_is_substr_ok_
= FALSE
;
19427 if (ffelex_token_type (t
) == FFELEX_typeCLOSE_PAREN
)
19428 return (ffelexHandler
) ffeexpr_token_substrp_
;
19429 return (ffelexHandler
) ffeexpr_token_substrp_ (t
);
19433 /* Terminate module. */
19436 ffeexpr_terminate_2 ()
19438 assert (ffeexpr_stack_
== NULL
);
19439 assert (ffeexpr_level_
== 0);