00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "proj.h"
00027 #include "bld.h"
00028 #include "com.h"
00029 #include "equiv.h"
00030 #include "global.h"
00031 #include "info.h"
00032 #include "implic.h"
00033 #include "intrin.h"
00034 #include "stu.h"
00035 #include "storag.h"
00036 #include "sta.h"
00037 #include "symbol.h"
00038 #include "target.h"
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 static void ffestu_list_exec_transition_ (ffebld list);
00061 static bool ffestu_symter_end_transition_ (ffebld expr);
00062 static bool ffestu_symter_exec_transition_ (ffebld expr);
00063 static bool ffestu_dummies_transition_ (ffesymbol (*symfunc) (ffesymbol),
00064 ffebld list);
00065
00066
00067
00068 #define ffestu_equiv_(s) (((ffesymbol_equiv (s) == NULL) \
00069 || (ffeequiv_common (ffesymbol_equiv (s)) == NULL)) ? FFEINFO_whereLOCAL \
00070 : FFEINFO_whereCOMMON)
00071
00072
00073
00074 ffesymbol
00075 ffestu_sym_end_transition (ffesymbol s)
00076 {
00077 ffeinfoKind skd;
00078 ffeinfoWhere swh;
00079 ffeinfoKind nkd;
00080 ffeinfoWhere nwh;
00081 ffesymbolAttrs sa;
00082 ffesymbolAttrs na;
00083 ffesymbolState ss;
00084 ffesymbolState ns;
00085 bool needs_type = TRUE;
00086
00087
00088 assert (s != NULL);
00089 ss = ffesymbol_state (s);
00090 sa = ffesymbol_attrs (s);
00091 skd = ffesymbol_kind (s);
00092 swh = ffesymbol_where (s);
00093
00094 switch (ss)
00095 {
00096 case FFESYMBOL_stateUNCERTAIN:
00097 if ((swh == FFEINFO_whereDUMMY)
00098 && (ffesymbol_numentries (s) == 0))
00099 {
00100 ffesymbol_error (s, ffesta_tokens[0]);
00101 return s;
00102 }
00103 else if (((swh == FFEINFO_whereLOCAL)
00104 || (swh == FFEINFO_whereNONE))
00105 && (skd == FFEINFO_kindENTITY)
00106 && ffestu_symter_end_transition_ (ffesymbol_dims (s)))
00107 {
00108 ffesymbol_error (s, NULL);
00109 return s;
00110 }
00111 break;
00112
00113 case FFESYMBOL_stateUNDERSTOOD:
00114 if ((swh == FFEINFO_whereLOCAL)
00115 && ((skd == FFEINFO_kindFUNCTION)
00116 || (skd == FFEINFO_kindSUBROUTINE)))
00117 {
00118 int n_args;
00119 ffebld list;
00120 ffebld item;
00121 ffeglobalArgSummary as;
00122 ffeinfoBasictype bt;
00123 ffeinfoKindtype kt;
00124 bool array;
00125 const char *name = NULL;
00126
00127 ffestu_dummies_transition_ (ffecom_sym_end_transition,
00128 ffesymbol_dummyargs (s));
00129
00130 n_args = ffebld_list_length (ffesymbol_dummyargs (s));
00131 ffeglobal_proc_def_nargs (s, n_args);
00132 for (list = ffesymbol_dummyargs (s), n_args = 0;
00133 list != NULL;
00134 list = ffebld_trail (list), ++n_args)
00135 {
00136 item = ffebld_head (list);
00137 array = FALSE;
00138 if (item != NULL)
00139 {
00140 bt = ffeinfo_basictype (ffebld_info (item));
00141 kt = ffeinfo_kindtype (ffebld_info (item));
00142 array = (ffeinfo_rank (ffebld_info (item)) > 0);
00143 switch (ffebld_op (item))
00144 {
00145 case FFEBLD_opSTAR:
00146 as = FFEGLOBAL_argsummaryALTRTN;
00147 break;
00148
00149 case FFEBLD_opSYMTER:
00150 name = ffesymbol_text (ffebld_symter (item));
00151 as = FFEGLOBAL_argsummaryNONE;
00152
00153 switch (ffeinfo_kind (ffebld_info (item)))
00154 {
00155 case FFEINFO_kindFUNCTION:
00156 as = FFEGLOBAL_argsummaryFUNC;
00157 break;
00158
00159 case FFEINFO_kindSUBROUTINE:
00160 as = FFEGLOBAL_argsummarySUBR;
00161 break;
00162
00163 case FFEINFO_kindNONE:
00164 as = FFEGLOBAL_argsummaryPROC;
00165 break;
00166
00167 default:
00168 break;
00169 }
00170
00171 if (as != FFEGLOBAL_argsummaryNONE)
00172 break;
00173
00174
00175 default:
00176 if (bt == FFEINFO_basictypeCHARACTER)
00177 as = FFEGLOBAL_argsummaryDESCR;
00178 else
00179 as = FFEGLOBAL_argsummaryREF;
00180 break;
00181 }
00182 }
00183 else
00184 {
00185 as = FFEGLOBAL_argsummaryNONE;
00186 bt = FFEINFO_basictypeNONE;
00187 kt = FFEINFO_kindtypeNONE;
00188 }
00189 ffeglobal_proc_def_arg (s, n_args, name, as, bt, kt, array);
00190 }
00191 }
00192 else if (swh == FFEINFO_whereDUMMY)
00193 {
00194 if (ffesymbol_numentries (s) == 0)
00195 {
00196 ffesymbol_error (s, ffesta_tokens[0]);
00197 return s;
00198 }
00199 if (ffestu_symter_end_transition_ (ffesymbol_dims (s)))
00200 {
00201 ffesymbol_error (s, NULL);
00202 return s;
00203 }
00204 }
00205 else if ((swh == FFEINFO_whereLOCAL)
00206 && ffestu_symter_end_transition_ (ffesymbol_dims (s)))
00207 {
00208 ffesymbol_error (s, NULL);
00209 return s;
00210 }
00211
00212 ffestorag_end_layout (s);
00213 ffesymbol_signal_unreported (s);
00214 return s;
00215
00216 default:
00217 assert ("bad status" == NULL);
00218 return s;
00219 }
00220
00221 ns = FFESYMBOL_stateUNDERSTOOD;
00222 na = sa = ffesymbol_attrs (s);
00223
00224 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
00225 | FFESYMBOL_attrsADJUSTABLE
00226 | FFESYMBOL_attrsANYLEN
00227 | FFESYMBOL_attrsARRAY
00228 | FFESYMBOL_attrsDUMMY
00229 | FFESYMBOL_attrsEXTERNAL
00230 | FFESYMBOL_attrsSFARG
00231 | FFESYMBOL_attrsTYPE)));
00232
00233 nkd = skd;
00234 nwh = swh;
00235
00236
00237
00238
00239 if (sa & FFESYMBOL_attrsEXTERNAL)
00240 {
00241 assert (!(sa & ~(FFESYMBOL_attrsACTUALARG
00242 | FFESYMBOL_attrsDUMMY
00243 | FFESYMBOL_attrsEXTERNAL
00244 | FFESYMBOL_attrsTYPE)));
00245
00246 if (sa & FFESYMBOL_attrsTYPE)
00247 nwh = FFEINFO_whereGLOBAL;
00248 else
00249
00250 {
00251 if (sa & FFESYMBOL_attrsDUMMY)
00252 {
00253 ns = FFESYMBOL_stateUNCERTAIN;
00254 needs_type = FALSE;
00255 }
00256 else if (sa & FFESYMBOL_attrsACTUALARG)
00257 {
00258 ns = FFESYMBOL_stateUNCERTAIN;
00259 needs_type = FALSE;
00260 }
00261 else
00262
00263 {
00264 nkd = FFEINFO_kindBLOCKDATA;
00265 nwh = FFEINFO_whereGLOBAL;
00266 needs_type = FALSE;
00267 }
00268 }
00269 }
00270 else if (sa & FFESYMBOL_attrsDUMMY)
00271 {
00272 assert (!(sa & FFESYMBOL_attrsEXTERNAL));
00273 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
00274 | FFESYMBOL_attrsEXTERNAL
00275 | FFESYMBOL_attrsTYPE)));
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 nkd = FFEINFO_kindENTITY;
00288 }
00289 else if (sa & FFESYMBOL_attrsARRAY)
00290 {
00291 assert (!(sa & ~(FFESYMBOL_attrsARRAY
00292 | FFESYMBOL_attrsADJUSTABLE
00293 | FFESYMBOL_attrsTYPE)));
00294
00295 if (ffestu_symter_end_transition_ (ffesymbol_dims (s)))
00296 {
00297 ffesymbol_error (s, NULL);
00298 return s;
00299 }
00300
00301 if (sa & FFESYMBOL_attrsADJUSTABLE)
00302 {
00303 if (ffe_is_pedantic ()
00304
00305 && ffebad_start_msg ("Local adjustable symbol `%A' at %0",
00306 FFEBAD_severityPEDANTIC))
00307 {
00308 ffebad_string (ffesymbol_text (s));
00309 ffebad_here (0, ffesymbol_where_line (s),
00310 ffesymbol_where_column (s));
00311 ffebad_finish ();
00312 }
00313 }
00314 nwh = FFEINFO_whereLOCAL;
00315 }
00316 else if (sa & FFESYMBOL_attrsSFARG)
00317 {
00318 assert (!(sa & ~(FFESYMBOL_attrsSFARG
00319 | FFESYMBOL_attrsTYPE)));
00320
00321 nwh = FFEINFO_whereLOCAL;
00322 }
00323 else if (sa & FFESYMBOL_attrsTYPE)
00324 {
00325 assert (!(sa & (FFESYMBOL_attrsARRAY
00326 | FFESYMBOL_attrsDUMMY
00327 | FFESYMBOL_attrsEXTERNAL
00328 | FFESYMBOL_attrsSFARG)));
00329 assert (!(sa & ~(FFESYMBOL_attrsTYPE
00330 | FFESYMBOL_attrsADJUSTABLE
00331 | FFESYMBOL_attrsANYLEN
00332 | FFESYMBOL_attrsARRAY
00333 | FFESYMBOL_attrsDUMMY
00334 | FFESYMBOL_attrsEXTERNAL
00335 | FFESYMBOL_attrsSFARG)));
00336
00337 if (sa & FFESYMBOL_attrsANYLEN)
00338 {
00339 ffesymbol_signal_change (s);
00340 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
00341 ffesymbol_resolve_intrin (s);
00342 s = ffecom_sym_learned (s);
00343 ffesymbol_reference (s, NULL, FALSE);
00344 ffestorag_end_layout (s);
00345 ffesymbol_signal_unreported (s);
00346 return s;
00347 }
00348
00349 nkd = FFEINFO_kindENTITY;
00350 nwh = FFEINFO_whereLOCAL;
00351 }
00352 else
00353 assert ("unexpected attribute set" == NULL);
00354
00355
00356
00357
00358
00359 if (na == FFESYMBOL_attrsetNONE)
00360 ffesymbol_error (s, ffesta_tokens[0]);
00361 else if (!(na & FFESYMBOL_attrsANY))
00362 {
00363 ffesymbol_signal_change (s);
00364 ffesymbol_set_attrs (s, na);
00365 ffesymbol_set_state (s, ns);
00366 ffesymbol_set_info (s,
00367 ffeinfo_new (ffesymbol_basictype (s),
00368 ffesymbol_kindtype (s),
00369 ffesymbol_rank (s),
00370 nkd,
00371 nwh,
00372 ffesymbol_size (s)));
00373 if (needs_type && !ffeimplic_establish_symbol (s))
00374 ffesymbol_error (s, ffesta_tokens[0]);
00375 else
00376 ffesymbol_resolve_intrin (s);
00377 s = ffecom_sym_learned (s);
00378 ffesymbol_reference (s, NULL, FALSE);
00379 ffestorag_end_layout (s);
00380 ffesymbol_signal_unreported (s);
00381 }
00382
00383 return s;
00384 }
00385
00386
00387
00388
00389
00390
00391 ffesymbol
00392 ffestu_sym_exec_transition (ffesymbol s)
00393 {
00394 ffeinfoKind skd;
00395 ffeinfoWhere swh;
00396 ffeinfoKind nkd;
00397 ffeinfoWhere nwh;
00398 ffesymbolAttrs sa;
00399 ffesymbolAttrs na;
00400 ffesymbolState ss;
00401 ffesymbolState ns;
00402 ffeintrinGen gen;
00403 ffeintrinSpec spec;
00404 ffeintrinImp imp;
00405 bool needs_type = TRUE;
00406
00407 bool resolve_intrin = TRUE;
00408
00409 assert (s != NULL);
00410
00411 sa = ffesymbol_attrs (s);
00412 skd = ffesymbol_kind (s);
00413 swh = ffesymbol_where (s);
00414 ss = ffesymbol_state (s);
00415
00416 switch (ss)
00417 {
00418 case FFESYMBOL_stateNONE:
00419 return s;
00420
00421 case FFESYMBOL_stateSEEN:
00422 break;
00423
00424 case FFESYMBOL_stateUNCERTAIN:
00425 ffestorag_exec_layout (s);
00426 return s;
00427
00428
00429 case FFESYMBOL_stateUNDERSTOOD:
00430 if (skd == FFEINFO_kindNAMELIST)
00431 {
00432 ffebld_end_list (ffesymbol_ptr_to_listbottom (s));
00433 ffestu_list_exec_transition_ (ffesymbol_namelist (s));
00434 }
00435 else if ((swh == FFEINFO_whereLOCAL)
00436 && ((skd == FFEINFO_kindFUNCTION)
00437 || (skd == FFEINFO_kindSUBROUTINE)))
00438 {
00439 ffestu_dummies_transition_ (ffecom_sym_exec_transition,
00440 ffesymbol_dummyargs (s));
00441 if ((skd == FFEINFO_kindFUNCTION)
00442 && !ffeimplic_establish_symbol (s))
00443 ffesymbol_error (s, ffesta_tokens[0]);
00444 }
00445
00446 ffesymbol_reference (s, NULL, FALSE);
00447 ffestorag_exec_layout (s);
00448 ffesymbol_signal_unreported (s);
00449 return s;
00450
00451 default:
00452 assert ("bad status" == NULL);
00453 return s;
00454 }
00455
00456 ns = FFESYMBOL_stateUNDERSTOOD;
00457
00458 na = sa;
00459 nkd = skd;
00460 nwh = swh;
00461
00462 assert (!(sa & FFESYMBOL_attrsANY));
00463
00464 if (sa & FFESYMBOL_attrsCOMMON)
00465 {
00466 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00467 | FFESYMBOL_attrsARRAY
00468 | FFESYMBOL_attrsCOMMON
00469 | FFESYMBOL_attrsEQUIV
00470 | FFESYMBOL_attrsINIT
00471 | FFESYMBOL_attrsNAMELIST
00472 | FFESYMBOL_attrsSFARG
00473 | FFESYMBOL_attrsTYPE)));
00474
00475 nkd = FFEINFO_kindENTITY;
00476 nwh = FFEINFO_whereCOMMON;
00477 }
00478 else if (sa & FFESYMBOL_attrsRESULT)
00479 {
00480 assert (!(sa & ~(FFESYMBOL_attrsANYLEN
00481 | FFESYMBOL_attrsRESULT
00482 | FFESYMBOL_attrsSFARG
00483 | FFESYMBOL_attrsTYPE)));
00484
00485 nkd = FFEINFO_kindENTITY;
00486 nwh = FFEINFO_whereRESULT;
00487 }
00488 else if (sa & FFESYMBOL_attrsSFUNC)
00489 {
00490 assert (!(sa & ~(FFESYMBOL_attrsSFUNC
00491 | FFESYMBOL_attrsTYPE)));
00492
00493 nkd = FFEINFO_kindFUNCTION;
00494 nwh = FFEINFO_whereCONSTANT;
00495 }
00496 else if (sa & FFESYMBOL_attrsEXTERNAL)
00497 {
00498 assert (!(sa & ~(FFESYMBOL_attrsDUMMY
00499 | FFESYMBOL_attrsEXTERNAL
00500 | FFESYMBOL_attrsTYPE)));
00501
00502 if (sa & FFESYMBOL_attrsTYPE)
00503 {
00504 nkd = FFEINFO_kindFUNCTION;
00505
00506 if (sa & FFESYMBOL_attrsDUMMY)
00507 nwh = FFEINFO_whereDUMMY;
00508 else
00509 {
00510 if (ffesta_is_entry_valid)
00511 {
00512 nwh = FFEINFO_whereNONE;
00513 ns = FFESYMBOL_stateUNCERTAIN;
00514 }
00515 else
00516 nwh = FFEINFO_whereGLOBAL;
00517 }
00518 }
00519 else
00520
00521 {
00522 nkd = FFEINFO_kindNONE;
00523 needs_type = FALSE;
00524 ns = FFESYMBOL_stateUNCERTAIN;
00525
00526 if (sa & FFESYMBOL_attrsDUMMY)
00527 nwh = FFEINFO_whereDUMMY;
00528 else
00529 {
00530 if (ffesta_is_entry_valid)
00531 nwh = FFEINFO_whereNONE;
00532 else
00533 nwh = FFEINFO_whereGLOBAL;
00534 }
00535 }
00536 }
00537 else if (sa & FFESYMBOL_attrsDUMMY)
00538 {
00539 assert (!(sa & FFESYMBOL_attrsEXTERNAL));
00540 assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE
00541 | FFESYMBOL_attrsADJUSTS
00542 | FFESYMBOL_attrsANYLEN
00543 | FFESYMBOL_attrsANYSIZE
00544 | FFESYMBOL_attrsARRAY
00545 | FFESYMBOL_attrsDUMMY
00546 | FFESYMBOL_attrsEXTERNAL
00547 | FFESYMBOL_attrsSFARG
00548 | FFESYMBOL_attrsTYPE)));
00549
00550 nwh = FFEINFO_whereDUMMY;
00551
00552 if (ffestu_symter_exec_transition_ (ffesymbol_dims (s)))
00553 na = FFESYMBOL_attrsetNONE;
00554
00555 if (sa & (FFESYMBOL_attrsADJUSTS
00556 | FFESYMBOL_attrsARRAY
00557 | FFESYMBOL_attrsANYLEN
00558 | FFESYMBOL_attrsNAMELIST
00559 | FFESYMBOL_attrsSFARG))
00560 nkd = FFEINFO_kindENTITY;
00561 else if (sa & FFESYMBOL_attrsDUMMY)
00562 {
00563 if (!(sa & FFESYMBOL_attrsTYPE))
00564 needs_type = FALSE;
00565 nkd = FFEINFO_kindNONE;
00566 ns = FFESYMBOL_stateUNCERTAIN;
00567 }
00568 }
00569 else if (sa & FFESYMBOL_attrsADJUSTS)
00570 {
00571 assert (!(sa & (FFESYMBOL_attrsCOMMON
00572 | FFESYMBOL_attrsDUMMY)));
00573 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00574 | FFESYMBOL_attrsCOMMON
00575 | FFESYMBOL_attrsDUMMY
00576 | FFESYMBOL_attrsEQUIV
00577 | FFESYMBOL_attrsINIT
00578 | FFESYMBOL_attrsNAMELIST
00579 | FFESYMBOL_attrsSFARG
00580 | FFESYMBOL_attrsTYPE)));
00581
00582 nkd = FFEINFO_kindENTITY;
00583
00584 if (sa & FFESYMBOL_attrsEQUIV)
00585 {
00586 if ((ffesymbol_equiv (s) == NULL)
00587 || (ffeequiv_common (ffesymbol_equiv (s)) == NULL))
00588 na = FFESYMBOL_attrsetNONE;
00589 else
00590 nwh = FFEINFO_whereCOMMON;
00591 }
00592 else if (!ffesta_is_entry_valid
00593 || (sa & (FFESYMBOL_attrsINIT
00594 | FFESYMBOL_attrsNAMELIST)))
00595 na = FFESYMBOL_attrsetNONE;
00596 else
00597 nwh = FFEINFO_whereDUMMY;
00598 }
00599 else if (sa & FFESYMBOL_attrsSAVE)
00600 {
00601 assert (!(sa & ~(FFESYMBOL_attrsARRAY
00602 | FFESYMBOL_attrsEQUIV
00603 | FFESYMBOL_attrsINIT
00604 | FFESYMBOL_attrsNAMELIST
00605 | FFESYMBOL_attrsSAVE
00606 | FFESYMBOL_attrsSFARG
00607 | FFESYMBOL_attrsTYPE)));
00608
00609 nkd = FFEINFO_kindENTITY;
00610 nwh = FFEINFO_whereLOCAL;
00611 }
00612 else if (sa & FFESYMBOL_attrsEQUIV)
00613 {
00614 assert (!(sa & FFESYMBOL_attrsCOMMON));
00615 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00616 | FFESYMBOL_attrsARRAY
00617 | FFESYMBOL_attrsCOMMON
00618 | FFESYMBOL_attrsEQUIV
00619 | FFESYMBOL_attrsINIT
00620 | FFESYMBOL_attrsNAMELIST
00621 | FFESYMBOL_attrsSAVE
00622 | FFESYMBOL_attrsSFARG
00623 | FFESYMBOL_attrsTYPE)));
00624
00625 nkd = FFEINFO_kindENTITY;
00626 nwh = ffestu_equiv_ (s);
00627 }
00628 else if (sa & FFESYMBOL_attrsNAMELIST)
00629 {
00630 assert (!(sa & (FFESYMBOL_attrsADJUSTS
00631 | FFESYMBOL_attrsCOMMON
00632 | FFESYMBOL_attrsEQUIV
00633 | FFESYMBOL_attrsSAVE)));
00634 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00635 | FFESYMBOL_attrsARRAY
00636 | FFESYMBOL_attrsCOMMON
00637 | FFESYMBOL_attrsEQUIV
00638 | FFESYMBOL_attrsINIT
00639 | FFESYMBOL_attrsNAMELIST
00640 | FFESYMBOL_attrsSAVE
00641 | FFESYMBOL_attrsSFARG
00642 | FFESYMBOL_attrsTYPE)));
00643
00644 nkd = FFEINFO_kindENTITY;
00645 nwh = FFEINFO_whereLOCAL;
00646 }
00647 else if (sa & FFESYMBOL_attrsINIT)
00648 {
00649 assert (!(sa & (FFESYMBOL_attrsADJUSTS
00650 | FFESYMBOL_attrsCOMMON
00651 | FFESYMBOL_attrsEQUIV
00652 | FFESYMBOL_attrsNAMELIST
00653 | FFESYMBOL_attrsSAVE)));
00654 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00655 | FFESYMBOL_attrsARRAY
00656 | FFESYMBOL_attrsCOMMON
00657 | FFESYMBOL_attrsEQUIV
00658 | FFESYMBOL_attrsINIT
00659 | FFESYMBOL_attrsNAMELIST
00660 | FFESYMBOL_attrsSAVE
00661 | FFESYMBOL_attrsSFARG
00662 | FFESYMBOL_attrsTYPE)));
00663
00664 nkd = FFEINFO_kindENTITY;
00665 nwh = FFEINFO_whereLOCAL;
00666 }
00667 else if (sa & FFESYMBOL_attrsSFARG)
00668 {
00669 assert (!(sa & (FFESYMBOL_attrsADJUSTS
00670 | FFESYMBOL_attrsCOMMON
00671 | FFESYMBOL_attrsDUMMY
00672 | FFESYMBOL_attrsEQUIV
00673 | FFESYMBOL_attrsINIT
00674 | FFESYMBOL_attrsNAMELIST
00675 | FFESYMBOL_attrsRESULT
00676 | FFESYMBOL_attrsSAVE)));
00677 assert (!(sa & ~(FFESYMBOL_attrsADJUSTS
00678 | FFESYMBOL_attrsCOMMON
00679 | FFESYMBOL_attrsDUMMY
00680 | FFESYMBOL_attrsEQUIV
00681 | FFESYMBOL_attrsINIT
00682 | FFESYMBOL_attrsNAMELIST
00683 | FFESYMBOL_attrsRESULT
00684 | FFESYMBOL_attrsSAVE
00685 | FFESYMBOL_attrsSFARG
00686 | FFESYMBOL_attrsTYPE)));
00687
00688 nkd = FFEINFO_kindENTITY;
00689
00690 if (ffesta_is_entry_valid)
00691 {
00692 nwh = FFEINFO_whereNONE;
00693 ns = FFESYMBOL_stateUNCERTAIN;
00694 }
00695 else
00696 nwh = FFEINFO_whereLOCAL;
00697 }
00698 else if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE))
00699 {
00700 assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE
00701 | FFESYMBOL_attrsANYLEN
00702 | FFESYMBOL_attrsANYSIZE
00703 | FFESYMBOL_attrsARRAY
00704 | FFESYMBOL_attrsTYPE)));
00705
00706 nkd = FFEINFO_kindENTITY;
00707
00708 if (ffestu_symter_exec_transition_ (ffesymbol_dims (s)))
00709 na = FFESYMBOL_attrsetNONE;
00710
00711 if (sa & (FFESYMBOL_attrsANYLEN | FFESYMBOL_attrsANYSIZE))
00712 nwh = FFEINFO_whereDUMMY;
00713 else if (sa & (FFESYMBOL_attrsADJUSTABLE | FFESYMBOL_attrsANYSIZE))
00714
00715 {
00716 nwh = FFEINFO_whereNONE;
00717 ns = FFESYMBOL_stateUNCERTAIN;
00718 }
00719 }
00720 else if (sa & FFESYMBOL_attrsARRAY)
00721 {
00722 assert (!(sa & (FFESYMBOL_attrsADJUSTABLE
00723 | FFESYMBOL_attrsANYSIZE
00724 | FFESYMBOL_attrsCOMMON
00725 | FFESYMBOL_attrsDUMMY
00726 | FFESYMBOL_attrsEQUIV
00727 | FFESYMBOL_attrsINIT
00728 | FFESYMBOL_attrsNAMELIST
00729 | FFESYMBOL_attrsSAVE)));
00730 assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE
00731 | FFESYMBOL_attrsANYLEN
00732 | FFESYMBOL_attrsANYSIZE
00733 | FFESYMBOL_attrsARRAY
00734 | FFESYMBOL_attrsCOMMON
00735 | FFESYMBOL_attrsDUMMY
00736 | FFESYMBOL_attrsEQUIV
00737 | FFESYMBOL_attrsINIT
00738 | FFESYMBOL_attrsNAMELIST
00739 | FFESYMBOL_attrsSAVE
00740 | FFESYMBOL_attrsTYPE)));
00741
00742 nkd = FFEINFO_kindENTITY;
00743
00744 if (sa & FFESYMBOL_attrsANYLEN)
00745 {
00746 assert (ffesta_is_entry_valid);
00747 nwh = FFEINFO_whereDUMMY;
00748 }
00749 else
00750 {
00751 if (ffesta_is_entry_valid)
00752 {
00753 nwh = FFEINFO_whereNONE;
00754 ns = FFESYMBOL_stateUNCERTAIN;
00755 }
00756 else
00757 nwh = FFEINFO_whereLOCAL;
00758 }
00759 }
00760 else if (sa & FFESYMBOL_attrsANYLEN)
00761 {
00762 assert (!(sa & (FFESYMBOL_attrsADJUSTABLE
00763 | FFESYMBOL_attrsANYSIZE
00764 | FFESYMBOL_attrsARRAY
00765 | FFESYMBOL_attrsDUMMY
00766 | FFESYMBOL_attrsRESULT)));
00767 assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE
00768 | FFESYMBOL_attrsANYLEN
00769 | FFESYMBOL_attrsANYSIZE
00770 | FFESYMBOL_attrsARRAY
00771 | FFESYMBOL_attrsDUMMY
00772 | FFESYMBOL_attrsRESULT
00773 | FFESYMBOL_attrsTYPE)));
00774
00775 if (ffesta_is_entry_valid)
00776 {
00777 nkd = FFEINFO_kindNONE;
00778 nwh = FFEINFO_whereNONE;
00779 ns = FFESYMBOL_stateUNCERTAIN;
00780 resolve_intrin = FALSE;
00781 }
00782 else if (ffeintrin_is_intrinsic (ffesymbol_text (s), NULL, FALSE,
00783 &gen, &spec, &imp))
00784 {
00785 ffesymbol_signal_change (s);
00786 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
00787 ffesymbol_set_generic (s, gen);
00788 ffesymbol_set_specific (s, spec);
00789 ffesymbol_set_implementation (s, imp);
00790 ffesymbol_set_info (s,
00791 ffeinfo_new (FFEINFO_basictypeNONE,
00792 FFEINFO_kindtypeNONE,
00793 0,
00794 FFEINFO_kindNONE,
00795 FFEINFO_whereINTRINSIC,
00796 FFETARGET_charactersizeNONE));
00797 ffesymbol_resolve_intrin (s);
00798 ffesymbol_reference (s, NULL, FALSE);
00799 ffestorag_exec_layout (s);
00800 ffesymbol_signal_unreported (s);
00801 return s;
00802 }
00803 else
00804 {
00805
00806
00807 ffesymbol_signal_change (s);
00808 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
00809 ffesymbol_resolve_intrin (s);
00810 ffesymbol_reference (s, NULL, FALSE);
00811 ffestorag_exec_layout (s);
00812 ffesymbol_signal_unreported (s);
00813 return s;
00814 }
00815 }
00816 else if (sa & FFESYMBOL_attrsTYPE)
00817 {
00818 assert (!(sa & (FFESYMBOL_attrsADJUSTABLE
00819 | FFESYMBOL_attrsADJUSTS
00820 | FFESYMBOL_attrsANYLEN
00821 | FFESYMBOL_attrsANYSIZE
00822 | FFESYMBOL_attrsARRAY
00823 | FFESYMBOL_attrsCOMMON
00824 | FFESYMBOL_attrsDUMMY
00825 | FFESYMBOL_attrsEQUIV
00826 | FFESYMBOL_attrsEXTERNAL
00827 | FFESYMBOL_attrsINIT
00828 | FFESYMBOL_attrsNAMELIST
00829 | FFESYMBOL_attrsRESULT
00830 | FFESYMBOL_attrsSAVE
00831 | FFESYMBOL_attrsSFARG
00832 | FFESYMBOL_attrsSFUNC)));
00833 assert (!(sa & ~(FFESYMBOL_attrsADJUSTABLE
00834 | FFESYMBOL_attrsADJUSTS
00835 | FFESYMBOL_attrsANYLEN
00836 | FFESYMBOL_attrsANYSIZE
00837 | FFESYMBOL_attrsARRAY
00838 | FFESYMBOL_attrsCOMMON
00839 | FFESYMBOL_attrsDUMMY
00840 | FFESYMBOL_attrsEQUIV
00841 | FFESYMBOL_attrsEXTERNAL
00842 | FFESYMBOL_attrsINIT
00843 | FFESYMBOL_attrsINTRINSIC
00844 | FFESYMBOL_attrsNAMELIST
00845 | FFESYMBOL_attrsRESULT
00846 | FFESYMBOL_attrsSAVE
00847 | FFESYMBOL_attrsSFARG
00848 | FFESYMBOL_attrsSFUNC
00849 | FFESYMBOL_attrsTYPE)));
00850
00851 nkd = FFEINFO_kindNONE;
00852 nwh = FFEINFO_whereNONE;
00853 ns = FFESYMBOL_stateUNCERTAIN;
00854 resolve_intrin = FALSE;
00855 }
00856 else if (sa & (FFESYMBOL_attrsCBLOCK | FFESYMBOL_attrsSAVECBLOCK))
00857 {
00858 assert (!(sa & ~(FFESYMBOL_attrsCBLOCK
00859 | FFESYMBOL_attrsSAVECBLOCK)));
00860
00861 if (sa & FFESYMBOL_attrsCBLOCK)
00862 ffebld_end_list (ffesymbol_ptr_to_listbottom (s));
00863 else
00864 ffesymbol_set_commonlist (s, NULL);
00865 ffestu_list_exec_transition_ (ffesymbol_commonlist (s));
00866 nkd = FFEINFO_kindCOMMON;
00867 nwh = FFEINFO_whereLOCAL;
00868 needs_type = FALSE;
00869 }
00870 else
00871 {
00872 assert (sa == FFESYMBOL_attrsetNONE);
00873 assert ("Why are we here again?" == NULL);
00874
00875 nkd = FFEINFO_kindNONE;
00876 nwh = FFEINFO_whereNONE;
00877 ns = FFESYMBOL_stateUNCERTAIN;
00878 needs_type = FALSE;
00879 }
00880
00881 if (na == FFESYMBOL_attrsetNONE)
00882 ffesymbol_error (s, ffesta_tokens[0]);
00883 else if (!(na & FFESYMBOL_attrsANY)
00884 && (needs_type || (nkd != skd) || (nwh != swh)
00885 || (na != sa) || (ns != ss)))
00886 {
00887 ffesymbol_signal_change (s);
00888 ffesymbol_set_attrs (s, na);
00889 ffesymbol_set_state (s, ns);
00890 if ((ffesymbol_common (s) == NULL)
00891 && (ffesymbol_equiv (s) != NULL))
00892 ffesymbol_set_common (s, ffeequiv_common (ffesymbol_equiv (s)));
00893 ffesymbol_set_info (s,
00894 ffeinfo_new (ffesymbol_basictype (s),
00895 ffesymbol_kindtype (s),
00896 ffesymbol_rank (s),
00897 nkd,
00898 nwh,
00899 ffesymbol_size (s)));
00900 if (needs_type && !ffeimplic_establish_symbol (s))
00901 ffesymbol_error (s, ffesta_tokens[0]);
00902 else if (resolve_intrin)
00903 ffesymbol_resolve_intrin (s);
00904 ffesymbol_reference (s, NULL, FALSE);
00905 ffestorag_exec_layout (s);
00906 ffesymbol_signal_unreported (s);
00907 }
00908
00909 return s;
00910 }
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925 static void
00926 ffestu_list_exec_transition_ (ffebld list)
00927 {
00928 static bool in_progress = FALSE;
00929 ffebld item;
00930 ffesymbol symbol;
00931
00932 assert (!in_progress);
00933 in_progress = TRUE;
00934
00935 for (; list != NULL; list = ffebld_trail (list))
00936 {
00937 if ((item = ffebld_head (list)) == NULL)
00938 continue;
00939
00940 switch (ffebld_op (item))
00941 {
00942 case FFEBLD_opSTAR:
00943 break;
00944
00945 case FFEBLD_opSYMTER:
00946 symbol = ffebld_symter (item);
00947 if (symbol == NULL)
00948 break;
00949 symbol = ffecom_sym_exec_transition (symbol);
00950 assert (ffesymbol_kind (symbol) != FFEINFO_kindNONE);
00951 assert (ffesymbol_where (symbol) != FFEINFO_whereNONE);
00952 ffebld_set_info (item, ffesymbol_info (symbol));
00953 break;
00954
00955 default:
00956 assert ("Unexpected item on list" == NULL);
00957 break;
00958 }
00959 }
00960
00961 in_progress = FALSE;
00962 }
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972 static bool
00973 ffestu_symter_end_transition_ (ffebld expr)
00974 {
00975 ffesymbol symbol;
00976 bool any = FALSE;
00977
00978
00979
00980
00981 tail:
00982
00983 if (expr == NULL)
00984 return any;
00985
00986 switch (ffebld_op (expr))
00987 {
00988 case FFEBLD_opITEM:
00989 while (ffebld_trail (expr) != NULL)
00990 {
00991 if (ffestu_symter_end_transition_ (ffebld_head (expr)))
00992 any = TRUE;
00993 expr = ffebld_trail (expr);
00994 }
00995 expr = ffebld_head (expr);
00996 goto tail;
00997
00998 case FFEBLD_opSYMTER:
00999 symbol = ffecom_sym_end_transition (ffebld_symter (expr));
01000 if ((symbol != NULL)
01001 && ffesymbol_attr (symbol, FFESYMBOL_attrANY))
01002 any = TRUE;
01003 ffebld_set_info (expr, ffesymbol_info (symbol));
01004 break;
01005
01006 case FFEBLD_opANY:
01007 return TRUE;
01008
01009 default:
01010 break;
01011 }
01012
01013 switch (ffebld_arity (expr))
01014 {
01015 case 2:
01016 if (ffestu_symter_end_transition_ (ffebld_left (expr)))
01017 any = TRUE;
01018 expr = ffebld_right (expr);
01019 goto tail;
01020
01021 case 1:
01022 expr = ffebld_left (expr);
01023 goto tail;
01024
01025 default:
01026 break;
01027 }
01028
01029 return any;
01030 }
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040 static bool
01041 ffestu_symter_exec_transition_ (ffebld expr)
01042 {
01043 ffesymbol symbol;
01044 bool any = FALSE;
01045
01046
01047
01048
01049 tail:
01050
01051 if (expr == NULL)
01052 return any;
01053
01054 switch (ffebld_op (expr))
01055 {
01056 case FFEBLD_opITEM:
01057 while (ffebld_trail (expr) != NULL)
01058 {
01059 if (ffestu_symter_exec_transition_ (ffebld_head (expr)))
01060 any = TRUE;
01061 expr = ffebld_trail (expr);
01062 }
01063 expr = ffebld_head (expr);
01064 goto tail;
01065
01066 case FFEBLD_opSYMTER:
01067 symbol = ffecom_sym_exec_transition (ffebld_symter (expr));
01068 if ((symbol != NULL)
01069 && ffesymbol_attr (symbol, FFESYMBOL_attrANY))
01070 any = TRUE;
01071 ffebld_set_info (expr, ffesymbol_info (symbol));
01072 break;
01073
01074 case FFEBLD_opANY:
01075 return TRUE;
01076
01077 default:
01078 break;
01079 }
01080
01081 switch (ffebld_arity (expr))
01082 {
01083 case 2:
01084 if (ffestu_symter_exec_transition_ (ffebld_left (expr)))
01085 any = TRUE;
01086 expr = ffebld_right (expr);
01087 goto tail;
01088
01089 case 1:
01090 expr = ffebld_left (expr);
01091 goto tail;
01092
01093 default:
01094 break;
01095 }
01096
01097 return any;
01098 }
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117 static bool
01118 ffestu_dummies_transition_ (ffesymbol (*symfunc) (ffesymbol), ffebld list)
01119 {
01120 static bool in_progress = FALSE;
01121 ffebld item;
01122 ffesymbol symbol;
01123 bool uncertain = FALSE;
01124
01125 assert (!in_progress);
01126 in_progress = TRUE;
01127
01128 for (; list != NULL; list = ffebld_trail (list))
01129 {
01130 if ((item = ffebld_head (list)) == NULL)
01131 continue;
01132
01133 switch (ffebld_op (item))
01134 {
01135 case FFEBLD_opSTAR:
01136 break;
01137
01138 case FFEBLD_opSYMTER:
01139 symbol = ffebld_symter (item);
01140 if (symbol == NULL)
01141 break;
01142 symbol = (*symfunc) (symbol);
01143 if (ffesymbol_state (symbol) == FFESYMBOL_stateUNCERTAIN)
01144 uncertain = TRUE;
01145 else
01146 {
01147 assert (ffesymbol_kind (symbol) != FFEINFO_kindNONE);
01148 assert (ffesymbol_where (symbol) != FFEINFO_whereNONE);
01149 }
01150 ffebld_set_info (item, ffesymbol_info (symbol));
01151 break;
01152
01153 default:
01154 assert ("Unexpected item on list" == NULL);
01155 break;
01156 }
01157 }
01158
01159 in_progress = FALSE;
01160
01161 return uncertain;
01162 }