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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 static char USMID[] = "\n@(#)5.0_pl/sources/p_dcls.c 5.10 10/08/99 08:26:21\n";
00046
00047 # include "defines.h"
00048
00049 # include "host.m"
00050 # include "host.h"
00051 # include "target.m"
00052 # include "target.h"
00053
00054 # include "globals.m"
00055 # include "tokens.m"
00056 # include "sytb.m"
00057 # include "p_globals.m"
00058 # include "debug.m"
00059
00060 # include "globals.h"
00061 # include "tokens.h"
00062 # include "sytb.h"
00063 # include "p_globals.h"
00064 # include "p_dcls.h"
00065
00066 #ifdef KEY
00067 #include "i_cvrt.h"
00068 #endif
00069
00070
00071
00072
00073
00074 static void issue_attr_blk_err(char *);
00075 static void issue_attr_err(attr_type, long);
00076 static void merge_parameter(boolean, int, int, int, opnd_type *,
00077 expr_arg_type *, int, int);
00078 static void merge_type(int, int, int, int);
00079 static void parse_cpnt_dcl_stmt(void);
00080 static long parse_attr_spec(int *, boolean *);
00081 static boolean parse_data_imp_do(opnd_type *);
00082 static void parse_derived_type_stmt(void);
00083 static boolean parse_initializer(int);
00084 static void parse_only_spec(int);
00085 static void retype_attr(int);
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 void parse_common_stmt (void)
00107
00108 {
00109 int array_idx;
00110 int attr_idx;
00111 boolean blank_common = FALSE;
00112 boolean blk_err = FALSE;
00113 int column;
00114 int line;
00115 int name_idx;
00116 int new_sb_idx;
00117 #ifdef KEY
00118 int last_attr_idx = 0;
00119 #else
00120 int last_attr_idx;
00121 #endif
00122 boolean parse_err = FALSE;
00123 token_type save_token;
00124 int sb_idx = NULL_IDX;
00125
00126
00127 TRACE (Func_Entry, "parse_common_stmt", NULL);
00128
00129 if (stmt_type == Task_Common_Stmt) {
00130
00131 if (!matched_specific_token(Tok_Kwd_Common, Tok_Class_Keyword)) {
00132 parse_err_flush(Find_Comma_Slash, "COMMON");
00133 blk_err = TRUE;
00134 }
00135
00136 # if !defined(_TASK_COMMON_EXTENSION)
00137 PRINTMSG(stmt_start_line, 1118, Error, stmt_start_col);
00138 # else
00139
00140
00141
00142 PRINTMSG(stmt_start_line, 46, Ansi, stmt_start_col);
00143 # endif
00144 }
00145
00146 if ((STMT_OUT_OF_ORDER(curr_stmt_category, stmt_type) ||
00147 STMT_CANT_BE_IN_BLK(stmt_type, CURR_BLK)) && iss_blk_stk_err()) {
00148 blk_err = TRUE;
00149 }
00150 else {
00151 curr_stmt_category = Declaration_Stmt_Cat;
00152 }
00153
00154 do {
00155 if (sb_idx == NULL_IDX || LA_CH_VALUE == SLASH) {
00156 parse_err = blk_err;
00157 blank_common = FALSE;
00158 last_attr_idx = NULL_IDX;
00159
00160 if (LA_CH_VALUE != SLASH) {
00161 CREATE_ID(TOKEN_ID(token),
00162 BLANK_COMMON_NAME,
00163 BLANK_COMMON_NAME_LEN);
00164 TOKEN_LEN(token) = BLANK_COMMON_NAME_LEN;
00165 TOKEN_VALUE(token) = Tok_Id;
00166 TOKEN_LINE(token) = LA_CH_LINE;
00167 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00168 blank_common = TRUE;
00169
00170 if (stmt_type == Task_Common_Stmt) {
00171 PRINTMSG(LA_CH_LINE, 109, Error, LA_CH_COLUMN);
00172 }
00173 }
00174 else {
00175 NEXT_LA_CH;
00176
00177 if (LA_CH_VALUE == SLASH) {
00178 CREATE_ID(TOKEN_ID(token),
00179 BLANK_COMMON_NAME,
00180 BLANK_COMMON_NAME_LEN);
00181 TOKEN_LEN(token) = BLANK_COMMON_NAME_LEN;
00182 TOKEN_VALUE(token) = Tok_Id;
00183 TOKEN_LINE(token) = LA_CH_LINE;
00184 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00185 blank_common = TRUE;
00186
00187 if (stmt_type == Task_Common_Stmt) {
00188 PRINTMSG(LA_CH_LINE, 109, Error, LA_CH_COLUMN);
00189 }
00190 NEXT_LA_CH;
00191 }
00192 else if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00193
00194 if (LA_CH_VALUE == SLASH) {
00195 NEXT_LA_CH;
00196 }
00197 else {
00198 parse_err = TRUE;
00199 save_token = token;
00200
00201 if (parse_err_flush(Find_Comma_Slash, "/") &&
00202 LA_CH_VALUE == SLASH) {
00203 NEXT_LA_CH;
00204 }
00205 token = save_token;
00206 }
00207 }
00208 else {
00209 line = LA_CH_LINE;
00210 column = LA_CH_COLUMN;
00211
00212 if (parse_err_flush(Find_Comma_Slash, "common-block-name or /")&&
00213 LA_CH_VALUE == SLASH) {
00214 NEXT_LA_CH;
00215 }
00216
00217 CREATE_ID(TOKEN_ID(token), "//", 2);
00218 TOKEN_LEN(token) = 2;
00219 TOKEN_VALUE(token) = Tok_Id;
00220 TOKEN_LINE(token) = line;
00221 TOKEN_COLUMN(token) = column;
00222 parse_err = TRUE;
00223
00224 }
00225 }
00226
00227 sb_idx = srch_stor_blk_tbl(TOKEN_STR(token),
00228 TOKEN_LEN(token),
00229 curr_scp_idx);
00230
00231 if (sb_idx == NULL_IDX) {
00232 sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00233 TOKEN_LEN(token),
00234 TOKEN_LINE(token),
00235 TOKEN_COLUMN(token),
00236 Common);
00237 SB_BLANK_COMMON(sb_idx) = blank_common;
00238 SB_COMMON_NEEDS_OFFSET(sb_idx) = TRUE;
00239 }
00240 else if (SB_USE_ASSOCIATED(sb_idx) || SB_HOST_ASSOCIATED(sb_idx)) {
00241
00242
00243
00244
00245
00246 new_sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00247 TOKEN_LEN(token),
00248 TOKEN_LINE(token),
00249 TOKEN_COLUMN(token),
00250 Common);
00251 SB_BLANK_COMMON(new_sb_idx) = blank_common;
00252 SB_COMMON_NEEDS_OFFSET(new_sb_idx) = TRUE;
00253 SB_HIDDEN(sb_idx) = TRUE;
00254 SB_DEF_MULT_SCPS(sb_idx) = TRUE;
00255 SB_MERGED_BLK_IDX(sb_idx) = new_sb_idx;
00256 sb_idx = new_sb_idx;
00257 }
00258 else if (SB_FIRST_ATTR_IDX(sb_idx) != NULL_IDX) {
00259 last_attr_idx = SB_FIRST_ATTR_IDX(sb_idx);
00260
00261 while (ATD_NEXT_MEMBER_IDX(last_attr_idx) != NULL_IDX) {
00262 last_attr_idx = ATD_NEXT_MEMBER_IDX(last_attr_idx);
00263 }
00264 }
00265 # if 0
00266
00267
00268
00269 else if (SB_BLK_TYPE(sb_idx) == Threadprivate && !SB_DCL_ERR(sb_idx)) {
00270
00271
00272
00273 PRINTMSG(TOKEN_LINE(token), 1479, Error, TOKEN_COLUMN(token),
00274 SB_NAME_PTR(sb_idx));
00275 }
00276 # endif
00277
00278 if ((cif_flags & XREF_RECS) != 0) {
00279 cif_sb_usage_rec(sb_idx,
00280 TOKEN_LINE(token),
00281 TOKEN_COLUMN(token),
00282 CIF_Symbol_Declaration);
00283 }
00284
00285 if (stmt_type == Task_Common_Stmt) {
00286
00287
00288
00289
00290 SB_BLK_TYPE(sb_idx) = Task_Common;
00291 SB_RUNTIME_INIT(sb_idx) = FALSE;
00292 SB_IS_COMMON(sb_idx) = TRUE;
00293 }
00294
00295 if (parse_err) {
00296 SB_DCL_ERR(sb_idx) = TRUE;
00297 }
00298
00299 if (LA_CH_CLASS == Ch_Class_Letter) {
00300 continue;
00301 }
00302 else {
00303
00304
00305
00306
00307
00308 if (!parse_err) {
00309 parse_err_flush(Find_Comma_Slash, "common-block-object");
00310 parse_err = TRUE;
00311 }
00312 SB_DCL_ERR(sb_idx) = TRUE;
00313 }
00314 }
00315 else if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00316 line = TOKEN_LINE(token);
00317 column = TOKEN_COLUMN(token);
00318 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
00319 &name_idx);
00320
00321 if (attr_idx == NULL_IDX) {
00322 attr_idx = ntr_sym_tbl(&token, name_idx);
00323 LN_DEF_LOC(name_idx) = TRUE;
00324 AT_DCL_ERR(attr_idx) = parse_err;
00325 AT_OBJ_CLASS(attr_idx) = Data_Obj;
00326 ATD_CLASS(attr_idx) = Variable;
00327 ATD_IN_COMMON(attr_idx) = TRUE;
00328 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
00329 SET_IMPL_TYPE(attr_idx);
00330 }
00331 #ifdef KEY
00332 else {
00333 int save_stor_blk_idx = 0;
00334
00335
00336
00337
00338
00339 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
00340 save_stor_blk_idx = ATD_STOR_BLK_IDX(attr_idx);
00341 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
00342 }
00343 if (!fnd_semantic_err(Obj_Common_Obj,line,column,attr_idx,TRUE))
00344 #else
00345 else if (!fnd_semantic_err(Obj_Common_Obj,line,column,attr_idx,TRUE))
00346 #endif
00347 {
00348
00349 if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
00350 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00351 LN_DEF_LOC(name_idx) = TRUE;
00352 }
00353
00354 if (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
00355 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00356 AT_HOST_ASSOCIATED(attr_idx) = FALSE;
00357 LN_DEF_LOC(name_idx) = TRUE;
00358 SET_IMPL_TYPE(attr_idx);
00359 }
00360
00361 ATD_IN_COMMON(attr_idx) = TRUE;
00362 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
00363 ATD_CLASS(attr_idx) = Variable;
00364 AT_DCL_ERR(attr_idx) = parse_err || AT_DCL_ERR(attr_idx);
00365
00366 if (ATD_AUXILIARY(attr_idx)) {
00367 SB_AUXILIARY(sb_idx) = TRUE;
00368 }
00369 }
00370 #ifdef KEY
00371
00372 else if (save_stor_blk_idx) {
00373 ATD_STOR_BLK_IDX(attr_idx) = save_stor_blk_idx;
00374 }
00375 }
00376 #endif
00377
00378 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
00379 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
00380 }
00381
00382 if ((cif_flags & XREF_RECS) != 0) {
00383 cif_usage_rec(attr_idx,
00384 AT_Tbl_Idx,
00385 line,
00386 column,
00387 CIF_Symbol_Declaration);
00388 }
00389
00390 if (!AT_DCL_ERR(attr_idx)) {
00391
00392 if (last_attr_idx == NULL_IDX) {
00393 SB_FIRST_ATTR_IDX(sb_idx) = attr_idx;
00394 }
00395 else {
00396 ATD_NEXT_MEMBER_IDX(last_attr_idx) = attr_idx;
00397 }
00398
00399 last_attr_idx = attr_idx;
00400 }
00401 else {
00402 SB_DCL_ERR(sb_idx) = TRUE;
00403 }
00404
00405 if (LA_CH_VALUE == LPAREN) {
00406 array_idx = parse_array_spec(attr_idx);
00407
00408 if (BD_ARRAY_CLASS(array_idx) == Deferred_Shape) {
00409
00410
00411
00412
00413
00414
00415 PRINTMSG(BD_LINE_NUM(array_idx), 372, Error,
00416 BD_COLUMN_NUM(array_idx));
00417 AT_DCL_ERR(attr_idx) = TRUE;
00418 }
00419 merge_dimension(attr_idx, line, column, array_idx);
00420 }
00421
00422 # ifdef _F_MINUS_MINUS
00423 if (LA_CH_VALUE == LBRKT &&
00424 cmd_line_flags.co_array_fortran) {
00425 ATD_PE_ARRAY_IDX(attr_idx) = parse_pe_array_spec(attr_idx);
00426 }
00427 # endif
00428 }
00429 else {
00430 line = LA_CH_LINE;
00431 column = LA_CH_COLUMN;
00432
00433 parse_err_flush(Find_Comma_Slash, "common-block-object or /");
00434
00435 if (sb_idx == NULL_IDX) {
00436 CREATE_ID(TOKEN_ID(token), "//", 2);
00437 TOKEN_LEN(token) = 2;
00438 TOKEN_VALUE(token) = Tok_Id;
00439 TOKEN_LINE(token) = line;
00440 TOKEN_COLUMN(token) = column;
00441 parse_err = TRUE;
00442
00443 sb_idx = srch_stor_blk_tbl(TOKEN_STR(token),
00444 TOKEN_LEN(token),
00445 curr_scp_idx);
00446
00447 if (sb_idx == NULL_IDX) {
00448 sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00449 TOKEN_LEN(token),
00450 TOKEN_LINE(token),
00451 TOKEN_COLUMN(token),
00452 Common);
00453 SB_COMMON_NEEDS_OFFSET(sb_idx) = TRUE;
00454 }
00455 else if (SB_USE_ASSOCIATED(sb_idx) || SB_HOST_ASSOCIATED(sb_idx)) {
00456
00457
00458
00459
00460
00461 new_sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00462 TOKEN_LEN(token),
00463 TOKEN_LINE(token),
00464 TOKEN_COLUMN(token),
00465 Common);
00466 SB_COMMON_NEEDS_OFFSET(new_sb_idx) = TRUE;
00467 SB_HIDDEN(sb_idx) = TRUE;
00468 SB_DEF_MULT_SCPS(sb_idx) = TRUE;
00469 sb_idx = new_sb_idx;
00470 }
00471 }
00472 SB_DCL_ERR(sb_idx) = TRUE;
00473 }
00474
00475 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != SLASH && LA_CH_VALUE != EOS) {
00476 parse_err_flush(Find_Comma_Slash, "/ or, or " EOS_STR);
00477 parse_err = TRUE;
00478 }
00479
00480 if (LA_CH_VALUE == COMMA) {
00481 NEXT_LA_CH;
00482
00483 if (LA_CH_VALUE == EOS) {
00484 parse_err_flush(Find_None, "common-block-object or /");
00485 }
00486 }
00487 }
00488 while (LA_CH_VALUE != EOS);
00489
00490 NEXT_LA_CH;
00491
00492 TRACE (Func_Exit, "parse_common_stmt", NULL);
00493
00494 return;
00495
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515 void parse_contains_stmt (void)
00516
00517 {
00518 boolean have_blk_err = FALSE;
00519
00520
00521 TRACE (Func_Entry, "parse_contains_stmt", NULL);
00522
00523 #ifdef KEY
00524 revisit_volatile();
00525 #endif
00526
00527 do_cmic_blk_checks();
00528
00529 if (LA_CH_VALUE == EOS) {
00530
00531 if (STMT_CANT_BE_IN_BLK(Contains_Stmt, CURR_BLK) && iss_blk_stk_err()) {
00532 have_blk_err = TRUE;
00533 }
00534 else {
00535 curr_stmt_category = Sub_Func_Stmt_Cat;
00536 }
00537
00538 if (CURR_BLK != Interface_Blk) {
00539
00540
00541
00542
00543
00544 PUSH_BLK_STK(Contains_Blk);
00545 CURR_BLK_NO_EXEC = TRUE;
00546 CURR_BLK_ERR = have_blk_err;
00547
00548 if (cif_flags) {
00549 cif_module_proc_start_line = LA_CH_LINE;
00550 cif_internal_proc_start_line = LA_CH_LINE;
00551 BLK_CIF_SCOPE_ID(blk_stk_idx) = BLK_CIF_SCOPE_ID(blk_stk_idx - 1);
00552 }
00553 }
00554 else {
00555 CURR_BLK_ERR = TRUE;
00556 }
00557 }
00558 else {
00559 parse_err_flush(Find_EOS, EOS_STR);
00560 }
00561
00562 NEXT_LA_CH;
00563
00564 TRACE (Func_Exit, "parse_contains_stmt", NULL);
00565
00566 return;
00567
00568 }
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588 static void parse_cpnt_dcl_stmt()
00589
00590 {
00591 int alignment;
00592 #ifdef KEY
00593 int array_column = 0;
00594 int array_line = 0;
00595 #else
00596 int array_column;
00597 int array_line;
00598 #endif
00599 int attr_idx;
00600 int bd_idx;
00601 int dt_idx;
00602 boolean found_colon;
00603 boolean GT_encountered;
00604 boolean have_attr_list = FALSE;
00605 int idx;
00606 int init_ir_idx;
00607 opnd_type init_opnd;
00608 boolean junk;
00609 int np_idx;
00610 int old_bd_idx;
00611 #ifdef KEY
00612 int save_column = 0;
00613 int save_line = 0;
00614 #else
00615 int save_column;
00616 int save_line;
00617 #endif
00618 int sn_idx;
00619 int stmt_number;
00620 boolean type_err;
00621 int type_idx;
00622
00623
00624 TRACE (Func_Entry, "parse_cpnt_dcl_stmt", NULL);
00625
00626 found_colon = FALSE;
00627 colon_recovery = TRUE;
00628 type_err = !parse_type_spec(TRUE);
00629 type_idx = ATD_TYPE_IDX(AT_WORK_IDX);
00630 AT_DCL_ERR(AT_WORK_IDX) = type_err;
00631 stmt_number = statement_number;
00632
00633 if (TYP_TYPE(type_idx) == Character) {
00634 ATT_CHAR_CPNT(CURR_BLK_NAME) = TRUE;
00635
00636 if (fold_relationals(TYP_IDX(type_idx), CN_INTEGER_ZERO_IDX, Lt_Opr)) {
00637
00638
00639
00640 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00641 TYP_TYPE(TYP_WORK_IDX) = Character;
00642 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00643 TYP_DESC(TYP_WORK_IDX) = TYP_DESC(type_idx);
00644 TYP_DCL_VALUE(TYP_WORK_IDX) = TYP_DCL_VALUE(type_idx);
00645 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00646 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00647 TYP_IDX(TYP_WORK_IDX) = CN_INTEGER_ZERO_IDX;
00648 type_idx = ntr_type_tbl();
00649 ATD_TYPE_IDX(AT_WORK_IDX) = type_idx;
00650 }
00651 }
00652 else if (TYP_TYPE(type_idx) != Structure) {
00653 ATT_NUMERIC_CPNT(CURR_BLK_NAME) = TRUE;
00654 }
00655
00656 if (TYP_DESC(type_idx) == Default_Typed ||
00657 TYP_LINEAR(type_idx) == INTEGER_DEFAULT_TYPE ||
00658 TYP_LINEAR(type_idx) == LOGICAL_DEFAULT_TYPE ||
00659 TYP_LINEAR(type_idx) == REAL_DEFAULT_TYPE ||
00660 TYP_LINEAR(type_idx) == DOUBLE_DEFAULT_TYPE ||
00661 TYP_LINEAR(type_idx) == COMPLEX_DEFAULT_TYPE) {
00662
00663
00664 }
00665 else {
00666 ATT_NON_DEFAULT_CPNT(CURR_BLK_NAME) = TRUE;
00667 }
00668
00669
00670
00671 while (LA_CH_VALUE == COMMA) {
00672 NEXT_LA_CH;
00673
00674 if (MATCHED_TOKEN_CLASS(Tok_Class_Keyword)) {
00675
00676 switch (TOKEN_VALUE(token)) {
00677
00678 #ifdef KEY
00679 case Tok_Kwd_Allocatable:
00680
00681 if (ATD_ALLOCATABLE(AT_WORK_IDX)) {
00682 PRINTMSG (TOKEN_LINE(token), 273, Error, TOKEN_COLUMN(token),
00683 "ALLOCATABLE");
00684 }
00685
00686 have_attr_list = TRUE;
00687 ATD_ALLOCATABLE(AT_WORK_IDX) = TRUE;
00688 ATD_IM_A_DOPE(AT_WORK_IDX) = TRUE;
00689 save_line = array_line = TOKEN_LINE(token);
00690 save_column = array_column = TOKEN_COLUMN(token);
00691 ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME) = TRUE;
00692 ATT_NUMERIC_CPNT(CURR_BLK_NAME) = TRUE;
00693 break;
00694 #endif
00695
00696 case Tok_Kwd_Pointer:
00697
00698 if (ATD_POINTER(AT_WORK_IDX)) {
00699 PRINTMSG (TOKEN_LINE(token), 273, Error,
00700 TOKEN_COLUMN(token), "POINTER");
00701 }
00702
00703 have_attr_list = TRUE;
00704 ATD_POINTER(AT_WORK_IDX) = TRUE;
00705 ATD_IM_A_DOPE(AT_WORK_IDX) = TRUE;
00706 ATT_POINTER_CPNT(CURR_BLK_NAME) = TRUE;
00707 ATT_NUMERIC_CPNT(CURR_BLK_NAME) = TRUE;
00708 break;
00709
00710 case Tok_Kwd_Dimension:
00711
00712 if (ATD_ARRAY_IDX(AT_WORK_IDX) != NULL_IDX) {
00713 PRINTMSG (TOKEN_LINE(token), 273, Error,
00714 TOKEN_COLUMN(token), "DIMENSION");
00715 }
00716
00717 have_attr_list = TRUE;
00718
00719 if (LA_CH_VALUE == LPAREN) {
00720 array_line = TOKEN_LINE(token);
00721 array_column = TOKEN_COLUMN(token);
00722 idx = parse_array_spec(AT_WORK_IDX);
00723 ATD_ARRAY_IDX(AT_WORK_IDX) = idx;
00724 }
00725 # ifdef _F_MINUS_MINUS
00726 else if (!cmd_line_flags.co_array_fortran ||
00727 LA_CH_VALUE != LBRKT)
00728 # else
00729 else
00730 # endif
00731 {
00732
00733 parse_err_flush(Find_Comma, "(");
00734 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
00735 }
00736
00737 # ifdef _F_MINUS_MINUS
00738 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran) {
00739 ATD_PE_ARRAY_IDX(AT_WORK_IDX) =
00740 parse_pe_array_spec(AT_WORK_IDX);
00741 }
00742 # endif
00743
00744 break;
00745
00746 default:
00747 PRINTMSG(TOKEN_LINE(token), 197, Error, TOKEN_COLUMN(token),
00748 "POINTER or DIMENSION", TOKEN_STR(token));
00749 parse_err_flush(Find_Comma, NULL);
00750 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
00751 break;
00752
00753 }
00754 }
00755 else {
00756 parse_err_flush(Find_Comma, "POINTER or DIMENSION");
00757 }
00758 }
00759
00760 #ifdef KEY
00761 if (ATD_ALLOCATABLE(AT_WORK_IDX)) {
00762 if (ATD_POINTER(AT_WORK_IDX)) {
00763 PRINTMSG(save_line, 425, Error, save_column, "POINTER", "ALLOCATABLE");
00764 }
00765 }
00766 #endif
00767
00768 found_colon = matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
00769
00770 if (!found_colon && have_attr_list) {
00771 PRINTMSG (LA_CH_LINE, 187, Error, LA_CH_COLUMN);
00772 }
00773
00774 colon_recovery = FALSE;
00775
00776 if (TYP_TYPE(type_idx) == Structure) {
00777
00778 if (!ATD_POINTER(AT_WORK_IDX)) {
00779 dt_idx = TYP_IDX(type_idx);
00780
00781 if (CURR_BLK_NAME == dt_idx) {
00782 PRINTMSG(TOKEN_LINE(token), 33, Error, TOKEN_COLUMN(token));
00783 ATT_NUMERIC_CPNT(CURR_BLK_NAME) = TRUE;
00784 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
00785 AT_DCL_ERR(CURR_BLK_NAME) = TRUE;
00786 }
00787 else if (!AT_DEFINED(dt_idx)) {
00788 ATT_NUMERIC_CPNT(CURR_BLK_NAME) = TRUE;
00789
00790 if (!AT_DCL_ERR(AT_WORK_IDX)) {
00791 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
00792
00793
00794
00795 if (!AT_DCL_ERR(dt_idx)) {
00796 issue_undefined_type_msg(dt_idx,
00797 TOKEN_LINE(token),
00798 TOKEN_COLUMN(token));
00799 }
00800 }
00801 }
00802 else {
00803 ATT_CHAR_CPNT(CURR_BLK_NAME) |= ATT_CHAR_CPNT(dt_idx);
00804 ATT_NUMERIC_CPNT(CURR_BLK_NAME) |= ATT_NUMERIC_CPNT(dt_idx);
00805 ATT_POINTER_CPNT(CURR_BLK_NAME) |= ATT_POINTER_CPNT(dt_idx);
00806 #ifdef KEY
00807 ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME) |= ATT_ALLOCATABLE_CPNT(dt_idx);
00808 #endif
00809 ATT_NON_DEFAULT_CPNT(CURR_BLK_NAME) |= ATT_NON_DEFAULT_CPNT(dt_idx);
00810 ATT_DEFAULT_INITIALIZED(CURR_BLK_NAME) |=
00811 ATT_DEFAULT_INITIALIZED(dt_idx);
00812 }
00813 }
00814 }
00815
00816 alignment = WORD_ALIGN;
00817
00818 if (ATD_POINTER(AT_WORK_IDX)) {
00819
00820 if (cmd_line_flags.s_pointer8) {
00821 alignment = Align_64;
00822 }
00823 else {
00824 alignment = WORD_ALIGN;
00825 }
00826 }
00827 else if (TYP_TYPE(type_idx) == Structure) {
00828 alignment = ATT_ALIGNMENT(TYP_IDX(type_idx));
00829 }
00830 else if (TYP_TYPE(type_idx) == Character) {
00831
00832 # if defined(_CHAR_IS_ALIGN_8)
00833 alignment = Align_8;
00834 # else
00835 alignment = Align_Bit;
00836 # endif
00837 }
00838
00839 # if defined(_ALIGN_REAL16_TO_16_BYTES)
00840
00841 else if (TYP_LINEAR(type_idx) == Complex_16 ||
00842 TYP_LINEAR(type_idx) == Real_16) {
00843 alignment = Align_128;
00844 }
00845 # endif
00846
00847 # if defined(_TARGET_PACK_HALF_WORD_TYPES)
00848
00849 else if (dump_flags.pack_half_word &&
00850 PACK_HALF_WORD_TEST_CONDITION(type_idx)) {
00851 alignment = Align_32;
00852 }
00853 # endif
00854
00855 # if defined(_HOST32)
00856
00857 else if (DALIGN_TEST_CONDITION(type_idx)) {
00858 alignment = Align_64;
00859 }
00860 # endif
00861
00862 # if defined(_INTEGER_1_AND_2)
00863
00864 else if (on_off_flags.integer_1_and_2 &&
00865 PACK_8_BIT_TEST_CONDITION(type_idx)) {
00866 alignment = Align_8;
00867 }
00868 else if (on_off_flags.integer_1_and_2 &&
00869 PACK_16_BIT_TEST_CONDITION(type_idx)){
00870 alignment = Align_16;
00871 }
00872
00873 # endif
00874
00875 if (ATT_ALIGNMENT(CURR_BLK_NAME) < alignment) {
00876 ATT_ALIGNMENT(CURR_BLK_NAME) = alignment;
00877 }
00878
00879 do {
00880 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00881 parse_err_flush(Find_Comma, "component-name");
00882 continue;
00883 }
00884
00885 sn_idx = ATT_FIRST_CPNT_IDX(CURR_BLK_NAME);
00886 attr_idx = srch_linked_sn(TOKEN_STR(token),
00887 TOKEN_LEN(token),
00888 &sn_idx);
00889
00890 if (attr_idx == NULL_IDX) {
00891 NTR_SN_TBL(sn_idx);
00892 NTR_NAME_POOL(TOKEN_ID(token).words, TOKEN_LEN(token), np_idx);
00893 NTR_ATTR_TBL(attr_idx);
00894 AT_DEF_LINE(attr_idx) = TOKEN_LINE(token);
00895 AT_DEF_COLUMN(attr_idx) = TOKEN_COLUMN(token);
00896 AT_NAME_LEN(attr_idx) = TOKEN_LEN(token);
00897 AT_NAME_IDX(attr_idx) = np_idx;
00898 SN_NAME_LEN(sn_idx) = TOKEN_LEN(token);
00899 SN_NAME_IDX(sn_idx) = np_idx;
00900 SN_ATTR_IDX(sn_idx) = attr_idx;
00901
00902 if (BLK_LAST_CPNT_IDX(blk_stk_idx) == NULL_IDX) {
00903 ATT_FIRST_CPNT_IDX(CURR_BLK_NAME) = sn_idx;
00904 ATT_NUM_CPNTS(CURR_BLK_NAME) = 1;
00905 }
00906 else {
00907 ATT_NUM_CPNTS(CURR_BLK_NAME) += 1;
00908 SN_SIBLING_LINK(BLK_LAST_CPNT_IDX(blk_stk_idx)) = sn_idx;
00909 }
00910 BLK_LAST_CPNT_IDX(blk_stk_idx) = sn_idx;
00911 }
00912 else {
00913 PRINTMSG (TOKEN_LINE(token), 188, Error, TOKEN_COLUMN(token),
00914 AT_OBJ_NAME_PTR(attr_idx));
00915 AT_DCL_ERR(attr_idx) = TRUE;
00916 }
00917
00918
00919
00920 AT_SEMANTICS_DONE(attr_idx) = TRUE;
00921 ATD_CLASS(attr_idx) = Struct_Component;
00922 ATD_DERIVED_TYPE_IDX(attr_idx) = CURR_BLK_NAME;
00923 ATD_ARRAY_IDX(attr_idx) = ATD_ARRAY_IDX(AT_WORK_IDX);
00924 ATD_PE_ARRAY_IDX(attr_idx) = ATD_PE_ARRAY_IDX(AT_WORK_IDX);
00925 ATD_POINTER(attr_idx) = ATD_POINTER(AT_WORK_IDX);
00926 #ifdef KEY
00927 ATD_ALLOCATABLE(attr_idx) = ATD_ALLOCATABLE(AT_WORK_IDX);
00928 #endif
00929 ATD_IM_A_DOPE(attr_idx) = ATD_IM_A_DOPE(AT_WORK_IDX);
00930 save_line = array_line;
00931 save_column = array_column;
00932 AT_TYPED(attr_idx) = AT_TYPED(AT_WORK_IDX);
00933 AT_DCL_ERR(attr_idx) = AT_DCL_ERR(AT_WORK_IDX);
00934
00935 if (type_err) {
00936 SET_IMPL_TYPE(attr_idx);
00937 }
00938 else {
00939 ATD_TYPE_IDX(attr_idx) = type_idx;
00940 }
00941
00942 if ((cif_flags & XREF_RECS) != 0) {
00943 cif_usage_rec(attr_idx,
00944 AT_Tbl_Idx,
00945 TOKEN_LINE(token),
00946 TOKEN_COLUMN(token),
00947 CIF_Symbol_Declaration);
00948 }
00949
00950 if (LA_CH_VALUE == LPAREN) {
00951 save_line = TOKEN_LINE(token);
00952 save_column = TOKEN_COLUMN(token);
00953 idx = parse_array_spec(attr_idx);
00954 ATD_ARRAY_IDX(attr_idx) = idx;
00955 }
00956
00957 # ifdef _F_MINUS_MINUS
00958 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran) {
00959 ATD_PE_ARRAY_IDX(attr_idx) = parse_pe_array_spec(attr_idx);
00960 }
00961 # endif
00962
00963 bd_idx = ATD_ARRAY_IDX(attr_idx);
00964
00965 #ifdef KEY
00966 if (ATD_ALLOCATABLE(attr_idx)) {
00967 if (bd_idx == NULL_IDX || BD_ARRAY_CLASS(bd_idx) != Deferred_Shape) {
00968 PRINTMSG(save_line, 570, Error, save_column,
00969 AT_OBJ_NAME_PTR(attr_idx));
00970 AT_DCL_ERR(attr_idx) = TRUE;
00971 }
00972 }
00973 else
00974 #endif
00975 if (bd_idx != NULL_IDX) {
00976 AT_DCL_ERR(attr_idx) = BD_DCL_ERR(bd_idx) | AT_DCL_ERR(attr_idx);
00977
00978 if (ATD_POINTER(attr_idx)) {
00979
00980 if (BD_ARRAY_CLASS(bd_idx) != Deferred_Shape) {
00981 PRINTMSG(save_line, 189, Error, save_column,
00982 AT_OBJ_NAME_PTR(attr_idx));
00983 AT_DCL_ERR(attr_idx) = TRUE;
00984 }
00985 }
00986 else if (BD_ARRAY_CLASS(bd_idx) != Explicit_Shape ||
00987 BD_ARRAY_SIZE(bd_idx) != Constant_Size) {
00988 PRINTMSG(save_line, 190, Error, save_column,
00989 AT_OBJ_NAME_PTR(attr_idx));
00990 AT_DCL_ERR(attr_idx) = TRUE;
00991 }
00992 }
00993
00994 if (LA_CH_VALUE == STAR) {
00995 save_line = LA_CH_LINE;
00996 save_column = LA_CH_COLUMN;
00997
00998
00999
01000
01001
01002 parse_length_selector(attr_idx, FALSE, FALSE);
01003
01004 TYP_DCL_VALUE(TYP_WORK_IDX) = TYP_DCL_VALUE(type_idx);
01005 TYP_DESC(TYP_WORK_IDX) = TYP_DESC(type_idx);
01006
01007 if (TYP_TYPE(type_idx) != Character) {
01008 PRINTMSG(save_line, 192, Error, save_column);
01009 AT_DCL_ERR(attr_idx) = TRUE;
01010 }
01011 else if (TYP_CHAR_CLASS(TYP_WORK_IDX) == Const_Len_Char) {
01012
01013 if (fold_relationals(TYP_IDX(TYP_WORK_IDX),
01014 CN_INTEGER_ZERO_IDX,
01015 Le_Opr)) {
01016 TYP_IDX(TYP_WORK_IDX) = CN_INTEGER_ZERO_IDX;
01017 }
01018
01019 ATD_TYPE_IDX(attr_idx) = ntr_type_tbl();
01020 }
01021 else if (!AT_DCL_ERR(attr_idx)) {
01022
01023
01024
01025 PRINTMSG(save_line, 191, Error, save_column);
01026
01027 ATD_TYPE_IDX(attr_idx) = CHARACTER_DEFAULT_TYPE;
01028 AT_DCL_ERR(attr_idx) = TRUE;
01029 }
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045 old_bd_idx = ATD_ARRAY_IDX(attr_idx);
01046
01047 if (old_bd_idx != NULL_IDX &&
01048 old_bd_idx == ATD_ARRAY_IDX(AT_WORK_IDX) &&
01049 BD_ARRAY_CLASS(old_bd_idx) != Deferred_Shape) {
01050 bd_idx = reserve_array_ntry(BD_RANK(old_bd_idx));
01051 COPY_BD_NTRY(bd_idx, old_bd_idx);
01052 ATD_ARRAY_IDX(attr_idx) = ntr_array_in_bd_tbl(bd_idx);
01053 }
01054 }
01055
01056 if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX) {
01057 bd_idx = ATD_ARRAY_IDX(attr_idx);
01058
01059 if (BD_RESOLVED(bd_idx) ||
01060 BD_ARRAY_CLASS(bd_idx) == Deferred_Shape ||
01061 BD_ARRAY_CLASS(bd_idx) == Assumed_Shape) {
01062 }
01063 else {
01064
01065
01066
01067
01068
01069 if (BD_ARRAY_CLASS(bd_idx) == Assumed_Size) {
01070
01071
01072
01073
01074
01075
01076 old_bd_idx = bd_idx;
01077 bd_idx = reserve_array_ntry(BD_RANK(old_bd_idx));
01078 COPY_BD_NTRY(bd_idx, old_bd_idx);
01079 BD_UB_IDX(bd_idx, BD_RANK(bd_idx)) = BD_LB_IDX(bd_idx,
01080 BD_RANK(bd_idx));
01081 BD_UB_FLD(bd_idx, BD_RANK(bd_idx)) = BD_LB_FLD(bd_idx,
01082 BD_RANK(bd_idx));
01083 BD_ARRAY_CLASS(bd_idx) = Explicit_Shape;
01084 BD_DCL_ERR(bd_idx) = TRUE;
01085 ATD_ARRAY_IDX(attr_idx) = ntr_array_in_bd_tbl(bd_idx);
01086 }
01087 array_bounds_resolution(attr_idx, &junk);
01088 }
01089 }
01090
01091 if (ATD_PE_ARRAY_IDX(attr_idx) != NULL_IDX) {
01092 PRINTMSG(BD_LINE_NUM(ATD_PE_ARRAY_IDX(attr_idx)), 1579, Error,
01093 BD_COLUMN_NUM(ATD_PE_ARRAY_IDX(attr_idx)),
01094 AT_OBJ_NAME_PTR(attr_idx),
01095 AT_OBJ_NAME_PTR(CURR_BLK_NAME));
01096 AT_DCL_ERR(attr_idx) = TRUE;
01097 ATD_PE_ARRAY_IDX(attr_idx) = NULL_IDX;
01098 }
01099
01100 if (LA_CH_VALUE == EQUAL) {
01101 NEXT_LA_CH;
01102 save_line = LA_CH_LINE;
01103 save_column = LA_CH_COLUMN;
01104
01105 if (LA_CH_VALUE == GT) {
01106 NEXT_LA_CH;
01107 save_line = LA_CH_LINE;
01108 save_column = LA_CH_COLUMN;
01109 GT_encountered = TRUE;
01110 }
01111 else {
01112 GT_encountered = FALSE;
01113 }
01114
01115 if (parse_expr(&init_opnd)) {
01116
01117 if (!found_colon) {
01118 PRINTMSG(save_line, 121, Error, save_column);
01119 AT_DCL_ERR(attr_idx) = TRUE;
01120 }
01121
01122 NTR_IR_TBL(init_ir_idx);
01123 ATD_CPNT_INIT_IDX(attr_idx) = init_ir_idx;
01124 ATD_FLD(attr_idx) = IR_Tbl_Idx;
01125 ATT_DEFAULT_INITIALIZED(CURR_BLK_NAME) = TRUE;
01126
01127 if (OPND_FLD(init_opnd) == IR_Tbl_Idx &&
01128 IR_OPR(OPND_IDX(init_opnd)) == Call_Opr &&
01129 AT_IS_INTRIN(IR_IDX_L(OPND_IDX(init_opnd))) &&
01130 strcmp(AT_OBJ_NAME_PTR(IR_IDX_L(OPND_IDX(init_opnd))),
01131 "NULL") == 0) {
01132
01133 if (IR_IDX_R(OPND_IDX(init_opnd)) != NULL_IDX) {
01134 PRINTMSG(IR_LINE_NUM(OPND_IDX(init_opnd)), 1573, Error,
01135 IR_COL_NUM(OPND_IDX(init_opnd)));
01136 AT_DCL_ERR(attr_idx) = TRUE;
01137 ATD_CPNT_INIT_IDX(attr_idx) = NULL_IDX;
01138 ATD_FLD(attr_idx) = NO_Tbl_Idx;
01139 }
01140
01141 IR_OPR(init_ir_idx) = Null_Opr;
01142
01143 if (!GT_encountered) {
01144 PRINTMSG(TOKEN_LINE(token), 1562, Error, TOKEN_COLUMN(token));
01145 AT_DCL_ERR(attr_idx) = TRUE;
01146 ATD_CPNT_INIT_IDX(attr_idx) = NULL_IDX;
01147 ATD_FLD(attr_idx) = NO_Tbl_Idx;
01148 }
01149 }
01150 else {
01151 IR_OPR(init_ir_idx) = Init_Opr;
01152
01153 if (GT_encountered) {
01154 PRINTMSG(TOKEN_LINE(token), 1562, Error, TOKEN_COLUMN(token));
01155 AT_DCL_ERR(attr_idx) = TRUE;
01156 ATD_CPNT_INIT_IDX(attr_idx) = NULL_IDX;
01157 ATD_FLD(attr_idx) = NO_Tbl_Idx;
01158 }
01159 }
01160
01161 if (ATD_CPNT_INIT_IDX(attr_idx) != NULL_IDX) {
01162 IR_TYPE_IDX(init_ir_idx) = TYPELESS_DEFAULT_TYPE;
01163 IR_LINE_NUM(init_ir_idx) = AT_DEF_LINE(attr_idx);
01164 IR_COL_NUM(init_ir_idx) = AT_DEF_COLUMN(attr_idx);
01165 IR_LINE_NUM_L(init_ir_idx) = AT_DEF_LINE(attr_idx);
01166 IR_COL_NUM_L(init_ir_idx) = AT_DEF_COLUMN(attr_idx);
01167 IR_FLD_L(init_ir_idx) = AT_Tbl_Idx;
01168 IR_IDX_L(init_ir_idx) = attr_idx;
01169
01170 COPY_OPND(IR_OPND_R(init_ir_idx), init_opnd);
01171 }
01172 }
01173 else {
01174 AT_DCL_ERR(attr_idx) = TRUE;
01175 }
01176 }
01177
01178 if (!AT_DCL_ERR(attr_idx)) {
01179 #ifdef KEY
01180 assign_bind_c_offset(attr_idx,
01181 AT_OBJ_CLASS(CURR_BLK_NAME) == Derived_Type &&
01182 AT_BIND_ATTR(CURR_BLK_NAME));
01183 #else
01184 assign_offset(attr_idx);
01185 #endif
01186 }
01187 else {
01188 ATD_CPNT_OFFSET_IDX(attr_idx) = CN_INTEGER_ZERO_IDX;
01189 ATD_OFFSET_FLD(attr_idx) = CN_Tbl_Idx;
01190 }
01191
01192 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
01193 AT_DCL_ERR(CURR_BLK_NAME) = AT_DCL_ERR(CURR_BLK_NAME) ||
01194 AT_DCL_ERR(attr_idx);
01195
01196 }
01197 while (LA_CH_VALUE == COMMA &&
01198 matched_specific_token(Tok_Punct_Comma, Tok_Class_Punct));
01199
01200 if (LA_CH_VALUE != EOS) {
01201 parse_err_flush(Find_EOS, ", or " EOS_STR);
01202 }
01203
01204 if (cif_flags & MISC_RECS) {
01205 cif_stmt_type_rec(TRUE, CIF_Type_Declaration_Stmt, stmt_number);
01206 }
01207
01208 NEXT_LA_CH;
01209
01210 TRACE (Func_Exit, "parse_cpnt_dcl_stmt", NULL);
01211
01212 return;
01213
01214 }
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233 void parse_data_stmt (void)
01234
01235 {
01236 int attr_idx;
01237 boolean found_attr;
01238 boolean found_comma = FALSE;
01239 int il_idx;
01240 int init_ir_idx;
01241 int name_column;
01242 int name_idx;
01243 int name_line;
01244 int obj_chain_end;
01245 opnd_type opnd;
01246
01247
01248 TRACE (Func_Entry, "parse_data_stmt", NULL);
01249
01250 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Data_Stmt) ||
01251 STMT_CANT_BE_IN_BLK(Data_Stmt, CURR_BLK)) &&
01252 iss_blk_stk_err()) {
01253
01254
01255
01256 }
01257 else if (curr_stmt_category < Declaration_Stmt_Cat) {
01258 curr_stmt_category = Declaration_Stmt_Cat;
01259 }
01260 else if (curr_stmt_category > Declaration_Stmt_Cat) {
01261 PRINTMSG(TOKEN_LINE(token), 1571,
01262 #ifdef KEY
01263 Ansi,
01264 #else
01265 Comment,
01266 #endif
01267 TOKEN_COLUMN(token));
01268 }
01269
01270 DATA_STMT_SET:
01271
01272 obj_chain_end = NULL_IDX;
01273 TOKEN_VALUE(token) = Tok_Const_False;
01274
01275 NTR_IR_TBL(init_ir_idx);
01276 SH_IR_IDX(curr_stmt_sh_idx) = init_ir_idx;
01277 IR_OPR(init_ir_idx) = Init_Opr;
01278 IR_TYPE_IDX(init_ir_idx) = TYPELESS_DEFAULT_TYPE;
01279 IR_LINE_NUM(init_ir_idx) = LA_CH_LINE;
01280 IR_COL_NUM(init_ir_idx) = LA_CH_COLUMN;
01281
01282 while (MATCHED_TOKEN_CLASS(Tok_Class_Id) || LA_CH_VALUE == LPAREN) {
01283
01284 found_comma = FALSE;
01285
01286 if (TOKEN_VALUE(token) != Tok_Const_False) {
01287 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
01288
01289 if (attr_idx == NULL_IDX) {
01290 found_attr = FALSE;
01291 attr_idx = ntr_sym_tbl(&token, name_idx);
01292 LN_DEF_LOC(name_idx) = TRUE;
01293 SET_IMPL_TYPE(attr_idx);
01294 }
01295 else {
01296 found_attr = TRUE;
01297
01298 if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
01299 AT_ATTR_LINK(attr_idx) = NULL_IDX;
01300 LN_DEF_LOC(name_idx) = TRUE;
01301 }
01302 }
01303
01304 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
01305 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
01306 #ifdef KEY
01307
01308
01309
01310 int typ_idx = TYP_IDX(ATD_TYPE_IDX(attr_idx));
01311 if (AT_OBJ_CLASS(typ_idx) == Derived_Type &&
01312 ATT_ALLOCATABLE_CPNT(typ_idx)) {
01313 PRINTMSG(TOKEN_LINE(token), 1680, Error, TOKEN_COLUMN(token),
01314 AT_OBJ_NAME_PTR(attr_idx));
01315 }
01316 #endif
01317 }
01318
01319
01320 name_line = TOKEN_LINE(token);
01321 name_column = TOKEN_COLUMN(token);
01322
01323
01324
01325
01326
01327
01328
01329 if (LA_CH_VALUE == LPAREN || LA_CH_VALUE == PERCENT) {
01330
01331 if (parse_deref(&opnd, NULL_IDX)) {
01332
01333 if (OPND_FLD(opnd) == IR_Tbl_Idx &&
01334 IR_OPR(OPND_IDX(opnd)) == Call_Opr) {
01335 PRINTMSG(name_line, 699, Error, name_column);
01336 parse_err_flush(Find_EOS, NULL);
01337 goto EXIT;
01338 }
01339 }
01340 else {
01341 parse_err_flush(Find_EOS, NULL);
01342 goto EXIT;
01343 }
01344 }
01345 else {
01346 OPND_LINE_NUM(opnd) = TOKEN_LINE(token);
01347 OPND_COL_NUM(opnd) = TOKEN_COLUMN(token);
01348 OPND_FLD(opnd) = AT_Tbl_Idx;
01349 OPND_IDX(opnd) = attr_idx;
01350 }
01351
01352 if (! merge_data(found_attr, name_line, name_column, attr_idx)) {
01353 parse_err_flush(Find_EOS, NULL);
01354 goto EXIT;
01355 }
01356 }
01357 else {
01358
01359 if (! parse_data_imp_do(&opnd)) {
01360 parse_err_flush(Find_EOS, NULL);
01361 goto EXIT;
01362 }
01363 }
01364
01365 NTR_IR_LIST_TBL(il_idx);
01366 COPY_OPND(IL_OPND(il_idx), opnd);
01367
01368 switch (IL_FLD(il_idx)) {
01369
01370 case AT_Tbl_Idx:
01371 IL_LINE_NUM(il_idx) = TOKEN_LINE(token);
01372 IL_COL_NUM(il_idx) = TOKEN_COLUMN(token);
01373 break;
01374
01375 case IR_Tbl_Idx:
01376 IL_LINE_NUM(il_idx) = IR_LINE_NUM(IL_IDX(il_idx));
01377 IL_COL_NUM(il_idx) = IR_COL_NUM(IL_IDX(il_idx));
01378 break;
01379
01380 default:
01381 PRINTMSG(stmt_start_line, 179, Internal, stmt_start_col,
01382 "parse_data_stmt");
01383 }
01384
01385 if (obj_chain_end == NULL_IDX) {
01386 IR_FLD_L(init_ir_idx) = IL_Tbl_Idx;
01387 IR_IDX_L(init_ir_idx) = il_idx;
01388 }
01389 else {
01390 IL_NEXT_LIST_IDX(obj_chain_end) = il_idx;
01391 IL_PREV_LIST_IDX(il_idx) = obj_chain_end;
01392 }
01393
01394 obj_chain_end = il_idx;
01395 ++IR_LIST_CNT_L(init_ir_idx);
01396
01397 TOKEN_VALUE(token) = Tok_Const_False;
01398
01399 if (LA_CH_VALUE == COMMA) {
01400 found_comma = TRUE;
01401 NEXT_LA_CH;
01402 }
01403 else if (LA_CH_VALUE != SLASH) {
01404 parse_err_flush(Find_EOS, "comma or /");
01405 goto EXIT;
01406 }
01407
01408 }
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426 if (IR_IDX_L(init_ir_idx) != NULL_IDX) {
01427
01428 if (found_comma) {
01429 parse_err_flush(Find_EOS, "data-stmt-object");
01430 goto EXIT;
01431 }
01432 }
01433 else {
01434
01435 if (! SH_COMPILER_GEN(curr_stmt_sh_idx)) {
01436 parse_err_flush(Find_EOS, "data-stmt-object");
01437 goto EXIT;
01438 }
01439 else {
01440
01441 if (found_comma) {
01442 parse_err_flush(Find_EOS, "data-stmt-object");
01443 goto EXIT;
01444 }
01445 else {
01446 parse_err_flush(Find_EOS, "comma, data-stmt-object, or EOS");
01447 goto EXIT;
01448 }
01449 }
01450 }
01451
01452 if (LA_CH_VALUE == SLASH) {
01453 NEXT_LA_CH;
01454
01455 if (!parse_initializer(init_ir_idx)) {
01456 goto EXIT;
01457 }
01458
01459 if (LA_CH_VALUE == COMMA) {
01460 found_comma = TRUE;
01461 NEXT_LA_CH;
01462 }
01463 else {
01464 found_comma = FALSE;
01465 }
01466
01467 if (LA_CH_VALUE != EOS) {
01468 gen_sh(After, Data_Stmt, LA_CH_LINE, LA_CH_COLUMN, FALSE, FALSE, TRUE);
01469 goto DATA_STMT_SET;
01470 }
01471 else if (found_comma) {
01472 parse_err_flush(Find_EOS, "data-stmt-object");
01473 }
01474 }
01475 else {
01476 parse_err_flush(Find_EOS, "/");
01477 }
01478
01479 EXIT:
01480
01481 NEXT_LA_CH;
01482 strcpy(parse_operand_insert, "operand");
01483
01484 TRACE (Func_Exit, "parse_data_stmt", NULL);
01485
01486 return;
01487
01488 }
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507 static void parse_derived_type_stmt()
01508
01509 {
01510 access_type access;
01511 boolean access_set = FALSE;
01512 int dt_idx = NULL_IDX;
01513 boolean err;
01514 int name_idx;
01515 char *str;
01516 #ifdef KEY
01517 int found_bind = 0;
01518 #endif
01519
01520
01521 TRACE (Func_Entry, "parse_derived_type_stmt", NULL);
01522
01523 access = (access_type) AT_PRIVATE(SCP_ATTR_IDX(curr_scp_idx));
01524
01525 if (LA_CH_VALUE == COMMA) {
01526 colon_recovery = TRUE;
01527 NEXT_LA_CH;
01528
01529 if (matched_specific_token(Tok_Kwd_Private, Tok_Class_Keyword) ||
01530 matched_specific_token(Tok_Kwd_Public, Tok_Class_Keyword)) {
01531 access = TOKEN_VALUE(token) == Tok_Kwd_Private ? Private : Public;
01532 access_set = TRUE;
01533
01534 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) != Module) {
01535 str = access == Private ? "PRIVATE" : "PUBLIC";
01536 PRINTMSG(TOKEN_LINE(token), 596, Error, TOKEN_COLUMN(token), str);
01537 access_set = FALSE;
01538 }
01539
01540 if (!matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct)) {
01541 parse_err_flush(Find_None, "::");
01542 }
01543 }
01544 #ifdef KEY
01545 else if (matched_specific_token(Tok_Kwd_Bind, Tok_Class_Keyword)) {
01546 parse_language_binding_spec(0);
01547 found_bind = 1;
01548 if (!matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct)) {
01549 parse_err_flush(Find_None, "::");
01550 }
01551 }
01552 #endif
01553 else {
01554 parse_err_flush(Find_None,
01555 #ifdef KEY
01556 "BIND, PUBLIC, or PRIVATE"
01557 #else
01558 "PUBLIC or PRIVATE"
01559 #endif
01560 );
01561
01562 matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
01563 }
01564 colon_recovery = FALSE;
01565 }
01566 else {
01567 matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
01568 }
01569
01570
01571 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
01572
01573 if (LA_CH_VALUE != EOS) {
01574 parse_err_flush(Find_EOS, EOS_STR);
01575 }
01576
01577 err = FALSE;
01578
01579 switch (TOKEN_STR(token)[0]) {
01580 case 'C':
01581 err = (strcmp(TOKEN_STR(token), "CHARACTER") == 0) ||
01582 (strcmp(TOKEN_STR(token), "COMPLEX") == 0);
01583 break;
01584 case 'D':
01585 err = (strcmp(TOKEN_STR(token), "DOUBLEPRECISION") == 0);
01586 break;
01587 case 'I':
01588 err = (strcmp(TOKEN_STR(token), "INTEGER") == 0);
01589 break;
01590 case 'L':
01591 err = (strcmp(TOKEN_STR(token), "LOGICAL") == 0);
01592 break;
01593 case 'R':
01594 err = (strcmp(TOKEN_STR(token), "REAL") == 0);
01595 break;
01596 }
01597
01598 if (err) {
01599 PRINTMSG (TOKEN_LINE(token), 286, Error, TOKEN_COLUMN(token),
01600 TOKEN_STR(token));
01601 }
01602
01603 dt_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
01604
01605 if (dt_idx == NULL_IDX) {
01606 dt_idx = ntr_sym_tbl(&token, name_idx);
01607 AT_OBJ_CLASS(dt_idx) = Derived_Type;
01608 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01609 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01610 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01611 }
01612 else if (AT_NOT_VISIBLE(dt_idx)) {
01613 PRINTMSG(TOKEN_LINE(token), 486, Error,
01614 TOKEN_COLUMN(token),
01615 AT_OBJ_NAME_PTR(dt_idx),
01616 AT_OBJ_NAME_PTR(AT_MODULE_IDX(dt_idx)));
01617 CREATE_ERR_ATTR(dt_idx,
01618 TOKEN_LINE(token),
01619 TOKEN_COLUMN(token),
01620 Derived_Type);
01621 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01622 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01623 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01624 }
01625 else if (AT_ATTR_LINK(dt_idx) != NULL_IDX) {
01626 AT_DEF_LINE(dt_idx) = TOKEN_LINE(token);
01627 AT_DEF_COLUMN(dt_idx) = TOKEN_COLUMN(token);
01628 AT_ATTR_LINK(dt_idx) = NULL_IDX;
01629 CLEAR_VARIANT_ATTR_INFO(dt_idx, Derived_Type);
01630 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01631 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01632 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01633
01634 if (AT_LOCKED_IN(dt_idx)) {
01635 PRINTMSG(TOKEN_LINE(token), 390, Error, TOKEN_COLUMN(token),
01636 AT_OBJ_NAME_PTR(dt_idx));
01637 AT_DCL_ERR(dt_idx) = TRUE;
01638 }
01639 }
01640 else if (AT_OBJ_CLASS(dt_idx) == Derived_Type) {
01641 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01642
01643 if (AT_DEFINED(dt_idx)) {
01644 AT_DCL_ERR(dt_idx) = TRUE;
01645 PRINTMSG(TOKEN_LINE(token), 123, Error, TOKEN_COLUMN(token),
01646 AT_OBJ_NAME_PTR(dt_idx));
01647 }
01648 }
01649 else if (fnd_semantic_err(Obj_Derived_Type,
01650 TOKEN_LINE(token),
01651 TOKEN_COLUMN(token),
01652 dt_idx,
01653 TRUE)) {
01654
01655
01656
01657 CREATE_ERR_ATTR(dt_idx,
01658 TOKEN_LINE(token),
01659 TOKEN_COLUMN(token),
01660 Derived_Type);
01661 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01662 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01663 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01664 }
01665 else {
01666
01667 CLEAR_VARIANT_ATTR_INFO(dt_idx, Derived_Type);
01668 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01669 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01670 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01671 }
01672
01673 #ifdef KEY
01674 if (found_bind) {
01675 AT_BIND_ATTR(dt_idx) = 1;
01676 }
01677 #endif
01678
01679 if (CURR_BLK != Interface_Body_Blk) {
01680
01681
01682
01683 num_of_derived_types++;
01684 }
01685
01686 if ((cif_flags & XREF_RECS) != 0) {
01687 cif_usage_rec(dt_idx,
01688 AT_Tbl_Idx,
01689 TOKEN_LINE(token),
01690 TOKEN_COLUMN(token),
01691 CIF_Derived_Type_Name_Definition);
01692 }
01693
01694 LN_DEF_LOC(name_idx) = TRUE;
01695 AT_DEFINED(dt_idx) = TRUE;
01696 AT_LOCKED_IN(dt_idx) = TRUE;
01697
01698 if (AT_ACCESS_SET(dt_idx)) {
01699
01700 if (access_set) {
01701 AT_DCL_ERR(dt_idx) = TRUE;
01702 PRINTMSG (TOKEN_LINE(token), 275, Error, TOKEN_COLUMN(token),
01703 AT_OBJ_NAME_PTR(dt_idx));
01704 }
01705 }
01706 else {
01707 AT_PRIVATE(dt_idx) = access;
01708 AT_ACCESS_SET(dt_idx) = access_set;
01709 }
01710 }
01711 else {
01712 parse_err_flush(Find_EOS, "type-name");
01713 }
01714
01715 stmt_type = Derived_Type_Stmt;
01716 SH_STMT_TYPE(curr_stmt_sh_idx) = Derived_Type_Stmt;
01717
01718 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Derived_Type_Stmt) ||
01719 STMT_CANT_BE_IN_BLK(Derived_Type_Stmt, CURR_BLK)) &&
01720 iss_blk_stk_err()) {
01721 PUSH_BLK_STK(Derived_Type_Blk);
01722 CURR_BLK_ERR = TRUE;
01723 }
01724 else {
01725 PUSH_BLK_STK(Derived_Type_Blk);
01726 curr_stmt_category = Declaration_Stmt_Cat;
01727 }
01728 #ifdef KEY
01729
01730
01731
01732
01733 if (dt_idx == NULL_IDX) {
01734 #define NO_ID "<NO NAME>"
01735 TOKEN_LEN(token) = (sizeof NO_ID) - 1;
01736 CREATE_ID(TOKEN_ID(token), NO_ID, TOKEN_LEN(token));
01737 dt_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
01738 if (dt_idx == NULL_IDX) {
01739 dt_idx = ntr_sym_tbl(&token, name_idx);
01740 AT_OBJ_CLASS(dt_idx) = Derived_Type;
01741 ATT_STRUCT_BIT_LEN_FLD(dt_idx) = CN_Tbl_Idx;
01742 ATT_STRUCT_BIT_LEN_IDX(dt_idx) = CN_INTEGER_ZERO_IDX;
01743 ATT_SCP_IDX(dt_idx) = curr_scp_idx;
01744 }
01745 }
01746 #endif
01747
01748 CURR_BLK_NO_EXEC = TRUE;
01749 CURR_BLK_NAME = dt_idx;
01750
01751 NEXT_LA_CH;
01752
01753 TRACE (Func_Exit, "parse_derived_type_stmt", NULL);
01754
01755 return;
01756
01757 }
01758
01759
01760
01761
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776 void parse_equivalence_stmt (void)
01777
01778 {
01779 int al_idx;
01780 int attr_idx;
01781 int column;
01782 int eq_idx;
01783 boolean fnd_attr;
01784 int group;
01785 boolean have_array;
01786 int items_in_list;
01787 int line;
01788 int list_idx;
01789 int list2_idx;
01790 int name_idx;
01791 opnd_type opnd;
01792 boolean parsed_ok = TRUE;
01793 int rank;
01794 opnd_type result_opnd;
01795 int subs_idx = NULL_IDX;
01796 boolean substring;
01797 int substring_idx;
01798
01799
01800 TRACE (Func_Entry, "parse_equivalence_stmt", NULL);
01801
01802 if (LA_CH_VALUE == LPAREN) {
01803
01804 NTR_EQ_TBL(eq_idx);
01805
01806 while (LA_CH_VALUE == LPAREN) {
01807 NEXT_LA_CH;
01808
01809 EQ_NEXT_EQUIV_GRP(eq_idx) = SCP_FIRST_EQUIV_GRP(curr_scp_idx);
01810 SCP_FIRST_EQUIV_GRP(curr_scp_idx) = eq_idx;
01811 group = eq_idx;
01812 items_in_list = 0;
01813
01814 do {
01815 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
01816 attr_idx = srch_sym_tbl(TOKEN_STR(token),
01817 TOKEN_LEN(token),
01818 &name_idx);
01819 fnd_attr = attr_idx;
01820 line = TOKEN_LINE(token);
01821 column = TOKEN_COLUMN(token);
01822 EQ_LINE_NUM(eq_idx) = line;
01823 EQ_COLUMN_NUM(eq_idx) = column;
01824 items_in_list = items_in_list + 1;
01825
01826 if (attr_idx == NULL_IDX) {
01827 attr_idx = ntr_sym_tbl(&token, name_idx);
01828 LN_DEF_LOC(name_idx) = TRUE;
01829 SET_IMPL_TYPE(attr_idx);
01830 AT_OBJ_CLASS(attr_idx) = Data_Obj;
01831 ATD_CLASS(attr_idx) = Variable;
01832 }
01833 else if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
01834 AT_ATTR_LINK(attr_idx) = NULL_IDX;
01835 LN_DEF_LOC(name_idx) = TRUE;
01836 }
01837
01838 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
01839 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
01840 }
01841
01842 if ((cif_flags & XREF_RECS) != 0) {
01843 cif_usage_rec(attr_idx,
01844 AT_Tbl_Idx,
01845 line,
01846 column,
01847 CIF_Symbol_Declaration);
01848 }
01849
01850 if (group != eq_idx) {
01851 EQ_NEXT_EQUIV_OBJ(EQ_GRP_END_IDX(group)) = eq_idx;
01852 }
01853
01854 if (!fnd_attr || !fnd_semantic_err(Obj_Equiv,
01855 line,
01856 column,
01857 attr_idx,
01858 TRUE)) {
01859
01860 NTR_ATTR_LIST_TBL(al_idx);
01861
01862 AL_IDX_IS_EQ(al_idx) = TRUE;
01863 AL_NEXT_IDX(al_idx) = ATD_EQUIV_LIST(attr_idx);
01864 AL_EQ_IDX(al_idx) = eq_idx;
01865 ATD_CLASS(attr_idx) = Variable;
01866 ATD_EQUIV(attr_idx) = TRUE;
01867 ATD_EQUIV_LIST(attr_idx) = al_idx;
01868 ATD_DCL_EQUIV(attr_idx) = TRUE;
01869 }
01870 EQ_ATTR_IDX(eq_idx) = attr_idx;
01871 EQ_GRP_IDX(eq_idx) = group;
01872 EQ_GRP_END_IDX(group) = eq_idx;
01873
01874 if (LA_CH_VALUE == LPAREN) {
01875 expr_mode = Initialization_Expr;
01876 OPND_FLD(result_opnd) = AT_Tbl_Idx;
01877 OPND_IDX(result_opnd) = attr_idx;
01878 OPND_LINE_NUM(result_opnd) = TOKEN_LINE(token);
01879 OPND_COL_NUM(result_opnd) = TOKEN_COLUMN(token);
01880 substring = is_substring_ref();
01881 have_array = (ATD_ARRAY_IDX(attr_idx) != NULL_IDX);
01882
01883 if (have_array && substring) {
01884 PRINTMSG(TOKEN_LINE(token), 250,Error,TOKEN_COLUMN(token));
01885 }
01886
01887 if (!substring) {
01888 rank = 0;
01889 NTR_IR_TBL(subs_idx);
01890
01891
01892
01893 COPY_OPND(IR_OPND_L(subs_idx), result_opnd);
01894
01895
01896
01897 OPND_FLD(result_opnd) = IR_Tbl_Idx;
01898 OPND_IDX(result_opnd) = subs_idx;
01899
01900
01901 IR_LINE_NUM(subs_idx) = LA_CH_LINE;
01902 IR_COL_NUM(subs_idx) = LA_CH_COLUMN;
01903 IR_OPR(subs_idx) = Subscript_Opr;
01904 IR_FLD_R(subs_idx) = IL_Tbl_Idx;
01905 list_idx = NULL_IDX;
01906
01907 do {
01908 NEXT_LA_CH;
01909
01910 if (list_idx == NULL_IDX) {
01911 NTR_IR_LIST_TBL(list_idx);
01912 IR_IDX_R(subs_idx) = list_idx;
01913 }
01914 else {
01915 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01916 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) =
01917 list_idx;
01918 list_idx = IL_NEXT_LIST_IDX(list_idx);
01919 }
01920
01921 if (LA_CH_VALUE != COLON) {
01922 parsed_ok = parse_expr(&opnd) && parsed_ok;
01923 COPY_OPND(IL_OPND(list_idx), opnd);
01924 }
01925 rank++;
01926 }
01927 while (LA_CH_VALUE == COMMA);
01928
01929 if (! matched_specific_token(Tok_Punct_Rparen,
01930 Tok_Class_Punct)) {
01931 parse_err_flush(Find_EOS, ")");
01932 parsed_ok = FALSE;
01933 expr_mode = Regular_Expr;
01934 goto EXIT;
01935 }
01936
01937 IR_LIST_CNT_R(subs_idx) = rank;
01938
01939 }
01940
01941
01942
01943 if (LA_CH_VALUE == LPAREN && is_substring_ref()) {
01944 EQ_SUBSTRINGED(eq_idx) = TRUE;
01945 NTR_IR_TBL(substring_idx);
01946 IR_OPR(substring_idx) = Substring_Opr;
01947 IR_LINE_NUM(substring_idx) = LA_CH_LINE;
01948 IR_COL_NUM(substring_idx) = LA_CH_COLUMN;
01949
01950 COPY_OPND(IR_OPND_L(substring_idx), result_opnd);
01951
01952
01953
01954 OPND_FLD(result_opnd) = IR_Tbl_Idx;
01955 OPND_IDX(result_opnd) = substring_idx;
01956 IR_FLD_R(substring_idx) = IL_Tbl_Idx;
01957 IR_LIST_CNT_R(substring_idx) = 2;
01958 NTR_IR_LIST_TBL(list_idx);
01959 NTR_IR_LIST_TBL(list2_idx);
01960 IR_IDX_R(substring_idx) = list_idx;
01961 IL_NEXT_LIST_IDX(list_idx) = list2_idx;
01962 IL_PREV_LIST_IDX(list2_idx) = list_idx;
01963
01964 NEXT_LA_CH;
01965
01966 if (LA_CH_VALUE != COLON) {
01967 parsed_ok = parse_expr(&opnd) && parsed_ok;
01968 COPY_OPND(IL_OPND(list_idx), opnd);
01969 }
01970
01971 if (LA_CH_VALUE != COLON) {
01972
01973 if (parse_err_flush(Find_EOS, ":")) {
01974 NEXT_LA_CH;
01975 }
01976
01977 parsed_ok = FALSE;
01978 expr_mode = Regular_Expr;
01979 goto EXIT;
01980 }
01981
01982 NEXT_LA_CH;
01983
01984 if (LA_CH_VALUE != RPAREN) {
01985 parsed_ok = parse_expr(&opnd) && parsed_ok;
01986 COPY_OPND(IL_OPND(list2_idx), opnd);
01987 }
01988
01989 if (LA_CH_VALUE != RPAREN) {
01990
01991 if (parse_err_flush(Find_EOS, ")")) {
01992 NEXT_LA_CH;
01993 }
01994 parsed_ok = FALSE;
01995 expr_mode = Regular_Expr;
01996 goto EXIT;
01997 }
01998 NEXT_LA_CH;
01999 }
02000
02001 expr_mode = Regular_Expr;
02002 EQ_OPND_FLD(eq_idx) = OPND_FLD(result_opnd);
02003 EQ_OPND_IDX(eq_idx) = OPND_IDX(result_opnd);
02004 }
02005 NTR_EQ_TBL(eq_idx);
02006
02007 # ifdef _F_MINUS_MINUS
02008
02009 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran) {
02010 PRINTMSG(LA_CH_LINE, 1578, Error, LA_CH_COLUMN,
02011 AT_OBJ_NAME_PTR(attr_idx), "EQUIVALENCE");
02012
02013
02014
02015
02016 list2_idx = parse_pe_array_spec(attr_idx);
02017 }
02018 # endif
02019 }
02020 else {
02021 parse_err_flush(Find_Comma_Rparen, "equivalence-object");
02022 }
02023
02024 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != RPAREN) {
02025 parse_err_flush(Find_EOS, ", or )");
02026 goto EXIT;
02027 }
02028
02029 if (LA_CH_VALUE == COMMA) {
02030 NEXT_LA_CH;
02031 }
02032 else {
02033 break;
02034 }
02035
02036 }
02037 while (TRUE);
02038
02039 if (items_in_list < 2) {
02040 PRINTMSG(LA_CH_LINE, 137, Error, LA_CH_COLUMN);
02041 }
02042
02043 if (LA_CH_VALUE != RPAREN) {
02044 parse_err_flush(Find_EOS, ")");
02045 goto EXIT;
02046 }
02047 NEXT_LA_CH;
02048
02049 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
02050 parse_err_flush(Find_EOS, ", or " EOS_STR);
02051 goto EXIT;
02052 }
02053
02054 if (LA_CH_VALUE == COMMA) {
02055 NEXT_LA_CH;
02056 }
02057 }
02058
02059 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Equivalence_Stmt) ||
02060 STMT_CANT_BE_IN_BLK(Equivalence_Stmt, CURR_BLK)) &&
02061 iss_blk_stk_err()) {
02062
02063 }
02064 else {
02065 curr_stmt_category = Declaration_Stmt_Cat;
02066 }
02067 }
02068 else {
02069 parse_err_flush(Find_EOS, "(");
02070 goto EXIT;
02071 }
02072
02073 if (LA_CH_VALUE != EOS) {
02074 parse_err_flush(Find_EOS, EOS_STR);
02075 }
02076
02077 EXIT:
02078
02079 NEXT_LA_CH;
02080
02081 TRACE (Func_Exit, "parse_equivalence_stmt", NULL);
02082
02083 return;
02084
02085 }
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112 void parse_implicit_stmt (void)
02113
02114 {
02115 int al_idx;
02116 int attr_idx;
02117 boolean end_found = FALSE;
02118 int end_idx;
02119 int err_idx;
02120 char err_str[80];
02121 boolean found_type;
02122 boolean have_kind;
02123 int idx;
02124 boolean implicit_undefined;
02125 int name_idx;
02126 char start_char;
02127 int start_idx;
02128 int stmt_number;
02129 int storage;
02130 boolean type_err;
02131 #ifdef KEY
02132 int type_idx = 0;
02133 #else
02134 int type_idx;
02135 #endif
02136
02137
02138 TRACE (Func_Entry, "parse_implicit_stmt", NULL);
02139
02140 stmt_number = statement_number;
02141 implicit_undefined = FALSE;
02142
02143 if (LA_CH_VALUE == 'U' &&
02144 matched_specific_token(Tok_Kwd_Undefined, Tok_Class_Keyword)) {
02145 implicit_undefined = TRUE;
02146 PRINTMSG(stmt_start_line, 1253, Ansi, stmt_start_col,
02147 "IMPLICIT UNDEFINED");
02148 }
02149
02150 if (implicit_undefined ||
02151 (LA_CH_VALUE == 'N' &&
02152 matched_specific_token(Tok_Kwd_None, Tok_Class_Keyword))) {
02153
02154 if (LA_CH_VALUE == EOS) {
02155 stmt_type = Implicit_None_Stmt;
02156 SH_STMT_TYPE(curr_stmt_sh_idx) = Implicit_None_Stmt;
02157
02158 if (cif_flags & MISC_RECS) {
02159 cif_stmt_type_rec(TRUE, CIF_Implicit_None_Stmt, stmt_number);
02160 }
02161
02162 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Implicit_None_Stmt) ||
02163 STMT_CANT_BE_IN_BLK(Implicit_None_Stmt, CURR_BLK)) &&
02164 iss_blk_stk_err()) {
02165
02166 }
02167 else {
02168 curr_stmt_category = Implicit_None_Stmt_Cat;
02169 }
02170
02171 if (SCP_IMPL_NONE(curr_scp_idx)) {
02172 PRINTMSG(stmt_start_line, 298, Error, stmt_start_col);
02173 }
02174
02175 SCP_IMPL_NONE(curr_scp_idx) = TRUE;
02176 }
02177 else {
02178 parse_err_flush(Find_EOS, EOS_STR);
02179 }
02180
02181 goto EXIT;
02182 }
02183
02184 if (cif_flags & MISC_RECS) {
02185 cif_stmt_type_rec(TRUE, CIF_Implicit_Stmt, stmt_number);
02186 }
02187
02188 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Implicit_Stmt) ||
02189 STMT_CANT_BE_IN_BLK(Implicit_Stmt, CURR_BLK)) &&
02190 iss_blk_stk_err()) {
02191
02192 }
02193 else {
02194 curr_stmt_category = Implicit_Stmt_Cat;
02195 }
02196
02197 found_type = FALSE;
02198
02199 do {
02200
02201 if (!MATCHED_TOKEN_CLASS (Tok_Class_Keyword)) {
02202
02203
02204
02205
02206
02207 if (!parse_err_flush(Find_Comma, "INTEGER, REAL, DOUBLE, COMPLEX,"
02208 " LOGICAL, CHARACTER or TYPE")) {
02209 goto EXIT;
02210 }
02211 NEXT_LA_CH;
02212 continue;
02213 }
02214
02215 if (TOKEN_VALUE(token) == Tok_Kwd_Automatic) {
02216 storage = Impl_Automatic_Storage;
02217 }
02218 else if (TOKEN_VALUE(token) == Tok_Kwd_Static) {
02219 storage = Impl_Static_Storage;
02220 }
02221 else {
02222 storage = Impl_Default_Storage;
02223
02224 found_type = TRUE;
02225
02226
02227
02228
02229
02230 have_kind = (LA_CH_VALUE == LPAREN &&
02231 TOKEN_VALUE(token) != Tok_Kwd_Type &&
02232 ch_after_paren_grp() == LPAREN);
02233
02234 type_err = !parse_type_spec(have_kind);
02235 type_idx = ATD_TYPE_IDX(AT_WORK_IDX);
02236
02237 if (type_err) {
02238
02239 if (!parse_err_flush(Find_Comma, NULL)) {
02240 goto EXIT;
02241 }
02242 NEXT_LA_CH;
02243 continue;
02244 }
02245
02246 if (TYP_TYPE(type_idx) == Character &&
02247 TYP_CHAR_CLASS(type_idx) == Assumed_Size_Char) {
02248
02249
02250
02251 PRINTMSG(TOKEN_LINE(token), 32, Error, TOKEN_COLUMN(token));
02252
02253 if (!parse_err_flush(Find_Comma, NULL)) {
02254 goto EXIT;
02255 }
02256 NEXT_LA_CH;
02257 continue;
02258 }
02259 }
02260
02261 if (LA_CH_VALUE != LPAREN) {
02262
02263 if (!parse_err_flush(Find_Comma, "(")) {
02264 goto EXIT;
02265 }
02266 NEXT_LA_CH;
02267 continue;
02268 }
02269
02270 do {
02271 NEXT_LA_CH;
02272
02273 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
02274 parse_err_flush(Find_Comma_Rparen,
02275 "A,B,C,D,E,F,G,H,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y or Z");
02276 continue;
02277 }
02278
02279 if (TOKEN_LEN(token) > 1) {
02280 PRINTMSG(TOKEN_LINE(token), 197, Error, TOKEN_COLUMN(token),
02281 "A,B,C,D,E,F,G,H,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y or Z",
02282 TOKEN_STR(token));
02283 parse_err_flush(Find_Comma_Rparen, NULL);
02284 continue;
02285 }
02286
02287 start_char = TOKEN_STR(token)[0];
02288 start_idx = IMPL_IDX(start_char);
02289 end_idx = start_idx;
02290
02291 if (LA_CH_VALUE == DASH) {
02292 NEXT_LA_CH;
02293
02294 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
02295 parse_err_flush(Find_Comma_Rparen,
02296 "A,B,C,D,E,F,G,H,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y or Z");
02297 continue;
02298 }
02299
02300 if (TOKEN_LEN(token) > 1) {
02301 PRINTMSG(TOKEN_LINE(token), 197, Error,TOKEN_COLUMN(token),
02302 "B,C,D,E,F,G,H,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y or Z",
02303 TOKEN_STR(token));
02304 parse_err_flush(Find_Comma_Rparen, NULL);
02305 continue;
02306 }
02307 end_idx = IMPL_IDX(TOKEN_STR(token)[0]);
02308
02309 if (start_idx > end_idx) {
02310 PRINTMSG(TOKEN_LINE(token), 175, Error,TOKEN_COLUMN(token),
02311 start_char, TOKEN_STR(token)[0]);
02312 }
02313 }
02314
02315 err_idx = NULL_IDX;
02316
02317 if (storage == Impl_Default_Storage) {
02318
02319 for (idx = start_idx; idx <= end_idx; idx++) {
02320
02321 if (IM_SET(curr_scp_idx, idx)) {
02322 err_str[err_idx++] = COMMA;
02323 err_str[err_idx++] = ' ';
02324 err_str[err_idx++] = idx + 'A';
02325 }
02326 else {
02327 IM_SET(curr_scp_idx, idx) = TRUE;
02328 IM_TYPE_IDX(curr_scp_idx, idx) = type_idx;
02329 }
02330 }
02331
02332 if (err_idx != NULL_IDX) {
02333 err_str[err_idx] = EOS;
02334 PRINTMSG(TOKEN_LINE(token), 1629, Error, TOKEN_COLUMN(token),
02335 "type",
02336 &err_str[2]);
02337 }
02338 }
02339 else {
02340 for (idx = start_idx; idx <= end_idx; idx++) {
02341
02342 if (IM_STORAGE(curr_scp_idx, idx) != Impl_Default_Storage) {
02343 err_str[err_idx++] = COMMA;
02344 err_str[err_idx++] = ' ';
02345 err_str[err_idx++] = idx + 'A';
02346 }
02347 else {
02348 IM_STORAGE(curr_scp_idx, idx) = storage;
02349 }
02350 }
02351
02352 if (err_idx != NULL_IDX) {
02353 err_str[err_idx] = EOS;
02354 PRINTMSG(TOKEN_LINE(token), 1629, Error, TOKEN_COLUMN(token),
02355 "storage",
02356 &err_str[2]);
02357 }
02358 }
02359
02360 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != RPAREN) {
02361 parse_err_flush(Find_Comma_Rparen, ", or )");
02362 }
02363
02364 }
02365 while (LA_CH_VALUE == COMMA);
02366
02367 if (LA_CH_VALUE == RPAREN) {
02368 NEXT_LA_CH;
02369 }
02370
02371 if (LA_CH_VALUE == EOS || (LA_CH_VALUE != COMMA &&
02372 !parse_err_flush(Find_Comma, ", or " EOS_STR))){
02373 end_found = TRUE;
02374 }
02375 else {
02376 NEXT_LA_CH;
02377 }
02378 }
02379 while (!end_found);
02380
02381 if (SCP_IMPL_NONE(curr_scp_idx) && found_type) {
02382
02383
02384
02385 PRINTMSG (stmt_start_line, 176, Error, stmt_start_col);
02386 parse_err_flush(Find_EOS, NULL);
02387 goto EXIT;
02388 }
02389
02390 for (name_idx = SCP_LN_FW_IDX(curr_scp_idx) + 1;
02391 name_idx < SCP_LN_LW_IDX(curr_scp_idx); name_idx++) {
02392
02393 attr_idx = LN_ATTR_IDX(name_idx);
02394
02395 if (AT_ATTR_LINK(attr_idx) == NULL_IDX && !AT_USE_ASSOCIATED(attr_idx)) {
02396 retype_attr(attr_idx);
02397 }
02398 }
02399
02400 al_idx = SCP_ATTR_LIST(curr_scp_idx);
02401
02402 while (al_idx != NULL_IDX) {
02403
02404 if (AT_ATTR_LINK(AL_ATTR_IDX(al_idx)) == NULL_IDX &&
02405 !AT_USE_ASSOCIATED(AL_ATTR_IDX(al_idx))) {
02406 retype_attr(AL_ATTR_IDX(al_idx));
02407 }
02408 al_idx = AL_NEXT_IDX(al_idx);
02409 }
02410
02411 EXIT:
02412
02413 NEXT_LA_CH;
02414
02415 TRACE (Func_Exit, "parse_implicit_stmt", NULL);
02416
02417 return;
02418
02419 }
02420
02421
02422
02423
02424
02425
02426
02427
02428
02429
02430
02431
02432
02433
02434
02435
02436 static void retype_attr(int attr_idx)
02437
02438 {
02439 int old_type_idx;
02440
02441
02442 TRACE (Func_Entry, "retype_attr", NULL);
02443
02444
02445
02446
02447 switch (AT_OBJ_CLASS(attr_idx)) {
02448
02449 case Data_Obj:
02450
02451 if (!AT_TYPED(attr_idx) && !ATD_SYMBOLIC_CONSTANT(attr_idx)) {
02452
02453 if (ATD_CLASS(attr_idx) == Constant) {
02454 old_type_idx = ATD_TYPE_IDX(attr_idx);
02455 SET_IMPL_TYPE(attr_idx);
02456
02457 if (old_type_idx != ATD_TYPE_IDX(attr_idx)) {
02458 PRINTMSG(AT_DEF_LINE(attr_idx), 238, Error,
02459 AT_DEF_COLUMN(attr_idx),
02460 AT_OBJ_NAME_PTR(attr_idx),
02461 get_basic_type_str(old_type_idx));
02462 ATD_TYPE_IDX(attr_idx) = old_type_idx;
02463 }
02464 }
02465 else if (ATD_CLASS(attr_idx) != Compiler_Tmp) {
02466
02467 if (AT_REFERENCED(attr_idx) > Not_Referenced) {
02468 old_type_idx = ATD_TYPE_IDX(attr_idx);
02469 SET_IMPL_TYPE(attr_idx);
02470
02471 if (old_type_idx != ATD_TYPE_IDX(attr_idx)) {
02472 ATD_TYPE_IDX(attr_idx) = old_type_idx;
02473 AT_DCL_ERR(attr_idx) = TRUE;
02474 PRINTMSG(AT_DEF_LINE(attr_idx), 827, Error,
02475 AT_DEF_COLUMN(attr_idx),
02476 AT_OBJ_NAME_PTR(attr_idx),
02477 get_basic_type_str(old_type_idx));
02478 }
02479 }
02480 else {
02481 SET_IMPL_TYPE(attr_idx);
02482 }
02483 }
02484 }
02485 break;
02486
02487 case Pgm_Unit:
02488
02489 if (ATP_PGM_UNIT(attr_idx) == Function &&
02490 !ATP_RSLT_NAME(attr_idx) &&
02491 !AT_TYPED(ATP_RSLT_IDX(attr_idx))) {
02492 SET_IMPL_TYPE(ATP_RSLT_IDX(attr_idx));
02493 }
02494 break;
02495
02496 default:
02497 break;
02498
02499 }
02500
02501 TRACE (Func_Exit, "retype_attr", NULL);
02502
02503 return;
02504
02505 }
02506
02507
02508
02509
02510
02511
02512
02513
02514
02515
02516
02517
02518
02519
02520
02521
02522
02523
02524
02525
02526
02527
02528
02529
02530 void parse_interface_stmt (void)
02531
02532 {
02533 int attr_idx = NULL_IDX;
02534 id_str_type name;
02535 int stmt_number;
02536
02537
02538 TRACE (Func_Entry, "parse_interface_stmt", NULL);
02539
02540 stmt_number = statement_number;
02541
02542 if (LA_CH_VALUE != EOS) {
02543
02544 if (parse_generic_spec()) {
02545 attr_idx = generic_spec_semantics();
02546
02547
02548
02549
02550
02551 AT_MODULE_IDX(attr_idx) = NULL_IDX;
02552
02553
02554
02555 if (LA_CH_VALUE != EOS) {
02556 parse_err_flush(Find_EOS, EOS_STR);
02557 }
02558 else {
02559
02560 if ((cif_flags & MISC_RECS) && attr_idx != NULL_IDX) {
02561
02562 if (TOKEN_VALUE(token) == Tok_Id) {
02563 cif_stmt_type_rec(TRUE,
02564 CIF_Interface_Generic_Stmt,
02565 stmt_number);
02566 }
02567 else if (TOKEN_VALUE(token) == Tok_Op_Assign) {
02568 cif_stmt_type_rec(TRUE,
02569 CIF_Interface_Assignment_Stmt,
02570 stmt_number);
02571 }
02572 else {
02573 cif_stmt_type_rec(TRUE,
02574 CIF_Interface_Operator_Stmt,
02575 stmt_number);
02576 }
02577 }
02578 }
02579 }
02580 else {
02581 CREATE_ID(name, "unnamed interface", 17);
02582 attr_idx = ntr_local_attr_list(name.string,
02583 17,
02584 TOKEN_LINE(token),
02585 TOKEN_COLUMN(token));
02586 AT_OBJ_CLASS(attr_idx) = Interface;
02587 ATI_UNNAMED_INTERFACE(attr_idx) = TRUE;
02588 AT_DCL_ERR(attr_idx) = TRUE;
02589 parse_err_flush(Find_EOS, NULL);
02590 }
02591 }
02592 else {
02593
02594
02595
02596
02597 CREATE_ID(name, "unnamed interface", 17);
02598 attr_idx = ntr_local_attr_list(name.string,
02599 17,
02600 TOKEN_LINE(token),
02601 TOKEN_COLUMN(token));
02602 AT_OBJ_CLASS(attr_idx) = Interface;
02603 ATI_UNNAMED_INTERFACE(attr_idx) = TRUE;
02604
02605 if (cif_flags & MISC_RECS) {
02606 cif_stmt_type_rec(TRUE, CIF_Interface_Explicit_Stmt, stmt_number);
02607 }
02608 }
02609
02610 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Interface_Stmt) ||
02611 STMT_CANT_BE_IN_BLK(Interface_Stmt, CURR_BLK)) &&
02612 iss_blk_stk_err()) {
02613 PUSH_BLK_STK(Interface_Blk);
02614 CURR_BLK_ERR = TRUE;
02615 }
02616 else {
02617 PUSH_BLK_STK(Interface_Blk);
02618 curr_stmt_category = Sub_Func_Stmt_Cat;
02619 }
02620
02621 CURR_BLK_NO_EXEC = TRUE;
02622
02623
02624
02625
02626
02627 if (attr_idx != NULL_IDX && ATI_UNNAMED_INTERFACE(attr_idx)) {
02628 BLK_UNNAMED_INTERFACE(blk_stk_idx) = attr_idx;
02629 attr_idx = NULL_IDX;
02630 }
02631
02632 CURR_BLK_NAME = attr_idx;
02633 NEXT_LA_CH;
02634
02635 if (cif_flags & BASIC_RECS) {
02636 cif_begin_scope_rec();
02637
02638 if (attr_idx != NULL_IDX) {
02639 ATI_CIF_SCOPE_ID(attr_idx) = BLK_CIF_SCOPE_ID(blk_stk_idx);
02640 }
02641 else if (BLK_UNNAMED_INTERFACE(blk_stk_idx) != NULL_IDX) {
02642 ATI_CIF_SCOPE_ID(BLK_UNNAMED_INTERFACE(blk_stk_idx)) =
02643 BLK_CIF_SCOPE_ID(blk_stk_idx);
02644 }
02645 }
02646
02647 TRACE (Func_Exit, "parse_interface_stmt", NULL);
02648
02649 return;
02650
02651 }
02652
02653
02654 #ifdef KEY
02655
02656
02657
02658
02659 void
02660 parse_enum_stmt() {
02661 TRACE (Func_Entry, "parse_enum_stmt", NULL);
02662
02663 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Enum_Stmt) ||
02664 STMT_CANT_BE_IN_BLK(Enum_Stmt, CURR_BLK)) &&
02665 iss_blk_stk_err()) {
02666 PUSH_BLK_STK(Enum_Blk);
02667 CURR_BLK_ERR = TRUE;
02668 }
02669 else {
02670 PUSH_BLK_STK(Enum_Blk);
02671 }
02672 curr_stmt_category = Declaration_Stmt_Cat;
02673
02674 CURR_BLK_NO_EXEC = TRUE;
02675
02676 BLK_ENUM_EMPTY(blk_stk_idx) = TRUE;
02677 BLK_ENUM_COUNTER(blk_stk_idx) = 0;
02678
02679 if (LA_CH_VALUE != COMMA) {
02680 parse_err_flush(Find_EOS, ",");
02681 return;
02682 }
02683 NEXT_LA_CH;
02684
02685 if (!matched_specific_token(Tok_Kwd_Bind, Tok_Class_Keyword)) {
02686 parse_err_flush(Find_EOS, "BIND");
02687 return;
02688 }
02689 parse_language_binding_spec(0);
02690
02691 if (LA_CH_VALUE != EOS) {
02692 parse_err_flush(Find_EOS, EOS_STR);
02693 }
02694 NEXT_LA_CH;
02695
02696 TRACE (Func_Exit, "parse_enum_stmt", NULL);
02697
02698 }
02699
02700
02701
02702
02703
02704 void
02705 parse_enumerator_stmt() {
02706 TRACE (Func_Entry, "parse_enumerator_stmt", NULL);
02707
02708 PRINTMSG(TOKEN_LINE(token), 1685, Ansi, TOKEN_COLUMN(token), "ENUM");
02709
02710 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Enumerator_Stmt) ||
02711 STMT_CANT_BE_IN_BLK(Enumerator_Stmt, CURR_BLK)) &&
02712 iss_blk_stk_err()) {
02713 PUSH_BLK_STK(Enum_Blk);
02714 CURR_BLK_ERR = TRUE;
02715 CURR_BLK_NO_EXEC = TRUE;
02716 }
02717
02718 BLK_ENUM_EMPTY(blk_stk_idx) = FALSE;
02719
02720
02721 matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
02722
02723 for (;;) {
02724 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
02725 parse_err_flush(Find_Comma_Rparen, "named-constant");
02726 if (LA_CH_VALUE == EOS) {
02727 break;
02728 }
02729 continue;
02730 }
02731 int line = TOKEN_LINE(token);
02732 int column = TOKEN_COLUMN(token);
02733 int name_idx;
02734 int attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
02735 if (attr_idx != NULL_IDX) {
02736 char *ptr2 = get_basic_type_str(ATD_TYPE_IDX(attr_idx));
02737 PRINTMSG(line, 550, Error, column, AT_OBJ_NAME_PTR(attr_idx), ptr2,
02738 "ENUMERATOR", AT_DEF_LINE(attr_idx));
02739 }
02740 attr_idx = ntr_sym_tbl(&token, name_idx);
02741 LN_DEF_LOC(name_idx) = TRUE;
02742 ATD_TYPE_IDX(attr_idx) = INTEGER_DEFAULT_TYPE;
02743 AT_TYPED(attr_idx) = TRUE;
02744 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
02745 boolean have_value = TRUE;
02746
02747 opnd_type opnd;
02748 int const_line = line;
02749 int const_column = column;
02750
02751 if (LA_CH_VALUE == EQUAL) {
02752 have_value = FALSE;
02753 NEXT_LA_CH;
02754
02755 const_line = LA_CH_LINE;
02756 const_column = LA_CH_COLUMN;
02757
02758 long kind_idx;
02759 fld_type field_type;
02760 if (parse_int_spec_expr(&kind_idx, &field_type, TRUE, FALSE)) {
02761 OPND_FLD(opnd) = field_type;
02762 OPND_IDX(opnd) = kind_idx;
02763
02764 BLK_ENUM_COUNTER(blk_stk_idx) =
02765 * (long *) &CN_CONST(OPND_IDX(opnd));
02766 }
02767 else {
02768
02769 AT_DCL_ERR(attr_idx) = TRUE;
02770 }
02771 }
02772 else {
02773
02774 long temp = BLK_ENUM_COUNTER(blk_stk_idx);
02775 OPND_FLD(opnd) = CN_Tbl_Idx;
02776 OPND_IDX(opnd) = ntr_const_tbl(ATD_TYPE_IDX(attr_idx), FALSE, &temp);
02777 }
02778 BLK_ENUM_COUNTER(blk_stk_idx) += 1;
02779 OPND_LINE_NUM(opnd) = const_line;
02780 OPND_COL_NUM(opnd) = const_column;
02781
02782 expr_arg_type exp_desc;
02783 exp_desc.rank = 0;
02784 if ((!AT_DCL_ERR(attr_idx)) && expr_semantics(&opnd, &exp_desc)) {
02785 merge_parameter(FALSE, attr_idx, line, column, &opnd, &exp_desc,
02786 const_line, const_column);
02787 if ((cif_flags & XREF_RECS) != 0) {
02788 cif_usage_rec(attr_idx, AT_Tbl_Idx, line, column,
02789 CIF_Symbol_Declaration);
02790 }
02791 }
02792
02793 if (LA_CH_VALUE != COMMA) {
02794 break;
02795 }
02796 NEXT_LA_CH;
02797 }
02798
02799 if (LA_CH_VALUE != EOS) {
02800 parse_err_flush(Find_EOS, EOS_STR);
02801 }
02802
02803 NEXT_LA_CH;
02804
02805 TRACE (Func_Exit, "parse_enumerator_stmt", NULL);
02806
02807 }
02808 #endif
02809
02810
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824
02825
02826
02827
02828 void parse_namelist_stmt (void)
02829
02830 {
02831 int attr_idx;
02832 boolean end_grp_list =FALSE;
02833 int grp_attr;
02834 int host_attr_idx;
02835 int host_name_idx;
02836 int name_idx;
02837 int sn_idx;
02838
02839
02840 TRACE (Func_Entry, "parse_namelist_stmt", NULL);
02841
02842 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Namelist_Stmt) ||
02843 STMT_CANT_BE_IN_BLK(Namelist_Stmt, CURR_BLK)) && iss_blk_stk_err()) {
02844
02845 }
02846 else if (curr_stmt_category < Declaration_Stmt_Cat) {
02847 curr_stmt_category = Declaration_Stmt_Cat;
02848 }
02849 else if (curr_stmt_category == Executable_Stmt_Cat) {
02850 PRINTMSG(stmt_start_line, 265, Ansi, stmt_start_col);
02851 }
02852
02853 if (LA_CH_VALUE != SLASH) {
02854 parse_err_flush (Find_EOS,"/");
02855 }
02856
02857
02858 while (LA_CH_VALUE == SLASH) {
02859 NEXT_LA_CH;
02860
02861 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
02862 parse_err_flush (Find_EOS, "namelist-group-name");
02863 goto EXIT;
02864 }
02865
02866
02867
02868
02869 grp_attr = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
02870
02871 if (grp_attr == NULL_IDX) {
02872 grp_attr = ntr_sym_tbl(&token, name_idx);
02873 LN_DEF_LOC(name_idx) = TRUE;
02874 AT_OBJ_CLASS(grp_attr) = Namelist_Grp;
02875 }
02876 else if (!fnd_semantic_err(Obj_Namelist_Grp,
02877 TOKEN_LINE(token),
02878 TOKEN_COLUMN(token),
02879 grp_attr,
02880 TRUE)) {
02881
02882 if (AT_REFERENCED(grp_attr) == Referenced) {
02883 PRINTMSG(TOKEN_LINE(token), 39, Error, TOKEN_COLUMN(token),
02884 AT_OBJ_NAME_PTR(grp_attr));
02885 }
02886
02887 AT_OBJ_CLASS(grp_attr) = Namelist_Grp;
02888 }
02889 else {
02890 parse_err_flush(Find_EOS, NULL);
02891 goto EXIT;
02892 }
02893
02894 if ((cif_flags & XREF_RECS) != 0) {
02895 cif_usage_rec(grp_attr,
02896 AT_Tbl_Idx,
02897 TOKEN_LINE(token),
02898 TOKEN_COLUMN(token),
02899 CIF_Symbol_Declaration);
02900 }
02901
02902 if (LA_CH_VALUE != SLASH) {
02903 parse_err_flush (Find_EOS, "/");
02904 goto EXIT;
02905 }
02906
02907
02908 NEXT_LA_CH;
02909
02910 while (!end_grp_list) {
02911
02912 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
02913 parse_err_flush(Find_EOS, "namelist-group-object");
02914 AT_DCL_ERR(grp_attr) = TRUE;
02915 goto EXIT;
02916 }
02917
02918 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
02919 &name_idx);
02920
02921 if (attr_idx == NULL_IDX) {
02922 host_attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
02923 TOKEN_LEN(token),
02924 &host_name_idx,
02925 FALSE);
02926
02927
02928
02929
02930 if (host_attr_idx != NULL_IDX) {
02931 attr_idx = ntr_host_in_sym_tbl(&token, name_idx,
02932 host_attr_idx, host_name_idx,
02933 TRUE);
02934 }
02935 else {
02936 attr_idx = ntr_sym_tbl(&token, name_idx);
02937 SET_IMPL_TYPE(attr_idx);
02938 }
02939 }
02940
02941 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
02942 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
02943 }
02944
02945
02946 if ((cif_flags & XREF_RECS) != 0) {
02947 cif_usage_rec(attr_idx,
02948 AT_Tbl_Idx,
02949 TOKEN_LINE(token),
02950 TOKEN_COLUMN(token),
02951 CIF_Symbol_Declaration);
02952 }
02953
02954 AT_NAMELIST_OBJ(attr_idx) = TRUE;
02955
02956 NTR_SN_TBL(sn_idx);
02957
02958 SN_ATTR_IDX(sn_idx) = attr_idx;
02959 SN_NAME_LEN(sn_idx) = AT_NAME_LEN(attr_idx);
02960 SN_NAME_IDX(sn_idx) = AT_NAME_IDX(attr_idx);
02961 SN_LINE_NUM(sn_idx) = TOKEN_LINE(token);
02962 SN_COLUMN_NUM(sn_idx) = TOKEN_COLUMN(token);
02963
02964 if (ATN_FIRST_NAMELIST_IDX(grp_attr) == NULL_IDX) {
02965 ATN_FIRST_NAMELIST_IDX(grp_attr) = sn_idx;
02966 }
02967 else {
02968 SN_SIBLING_LINK(ATN_LAST_NAMELIST_IDX(grp_attr)) = sn_idx;
02969 }
02970
02971 ATN_LAST_NAMELIST_IDX(grp_attr) = sn_idx;
02972 ATN_NUM_NAMELIST(grp_attr) += 1;
02973
02974 if (LA_CH_VALUE != COMMA &&
02975 LA_CH_VALUE != SLASH &&
02976 LA_CH_VALUE != EOS) {
02977 parse_err_flush(Find_EOS, "/ or, or " EOS_STR);
02978 AT_DCL_ERR(grp_attr) = TRUE;
02979 goto EXIT;
02980 }
02981
02982
02983
02984 if (LA_CH_VALUE == COMMA) {
02985 NEXT_LA_CH;
02986
02987 if (LA_CH_VALUE == SLASH) {
02988
02989 end_grp_list = TRUE;
02990 }
02991 }
02992 else {
02993 end_grp_list = TRUE;
02994 }
02995 }
02996
02997 end_grp_list = FALSE;
02998 }
02999
03000 EXIT:
03001
03002 if (LA_CH_VALUE != EOS) {
03003 parse_err_flush(Find_EOS, EOS_STR);
03004 }
03005
03006 NEXT_LA_CH;
03007
03008 TRACE (Func_Exit, "parse_namelist_stmt", NULL);
03009
03010 return;
03011
03012 }
03013
03014
03015
03016
03017
03018
03019
03020
03021
03022
03023
03024
03025
03026
03027
03028
03029
03030 void parse_parameter_stmt (void)
03031
03032 {
03033 int attr_idx;
03034 int column;
03035 int const_column;
03036 int const_line;
03037 expr_arg_type exp_desc;
03038 boolean fnd_attr;
03039 opnd_type init_opnd;
03040 int line;
03041 int name_idx;
03042
03043
03044 TRACE (Func_Entry, "parse_parameter_stmt", NULL);
03045
03046
03047
03048
03049
03050
03051
03052 if (LA_CH_VALUE != LPAREN) {
03053 parse_err_flush(Find_EOS, "(");
03054 goto EXIT;
03055 }
03056
03057 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Parameter_Stmt) ||
03058 STMT_CANT_BE_IN_BLK(Parameter_Stmt,CURR_BLK)) && iss_blk_stk_err()) {
03059
03060 }
03061 else if (curr_stmt_category <= Implicit_Stmt_Cat) {
03062 curr_stmt_category = Implicit_Stmt_Cat;
03063 }
03064 else {
03065 curr_stmt_category = Declaration_Stmt_Cat;
03066 }
03067
03068 do {
03069 NEXT_LA_CH;
03070
03071 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
03072 parse_err_flush(Find_Comma_Rparen, "named-constant");
03073 continue;
03074 }
03075
03076 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
03077 fnd_attr = attr_idx;
03078 line = TOKEN_LINE(token);
03079 column = TOKEN_COLUMN(token);
03080
03081 if (attr_idx == NULL_IDX) {
03082 attr_idx = ntr_sym_tbl(&token, name_idx);
03083 LN_DEF_LOC(name_idx) = TRUE;
03084 SET_IMPL_TYPE(attr_idx);
03085 }
03086 else if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
03087 AT_ATTR_LINK(attr_idx) = NULL_IDX;
03088 LN_DEF_LOC(name_idx) = TRUE;
03089 }
03090
03091 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
03092 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
03093 }
03094
03095 if (LA_CH_VALUE != EQUAL) {
03096 parse_err_flush(Find_Comma_Rparen, "=");
03097 continue;
03098 }
03099
03100 NEXT_LA_CH;
03101 const_line = LA_CH_LINE;
03102 const_column = LA_CH_COLUMN;
03103
03104 if (parse_expr(&init_opnd)) {
03105 exp_desc.rank = 0;
03106 expr_mode = Initialization_Expr;
03107 xref_state = CIF_Symbol_Reference;
03108
03109 if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
03110 TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Character &&
03111 TYP_CHAR_CLASS(ATD_TYPE_IDX(attr_idx)) == Unknown_Char) {
03112
03113 char_bounds_resolution(attr_idx,
03114 &fnd_attr);
03115 }
03116
03117 if (AT_OBJ_CLASS(attr_idx) == Data_Obj && ATD_ARRAY_IDX(attr_idx)) {
03118 array_bounds_resolution(attr_idx, &fnd_attr);
03119 }
03120
03121 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
03122
03123 if (ATD_ARRAY_IDX(attr_idx)) {
03124 target_array_idx = ATD_ARRAY_IDX(attr_idx);
03125 }
03126
03127 switch (TYP_TYPE(ATD_TYPE_IDX(attr_idx))) {
03128 case Integer:
03129 case Real:
03130 case Complex:
03131 check_type_conversion = TRUE;
03132 target_type_idx = ATD_TYPE_IDX(attr_idx);
03133 break;
03134
03135 case Character:
03136
03137 if (TYP_CHAR_CLASS(ATD_TYPE_IDX(attr_idx)) == Const_Len_Char) {
03138 check_type_conversion = TRUE;
03139 target_type_idx = Character_1;
03140 target_char_len_idx = TYP_IDX(ATD_TYPE_IDX(attr_idx));
03141 }
03142 break;
03143 }
03144 }
03145
03146
03147
03148
03149
03150 comp_gen_expr = TRUE;
03151
03152 if (expr_semantics(&init_opnd, &exp_desc)) {
03153 check_type_conversion = FALSE;
03154 target_array_idx = NULL_IDX;
03155 expr_mode = Regular_Expr;
03156 merge_parameter(fnd_attr,
03157 attr_idx,
03158 line,
03159 column,
03160 &init_opnd,
03161 &exp_desc,
03162 const_line,
03163 const_column);
03164
03165 if ((cif_flags & XREF_RECS) != 0) {
03166 cif_usage_rec(attr_idx,
03167 AT_Tbl_Idx,
03168 line,
03169 column,
03170 CIF_Symbol_Declaration);
03171 }
03172 }
03173 else {
03174 check_type_conversion = FALSE;
03175 target_array_idx = NULL_IDX;
03176 expr_mode = Regular_Expr;
03177 AT_DCL_ERR(attr_idx) = TRUE;
03178 }
03179
03180
03181 comp_gen_expr = FALSE;
03182 }
03183 else {
03184
03185 AT_DCL_ERR(attr_idx) = TRUE;
03186 }
03187
03188 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != RPAREN) {
03189 parse_err_flush(Find_Comma_Rparen, ", or )");
03190 }
03191 }
03192 while (LA_CH_VALUE == COMMA);
03193
03194 if (LA_CH_VALUE == RPAREN) {
03195 NEXT_LA_CH;
03196 }
03197
03198 EXIT:
03199
03200 NEXT_LA_CH;
03201
03202 TRACE (Func_Exit, "parse_parameter_stmt", NULL);
03203
03204 return;
03205
03206 }
03207
03208
03209
03210
03211
03212
03213
03214
03215
03216
03217
03218
03219
03220
03221
03222
03223
03224 void parse_sequence_stmt (void)
03225
03226 {
03227 TRACE (Func_Entry, "parse_sequence_stmt", NULL);
03228
03229 if (CURR_BLK == Derived_Type_Blk) {
03230
03231 if (LA_CH_VALUE == EOS) {
03232
03233 if (ATT_SEQUENCE_SET(CURR_BLK_NAME)) {
03234 PRINTMSG (TOKEN_LINE(token), 41, Error,
03235 TOKEN_COLUMN(token), "SEQUENCE",
03236 AT_OBJ_NAME_PTR(CURR_BLK_NAME));
03237 }
03238
03239 if (ATT_FIRST_CPNT_IDX(CURR_BLK_NAME) != NULL_IDX) {
03240 PRINTMSG(TOKEN_LINE(token), 8, Error, TOKEN_COLUMN(token),
03241 "SEQUENCE", AT_OBJ_NAME_PTR(CURR_BLK_NAME));
03242 }
03243
03244 ATT_SEQUENCE_SET(CURR_BLK_NAME) = TRUE;
03245 }
03246 else {
03247 parse_err_flush(Find_EOS, EOS_STR);
03248 }
03249 }
03250 else {
03251 parse_err_flush(Find_EOS, NULL);
03252 iss_blk_stk_err();
03253 }
03254
03255 NEXT_LA_CH;
03256
03257 TRACE (Func_Exit, "parse_sequence_stmt", NULL);
03258
03259 return;
03260
03261 }
03262
03263
03264
03265
03266
03267
03268
03269
03270
03271
03272
03273
03274
03275
03276
03277
03278
03279
03280
03281
03282 void parse_stmt_func_stmt(int sf_attr_idx,
03283 int sf_name_idx)
03284
03285 {
03286 int attr_idx;
03287 int count;
03288 int first_idx;
03289 boolean found_end = FALSE;
03290 int i;
03291 int name_idx;
03292 int new_attr_idx;
03293 opnd_type opnd;
03294 int sn_idx;
03295 int sn_attr_idx;
03296 int stmt_number;
03297
03298
03299 TRACE (Func_Entry, "parse_stmt_func_stmt", NULL);
03300
03301 stmt_type = Stmt_Func_Stmt;
03302 stmt_number = statement_number;
03303
03304 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Stmt_Func_Stmt) ||
03305 STMT_CANT_BE_IN_BLK(Stmt_Func_Stmt, CURR_BLK)) && iss_blk_stk_err()) {
03306
03307 }
03308 else {
03309 curr_stmt_category = Declaration_Stmt_Cat;
03310 }
03311
03312 if (!fnd_semantic_err(Obj_Stmt_Func,
03313 TOKEN_LINE(token),
03314 TOKEN_COLUMN(token),
03315 sf_attr_idx,
03316 TRUE)) {
03317
03318 if (AT_REFERENCED(sf_attr_idx) == Char_Rslt_Bound_Ref) {
03319 AT_ATTR_LINK(sf_attr_idx) = NULL_IDX;
03320 LN_DEF_LOC(sf_name_idx) = TRUE;
03321 }
03322
03323
03324
03325 AT_OBJ_CLASS(sf_attr_idx) = Stmt_Func;
03326 LN_DEF_LOC(sf_name_idx) = TRUE;
03327 }
03328 else {
03329 CREATE_ERR_ATTR(sf_attr_idx,
03330 TOKEN_LINE(token),
03331 TOKEN_COLUMN(token),
03332 Stmt_Func);
03333 }
03334
03335 if ((cif_flags & XREF_RECS) != 0) {
03336 cif_usage_rec(sf_attr_idx,
03337 AT_Tbl_Idx,
03338 TOKEN_LINE(token),
03339 TOKEN_COLUMN(token),
03340 CIF_Symbol_Declaration);
03341 }
03342
03343 NEXT_LA_CH;
03344
03345 if (LA_CH_VALUE == RPAREN) {
03346 goto DONE;
03347 }
03348
03349 do {
03350
03351 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
03352 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
03353
03354 if (attr_idx == NULL_IDX) {
03355 attr_idx = ntr_sym_tbl(&token, name_idx);
03356 LN_DEF_LOC(name_idx) = TRUE;
03357 AT_OBJ_CLASS(attr_idx) = Data_Obj;
03358 ATD_CLASS(attr_idx) = Dummy_Argument;
03359 SET_IMPL_TYPE(attr_idx);
03360 AT_IS_DARG(attr_idx) = TRUE;
03361 ATD_SF_DARG(attr_idx) = TRUE;
03362 }
03363 else {
03364
03365 if (fnd_semantic_err(Obj_Sf_Darg,
03366 TOKEN_LINE(token),
03367 TOKEN_COLUMN(token),
03368 attr_idx,
03369 TRUE)) {
03370
03371 AT_DCL_ERR(sf_attr_idx) = TRUE;
03372 }
03373
03374 NTR_ATTR_TBL(new_attr_idx);
03375 COPY_COMMON_ATTR_INFO(attr_idx, new_attr_idx, Data_Obj);
03376 AT_OBJ_CLASS(new_attr_idx) = Data_Obj;
03377 ATD_CLASS(new_attr_idx) = Dummy_Argument;
03378 AT_IS_DARG(new_attr_idx) = TRUE;
03379 AT_IS_INTRIN(new_attr_idx) = FALSE;
03380 AT_ELEMENTAL_INTRIN(new_attr_idx) = FALSE;
03381 ATD_SF_DARG(new_attr_idx) = TRUE;
03382
03383 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
03384 AT_TYPED(new_attr_idx) = AT_TYPED(attr_idx);
03385 ATD_TYPE_IDX(new_attr_idx) = ATD_TYPE_IDX(attr_idx);
03386 }
03387 else {
03388 SET_IMPL_TYPE(new_attr_idx);
03389 }
03390 ATD_SF_LINK(new_attr_idx) = attr_idx;
03391 LN_ATTR_IDX(name_idx) = new_attr_idx;
03392 attr_idx = new_attr_idx;
03393 }
03394
03395 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
03396 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
03397 }
03398
03399
03400 if ((cif_flags & XREF_RECS) != 0) {
03401 cif_usage_rec(attr_idx,
03402 AT_Tbl_Idx,
03403 TOKEN_LINE(token),
03404 TOKEN_COLUMN(token),
03405 CIF_Symbol_Is_Dummy_Arg);
03406 }
03407
03408
03409
03410 sn_attr_idx = srch_kwd_name(TOKEN_STR(token),
03411 TOKEN_LEN(token),
03412 sf_attr_idx,
03413 &sn_idx);
03414
03415 if (sn_attr_idx != NULL_IDX) {
03416 PRINTMSG(TOKEN_LINE(token), 10, Error, TOKEN_COLUMN(token),
03417 TOKEN_STR(token));
03418 AT_DCL_ERR(sf_attr_idx) = TRUE;
03419 }
03420 else {
03421 NTR_SN_TBL(sn_idx);
03422 SN_ATTR_IDX(sn_idx) = attr_idx;
03423 SN_NAME_LEN(sn_idx) = AT_NAME_LEN(attr_idx);
03424 SN_NAME_IDX(sn_idx) = AT_NAME_IDX(attr_idx);
03425 SN_LINE_NUM(sn_idx) = TOKEN_LINE(token);
03426 SN_COLUMN_NUM(sn_idx) = TOKEN_COLUMN(token);
03427
03428 if (ATP_FIRST_IDX(sf_attr_idx) == NULL_IDX) {
03429 ATP_FIRST_IDX(sf_attr_idx) = sn_idx;
03430 }
03431 ATP_NUM_DARGS(sf_attr_idx) += 1;
03432 }
03433 }
03434 else {
03435
03436 AT_DCL_ERR(sf_attr_idx) = TRUE;
03437
03438 if (!parse_err_flush(Find_Comma_Rparen, "dummy-arg-name")) {
03439 goto EXIT;
03440 }
03441 }
03442
03443 if (LA_CH_VALUE != RPAREN && LA_CH_VALUE != COMMA) {
03444
03445 AT_DCL_ERR(sf_attr_idx) = TRUE;
03446
03447 if (!parse_err_flush(Find_Comma_Rparen, ", or )")) {
03448 goto EXIT;
03449 }
03450 }
03451
03452 if (LA_CH_VALUE == COMMA) {
03453 NEXT_LA_CH;
03454 }
03455 else {
03456 found_end = TRUE;
03457 }
03458
03459 }
03460 while (!found_end);
03461
03462 DONE:
03463
03464 NEXT_LA_CH;
03465
03466 if (matched_specific_token(Tok_Punct_Eq, Tok_Class_Punct)) {
03467 expr_mode = Stmt_Func_Expr;
03468
03469 if (parse_expr(&opnd)) {
03470 ATS_SF_FLD(sf_attr_idx) = OPND_FLD(opnd);
03471 ATS_SF_IDX(sf_attr_idx) = OPND_IDX(opnd);
03472 }
03473 else {
03474 AT_DCL_ERR(sf_attr_idx) = TRUE;
03475 }
03476
03477 expr_mode = Regular_Expr;
03478
03479 if (cif_flags & MISC_RECS) {
03480 cif_stmt_type_rec(TRUE, CIF_Statement_Function_Stmt, stmt_number);
03481 }
03482 }
03483 else {
03484 AT_DCL_ERR(sf_attr_idx) = TRUE;
03485 parse_err_flush(Find_EOS, "=");
03486 }
03487
03488 first_idx = ATP_FIRST_IDX(sf_attr_idx);
03489 count = ATP_NUM_DARGS(sf_attr_idx);
03490
03491
03492
03493 for (i = first_idx; i < (first_idx + count); i++) {
03494 attr_idx = SN_ATTR_IDX(i);
03495 srch_sym_tbl(AT_OBJ_NAME_PTR(attr_idx), AT_NAME_LEN(attr_idx), &name_idx);
03496
03497 if (ATD_SF_LINK(attr_idx) != NULL_IDX) {
03498 LN_ATTR_IDX(name_idx) = ATD_SF_LINK(attr_idx);
03499 }
03500 else {
03501 remove_ln_ntry(name_idx);
03502 }
03503 }
03504
03505 if (LA_CH_VALUE != EOS) {
03506 AT_DCL_ERR(sf_attr_idx) = TRUE;
03507 parse_err_flush(Find_EOS, EOS_STR);
03508 }
03509
03510 EXIT:
03511 #ifdef KEY
03512 PRINTMSG(stmt_start_line, 1682, Ansi, stmt_start_col);
03513 #endif
03514
03515 TRACE (Func_Exit, "parse_stmt_func_stmt", NULL);
03516
03517 return;
03518
03519 }
03520
03521
03522
03523
03524
03525
03526
03527
03528
03529
03530
03531
03532
03533
03534
03535
03536
03537
03538
03539
03540
03541
03542 void parse_type_dcl_stmt (void)
03543
03544 {
03545 int array_idx;
03546 int attr_idx;
03547 long attr_list = 0;
03548 int buf_idx;
03549 boolean check_char_comma;
03550 boolean GT_encountered = FALSE;
03551 boolean chk_semantics;
03552 expr_arg_type exp_desc;
03553 boolean found_colon;
03554 boolean found_end;
03555 boolean has_parameter = FALSE;
03556 int id_column;
03557 int id_line;
03558 int il_idx;
03559 int init_ir_idx;
03560 opnd_type init_opnd;
03561 int name_idx;
03562 boolean need_new_array;
03563 int new_array_idx;
03564 int new_pe_array_idx = NULL_IDX;
03565 boolean new_attr;
03566 int old_array_idx;
03567 int pe_array_idx = NULL_IDX;
03568 boolean possible_func;
03569 int save_column;
03570 int save_line;
03571 int stmt_number;
03572 int stmt_num;
03573 boolean type_err;
03574 int type_idx;
03575 int usage_code;
03576
03577
03578 TRACE (Func_Entry, "parse_type_dcl_stmt", NULL);
03579
03580 colon_recovery = TRUE;
03581 stmt_number = statement_number;
03582
03583 if (TOKEN_VALUE(token) == Tok_Kwd_Type && LA_CH_VALUE != LPAREN) {
03584
03585 if (LA_CH_VALUE == EOS) {
03586
03587
03588
03589 parse_err_flush(Find_EOS, "( or , or :: or type-name");
03590 NEXT_LA_CH;
03591 goto EXIT;
03592 }
03593
03594
03595
03596
03597 parse_derived_type_stmt();
03598
03599 if (cif_flags & MISC_RECS) {
03600 cif_stmt_type_rec(TRUE, CIF_Type_Stmt, stmt_number);
03601 }
03602
03603 goto EXIT;
03604 }
03605
03606 if (CURR_BLK == Derived_Type_Blk) {
03607 stmt_type = Cpnt_Decl_Stmt;
03608 parse_cpnt_dcl_stmt();
03609 goto EXIT;
03610 }
03611
03612 if (curr_stmt_category == Sub_Func_Stmt_Cat) {
03613
03614
03615
03616
03617
03618
03619 CLEAR_ATTR_NTRY(AT_WORK_IDX);
03620 parse_typed_function_stmt();
03621 goto EXIT;
03622 }
03623
03624 check_char_comma = (TOKEN_VALUE(token) == Tok_Kwd_Character &&
03625 LA_CH_VALUE == STAR);
03626 found_colon = FALSE;
03627 found_end = FALSE;
03628 type_err = !parse_type_spec(TRUE);
03629 AT_DCL_ERR(AT_WORK_IDX) = type_err;
03630 type_idx = ATD_TYPE_IDX(AT_WORK_IDX);
03631 array_idx = NULL_IDX;
03632
03633
03634 if (LA_CH_VALUE == COMMA && (!check_char_comma || stmt_has_double_colon())) {
03635
03636 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Type_Decl_Stmt) ||
03637 STMT_CANT_BE_IN_BLK(Type_Decl_Stmt, CURR_BLK)) && iss_blk_stk_err()){
03638
03639 }
03640 else {
03641 curr_stmt_category = Declaration_Stmt_Cat;
03642 }
03643
03644
03645
03646 if (TYP_TYPE(type_idx) == Structure &&
03647 !AT_DEFINED(TYP_IDX(type_idx)) && !AT_DCL_ERR(TYP_IDX(type_idx))) {
03648 issue_undefined_type_msg(TYP_IDX(type_idx),
03649 TOKEN_LINE(token),
03650 TOKEN_COLUMN(token));
03651 }
03652
03653
03654
03655
03656
03657
03658
03659
03660 new_intent = Intent_Unseen;
03661 attr_list = parse_attr_spec(&array_idx, &has_parameter);
03662
03663 # ifdef _F_MINUS_MINUS
03664 if (AT_OBJ_CLASS(AT_WORK_IDX) == Data_Obj) {
03665 pe_array_idx = ATD_PE_ARRAY_IDX(AT_WORK_IDX);
03666 }
03667 # endif
03668 found_colon = TRUE;
03669 colon_recovery = FALSE;
03670 }
03671 else {
03672 colon_recovery = FALSE;
03673
03674 if (curr_stmt_category == Init_Stmt_Cat) {
03675
03676
03677
03678
03679
03680 save_line = LA_CH_LINE;
03681 save_column = LA_CH_COLUMN;
03682 buf_idx = LA_CH_BUF_IDX;
03683 stmt_num = LA_CH_STMT_NUM;
03684 possible_func = TRUE;
03685
03686 while (MATCHED_TOKEN_CLASS(Tok_Class_Keyword) && possible_func) {
03687
03688 switch(TOKEN_VALUE(token)) {
03689 case Tok_Kwd_Recursive:
03690 case Tok_Kwd_Elemental:
03691 case Tok_Kwd_Pure:
03692 break;
03693
03694 case Tok_Kwd_Function:
03695
03696 #ifdef KEY
03697 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
03698
03699
03700 if (!on_off_flags.issue_ansi_messages && LA_CH_VALUE == STAR) {
03701 possible_func = FALSE;
03702 NEXT_LA_CH;
03703 if (LA_CH_VALUE == LPAREN) {
03704 NEXT_LA_CH;
03705 if (LA_CH_VALUE == STAR) {
03706 NEXT_LA_CH;
03707 if (LA_CH_VALUE == RPAREN) {
03708 NEXT_LA_CH;
03709 possible_func = TRUE;
03710 }
03711 }
03712 }
03713 else if (MATCHED_TOKEN_CLASS(Tok_Class_Int_Spec)) {
03714 possible_func = TRUE;
03715 }
03716 if (!possible_func) {
03717 break;
03718 }
03719 }
03720 if (LA_CH_VALUE == LPAREN) {
03721 NEXT_LA_CH;
03722
03723 if (LA_CH_VALUE == RPAREN || LA_CH_CLASS == Ch_Class_Letter) {
03724
03725
03726
03727
03728
03729 reset_lex(buf_idx, stmt_num);
03730 AT_DCL_ERR(AT_WORK_IDX) = SH_ERR_FLG(curr_stmt_sh_idx);
03731 parse_typed_function_stmt();
03732 goto EXIT;
03733 }
03734 }
03735 }
03736 #else
03737 if (MATCHED_TOKEN_CLASS(Tok_Class_Id) && LA_CH_VALUE == LPAREN) {
03738 NEXT_LA_CH;
03739
03740 if (LA_CH_VALUE == RPAREN || LA_CH_CLASS == Ch_Class_Letter) {
03741
03742
03743
03744
03745
03746 reset_lex(buf_idx, stmt_num);
03747 AT_DCL_ERR(AT_WORK_IDX) = SH_ERR_FLG(curr_stmt_sh_idx);
03748 parse_typed_function_stmt();
03749 goto EXIT;
03750 }
03751 }
03752 #endif
03753 possible_func = FALSE;
03754 break;
03755
03756 default:
03757 possible_func = FALSE;
03758 break;
03759 }
03760 }
03761
03762
03763
03764
03765 if (LA_CH_LINE != save_line || LA_CH_COLUMN != save_column) {
03766 reset_lex(buf_idx, stmt_num);
03767 }
03768 }
03769
03770 if (LA_CH_VALUE == COMMA) {
03771 NEXT_LA_CH;
03772 }
03773
03774 found_colon = matched_specific_token(Tok_Punct_Colon_Colon,
03775 Tok_Class_Punct);
03776
03777 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Type_Decl_Stmt) ||
03778 STMT_CANT_BE_IN_BLK(Type_Decl_Stmt, CURR_BLK)) && iss_blk_stk_err()){
03779
03780 }
03781 else {
03782 curr_stmt_category = Declaration_Stmt_Cat;
03783 }
03784
03785 if (TYP_TYPE(type_idx) == Structure && !AT_DEFINED(TYP_IDX(type_idx)) &&
03786 !AT_DCL_ERR(TYP_IDX(type_idx))) {
03787 issue_undefined_type_msg(TYP_IDX(type_idx),
03788 AT_DEF_LINE(TYP_IDX(type_idx)),
03789 AT_DEF_COLUMN(TYP_IDX(type_idx)));
03790 }
03791 }
03792
03793 AT_DCL_ERR(AT_WORK_IDX) = SH_ERR_FLG(curr_stmt_sh_idx);
03794
03795 #ifdef KEY
03796 int count_entities = 0;
03797 #endif
03798 do {
03799 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
03800 found_end = !parse_err_flush(Find_Comma, "object-name");
03801 NEXT_LA_CH;
03802 continue;
03803 }
03804
03805 type_idx = ATD_TYPE_IDX(AT_WORK_IDX);
03806 attr_idx = srch_sym_tbl(TOKEN_STR(token),
03807 TOKEN_LEN(token), &name_idx);
03808 id_line = TOKEN_LINE(token);
03809 id_column = TOKEN_COLUMN(token);
03810 new_attr = FALSE;
03811 new_array_idx = array_idx;
03812 new_pe_array_idx = pe_array_idx;
03813
03814
03815
03816
03817 need_new_array = (TYP_TYPE(type_idx) == Character &&
03818 TYP_CHAR_CLASS(type_idx) == Assumed_Size_Char);
03819
03820 if (attr_idx == NULL_IDX) {
03821 attr_idx = ntr_sym_tbl(&token, name_idx);
03822 LN_DEF_LOC(name_idx) = TRUE;
03823 new_attr = TRUE;
03824 AT_NAME_LEN(AT_WORK_IDX) = AT_NAME_LEN(attr_idx);
03825 AT_NAME_IDX(AT_WORK_IDX) = AT_NAME_IDX(attr_idx);
03826 AT_DEF_LINE(AT_WORK_IDX) = AT_DEF_LINE(attr_idx);
03827 AT_DEF_COLUMN(AT_WORK_IDX) = AT_DEF_COLUMN(attr_idx);
03828 COPY_ATTR_NTRY(attr_idx, AT_WORK_IDX);
03829 #ifdef KEY
03830 if (AT_OBJ_CLASS(attr_idx) == Data_Obj && !AT_IS_INTRIN(attr_idx) &&
03831 TYP_LINEAR(ATD_TYPE_IDX(attr_idx)) == Real_4 &&
03832 Check_FF2C_Script(AT_OBJ_NAME_PTR(attr_idx), 0) )
03833 {
03834 ATD_TYPE_IDX(attr_idx) = Real_8;
03835 ATD_F2C_ABI_VAR(attr_idx) = TRUE;
03836 }
03837 #endif
03838 AT_CIF_SYMBOL_ID(attr_idx) = 0;
03839
03840 if (type_err) {
03841 SET_IMPL_TYPE(attr_idx);
03842 }
03843 }
03844 else if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
03845 AT_ATTR_LINK(attr_idx) = NULL_IDX;
03846 LN_DEF_LOC(name_idx) = TRUE;
03847 }
03848
03849 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
03850 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
03851 }
03852
03853
03854
03855
03856
03857
03858
03859
03860 if (attr_list & (1 << Intrinsic_Attr)) {
03861 merge_intrinsic(!new_attr, id_line, id_column, attr_idx);
03862 }
03863
03864
03865
03866
03867 if (attr_list & (1 << External_Attr)) {
03868 merge_external(!new_attr, id_line, id_column, attr_idx);
03869 }
03870
03871
03872
03873 if (attr_list & (1 << Bind_Attr)) {
03874 merge_bind(TRUE, id_line, id_column, attr_idx);
03875 count_entities += 1;
03876
03877 if ((BIND_SPECIFIES_NAME(new_binding_label)) && count_entities == 2) {
03878 PRINTMSG(id_line, 1689, Error, id_column);
03879 }
03880 }
03881
03882 #ifdef KEY
03883 boolean have_seen_bounds = FALSE;
03884 #endif
03885
03886 if (LA_CH_VALUE == LPAREN) {
03887
03888
03889
03890
03891
03892 new_array_idx = parse_array_spec(attr_idx);
03893 need_new_array = FALSE;
03894 #ifdef KEY
03895 have_seen_bounds = TRUE;
03896 #endif
03897 }
03898
03899 # ifdef _F_MINUS_MINUS
03900
03901 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran) {
03902 new_pe_array_idx = parse_pe_array_spec(attr_idx);
03903 }
03904 # endif
03905
03906 if (LA_CH_VALUE == STAR) {
03907
03908
03909
03910
03911 #ifdef KEY
03912
03913
03914
03915
03916 if (Character != TYP_TYPE(type_idx) &&
03917 !on_off_flags.issue_ansi_messages) {
03918 NEXT_LA_CH;
03919 type_idx = parse_non_char_kind_selector(FALSE);
03920 need_new_array = FALSE;
03921 if (new_attr) {
03922 switch (AT_OBJ_CLASS(attr_idx)) {
03923 case Data_Obj:
03924 case Interface:
03925 ATD_TYPE_IDX(attr_idx) = type_idx;
03926 break;
03927
03928 case Pgm_Unit:
03929 ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx)) = type_idx;
03930 break;
03931 }
03932 }
03933 }
03934 else
03935 #endif
03936 parse_length_selector(attr_idx, FALSE, FALSE);
03937
03938 #ifdef KEY
03939
03940 if (LA_CH_VALUE == LPAREN &&
03941 !(have_seen_bounds || on_off_flags.issue_ansi_messages)) {
03942 new_array_idx = parse_array_spec(attr_idx);
03943 need_new_array = FALSE;
03944 have_seen_bounds = TRUE;
03945 }
03946 #endif
03947
03948 if (TYP_TYPE(type_idx) == Character) {
03949 TYP_DESC(TYP_WORK_IDX) = TYP_DESC(type_idx);
03950 TYP_DCL_VALUE(TYP_WORK_IDX) = TYP_DCL_VALUE(type_idx);
03951 type_idx = ntr_type_tbl();
03952
03953 if (TYP_CHAR_CLASS(type_idx) != Assumed_Size_Char)
03954 {
03955 need_new_array = FALSE;
03956 }
03957
03958 if (new_attr) {
03959 switch (AT_OBJ_CLASS(attr_idx)) {
03960 case Data_Obj:
03961 case Interface:
03962 ATD_TYPE_IDX(attr_idx) = type_idx;
03963 break;
03964
03965 case Pgm_Unit:
03966 ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx)) = type_idx;
03967 break;
03968 }
03969 }
03970 }
03971 #ifdef KEY
03972 else if (!on_off_flags.issue_ansi_messages) { }
03973 #endif
03974 else {
03975 PRINTMSG(TOKEN_LINE(token), 192, Error, TOKEN_COLUMN(token));
03976 AT_DCL_ERR(attr_idx) = TRUE;
03977 }
03978
03979
03980
03981
03982
03983
03984
03985
03986
03987
03988
03989
03990
03991
03992
03993 if (new_array_idx != NULL_IDX && new_array_idx == array_idx &&
03994 BD_ARRAY_CLASS(new_array_idx) != Deferred_Shape) {
03995 old_array_idx = new_array_idx;
03996 new_array_idx = reserve_array_ntry(BD_RANK(old_array_idx));
03997 COPY_BD_NTRY(new_array_idx, old_array_idx);
03998 new_array_idx = ntr_array_in_bd_tbl(new_array_idx);
03999 }
04000 }
04001
04002
04003
04004
04005 if (!new_attr || TYP_TYPE(type_idx) == Character) {
04006
04007 if (new_attr) {
04008
04009 if (AT_OBJ_CLASS(attr_idx) == Data_Obj ||
04010 AT_OBJ_CLASS(attr_idx) == Interface) {
04011 AT_TYPED(attr_idx) = FALSE;
04012 }
04013 else if (AT_OBJ_CLASS(attr_idx) == Pgm_Unit) {
04014 AT_TYPED(ATP_RSLT_IDX(attr_idx)) = FALSE;
04015 }
04016 }
04017
04018 merge_type(attr_idx,
04019 type_idx,
04020 id_line,
04021 id_column);
04022 }
04023
04024
04025
04026
04027
04028 if (new_array_idx != NULL_IDX) {
04029
04030 if (need_new_array && BD_ARRAY_CLASS(array_idx) != Deferred_Shape) {
04031
04032
04033
04034
04035
04036
04037 new_array_idx = reserve_array_ntry(BD_RANK(array_idx));
04038 COPY_BD_NTRY(new_array_idx, array_idx);
04039 new_array_idx = ntr_array_in_bd_tbl(new_array_idx);
04040 }
04041
04042 merge_dimension(attr_idx, id_line, id_column, new_array_idx);
04043 }
04044
04045 if (attr_list && !new_attr) {
04046
04047 if (attr_list & (1 << Allocatable_Attr)) {
04048 merge_allocatable(TRUE, id_line, id_column, attr_idx);
04049 }
04050
04051 if (attr_list & (1 << Automatic_Attr)) {
04052 merge_automatic(TRUE, id_line, id_column, attr_idx);
04053 }
04054 #if 0 && defined(KEY)
04055 if (attr_list & (1 << Bind_Attr)) {
04056 merge_bind(TRUE, id_line, id_column, attr_idx);
04057 }
04058 #endif
04059 if (attr_list & (1 << Value_Attr)) {
04060 merge_value(TRUE, id_line, id_column, attr_idx);
04061 }
04062
04063 if (attr_list & (1 << Public_Attr)) {
04064 merge_access(attr_idx, id_line, id_column, Public);
04065 }
04066 else if (attr_list & (1 << Private_Attr)) {
04067 merge_access(attr_idx, id_line, id_column, Private);
04068 }
04069
04070 if (attr_list & (1 << Optional_Attr)) {
04071 merge_optional(TRUE, id_line, id_column, attr_idx);
04072 }
04073
04074 if (attr_list & (1 << Pointer_Attr)) {
04075 merge_pointer(TRUE, id_line, id_column, attr_idx);
04076 }
04077
04078 if (attr_list & (1 << Save_Attr)) {
04079 merge_save(TRUE, id_line, id_column, attr_idx);
04080 }
04081
04082 if (attr_list & (1 << Target_Attr)) {
04083 merge_target(TRUE, id_line, id_column, attr_idx);
04084 }
04085
04086 if (attr_list & (1 << Volatile_Attr)) {
04087 merge_volatile(TRUE, id_line, id_column, attr_idx);
04088 }
04089
04090 if (attr_list & (1 << Intent_Attr)) {
04091 merge_intent(TRUE, id_line, id_column, attr_idx);
04092 }
04093 }
04094
04095 if ((new_pe_array_idx != NULL_IDX) &&
04096 (!new_attr || (!(attr_list & (1 << Co_Array_Attr))))) {
04097 merge_co_array(TRUE, id_line, id_column, attr_idx,new_pe_array_idx);
04098 }
04099
04100 usage_code = CIF_Symbol_Declaration;
04101
04102 if (LA_CH_VALUE == SLASH) {
04103 PRINTMSG(LA_CH_LINE, 1662, Ansi, LA_CH_COLUMN);
04104
04105 if (has_parameter) {
04106 PRINTMSG(LA_CH_LINE, 1663, Error, LA_CH_COLUMN);
04107 }
04108 NEXT_LA_CH;
04109
04110 if (merge_data(TRUE, id_line, id_column, attr_idx)) {
04111
04112 if (SH_STMT_TYPE(curr_stmt_sh_idx) == Type_Decl_Stmt) {
04113 SH_STMT_TYPE(curr_stmt_sh_idx) = Data_Stmt;
04114 SH_COMPILER_GEN(curr_stmt_sh_idx) = TRUE;
04115 SH_GLB_LINE(curr_stmt_sh_idx) = id_line;
04116 SH_COL_NUM(curr_stmt_sh_idx) = id_column;
04117 }
04118 else {
04119 gen_sh(After, Data_Stmt, id_line, id_column,
04120 FALSE, FALSE, TRUE);
04121 }
04122
04123 stmt_type = Data_Stmt;
04124
04125 NTR_IR_TBL(init_ir_idx);
04126 SH_IR_IDX(curr_stmt_sh_idx) = init_ir_idx;
04127
04128 IR_OPR(init_ir_idx) = Init_Opr;
04129
04130 IR_TYPE_IDX(init_ir_idx) = TYPELESS_DEFAULT_TYPE;
04131 IR_LINE_NUM(init_ir_idx) = id_line;
04132 IR_COL_NUM(init_ir_idx) = id_column;
04133 NTR_IR_LIST_TBL(il_idx);
04134 IR_FLD_L(init_ir_idx) = IL_Tbl_Idx;
04135 IR_IDX_L(init_ir_idx) = il_idx;
04136 IR_LIST_CNT_L(init_ir_idx) = 1;
04137 IL_FLD(il_idx) = AT_Tbl_Idx;
04138 IL_IDX(il_idx) = attr_idx;
04139 IL_LINE_NUM(il_idx) = id_line;
04140 IL_COL_NUM(il_idx) = id_column;
04141
04142 parse_initializer(init_ir_idx);
04143
04144
04145
04146
04147 usage_code = CIF_Symbol_Modification + 200;
04148 }
04149 }
04150 else if (LA_CH_VALUE == EQUAL) {
04151 NEXT_LA_CH;
04152 save_line = LA_CH_LINE;
04153 save_column = LA_CH_COLUMN;
04154
04155 if (LA_CH_VALUE == GT) {
04156 NEXT_LA_CH;
04157 save_line = LA_CH_LINE;
04158 save_column = LA_CH_COLUMN;
04159 GT_encountered = TRUE;
04160 }
04161
04162 if (!found_colon) {
04163 PRINTMSG(save_line, 121, Error, save_column);
04164 AT_DCL_ERR(attr_idx) = TRUE;
04165 }
04166
04167
04168
04169
04170
04171
04172
04173
04174 stmt_type = Type_Decl_Stmt;
04175
04176 if (parse_expr(&init_opnd)) {
04177
04178 if (has_parameter) {
04179
04180
04181
04182
04183
04184
04185
04186
04187
04188
04189
04190
04191
04192
04193
04194
04195 chk_semantics = !new_attr;
04196
04197 # if defined(_F_MINUS_MINUS)
04198
04199 if (pe_array_idx == NULL_IDX && new_pe_array_idx != NULL_IDX) {
04200
04201
04202
04203
04204 chk_semantics = TRUE;
04205 }
04206 # endif
04207
04208
04209 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
04210 type_idx = ATD_TYPE_IDX(attr_idx);
04211
04212 if (TYP_TYPE(type_idx) == Character &&
04213 TYP_CHAR_CLASS(type_idx) == Unknown_Char) {
04214
04215 char_bounds_resolution(attr_idx,
04216 &chk_semantics);
04217 }
04218
04219 if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX) {
04220 array_bounds_resolution(attr_idx,
04221 &chk_semantics);
04222
04223 target_array_idx = ATD_ARRAY_IDX(attr_idx);
04224 }
04225
04226 type_idx = ATD_TYPE_IDX(attr_idx);
04227
04228 switch (TYP_TYPE(type_idx)) {
04229 case Integer:
04230 case Real:
04231 case Complex:
04232 check_type_conversion = TRUE;
04233 target_type_idx = type_idx;
04234 break;
04235
04236 case Character:
04237
04238 if (TYP_CHAR_CLASS(type_idx) == Const_Len_Char) {
04239 check_type_conversion = TRUE;
04240 target_type_idx = Character_1;
04241 target_char_len_idx = TYP_IDX(type_idx);
04242 }
04243 break;
04244 }
04245 }
04246
04247 exp_desc.rank = 0;
04248 expr_mode = Initialization_Expr;
04249 xref_state = CIF_Symbol_Reference;
04250
04251
04252
04253
04254
04255
04256 comp_gen_expr = TRUE;
04257
04258 if (expr_semantics(&init_opnd, &exp_desc)) {
04259 check_type_conversion = FALSE;
04260 target_array_idx = NULL_IDX;
04261 expr_mode = Regular_Expr;
04262
04263
04264
04265
04266
04267 if (attr_list & (1 << Parameter_Attr)) {
04268 merge_parameter(chk_semantics,
04269 attr_idx,
04270 id_line,
04271 id_column,
04272 &init_opnd,
04273 &exp_desc,
04274 save_line,
04275 save_column);
04276 }
04277 }
04278 else {
04279 check_type_conversion = FALSE;
04280 target_array_idx = NULL_IDX;
04281 expr_mode = Regular_Expr;
04282 AT_DCL_ERR(attr_idx) = TRUE;
04283 }
04284
04285
04286 comp_gen_expr = FALSE;
04287 }
04288 else {
04289
04290 if (merge_data(TRUE, id_line, id_column, attr_idx)) {
04291
04292 if (SH_STMT_TYPE(curr_stmt_sh_idx) == Type_Decl_Stmt) {
04293 SH_STMT_TYPE(curr_stmt_sh_idx) = Type_Init_Stmt;
04294 SH_COMPILER_GEN(curr_stmt_sh_idx) = TRUE;
04295 SH_GLB_LINE(curr_stmt_sh_idx) = id_line;
04296 SH_COL_NUM(curr_stmt_sh_idx) = id_column;
04297 }
04298 else {
04299 gen_sh(After, Type_Init_Stmt, id_line, id_column,
04300 FALSE, FALSE, TRUE);
04301 }
04302
04303 stmt_type = Type_Init_Stmt;
04304
04305 NTR_IR_TBL(init_ir_idx);
04306 SH_IR_IDX(curr_stmt_sh_idx) = init_ir_idx;
04307
04308 if (OPND_FLD(init_opnd) == IR_Tbl_Idx &&
04309 IR_OPR(OPND_IDX(init_opnd)) == Call_Opr &&
04310 AT_IS_INTRIN(IR_IDX_L(OPND_IDX(init_opnd))) &&
04311 strcmp(AT_OBJ_NAME_PTR(IR_IDX_L(OPND_IDX(init_opnd))),
04312 "NULL") == 0) {
04313 if (IR_IDX_R(OPND_IDX(init_opnd)) != NULL_IDX) {
04314 PRINTMSG(IR_LINE_NUM(OPND_IDX(init_opnd)), 1573, Error,
04315 IR_COL_NUM(OPND_IDX(init_opnd)));
04316 }
04317 IR_OPR(init_ir_idx) = Null_Opr;
04318 if (!GT_encountered) {
04319 PRINTMSG(TOKEN_LINE(token), 1562, Error,
04320 TOKEN_COLUMN(token));
04321 }
04322 }
04323 else {
04324 IR_OPR(init_ir_idx) = Init_Opr;
04325 if (GT_encountered) {
04326 PRINTMSG(TOKEN_LINE(token), 1562, Error,
04327 TOKEN_COLUMN(token));
04328 }
04329 }
04330 IR_TYPE_IDX(init_ir_idx) = TYPELESS_DEFAULT_TYPE;
04331 IR_LINE_NUM(init_ir_idx) = id_line;
04332 IR_COL_NUM(init_ir_idx) = id_column;
04333 IR_LINE_NUM_L(init_ir_idx) = id_line;
04334 IR_COL_NUM_L(init_ir_idx) = id_column;
04335 IR_FLD_L(init_ir_idx) = AT_Tbl_Idx;
04336 IR_IDX_L(init_ir_idx) = attr_idx;
04337
04338 COPY_OPND(IR_OPND_R(init_ir_idx), init_opnd);
04339
04340
04341
04342
04343 usage_code = CIF_Symbol_Modification + 200;
04344 }
04345 }
04346 }
04347 else {
04348
04349 AT_DCL_ERR(attr_idx) = TRUE;
04350 }
04351
04352 }
04353 else if (has_parameter) {
04354 AT_DCL_ERR(attr_idx) = TRUE;
04355 PRINTMSG(LA_CH_LINE, 111, Error, LA_CH_COLUMN,
04356 AT_OBJ_NAME_PTR(attr_idx));
04357 }
04358
04359 AT_DCL_ERR(attr_idx) = AT_DCL_ERR(AT_WORK_IDX) || AT_DCL_ERR(attr_idx);
04360
04361 if ((cif_flags & XREF_RECS) != 0) {
04362 cif_usage_rec(attr_idx,
04363 AT_Tbl_Idx,
04364 id_line,
04365 id_column,
04366 usage_code);
04367 }
04368
04369 if (LA_CH_VALUE == COMMA ||
04370 (LA_CH_VALUE != EOS &&
04371 parse_err_flush(Find_Comma, ", or " EOS_STR))) {
04372
04373
04374
04375 }
04376 else {
04377 found_end = TRUE;
04378 }
04379 NEXT_LA_CH;
04380 }
04381 while (!found_end);
04382
04383 if (cif_flags & MISC_RECS) {
04384 cif_stmt_type_rec(TRUE, CIF_Type_Declaration_Stmt, stmt_number);
04385 }
04386
04387 EXIT:
04388
04389 TRACE (Func_Exit, "parse_type_dcl_stmt", NULL);
04390
04391 return;
04392
04393 }
04394
04395
04396
04397
04398
04399
04400
04401
04402
04403
04404
04405
04406
04407
04408
04409
04410
04411
04412
04413
04414
04415
04416 void parse_use_stmt (void)
04417
04418 {
04419 #ifdef KEY
04420 int attr_idx = 0;
04421 #else
04422 int attr_idx;
04423 #endif
04424 boolean found_end = TRUE;
04425 int list_idx;
04426 int name_idx;
04427 int new_name_idx;
04428 use_type_type prev_use = Use_Not;
04429 int ro_idx;
04430 int use_ir_idx;
04431 #ifdef KEY
04432 boolean intrinsic = FALSE;
04433 boolean non_intrinsic = FALSE;
04434 #endif
04435
04436
04437 TRACE (Func_Entry, "parse_use_stmt", NULL);
04438
04439 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Use_Stmt) ||
04440 STMT_CANT_BE_IN_BLK(Use_Stmt, CURR_BLK)) && iss_blk_stk_err()) {
04441
04442 }
04443 else {
04444 curr_stmt_category = Use_Stmt_Cat;
04445 }
04446
04447 #ifdef KEY
04448
04449 if (LA_CH_VALUE == COMMA) {
04450 NEXT_LA_CH;
04451 token_values_type module_nature;
04452 if ((!MATCHED_TOKEN_CLASS(Tok_Class_Keyword))
04453 || ((Tok_Kwd_Intrinsic != (module_nature = TOKEN_VALUE(token))) &&
04454 (Tok_Kwd_Nonintrinsic != module_nature))) {
04455 parse_err_flush(Find_EOS, "INTRINSIC/NON_INTRINSIC");
04456 }
04457
04458 else if (!matched_specific_token(Tok_Punct_Colon_Colon,
04459 Tok_Class_Punct)) {
04460 parse_err_flush(Find_EOS, "::");
04461 }
04462 else if (Tok_Kwd_Intrinsic == module_nature) {
04463 intrinsic = TRUE;
04464 }
04465 else if (Tok_Kwd_Nonintrinsic == module_nature) {
04466 non_intrinsic = TRUE;
04467 }
04468 }
04469
04470 else {
04471 (void) matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
04472 }
04473 #endif
04474
04475 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04476 parse_err_flush(Find_EOS, "module-name");
04477 goto EXIT;
04478 }
04479
04480 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
04481
04482 if (attr_idx != NULL_IDX) {
04483
04484 if (AT_OBJ_CLASS(attr_idx) == Pgm_Unit &&
04485 ATP_PGM_UNIT(attr_idx) == Module) {
04486
04487
04488
04489
04490 prev_use = (use_type_type) ATP_USE_TYPE(attr_idx);
04491 list_idx = SCP_USED_MODULE_LIST(curr_scp_idx);
04492
04493 #ifdef KEY
04494
04495
04496
04497
04498
04499
04500
04501
04502 if (intrinsic) {
04503 AT_IS_INTRIN(attr_idx) = TRUE;
04504 } else if (non_intrinsic) {
04505 ATT_NON_INTRIN(attr_idx) = TRUE;
04506 } else {
04507 ATT_NO_MODULE_NATURE(attr_idx) = TRUE;
04508 }
04509 #endif
04510
04511 while (list_idx != NULL_IDX) {
04512
04513 if (AL_ATTR_IDX(list_idx) == attr_idx) {
04514 break;
04515 }
04516 list_idx = AL_NEXT_IDX(list_idx);
04517 }
04518
04519 if (list_idx == NULL_IDX) {
04520
04521
04522
04523
04524 NTR_ATTR_LIST_TBL(list_idx);
04525 AL_ATTR_IDX(list_idx) = attr_idx;
04526 AL_PREV_MODULE_IDX(SCP_USED_MODULE_LIST(curr_scp_idx)) = list_idx;
04527 AL_NEXT_IDX(list_idx) = SCP_USED_MODULE_LIST(curr_scp_idx);
04528 SCP_USED_MODULE_LIST(curr_scp_idx) = list_idx;
04529 AT_USE_ASSOCIATED(attr_idx) = TRUE;
04530 AT_MODULE_IDX(attr_idx) = attr_idx;
04531 prev_use = Use_Not;
04532 }
04533 }
04534 else {
04535 PRINTMSG(TOKEN_LINE(token), 791, Error,
04536 TOKEN_COLUMN(token),
04537 AT_OBJ_NAME_PTR(attr_idx));
04538
04539 CREATE_ERR_ATTR(attr_idx,
04540 TOKEN_LINE(token),
04541 TOKEN_COLUMN(token),
04542 Pgm_Unit);
04543 ATP_PGM_UNIT(attr_idx) = Module;
04544 ATP_SCP_IDX(attr_idx) = curr_scp_idx;
04545 NTR_ATTR_LIST_TBL(list_idx);
04546 AL_ATTR_IDX(list_idx) = attr_idx;
04547 AL_PREV_MODULE_IDX(SCP_USED_MODULE_LIST(curr_scp_idx)) = list_idx;
04548 AL_NEXT_IDX(list_idx) = SCP_USED_MODULE_LIST(curr_scp_idx);
04549 SCP_USED_MODULE_LIST(curr_scp_idx)= list_idx;
04550 AT_USE_ASSOCIATED(attr_idx) = TRUE;
04551 AT_MODULE_IDX(attr_idx) = attr_idx;
04552 MAKE_EXTERNAL_NAME(attr_idx,
04553 AT_NAME_IDX(attr_idx),
04554 AT_NAME_LEN(attr_idx));
04555 }
04556 }
04557 else {
04558 attr_idx = ntr_sym_tbl(&token, name_idx);
04559 AT_OBJ_CLASS(attr_idx) = Pgm_Unit;
04560 ATP_PGM_UNIT(attr_idx) = Module;
04561 ATP_SCP_IDX(attr_idx) = curr_scp_idx;
04562 MAKE_EXTERNAL_NAME(attr_idx,
04563 AT_NAME_IDX(attr_idx),
04564 AT_NAME_LEN(attr_idx));
04565 NTR_ATTR_LIST_TBL(list_idx);
04566 AL_ATTR_IDX(list_idx) = attr_idx;
04567 AL_PREV_MODULE_IDX(SCP_USED_MODULE_LIST(curr_scp_idx)) = list_idx;
04568 AL_NEXT_IDX(list_idx) = SCP_USED_MODULE_LIST(curr_scp_idx);
04569 SCP_USED_MODULE_LIST(curr_scp_idx)= list_idx;
04570 AT_USE_ASSOCIATED(attr_idx) = TRUE;
04571 AT_MODULE_IDX(attr_idx) = attr_idx;
04572 LN_DEF_LOC(name_idx) = TRUE;
04573 #ifdef KEY
04574 AT_IS_INTRIN(attr_idx) = intrinsic;
04575 ATT_NON_INTRIN(attr_idx) = non_intrinsic;
04576 ATT_NO_MODULE_NATURE(attr_idx) = !(intrinsic || non_intrinsic);
04577 #endif
04578 }
04579
04580 if (AT_ORIG_NAME_IDX(attr_idx) == NULL_IDX) {
04581 AT_ORIG_NAME_IDX(attr_idx) = AT_NAME_IDX(attr_idx);
04582 AT_ORIG_NAME_LEN(attr_idx) = AT_NAME_LEN(attr_idx);
04583 }
04584
04585 if (ATP_GLOBAL_ATTR_IDX(attr_idx) == NULL_IDX) {
04586
04587
04588
04589
04590
04591
04592
04593
04594
04595 AT_REFERENCED(attr_idx) = Referenced;
04596 name_idx = check_global_pgm_unit(attr_idx);
04597 ATP_MODULE_STR_IDX(attr_idx) = GN_NAME_IDX(name_idx);
04598 }
04599
04600 if ((cif_flags & XREF_RECS) != 0) {
04601 cif_usage_rec(attr_idx,
04602 AT_Tbl_Idx,
04603 TOKEN_LINE(token),
04604 TOKEN_COLUMN(token),
04605 CIF_Symbol_Reference);
04606 }
04607
04608 if (LA_CH_VALUE == COMMA) {
04609 NEXT_LA_CH;
04610
04611 if (!MATCHED_TOKEN_CLASS(Tok_Class_Keyword)) {
04612 parse_err_flush(Find_EOS, "ONLY or use-name");
04613 }
04614 else if (TOKEN_VALUE(token) == Tok_Kwd_Only && LA_CH_VALUE == COLON) {
04615 NEXT_LA_CH;
04616
04617 if (LA_CH_VALUE != EOS) {
04618 parse_only_spec(attr_idx);
04619 }
04620
04621
04622
04623
04624 if (prev_use == Use_Not || prev_use == Use_Only) {
04625 ATP_USE_TYPE(attr_idx) = Use_Only;
04626 }
04627
04628 goto EXIT;
04629 }
04630 else {
04631 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
04632 found_end = FALSE;
04633 }
04634 }
04635 else if (LA_CH_VALUE != EOS) {
04636 parse_err_flush(Find_EOS, ", or " EOS_STR);
04637 }
04638
04639 while (!found_end) {
04640
04641 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04642 new_name_idx = make_ro_entry(attr_idx,
04643 NULL_IDX,
04644 TRUE);
04645
04646 if (matched_specific_token(Tok_Punct_Rename, Tok_Class_Punct)) {
04647
04648 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04649 ro_idx = make_ro_entry(attr_idx,
04650 NULL_IDX,
04651 FALSE);
04652 RO_RENAME_IDX(ro_idx) = new_name_idx;
04653 check_for_duplicate_renames(new_name_idx);
04654 }
04655 else {
04656 parse_err_flush(Find_Comma, NULL);
04657 }
04658 }
04659 else {
04660 parse_err_flush(Find_Comma, "=>");
04661 }
04662 }
04663 else {
04664 parse_err_flush(Find_Comma, "use-name");
04665 }
04666
04667 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
04668 parse_err_flush(Find_Comma, ", or " EOS_STR);
04669 }
04670
04671 if (LA_CH_VALUE == COMMA) {
04672 NEXT_LA_CH;
04673 }
04674 else if (LA_CH_VALUE == EOS) {
04675 found_end = TRUE;
04676 }
04677 }
04678
04679 ATP_USE_TYPE(attr_idx) = (ATP_USE_LIST(attr_idx) == NULL_IDX) ? Use_All :
04680 Use_Renamed;
04681
04682 EXIT:
04683
04684
04685
04686
04687
04688 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04689 NTR_IR_TBL(use_ir_idx);
04690 IR_OPR(use_ir_idx) = Use_Opr;
04691 IR_TYPE_IDX(use_ir_idx) = TYPELESS_DEFAULT_TYPE;
04692 IR_LINE_NUM(use_ir_idx) = stmt_start_line;
04693 IR_COL_NUM(use_ir_idx) = stmt_start_col;
04694 IR_IDX_L(use_ir_idx) = attr_idx;
04695 IR_FLD_L(use_ir_idx) = AT_Tbl_Idx;
04696 IR_LINE_NUM_L(use_ir_idx) = stmt_start_line;
04697 IR_COL_NUM_L(use_ir_idx) = stmt_start_col;
04698 SH_IR_IDX(curr_stmt_sh_idx) = use_ir_idx;
04699
04700 NEXT_LA_CH;
04701
04702 TRACE (Func_Exit, "parse_use_stmt", NULL);
04703
04704 return;
04705
04706 }
04707 #ifdef KEY
04708
04709
04710
04711
04712
04713
04714
04715
04716
04717
04718
04719
04720
04721
04722
04723
04724
04725 void parse_import_stmt(void)
04726
04727 {
04728 boolean found_list = FALSE;
04729
04730 TRACE (Func_Entry, "parse_import_stmt", NULL);
04731
04732 PRINTMSG(TOKEN_LINE(token), 1685, Ansi, TOKEN_COLUMN(token), "IMPORT");
04733
04734 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Import_Stmt) ||
04735 STMT_CANT_BE_IN_BLK(Import_Stmt, CURR_BLK)) && iss_blk_stk_err()) {
04736
04737 }
04738 else {
04739 curr_stmt_category = Import_Stmt_Cat;
04740 }
04741
04742
04743 if (matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct) &&
04744 LA_CH_VALUE == EOS) {
04745 parse_err_flush(Find_EOS, "identifier");
04746 }
04747
04748 while (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04749 found_list = TRUE;
04750 int missing_in_host = FALSE;
04751 int name_idx;
04752 int attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
04753
04754
04755 if (attr_idx != NULL_IDX) {
04756
04757
04758 if (AT_OBJ_CLASS(attr_idx) == Derived_Type && !AT_DEFINED(attr_idx)) {
04759 if (import_from_host(TOKEN_STR(token), TOKEN_LEN(token), 0, attr_idx)
04760 == NULL_IDX) {
04761 missing_in_host = TRUE;
04762 }
04763 }
04764 else {
04765
04766
04767 int severity = AT_ATTR_LINK(attr_idx) ? Warning : Error;
04768 PRINTMSG(TOKEN_LINE(token), 1683, severity, TOKEN_COLUMN(token),
04769 TOKEN_STR(token));
04770 }
04771 }
04772
04773
04774 else {
04775 int host_name_idx;
04776 int host_attr_idx = srch_host_sym_tbl_for_import(TOKEN_STR(token),
04777 TOKEN_LEN(token), &host_name_idx);
04778 if (NULL_IDX == host_attr_idx) {
04779 missing_in_host = TRUE;
04780 }
04781 else {
04782 attr_idx = ntr_host_in_sym_tbl(&token, name_idx, host_attr_idx,
04783 host_name_idx, TRUE);
04784 AT_DEFINED(attr_idx) = AT_DEFINED(host_attr_idx);
04785 AT_LOCKED_IN(attr_idx) = TRUE;
04786 }
04787 }
04788
04789 if (missing_in_host) {
04790 PRINTMSG(TOKEN_LINE(token), 1684, Error, TOKEN_COLUMN(token),
04791 TOKEN_STR(token));
04792 }
04793
04794 if (LA_CH_VALUE == COMMA) {
04795 NEXT_LA_CH;
04796 }
04797 else {
04798 break;
04799 }
04800 }
04801
04802 if (LA_CH_VALUE != EOS) {
04803 parse_err_flush(Find_EOS, ", or " EOS_STR);
04804 }
04805
04806 NEXT_LA_CH;
04807
04808 if (!found_list) {
04809 SCP_IMPORT(curr_scp_idx) = TRUE;
04810 }
04811
04812 TRACE (Func_Exit, "parse_import_stmt", NULL);
04813 }
04814 #endif
04815
04816
04817
04818
04819
04820
04821
04822
04823
04824
04825
04826
04827
04828
04829
04830
04831
04832
04833 static void parse_only_spec(int module_attr_idx)
04834 {
04835 int first_name_idx;
04836 boolean found_end = FALSE;
04837 int ro_idx;
04838
04839
04840 TRACE (Func_Entry, "parse_only_spec", NULL);
04841
04842 do {
04843 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04844 first_name_idx = make_ro_entry(module_attr_idx,
04845 NULL_IDX,
04846 TRUE);
04847
04848 if (LA_CH_VALUE == EQUAL) {
04849
04850 if (!matched_specific_token(Tok_Punct_Rename, Tok_Class_Punct)) {
04851 parse_err_flush(Find_Comma, "=>");
04852 goto ERR_EXIT;
04853 }
04854
04855 if (!MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
04856 parse_err_flush(Find_Comma, NULL);
04857 goto ERR_EXIT;
04858 }
04859 ro_idx = make_ro_entry(module_attr_idx,
04860 NULL_IDX,
04861 FALSE);
04862 RO_RENAME_IDX(ro_idx) = first_name_idx;
04863 check_for_duplicate_renames(first_name_idx);
04864
04865 }
04866 else if (LA_CH_VALUE == LPAREN) {
04867 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
04868
04869 if (!parse_generic_spec()) {
04870 parse_err_flush(Find_Comma, NULL);
04871 goto ERR_EXIT;
04872 }
04873
04874 rename_only_tbl_idx--;
04875
04876 ro_idx = make_ro_entry(module_attr_idx,
04877 NULL_IDX,
04878 FALSE);
04879 }
04880 else {
04881
04882
04883
04884
04885
04886
04887
04888
04889 ro_idx = make_ro_entry(module_attr_idx,
04890 first_name_idx,
04891 FALSE);
04892 }
04893 }
04894 else {
04895 parse_err_flush(Find_Comma, "use-name");
04896 }
04897
04898 ERR_EXIT:
04899
04900 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
04901 parse_err_flush(Find_Comma, ", or " EOS_STR);
04902 }
04903
04904 if (LA_CH_VALUE == COMMA) {
04905 NEXT_LA_CH;
04906 }
04907 else if (LA_CH_VALUE == EOS) {
04908 found_end = TRUE;
04909 }
04910 }
04911 while (!found_end);
04912
04913 TRACE (Func_Exit, "parse_only_spec", NULL);
04914
04915 return;
04916
04917 }
04918
04919
04920
04921
04922
04923
04924
04925
04926
04927
04928
04929
04930
04931
04932
04933
04934
04935
04936
04937
04938
04939
04940
04941
04942
04943
04944
04945
04946
04947 static long parse_attr_spec(int *array_idx,
04948 boolean *has_parameter)
04949
04950 {
04951 long attr_list = 0;
04952 long err_in_list;
04953 long err_list = 0;
04954 int pe_array_idx;
04955
04956
04957 TRACE (Func_Entry, "parse_attr_spec", NULL);
04958
04959
04960
04961 *has_parameter = FALSE;
04962
04963 do {
04964 if (LA_CH_VALUE == EOS) {
04965 break;
04966 }
04967
04968 if (LA_CH_VALUE != COMMA) {
04969 parse_err_flush(Find_Comma, ", or ::");
04970 continue;
04971 }
04972
04973 NEXT_LA_CH;
04974
04975 if (!MATCHED_TOKEN_CLASS(Tok_Class_Keyword)) {
04976 parse_err_flush(Find_Comma, "ALLOCATABLE, "
04977 #ifdef KEY
04978 "BIND, "
04979 #endif
04980 "DIMENSION, EXTERNAL, "
04981 "INTENT, INTRINSIC, OPTIONAL, PARAMETER, POINTER, "
04982 "PRIVATE, PUBLIC, SAVE or TARGET");
04983 continue;
04984 }
04985
04986 switch (TOKEN_VALUE(token)) {
04987
04988 case Tok_Kwd_Parameter:
04989
04990
04991
04992
04993
04994
04995
04996
04997
04998
04999
05000
05001
05002
05003
05004
05005
05006
05007 err_in_list = err_attrs[Parameter_Attr] & attr_list;
05008 attr_list = attr_list | (1 << Parameter_Attr);
05009 *has_parameter = TRUE;
05010
05011 if (err_in_list) {
05012 issue_attr_err(Parameter_Attr, err_in_list);
05013 err_list = err_list | (1 << Parameter_Attr);
05014 }
05015 break;
05016
05017
05018 case Tok_Kwd_Public:
05019
05020 if (CURR_BLK != Module_Blk) {
05021 issue_attr_blk_err("PUBLIC");
05022 }
05023 else {
05024 err_in_list = err_attrs[Public_Attr] & attr_list;
05025 attr_list = attr_list | (1 << Public_Attr);
05026
05027 if (err_in_list) {
05028 issue_attr_err(Public_Attr, err_in_list);
05029 err_list = err_list | (1 << Public_Attr);
05030 }
05031 else {
05032 AT_ACCESS_SET(AT_WORK_IDX) = TRUE;
05033 AT_PRIVATE(AT_WORK_IDX) = FALSE;
05034 }
05035 }
05036 break;
05037
05038
05039 case Tok_Kwd_Private:
05040
05041 if (CURR_BLK != Module_Blk) {
05042 issue_attr_blk_err("PRIVATE");
05043 }
05044 else {
05045 err_in_list = err_attrs[Private_Attr] & attr_list;
05046 attr_list = attr_list | (1 << Private_Attr);
05047
05048 if (err_in_list) {
05049 issue_attr_err(Private_Attr, err_in_list);
05050 err_list = err_list | (1 << Private_Attr);
05051 }
05052 else {
05053 AT_ACCESS_SET(AT_WORK_IDX) = TRUE;
05054 AT_PRIVATE(AT_WORK_IDX) = TRUE;
05055 }
05056 }
05057 break;
05058
05059
05060 case Tok_Kwd_Allocatable:
05061
05062 if (STMT_CANT_BE_IN_BLK(Allocatable_Stmt, CURR_BLK)) {
05063 issue_attr_blk_err("ALLOCATABLE");
05064 }
05065 else {
05066 err_in_list = err_attrs[Allocatable_Attr] & attr_list;
05067 attr_list = attr_list | (1 << Allocatable_Attr);
05068
05069 if (err_in_list) {
05070 issue_attr_err(Allocatable_Attr, err_in_list);
05071 err_list = err_list | (1 << Allocatable_Attr);
05072 }
05073 else {
05074 ATD_ALLOCATABLE(AT_WORK_IDX) = TRUE;
05075 ATD_IM_A_DOPE(AT_WORK_IDX) = TRUE;
05076 }
05077 }
05078 break;
05079
05080
05081 case Tok_Kwd_Automatic:
05082
05083 if (STMT_CANT_BE_IN_BLK(Automatic_Stmt, CURR_BLK)) {
05084 issue_attr_blk_err("AUTOMATIC");
05085 }
05086 else {
05087 PRINTMSG(TOKEN_LINE(token), 1254, Ansi,
05088 TOKEN_COLUMN(token),
05089 "AUTOMATIC");
05090 err_in_list = err_attrs[Automatic_Attr] & attr_list;
05091 attr_list = attr_list | (1 << Automatic_Attr);
05092
05093 if (err_in_list) {
05094 issue_attr_err(Automatic_Attr, err_in_list);
05095 err_list = err_list | (1 << Automatic_Attr);
05096 }
05097 else {
05098 ATD_STACK(AT_WORK_IDX) = TRUE;
05099 }
05100 }
05101 break;
05102
05103
05104
05105
05106
05107 case Tok_Kwd_External:
05108
05109 if (STMT_CANT_BE_IN_BLK(External_Stmt, CURR_BLK)) {
05110 issue_attr_blk_err("EXTERNAL");
05111 }
05112 else {
05113 err_in_list = err_attrs[External_Attr] & attr_list;
05114 attr_list = attr_list | (1 << External_Attr);
05115
05116 if (err_in_list) {
05117 issue_attr_err(External_Attr, err_in_list);
05118 err_list = err_list | (1 << External_Attr);
05119 }
05120 }
05121 break;
05122
05123
05124 case Tok_Kwd_Intrinsic:
05125
05126 err_in_list = err_attrs[Intrinsic_Attr] & attr_list;
05127 attr_list = attr_list | (1 << Intrinsic_Attr);
05128
05129 if (err_in_list) {
05130 issue_attr_err(Intrinsic_Attr, err_in_list);
05131 err_list = err_list | (1 << Intrinsic_Attr);
05132 }
05133 break;
05134
05135
05136 case Tok_Kwd_Optional:
05137
05138 if (STMT_CANT_BE_IN_BLK(Optional_Stmt, CURR_BLK)) {
05139 issue_attr_blk_err("OPTIONAL");
05140 }
05141 else {
05142 err_in_list = err_attrs[Optional_Attr] & attr_list;
05143 attr_list = attr_list | (1 << Optional_Attr);
05144
05145 if (err_in_list) {
05146 issue_attr_err(Optional_Attr, err_in_list);
05147 err_list = err_list | (1 << Optional_Attr);
05148 }
05149 else {
05150 if (AT_OBJ_CLASS(AT_WORK_IDX) == Data_Obj) {
05151 ATD_CLASS(AT_WORK_IDX) = Dummy_Argument;
05152 }
05153
05154 AT_OPTIONAL(AT_WORK_IDX) = TRUE;
05155 }
05156 }
05157 break;
05158
05159
05160 case Tok_Kwd_Pointer:
05161
05162 err_in_list = err_attrs[Pointer_Attr] & attr_list;
05163 attr_list = attr_list | (1 << Pointer_Attr);
05164
05165 if (err_in_list) {
05166 issue_attr_err(Pointer_Attr, err_in_list);
05167 err_list = err_list | (1 << Pointer_Attr);
05168 }
05169 else {
05170 ATD_POINTER(AT_WORK_IDX) = TRUE;
05171 ATD_IM_A_DOPE(AT_WORK_IDX) = TRUE;
05172 }
05173 break;
05174
05175
05176 case Tok_Kwd_Save:
05177
05178 if (ATP_SAVE_ALL(SCP_ATTR_IDX(curr_scp_idx))) {
05179 PRINTMSG(TOKEN_LINE(token), 133, Ansi, TOKEN_COLUMN(token));
05180 }
05181
05182 err_in_list = err_attrs[Save_Attr] & attr_list;
05183 attr_list = attr_list | (1 << Save_Attr);
05184
05185 if (err_in_list) {
05186 issue_attr_err(Save_Attr, err_in_list);
05187 err_list = err_list | (1 << Save_Attr);
05188 }
05189 else {
05190 ATD_SAVED(AT_WORK_IDX) = TRUE;
05191 ATD_CLASS(AT_WORK_IDX) = Variable;
05192 }
05193 break;
05194
05195
05196 case Tok_Kwd_Target:
05197
05198 err_in_list = err_attrs[Target_Attr] & attr_list;
05199 attr_list = attr_list | (1 << Target_Attr);
05200
05201 if (err_in_list) {
05202 issue_attr_err(Target_Attr, err_in_list);
05203 err_list = err_list | (1 << Target_Attr);
05204 }
05205 else {
05206 ATD_TARGET(AT_WORK_IDX) = TRUE;
05207 }
05208 break;
05209
05210
05211 case Tok_Kwd_Volatile:
05212
05213 if (STMT_CANT_BE_IN_BLK(Volatile_Stmt, CURR_BLK)) {
05214 issue_attr_blk_err("VOLATILE");
05215 }
05216 else {
05217 PRINTMSG(TOKEN_LINE(token),
05218 #ifdef KEY
05219 1685,
05220 #else
05221 1254,
05222 #endif
05223 Ansi, TOKEN_COLUMN(token), "VOLATILE");
05224 err_in_list = err_attrs[Volatile_Attr] & attr_list;
05225 attr_list = attr_list | (1 << Volatile_Attr);
05226
05227 if (err_in_list) {
05228 issue_attr_err(Volatile_Attr, err_in_list);
05229 err_list = err_list | (1 << Volatile_Attr);
05230 }
05231 else {
05232 ATD_VOLATILE(AT_WORK_IDX) = TRUE;
05233 }
05234 }
05235 break;
05236
05237
05238 case Tok_Kwd_Intent:
05239
05240 if (STMT_CANT_BE_IN_BLK(Intent_Stmt, CURR_BLK)) {
05241 issue_attr_blk_err("INTENT");
05242 parse_err_flush(Find_Comma, NULL);
05243 continue;
05244 }
05245 err_in_list = err_attrs[Intent_Attr] & attr_list;
05246 attr_list = attr_list | (1 << Intent_Attr);
05247
05248 if (err_in_list) {
05249 issue_attr_err(Intent_Attr, err_in_list);
05250 }
05251
05252 new_intent = parse_intent_spec();
05253 ATD_CLASS(AT_WORK_IDX) = Dummy_Argument;
05254 ATD_INTENT(AT_WORK_IDX) = new_intent;
05255 break;
05256
05257 #ifdef KEY
05258 case Tok_Kwd_Bind:
05259 if (STMT_CANT_BE_IN_BLK(Bind_Stmt, CURR_BLK)) {
05260 issue_attr_blk_err("BIND");
05261 parse_err_flush(Find_Comma, NULL);
05262 continue;
05263 }
05264 err_in_list = err_attrs[Bind_Attr] & attr_list;
05265 attr_list = attr_list | (1 << Bind_Attr);
05266
05267 if (err_in_list) {
05268 issue_attr_err(Bind_Attr, err_in_list);
05269 }
05270
05271 if (parse_language_binding_spec(&new_binding_label)) {
05272 #if 1
05273
05274 #else
05275
05276 AT_OBJ_CLASS(AT_WORK_IDX) = Data_Obj;
05277 ATD_CLASS(AT_WORK_IDX) = Variable;
05278 set_binding_label(AT_Tbl_Idx, AT_WORK_IDX, &new_binding_label);
05279 #endif
05280 }
05281 break;
05282
05283 case Tok_Kwd_Value:
05284
05285 if (STMT_CANT_BE_IN_BLK(Value_Stmt, CURR_BLK)) {
05286 issue_attr_blk_err("VALUE");
05287 parse_err_flush(Find_Comma, NULL);
05288 continue;
05289 }
05290 err_in_list = err_attrs[Value_Attr] & attr_list;
05291 attr_list = attr_list | (1 << Value_Attr);
05292
05293 if (err_in_list) {
05294 issue_attr_err(Value_Attr, err_in_list);
05295 }
05296
05297 else {
05298
05299 AT_OBJ_CLASS(AT_WORK_IDX) = Data_Obj;
05300 ATD_CLASS(AT_WORK_IDX) = Dummy_Argument;
05301 ATD_VALUE_ATTR(AT_WORK_IDX) = TRUE;
05302 }
05303 break;
05304 #endif
05305
05306 case Tok_Kwd_Dimension:
05307 err_in_list = err_attrs[Dimension_Attr] & attr_list;
05308 attr_list = attr_list | (1 << Dimension_Attr);
05309
05310 if (err_in_list) {
05311 issue_attr_err(Dimension_Attr, err_in_list);
05312 err_list = err_list | (1 << Dimension_Attr);
05313 }
05314
05315 if (LA_CH_VALUE == LPAREN) {
05316 *array_idx = parse_array_spec(AT_WORK_IDX);
05317 }
05318 # ifdef _F_MINUS_MINUS
05319 else if (!cmd_line_flags.co_array_fortran || LA_CH_VALUE != LBRKT)
05320 # else
05321 else
05322 # endif
05323 {
05324 parse_err_flush(Find_Comma, "( dimension-spec )");
05325 }
05326
05327 # ifdef _F_MINUS_MINUS
05328
05329 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran) {
05330 err_in_list = err_attrs[Co_Array_Attr] & attr_list;
05331 attr_list = attr_list | (1 << Co_Array_Attr);
05332
05333 if (err_in_list) {
05334 issue_attr_err(Co_Array_Attr, err_in_list);
05335 err_list = err_list | (1 << Co_Array_Attr);
05336 }
05337
05338 pe_array_idx = parse_pe_array_spec(AT_WORK_IDX);
05339
05340 if (!err_in_list) {
05341 ATD_PE_ARRAY_IDX(AT_WORK_IDX) = pe_array_idx;
05342 }
05343 }
05344 # endif
05345 break;
05346
05347
05348 default:
05349 parse_err_flush(Find_Comma, "attr-spec");
05350 break;
05351
05352 }
05353
05354 }
05355 while (LA_CH_VALUE != COLON ||
05356 !matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct));
05357
05358
05359
05360 attr_list = attr_list^err_list;
05361
05362 TRACE (Func_Exit, "parse_attr_spec", NULL);
05363
05364 return(attr_list);
05365
05366 }
05367
05368
05369
05370
05371
05372
05373
05374
05375
05376
05377
05378
05379
05380
05381
05382
05383
05384
05385
05386 static void issue_attr_err(attr_type new_attr,
05387 long err_in_list)
05388 {
05389 long idx;
05390
05391
05392 TRACE (Func_Entry, "issue_attr_err", NULL);
05393
05394 for (idx = 0; idx <= End_Attr; idx++) {
05395
05396 if ((1 & err_in_list) != 0) {
05397
05398 if (idx == new_attr) {
05399
05400
05401
05402 PRINTMSG(TOKEN_LINE(token), 424, Error, TOKEN_COLUMN(token),
05403 attr_str[new_attr]);
05404 }
05405 else {
05406
05407 PRINTMSG(TOKEN_LINE(token), 425, Error, TOKEN_COLUMN(token),
05408 attr_str[new_attr], attr_str[idx]);
05409 }
05410 }
05411 err_in_list = err_in_list >> 1;
05412 }
05413
05414 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
05415
05416 TRACE (Func_Exit, "issue_attr_err", NULL);
05417
05418 return;
05419
05420 }
05421
05422
05423
05424
05425
05426
05427
05428
05429
05430
05431
05432
05433
05434
05435
05436
05437
05438
05439
05440
05441
05442
05443
05444
05445
05446 static void merge_type(int attr_idx,
05447 int type_idx,
05448 int id_line,
05449 int id_column)
05450
05451 {
05452 boolean error = FALSE;
05453 int func_idx;
05454 int msg_num;
05455 opnd_type opnd;
05456 char *ptr;
05457 char *ptr2;
05458 boolean referenced_itrfc = FALSE;
05459 int rslt_idx;
05460 obj_type sem_type = Obj_Typed;
05461 boolean set_type = FALSE;
05462
05463
05464 TRACE (Func_Entry, "merge_type", NULL);
05465
05466 if (AT_OBJ_CLASS(attr_idx) == Interface &&
05467 !AT_IS_INTRIN(attr_idx) &&
05468 ATI_PROC_IDX(attr_idx) != NULL_IDX) {
05469 referenced_itrfc = AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref;
05470 attr_idx = ATI_PROC_IDX(attr_idx);
05471 }
05472
05473 if (AT_OBJ_CLASS(attr_idx) == Pgm_Unit && ATP_RSLT_NAME(attr_idx)) {
05474
05475
05476
05477 PRINTMSG(id_line, 185, Error, id_column,
05478 AT_OBJ_NAME_PTR(attr_idx),
05479 AT_OBJ_NAME_PTR(ATP_RSLT_IDX(attr_idx)));
05480 AT_DCL_ERR(attr_idx) = TRUE;
05481 AT_DCL_ERR(ATP_RSLT_IDX(attr_idx)) = TRUE;
05482 goto EXIT;
05483 }
05484
05485 if (TYP_TYPE(type_idx) == Character &&
05486 TYP_CHAR_CLASS(type_idx) == Assumed_Size_Char) {
05487 sem_type = Obj_Assum_Type_Ch;
05488 error = fnd_semantic_err(sem_type,
05489 id_line,
05490 id_column,
05491 attr_idx,
05492 TRUE);
05493 }
05494
05495 # if ! defined(_EXTENDED_CRI_CHAR_POINTER)
05496 else if (TYP_TYPE(type_idx) == Character &&
05497 AT_OBJ_CLASS(attr_idx) == Data_Obj &&
05498 ATD_CLASS(attr_idx) == CRI__Pointee) {
05499 PRINTMSG(id_line,625,Error,id_column,
05500 AT_OBJ_NAME_PTR(attr_idx),
05501 "Cray pointee","CHARACTER*(*)");
05502 AT_DCL_ERR(attr_idx) = TRUE;
05503 error = TRUE;
05504 }
05505 # endif
05506 else if (AT_ATTR_LINK(attr_idx) != NULL_IDX ||
05507 AT_USE_ASSOCIATED(attr_idx) ||
05508 AT_OBJ_CLASS(attr_idx) != Data_Obj ||
05509 ATD_SYMBOLIC_CONSTANT(attr_idx) ||
05510 AT_TYPED(attr_idx) ) {
05511
05512
05513
05514
05515
05516
05517 ptr = get_basic_type_str(type_idx);
05518 (obj_str[Obj_Typed]) = ptr;
05519
05520
05521 error = fnd_semantic_err(Obj_Typed,
05522 id_line,
05523 id_column,
05524 attr_idx,
05525 TRUE);
05526 }
05527
05528
05529
05530
05531 # ifdef _DEBUG
05532
05533
05534
05535
05536
05537 if (!error && fnd_semantic_err(Obj_Typed,
05538 id_line,
05539 id_column,
05540 attr_idx,
05541 TRUE)) {
05542 PRINTMSG(id_line, 655, Internal, id_column, "merge_type");
05543 }
05544
05545 # endif
05546
05547 if (AT_ARG_TO_KIND(attr_idx)) {
05548 PRINTMSG(id_line, 1522, Error, id_column, AT_OBJ_NAME_PTR(attr_idx));
05549 error = TRUE;
05550 }
05551
05552 if (error) {
05553 AT_DCL_ERR(attr_idx) = TRUE;
05554 goto EXIT;
05555 }
05556
05557 switch (AT_OBJ_CLASS(attr_idx)) {
05558 case Data_Obj:
05559
05560 if (ATD_CLASS(attr_idx) == CRI__Pointee) {
05561
05562 if (TYP_TYPE(type_idx) == Structure) {
05563 PRINTMSG(id_line, 650, Error,
05564 id_column,
05565 AT_OBJ_NAME_PTR(attr_idx));
05566 AT_DCL_ERR(attr_idx) = TRUE;
05567 }
05568 }
05569
05570 if (AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref ||
05571 ATD_CLASS(attr_idx) == Constant ||
05572 AT_NAMELIST_OBJ(attr_idx) ||
05573 ATD_DATA_INIT(attr_idx)) {
05574
05575 if (TYP_LINEAR(ATD_TYPE_IDX(attr_idx)) != TYP_LINEAR(type_idx)) {
05576
05577
05578
05579
05580
05581 if (TYP_TYPE(type_idx) == Character &&
05582 TYP_FLD(type_idx) == AT_Tbl_Idx &&
05583 find_attr_in_ir(attr_idx,
05584 ATD_TMP_IDX(TYP_IDX(type_idx)),
05585 &opnd)) {
05586 AT_DCL_ERR(attr_idx) = TRUE;
05587 PRINTMSG(OPND_LINE_NUM(opnd), 1035, Error,
05588 OPND_COL_NUM(opnd),
05589 AT_OBJ_NAME_PTR(attr_idx));
05590 }
05591 else if (SCP_IMPL_NONE(curr_scp_idx)) {
05592 PRINTMSG(id_line, 1424, Error, id_column,
05593 AT_OBJ_NAME_PTR(attr_idx));
05594 }
05595 else {
05596
05597 if (ATD_CLASS(attr_idx) == Constant) {
05598 msg_num = 238;
05599 }
05600 else if (ATD_DATA_INIT(attr_idx)) {
05601 msg_num = 239;
05602 }
05603 else if (AT_NAMELIST_OBJ(attr_idx)) {
05604 msg_num = 1002;
05605 }
05606 else {
05607 msg_num = 827;
05608 }
05609
05610 if (!AT_DCL_ERR(attr_idx)) {
05611 PRINTMSG(id_line, msg_num, Error,
05612 id_column,
05613 AT_OBJ_NAME_PTR(attr_idx),
05614 get_basic_type_str(ATD_TYPE_IDX(attr_idx)));
05615 }
05616 }
05617
05618 type_idx = ATD_TYPE_IDX(attr_idx);
05619 }
05620 else if (SCP_IMPL_NONE(curr_scp_idx)) {
05621 PRINTMSG(id_line, 1423, Ansi, id_column,
05622 AT_OBJ_NAME_PTR(attr_idx));
05623 }
05624 }
05625 else if (sem_type == Obj_Assum_Type_Ch &&
05626 ATD_CLASS(attr_idx) == Function_Result) {
05627 func_idx = ATD_FUNC_IDX(attr_idx);
05628
05629 PRINTMSG(id_line, 1565,
05630 #ifdef KEY
05631 Ansi,
05632 #else
05633 Comment,
05634 #endif
05635 id_column);
05636
05637
05638
05639 if (ATP_PROC(func_idx) == Intern_Proc ||
05640 ATP_PROC(func_idx) == Module_Proc) {
05641
05642
05643
05644
05645 PRINTMSG(id_line, 367, Error, id_column,
05646 AT_OBJ_NAME_PTR(func_idx));
05647
05648 AT_DCL_ERR(attr_idx) = TRUE;
05649 AT_DCL_ERR(func_idx) = TRUE;
05650 }
05651 else if (ATP_IN_INTERFACE_BLK(func_idx)) {
05652
05653
05654
05655
05656 PRINTMSG(id_line, 1566, Warning, id_column,
05657 AT_OBJ_NAME_PTR(func_idx));
05658 }
05659 else if (ATP_RECURSIVE(func_idx)) {
05660
05661
05662
05663
05664 PRINTMSG(id_line, 506, Error, id_column,
05665 AT_OBJ_NAME_PTR(func_idx));
05666
05667 AT_DCL_ERR(attr_idx) = TRUE;
05668 AT_DCL_ERR(func_idx) = TRUE;
05669 }
05670 }
05671
05672 set_type = TRUE;
05673 break;
05674
05675
05676 case Pgm_Unit:
05677
05678 if (ATP_PGM_UNIT(attr_idx) != Function) {
05679 CREATE_FUNC_RSLT(attr_idx, rslt_idx);
05680 ATP_PGM_UNIT(attr_idx) = Function;
05681 }
05682 else {
05683 rslt_idx = ATP_RSLT_IDX(attr_idx);
05684
05685 if (attr_idx != SCP_ATTR_IDX(curr_scp_idx) &&
05686 !ATP_ALT_ENTRY(attr_idx) &&
05687 (AT_REFERENCED(rslt_idx) >= Dcl_Bound_Ref || referenced_itrfc)) {
05688
05689
05690
05691 if (ATD_TYPE_IDX(rslt_idx) != type_idx) {
05692
05693
05694
05695
05696
05697
05698 if (TYP_TYPE(type_idx) == Character &&
05699 TYP_FLD(type_idx) == AT_Tbl_Idx &&
05700 find_attr_in_ir(attr_idx,
05701 ATD_TMP_IDX(TYP_IDX(type_idx)),
05702 &opnd)) {
05703 AT_DCL_ERR(attr_idx) = TRUE;
05704 PRINTMSG(OPND_LINE_NUM(opnd), 1035, Error,
05705 OPND_COL_NUM(opnd),
05706 AT_OBJ_NAME_PTR(attr_idx));
05707 }
05708 else {
05709 PRINTMSG(id_line,
05710 118,
05711 Error,
05712 id_column,
05713 AT_OBJ_NAME_PTR(attr_idx),
05714 get_basic_type_str(ATD_TYPE_IDX(rslt_idx)));
05715 }
05716
05717 type_idx = ATD_TYPE_IDX(rslt_idx);
05718 }
05719 }
05720 else if (sem_type == Obj_Assum_Type_Ch) {
05721
05722
05723
05724 PRINTMSG(id_line, 1565,
05725 #ifdef KEY
05726 Ansi,
05727 #else
05728 Comment,
05729 #endif
05730 id_column);
05731
05732 if (ATP_PROC(attr_idx) == Intern_Proc ||
05733 ATP_PROC(attr_idx) == Module_Proc) {
05734
05735
05736
05737
05738 AT_DCL_ERR(attr_idx) = TRUE;
05739 AT_DCL_ERR(rslt_idx) = TRUE;
05740 PRINTMSG(id_line, 367, Error,
05741 id_column,
05742 AT_OBJ_NAME_PTR(attr_idx));
05743 }
05744 else if (ATP_IN_INTERFACE_BLK(attr_idx)) {
05745
05746
05747
05748
05749 PRINTMSG(id_line, 1566, Warning, id_column,
05750 AT_OBJ_NAME_PTR(attr_idx));
05751 }
05752 else if (ATP_RECURSIVE(attr_idx)) {
05753
05754
05755
05756
05757 AT_DCL_ERR(attr_idx) = TRUE;
05758 AT_DCL_ERR(rslt_idx) = TRUE;
05759 PRINTMSG(id_line,
05760 506,
05761 Error,
05762 id_column,
05763 AT_OBJ_NAME_PTR(attr_idx));
05764 }
05765 }
05766 }
05767
05768 set_type = TRUE;
05769 attr_idx = rslt_idx;
05770 break;
05771
05772 case Interface:
05773
05774 if (AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref) {
05775
05776
05777
05778
05779
05780
05781
05782 if (ATP_RSLT_IDX(SN_ATTR_IDX(ATI_FIRST_SPECIFIC_IDX(attr_idx))) !=
05783 NULL_IDX &&
05784 TYP_TYPE(ATD_TYPE_IDX(ATP_RSLT_IDX(
05785 SN_ATTR_IDX(ATI_FIRST_SPECIFIC_IDX(attr_idx))))) !=
05786 TYP_TYPE(type_idx)) {
05787 PRINTMSG(id_line, 950, Error, id_column,
05788 AT_OBJ_NAME_PTR(attr_idx));
05789 }
05790 }
05791
05792 set_type = TRUE;
05793 break;
05794
05795 case Stmt_Func:
05796
05797 if (AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref &&
05798 TYP_LINEAR(ATD_TYPE_IDX(attr_idx)) != TYP_LINEAR(type_idx)) {
05799 AT_TYPED(attr_idx) = TRUE;
05800
05801
05802
05803
05804
05805
05806 if (TYP_TYPE(type_idx) == Character &&
05807 TYP_FLD(type_idx) == AT_Tbl_Idx &&
05808 find_attr_in_ir(attr_idx,
05809 ATD_TMP_IDX(TYP_IDX(type_idx)),
05810 &opnd)) {
05811 AT_DCL_ERR(attr_idx) = TRUE;
05812 PRINTMSG(OPND_LINE_NUM(opnd), 1035, Error,
05813 OPND_COL_NUM(opnd),
05814 AT_OBJ_NAME_PTR(attr_idx));
05815 }
05816 else if (SCP_IMPL_NONE(curr_scp_idx)) {
05817 PRINTMSG(id_line, 1424, Error, id_column,
05818 AT_OBJ_NAME_PTR(attr_idx));
05819 }
05820 else {
05821 PRINTMSG(id_line, 827, Error,
05822 id_column,
05823 AT_OBJ_NAME_PTR(attr_idx),
05824 get_basic_type_str(ATD_TYPE_IDX(attr_idx)));
05825 }
05826 }
05827 else {
05828
05829 if (SCP_IMPL_NONE(curr_scp_idx)) {
05830 PRINTMSG(id_line, 1423, Ansi, id_column,
05831 AT_OBJ_NAME_PTR(attr_idx));
05832 }
05833 set_type = TRUE;
05834 }
05835 break;
05836
05837 default:
05838 break;
05839
05840 }
05841
05842 if (set_type) {
05843
05844 if (AT_TYPED(attr_idx)) {
05845 ptr = get_basic_type_str(type_idx);
05846
05847 #ifdef KEY
05848 ptr2 = get_basic_type_str(ATD_TYPE_IDX(attr_idx));
05849
05850
05851
05852 if (type_idx == ATD_TYPE_IDX(attr_idx) ||
05853 0 == strcmp(ptr, ptr2)) {
05854 PRINTMSG(id_line, 1259, ansi_or_warning(), id_column,
05855 AT_OBJ_NAME_PTR(attr_idx), AT_DEF_LINE(attr_idx), ptr);
05856 }
05857 else {
05858 PRINTMSG(id_line, 550, Error, id_column, AT_OBJ_NAME_PTR(attr_idx),
05859 ptr2, ptr, AT_DEF_LINE(attr_idx));
05860 }
05861 #else
05862 if (type_idx == ATD_TYPE_IDX(attr_idx)) {
05863 PRINTMSG(id_line, 1259, Ansi, id_column,
05864 AT_OBJ_NAME_PTR(attr_idx), ptr);
05865 }
05866 else {
05867 ptr2 = get_basic_type_str(ATD_TYPE_IDX(attr_idx));
05868 PRINTMSG(id_line, 550, Error, id_column,
05869 AT_OBJ_NAME_PTR(attr_idx), ptr2, ptr);
05870 }
05871 #endif
05872 }
05873 else {
05874 AT_TYPED(attr_idx) = TRUE;
05875 ATD_TYPE_IDX(attr_idx) = type_idx;
05876 }
05877 }
05878
05879 EXIT:
05880
05881 TRACE (Func_Exit, "merge_type", NULL);
05882
05883 return;
05884
05885 }
05886
05887
05888
05889
05890
05891
05892
05893
05894
05895
05896
05897
05898
05899
05900
05901
05902
05903
05904 static void issue_attr_blk_err(char *attr_str)
05905
05906 {
05907 boolean issue_msg = TRUE;
05908 #ifdef KEY
05909 char *msg_str = 0;
05910 #else
05911 char *msg_str;
05912 #endif
05913
05914
05915 TRACE (Func_Entry, "issue_attr_blk_err", NULL);
05916
05917 switch (CURR_BLK) {
05918
05919 case Unknown_Blk:
05920 PRINTMSG(TOKEN_LINE(token), 160, Internal, TOKEN_COLUMN(token));
05921 break;
05922
05923 case Program_Blk:
05924 msg_str = "PROGRAM";
05925 break;
05926
05927 case Function_Blk:
05928 msg_str = "FUNCTION";
05929 break;
05930
05931 case Subroutine_Blk:
05932 msg_str = "SUBROUTINE";
05933 break;
05934
05935 case Module_Blk:
05936 msg_str = "MODULE";
05937 break;
05938
05939 case Blockdata_Blk:
05940 msg_str = "BLOCKDATA";
05941 break;
05942
05943 case Interface_Body_Blk:
05944 case Internal_Blk:
05945 case Module_Proc_Blk:
05946 msg_str = (ATP_PGM_UNIT(CURR_BLK_NAME) == Function) ? "FUNCTION" :
05947 "SUBROUTINE";
05948 break;
05949
05950 case Where_Then_Blk:
05951 case Where_Else_Blk:
05952 case Where_Else_Mask_Blk:
05953 case Select_Blk:
05954 case Case_Blk:
05955 case Do_Blk:
05956 case If_Blk:
05957 case If_Then_Blk:
05958 case If_Else_If_Blk:
05959 case If_Else_Blk:
05960 case Contains_Blk:
05961 case Derived_Type_Blk:
05962 case Interface_Blk:
05963 #ifdef KEY
05964 case Enum_Blk:
05965 #endif
05966
05967
05968
05969
05970
05971
05972
05973
05974
05975 issue_msg = FALSE;
05976 break;
05977
05978
05979 }
05980
05981 if (issue_msg) {
05982 AT_DCL_ERR(AT_WORK_IDX) = TRUE;
05983 PRINTMSG(TOKEN_LINE(token), 595, Error,
05984 TOKEN_COLUMN(token),
05985 attr_str,
05986 msg_str);
05987 }
05988
05989 TRACE (Func_Exit, "issue_attr_blk_err", NULL);
05990
05991 return;
05992
05993 }
05994
05995
05996
05997
05998
05999
06000
06001
06002
06003
06004
06005
06006
06007
06008
06009
06010
06011
06012
06013
06014
06015
06016
06017 static boolean parse_data_imp_do(opnd_type *result_opnd)
06018
06019 {
06020 int attr_idx;
06021 int column;
06022 int expr_start_col;
06023 int expr_start_line;
06024 boolean found_attr;
06025 boolean had_equal = FALSE;
06026 int imp_do_start_col;
06027 int imp_do_start_line;
06028 int ir_idx;
06029 int line;
06030 int list_idx;
06031 int list2_idx = NULL_IDX;
06032 int name_column;
06033 int name_idx;
06034 int name_line;
06035 opnd_type opnd;
06036 boolean parsed_ok = TRUE;
06037 boolean save_in_implied_do;
06038
06039
06040 TRACE (Func_Entry, "parse_data_imp_do", NULL);
06041
06042
06043
06044 NTR_IR_TBL(ir_idx);
06045 IR_OPR(ir_idx) = Implied_Do_Opr;
06046 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
06047 IR_LINE_NUM(ir_idx) = LA_CH_LINE;
06048 IR_COL_NUM(ir_idx) = LA_CH_COLUMN;
06049 OPND_FLD((*result_opnd)) = IR_Tbl_Idx;
06050 OPND_IDX((*result_opnd)) = ir_idx;
06051
06052 imp_do_start_line = LA_CH_LINE;
06053 imp_do_start_col = LA_CH_COLUMN;
06054 save_in_implied_do = in_implied_do;
06055 in_implied_do = TRUE;
06056
06057
06058
06059
06060
06061
06062
06063 do {
06064
06065
06066
06067
06068 NEXT_LA_CH;
06069
06070 if (LA_CH_VALUE == LPAREN) {
06071
06072 if (parsed_ok = parse_data_imp_do(&opnd)) {
06073
06074 if (LA_CH_VALUE != COMMA) {
06075 parsed_ok = FALSE;
06076 parse_err_flush(Find_Rparen, ",");
06077 continue;
06078 }
06079 }
06080 else {
06081
06082 if (LA_CH_VALUE != EOS) {
06083 parse_err_flush(Find_Rparen, NULL);
06084 NEXT_LA_CH;
06085 }
06086
06087 goto EXIT;
06088 }
06089 }
06090 else if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
06091
06092 if (LA_CH_VALUE == EQUAL) {
06093 had_equal = TRUE;
06094
06095 parsed_ok = parse_deref(&opnd, NULL_IDX) && parsed_ok;
06096
06097 if (parsed_ok) {
06098 mark_attr_defined(&opnd);
06099 }
06100
06101 if (OPND_FLD(opnd) == AT_Tbl_Idx &&
06102 AT_OBJ_CLASS(OPND_IDX(opnd)) == Data_Obj) {
06103
06104 ATD_SEEN_AS_LCV(OPND_IDX(opnd)) = TRUE;
06105
06106 if (ATD_SEEN_IN_IMP_DO(OPND_IDX(opnd)) &&
06107 (AT_DEF_LINE(OPND_IDX(opnd)) > imp_do_start_line ||
06108 (AT_DEF_LINE(OPND_IDX(opnd)) == imp_do_start_line &&
06109 AT_DEF_COLUMN(OPND_IDX(opnd)) > imp_do_start_col))) {
06110
06111
06112
06113 ATD_SEEN_IN_IMP_DO(OPND_IDX(opnd)) = FALSE;
06114 }
06115 }
06116
06117
06118
06119
06120
06121
06122 if (OPND_FLD(opnd) == AT_Tbl_Idx &&
06123 AT_OBJ_CLASS(OPND_IDX(opnd)) == Data_Obj) {
06124 attr_idx = OPND_IDX(opnd);
06125 }
06126
06127 NTR_IR_LIST_TBL(list_idx);
06128 IR_FLD_R(ir_idx) = IL_Tbl_Idx;
06129 IR_IDX_R(ir_idx) = list_idx;
06130 COPY_OPND(IL_OPND(list_idx), opnd);
06131
06132
06133
06134
06135
06136 NEXT_LA_CH;
06137
06138 NTR_IR_LIST_TBL(list2_idx);
06139 IL_NEXT_LIST_IDX(list_idx) = list2_idx;
06140 IL_PREV_LIST_IDX(list2_idx) = list_idx;
06141 expr_start_line = LA_CH_LINE;
06142 expr_start_col = LA_CH_COLUMN;
06143 parsed_ok = parse_expr(&opnd) && parsed_ok;
06144 COPY_OPND(IL_OPND(list2_idx), opnd);
06145 IL_LINE_NUM(list2_idx) = expr_start_line;
06146 IL_COL_NUM(list2_idx) = expr_start_col;
06147
06148 if (LA_CH_VALUE != COMMA) {
06149 parsed_ok = FALSE;
06150 parse_err_flush(Find_Rparen, ",");
06151 continue;
06152 }
06153
06154
06155
06156
06157
06158 NEXT_LA_CH;
06159
06160 NTR_IR_LIST_TBL(list_idx);
06161 IL_NEXT_LIST_IDX(list2_idx) = list_idx;
06162 IL_PREV_LIST_IDX(list_idx) = list2_idx;
06163 expr_start_line = LA_CH_LINE;
06164 expr_start_col = LA_CH_COLUMN;
06165 parsed_ok = parse_expr(&opnd) && parsed_ok;
06166 COPY_OPND(IL_OPND(list_idx), opnd);
06167 IL_LINE_NUM(list_idx) = expr_start_line;
06168 IL_COL_NUM(list_idx) = expr_start_col;
06169
06170
06171
06172
06173
06174 if (LA_CH_VALUE == COMMA) {
06175 NEXT_LA_CH;
06176 NTR_IR_LIST_TBL(list2_idx);
06177 IL_NEXT_LIST_IDX(list_idx) = list2_idx;
06178 IL_PREV_LIST_IDX(list2_idx) = list_idx;
06179 expr_start_line = LA_CH_LINE;
06180 expr_start_col = LA_CH_COLUMN;
06181 parsed_ok = parse_expr(&opnd) && parsed_ok;
06182 COPY_OPND(IL_OPND(list2_idx), opnd);
06183 IL_LINE_NUM(list2_idx) = expr_start_line;
06184 IL_COL_NUM(list2_idx) = expr_start_col;
06185 IR_LIST_CNT_R(ir_idx) = 4;
06186 }
06187 else {
06188 IR_LIST_CNT_R(ir_idx) = 3;
06189 }
06190
06191 break;
06192 }
06193 else {
06194
06195
06196
06197
06198
06199 attr_idx =
06200 srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
06201
06202 if (attr_idx == NULL_IDX) {
06203 found_attr = FALSE;
06204 attr_idx = ntr_sym_tbl(&token, name_idx);
06205 LN_DEF_LOC(name_idx) = TRUE;
06206 SET_IMPL_TYPE(attr_idx);
06207 }
06208 else {
06209 found_attr = TRUE;
06210
06211 if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
06212 AT_ATTR_LINK(attr_idx) = NULL_IDX;
06213 LN_DEF_LOC(name_idx) = TRUE;
06214 }
06215 }
06216
06217 name_line = TOKEN_LINE(token);
06218 name_column = TOKEN_COLUMN(token);
06219
06220
06221
06222
06223
06224
06225
06226
06227
06228
06229 if (LA_CH_VALUE == LPAREN || LA_CH_VALUE == PERCENT) {
06230
06231 if (parse_deref(&opnd, NULL_IDX)) {
06232
06233 if (OPND_FLD(opnd) == IR_Tbl_Idx &&
06234 IR_OPR(OPND_IDX(opnd)) == Call_Opr) {
06235 PRINTMSG(name_line, 699, Error, name_column);
06236 parsed_ok = FALSE;
06237 }
06238
06239 if (LA_CH_VALUE == EQUAL) {
06240 find_opnd_line_and_column(&opnd, &line, &column);
06241 PRINTMSG(line, 199, Error, column);
06242 parse_err_flush(Find_Rparen, NULL_IDX);
06243 parsed_ok = FALSE;
06244 }
06245
06246 }
06247 else {
06248 parse_err_flush(Find_Rparen, NULL);
06249 parsed_ok = FALSE;
06250 }
06251
06252 }
06253 else {
06254 OPND_LINE_NUM(opnd) = TOKEN_LINE(token);
06255 OPND_COL_NUM(opnd) = TOKEN_COLUMN(token);
06256 OPND_FLD(opnd) = AT_Tbl_Idx;
06257 OPND_IDX(opnd) = attr_idx;
06258 }
06259
06260 if (parsed_ok) {
06261
06262 if (! merge_data(found_attr, name_line, name_column, attr_idx)) {
06263 parsed_ok = FALSE;
06264 }
06265 }
06266 }
06267 }
06268 else {
06269 parsed_ok = FALSE;
06270 parse_err_flush(Find_Rparen,
06271 (list2_idx == NULL_IDX) ?
06272 "data-i-do-object" :
06273 "data-i-do-object or data-i-do-variable");
06274 }
06275
06276
06277
06278
06279 NTR_IR_LIST_TBL(list_idx);
06280 COPY_OPND(IL_OPND(list_idx), opnd);
06281
06282 if (IR_IDX_L(ir_idx) == NULL_IDX) {
06283 IR_LIST_CNT_L(ir_idx) = 1;
06284 IR_FLD_L(ir_idx) = IL_Tbl_Idx;
06285 IR_IDX_L(ir_idx) = list_idx;
06286 }
06287 else {
06288 IL_NEXT_LIST_IDX(list2_idx) = list_idx;
06289 IL_PREV_LIST_IDX(list_idx) = list2_idx;
06290 ++IR_LIST_CNT_L(ir_idx);
06291 }
06292
06293 list2_idx = list_idx;
06294 }
06295 while (LA_CH_VALUE == COMMA);
06296
06297 in_implied_do = save_in_implied_do;
06298
06299 if (LA_CH_VALUE == RPAREN) {
06300
06301 if (! SH_ERR_FLG(curr_stmt_sh_idx) && ! had_equal) {
06302 parsed_ok = FALSE;
06303 parse_err_flush(Find_Rparen, ",");
06304 }
06305 }
06306 else {
06307
06308 if (had_equal) {
06309 parse_err_flush(Find_EOS,
06310 (IR_LIST_CNT_R(ir_idx) == 3) ? ", or )" : ")");
06311 }
06312 else {
06313
06314 if (IL_FLD(list2_idx) == AT_Tbl_Idx) {
06315 parse_err_flush(Find_EOS, "=, comma, or '(subscript-list)'");
06316 }
06317 else {
06318 parse_err_flush(Find_EOS, ",");
06319 }
06320
06321 }
06322
06323 parsed_ok = FALSE;
06324 goto EXIT;
06325 }
06326
06327 NEXT_LA_CH;
06328
06329 EXIT:
06330
06331 TRACE (Func_Exit, "parse_data_imp_do", NULL);
06332
06333 return(parsed_ok);
06334
06335 }
06336
06337
06338
06339
06340
06341
06342
06343
06344
06345
06346
06347
06348
06349
06350
06351
06352
06353
06354
06355 void char_bounds_resolution(int attr_idx,
06356 boolean *chk_semantics)
06357
06358 {
06359 int tmp_idx;
06360
06361
06362 TRACE (Func_Entry, "char_bounds_resolution", NULL);
06363
06364 if (TYP_FLD(ATD_TYPE_IDX(attr_idx)) == CN_Tbl_Idx) {
06365 return;
06366 }
06367
06368 tmp_idx = TYP_IDX(ATD_TYPE_IDX(attr_idx));
06369 xref_state = CIF_Symbol_Reference;
06370 no_func_expansion = TRUE;
06371
06372
06373
06374
06375 if (ATD_CLASS(tmp_idx) != Constant) {
06376 bound_semantics(tmp_idx, FALSE);
06377 }
06378
06379 char_len_resolution(attr_idx, TRUE);
06380
06381 if (TYP_CHAR_CLASS(ATD_TYPE_IDX(attr_idx)) != Const_Len_Char) {
06382
06383
06384
06385
06386
06387 *chk_semantics = TRUE;
06388 }
06389
06390 no_func_expansion = FALSE;
06391
06392 TRACE (Func_Exit, "char_bounds_resolution", NULL);
06393
06394 return;
06395
06396 }
06397
06398
06399
06400
06401
06402
06403
06404
06405
06406
06407
06408
06409
06410
06411
06412
06413
06414
06415
06416 void array_bounds_resolution(int attr_idx,
06417 boolean *chk_semantics)
06418
06419 {
06420 int bd_idx;
06421 int dim;
06422
06423
06424 TRACE (Func_Entry, "array_bounds_resolution", NULL);
06425
06426 bd_idx = ATD_ARRAY_IDX(attr_idx);
06427
06428 if (BD_RESOLVED(bd_idx)) {
06429 return;
06430 }
06431
06432 if (BD_ARRAY_CLASS(bd_idx) != Deferred_Shape) {
06433 xref_state = CIF_Symbol_Reference;
06434 no_func_expansion = TRUE;
06435
06436
06437
06438
06439 for (dim = 1; dim <= BD_RANK(bd_idx); dim++) {
06440
06441 if (BD_LB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06442 ATD_CLASS(BD_LB_IDX(bd_idx, dim)) != Constant) {
06443 bound_semantics(BD_LB_IDX(bd_idx, dim), FALSE);
06444
06445 if (BD_LB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06446 ATD_CLASS(BD_LB_IDX(bd_idx, dim)) != Constant) {
06447
06448
06449
06450 AT_REFERENCED(BD_LB_IDX(bd_idx, dim)) = Referenced;
06451 }
06452 }
06453
06454 if (BD_UB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06455 ATD_CLASS(BD_UB_IDX(bd_idx, dim)) != Constant) {
06456 bound_semantics(BD_UB_IDX(bd_idx, dim), FALSE);
06457
06458 if (BD_UB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06459 ATD_CLASS(BD_UB_IDX(bd_idx, dim)) != Constant) {
06460
06461
06462
06463 AT_REFERENCED(BD_UB_IDX(bd_idx, dim)) = Referenced;
06464 }
06465 }
06466 }
06467
06468 no_func_expansion = FALSE;
06469 }
06470
06471
06472
06473
06474
06475
06476 array_dim_resolution(attr_idx, TRUE);
06477
06478
06479
06480 if (BD_ARRAY_CLASS(ATD_ARRAY_IDX(attr_idx)) != Explicit_Shape ||
06481 BD_ARRAY_SIZE(ATD_ARRAY_IDX(attr_idx)) != Constant_Size) {
06482 *chk_semantics = TRUE;
06483 }
06484
06485 # ifdef _F_MINUS_MINUS
06486 bd_idx = ATD_PE_ARRAY_IDX(attr_idx);
06487
06488 if (bd_idx == NULL_IDX ||
06489 BD_RESOLVED(bd_idx)) {
06490 return;
06491 }
06492
06493 if (BD_ARRAY_CLASS(bd_idx) != Deferred_Shape) {
06494 xref_state = CIF_Symbol_Reference;
06495 no_func_expansion = TRUE;
06496
06497
06498
06499
06500 for (dim = 1; dim <= BD_RANK(bd_idx); dim++) {
06501
06502 if (BD_LB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06503 ATD_CLASS(BD_LB_IDX(bd_idx, dim)) != Constant) {
06504 bound_semantics(BD_LB_IDX(bd_idx, dim), FALSE);
06505
06506 if (BD_LB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06507 ATD_CLASS(BD_LB_IDX(bd_idx, dim)) != Constant) {
06508
06509
06510
06511 AT_REFERENCED(BD_LB_IDX(bd_idx, dim)) = Referenced;
06512 }
06513 }
06514
06515 if (BD_UB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06516 ATD_CLASS(BD_UB_IDX(bd_idx, dim)) != Constant) {
06517 bound_semantics(BD_UB_IDX(bd_idx, dim), FALSE);
06518
06519 if (BD_UB_FLD(bd_idx, dim) == AT_Tbl_Idx &&
06520 ATD_CLASS(BD_UB_IDX(bd_idx, dim)) != Constant) {
06521
06522
06523
06524 AT_REFERENCED(BD_UB_IDX(bd_idx, dim)) = Referenced;
06525 }
06526 }
06527 }
06528
06529 no_func_expansion = FALSE;
06530 }
06531
06532 pe_array_dim_resolution(attr_idx);
06533
06534 # endif
06535 TRACE (Func_Exit, "array_bounds_resolution", NULL);
06536
06537 return;
06538
06539 }
06540
06541
06542
06543
06544
06545
06546
06547
06548
06549
06550
06551
06552
06553
06554
06555
06556
06557
06558
06559
06560
06561
06562
06563
06564
06565 static void merge_parameter(boolean chk_semantics,
06566 int attr_idx,
06567 int line,
06568 int column,
06569 opnd_type *opnd,
06570 expr_arg_type *const_exp_desc,
06571 int const_line,
06572 int const_column)
06573
06574 {
06575 int a_type_idx;
06576 int c_type_idx;
06577 char *c_char_ptr;
06578 char *char_ptr;
06579 long_type constant[MAX_WORDS_FOR_NUMERIC];
06580 int const_idx;
06581 long64 i;
06582 char msg_str[45];
06583 int o_column;
06584 int o_line;
06585 long_type the_constant;
06586
06587
06588 TRACE (Func_Entry, "merge_parameter", NULL);
06589
06590 if (chk_semantics) {
06591
06592 if (fnd_semantic_err(Obj_Constant, line, column, attr_idx, TRUE)) {
06593 goto EXIT;
06594 }
06595
06596 if ((AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref || AT_DEFINED(attr_idx))) {
06597 AT_DCL_ERR(attr_idx) = TRUE;
06598
06599 if (ATD_CLASS(attr_idx) == Atd_Unknown) {
06600
06601
06602
06603
06604 PRINTMSG(line, 1426, Error, column,
06605 AT_OBJ_NAME_PTR(attr_idx));
06606 }
06607 else {
06608 PRINTMSG(line, 559, Error, column,
06609 AT_OBJ_NAME_PTR(attr_idx),
06610 "PARAMETER");
06611 goto EXIT;
06612 }
06613 }
06614 }
06615
06616 a_type_idx = ATD_TYPE_IDX(attr_idx);
06617
06618 if (TYP_TYPE(a_type_idx) == Structure &&
06619 #ifdef KEY
06620
06621
06622
06623
06624
06625 ATT_ALLOCATABLE_CPNT(TYP_IDX(a_type_idx))
06626 #else
06627 ATT_POINTER_CPNT(TYP_IDX(a_type_idx))
06628 #endif
06629 ) {
06630 PRINTMSG(line, 691, Error, column,
06631 AT_OBJ_NAME_PTR(attr_idx));
06632 AT_DCL_ERR(attr_idx) = TRUE;
06633 goto EXIT;
06634 }
06635
06636
06637
06638
06639
06640
06641
06642
06643
06644 AT_DEFINED(attr_idx) = TRUE;
06645 ATD_CLASS(attr_idx) = Constant;
06646
06647 if (opnd == NULL_IDX || ! const_exp_desc->foldable) {
06648
06649
06650
06651 find_opnd_line_and_column(opnd, &o_line, &o_column);
06652 PRINTMSG(o_line, 587, Error, o_column,
06653 AT_OBJ_NAME_PTR(attr_idx));
06654 AT_DCL_ERR(attr_idx) = TRUE;
06655 ATD_CONST_IDX(attr_idx) = NULL_IDX;
06656 ATD_FLD(attr_idx) = NO_Tbl_Idx;
06657 goto EXIT;
06658 }
06659
06660
06661 while (OPND_FLD((*opnd)) == IR_Tbl_Idx) {
06662 COPY_OPND((*opnd), IR_OPND_L(OPND_IDX((*opnd))));
06663 }
06664
06665 ATD_FLD(attr_idx) = OPND_FLD((*opnd));
06666 ATD_CONST_IDX(attr_idx) = OPND_IDX((*opnd));
06667
06668 if (OPND_FLD((*opnd)) == AT_Tbl_Idx) {
06669
06670
06671
06672 AT_REFERENCED(attr_idx) = Referenced;
06673
06674
06675 AT_NAME_IDX(OPND_IDX((*opnd))) = AT_NAME_IDX(attr_idx);
06676 AT_NAME_LEN(OPND_IDX((*opnd))) = AT_NAME_LEN(attr_idx);
06677
06678 c_type_idx = const_exp_desc->type_idx;
06679 find_opnd_line_and_column(opnd, &o_line, &o_column);
06680
06681 if (TYP_LINEAR(c_type_idx) == Long_Typeless) {
06682 PRINTMSG(o_line, 1133, Error, o_column);
06683 AT_DCL_ERR(attr_idx) = TRUE;
06684 goto EXIT;
06685 }
06686
06687 if (!check_asg_semantics(a_type_idx, c_type_idx, o_line, o_column)) {
06688 msg_str[0] = '\0';
06689 strcpy(msg_str, get_basic_type_str(a_type_idx));
06690
06691 PRINTMSG(line, 580, Error, column,
06692 AT_OBJ_NAME_PTR(attr_idx),
06693 msg_str,
06694 get_basic_type_str(c_type_idx));
06695
06696 AT_DCL_ERR(attr_idx) = TRUE;
06697 goto EXIT;
06698 }
06699
06700
06701
06702 if (const_exp_desc->rank > 0) {
06703
06704 if (ATD_ARRAY_IDX(attr_idx) == NULL_IDX) {
06705 PRINTMSG(line, 835, Error, column,
06706 AT_OBJ_NAME_PTR(attr_idx));
06707 AT_DCL_ERR(attr_idx) = TRUE;
06708 goto EXIT;
06709 }
06710
06711 if (const_exp_desc->rank == BD_RANK(ATD_ARRAY_IDX(attr_idx))) {
06712
06713 for (i = 1; i <= const_exp_desc->rank; i++) {
06714
06715 if (fold_relationals(const_exp_desc->shape[i-1].idx,
06716 BD_XT_IDX(ATD_ARRAY_IDX(attr_idx),i),
06717 Ne_Opr)) {
06718
06719 PRINTMSG(line, 834, Error, column, AT_OBJ_NAME_PTR(attr_idx));
06720 AT_DCL_ERR(attr_idx) = TRUE;
06721 goto EXIT;
06722 }
06723 }
06724 }
06725 else {
06726 PRINTMSG(line, 834, Error, column, AT_OBJ_NAME_PTR(attr_idx));
06727 AT_DCL_ERR(attr_idx) = TRUE;
06728 goto EXIT;
06729 }
06730 }
06731
06732
06733 if (TYP_TYPE(a_type_idx) == Character &&
06734 TYP_CHAR_CLASS(a_type_idx) == Assumed_Size_Char) {
06735
06736
06737
06738 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
06739 TYP_TYPE(TYP_WORK_IDX) = Character;
06740 TYP_LINEAR(TYP_WORK_IDX) = TYP_LINEAR(a_type_idx);
06741 TYP_DESC(TYP_WORK_IDX) = TYP_DESC(a_type_idx);
06742 TYP_DCL_VALUE(TYP_WORK_IDX) = TYP_DCL_VALUE(a_type_idx);
06743 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
06744 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
06745 TYP_IDX(TYP_WORK_IDX) = TYP_IDX(c_type_idx);
06746 ATD_TYPE_IDX(attr_idx) = ntr_type_tbl();
06747
06748 if (ATD_ARRAY_IDX(attr_idx)) {
06749
06750 BD_RESOLVED(ATD_ARRAY_IDX(attr_idx)) = FALSE;
06751 array_dim_resolution(attr_idx, TRUE);
06752 ATD_ARRAY_IDX(ATD_CONST_IDX(attr_idx)) = ATD_ARRAY_IDX(attr_idx);
06753 }
06754 }
06755 }
06756 else if (a_type_idx != CN_TYPE_IDX(OPND_IDX((*opnd)))) {
06757 c_type_idx = CN_TYPE_IDX(OPND_IDX((*opnd)));
06758 find_opnd_line_and_column(opnd, &o_line, &o_column);
06759
06760 if (TYP_LINEAR(c_type_idx) == Long_Typeless) {
06761 PRINTMSG(o_line, 1133, Error, o_column);
06762 AT_DCL_ERR(attr_idx) = TRUE;
06763 goto EXIT;
06764 }
06765
06766 if (!check_asg_semantics(a_type_idx, c_type_idx, o_line, o_column)) {
06767 msg_str[0] = '\0';
06768 strcpy(msg_str, get_basic_type_str(a_type_idx));
06769
06770 PRINTMSG(line, 580, Error, column,
06771 AT_OBJ_NAME_PTR(attr_idx),
06772 msg_str,
06773 get_basic_type_str(c_type_idx));
06774
06775 AT_DCL_ERR(attr_idx) = TRUE;
06776 goto EXIT;
06777 }
06778
06779 switch (TYP_TYPE(a_type_idx)) {
06780 case Integer:
06781 case Real:
06782 case Complex:
06783 case Logical:
06784
06785 if (TYP_TYPE(c_type_idx) == Character) {
06786
06787
06788 the_constant = CN_CONST(OPND_IDX((*opnd)));
06789
06790
06791
06792
06793 OPND_IDX((*opnd)) = ntr_const_tbl(TYPELESS_DEFAULT_TYPE,
06794 FALSE,
06795 &the_constant);
06796 c_type_idx = TYPELESS_DEFAULT_TYPE;
06797 }
06798
06799 if (TYP_LINEAR(a_type_idx) == TYP_LINEAR(c_type_idx)) {
06800
06801 }
06802 else {
06803 find_opnd_line_and_column(opnd, &o_line, &o_column);
06804
06805 if (folder_driver((char *)&CN_CONST(OPND_IDX((*opnd))),
06806 c_type_idx,
06807 NULL,
06808 NULL_IDX,
06809 constant,
06810 &a_type_idx,
06811 o_line,
06812 o_column,
06813 1,
06814 Cvrt_Opr)) {
06815
06816
06817
06818 ATD_FLD(attr_idx) = CN_Tbl_Idx;
06819 ATD_CONST_IDX(attr_idx) = ntr_const_tbl(TYP_LINEAR(a_type_idx),
06820 FALSE,
06821 constant);
06822 }
06823 }
06824 break;
06825
06826
06827 case Character:
06828
06829 if (TYP_TYPE(c_type_idx) != Character &&
06830 TYP_TYPE(c_type_idx) != Typeless) {
06831
06832
06833 }
06834 else if (TYP_CHAR_CLASS(a_type_idx) == Assumed_Size_Char) {
06835
06836
06837
06838 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
06839 TYP_TYPE(TYP_WORK_IDX) = Character;
06840 TYP_LINEAR(TYP_WORK_IDX) = TYP_LINEAR(a_type_idx);
06841 TYP_DESC(TYP_WORK_IDX) = TYP_DESC(a_type_idx);
06842 TYP_DCL_VALUE(TYP_WORK_IDX) = TYP_DCL_VALUE(a_type_idx);
06843 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
06844 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
06845 TYP_IDX(TYP_WORK_IDX) = TYP_IDX(c_type_idx);
06846 ATD_TYPE_IDX(attr_idx) = ntr_type_tbl();
06847 }
06848 else if (TYP_IDX(a_type_idx) != TYP_IDX(c_type_idx)) {
06849
06850
06851
06852
06853
06854
06855 const_idx = ntr_const_tbl(a_type_idx, TRUE, NULL_IDX);
06856
06857 char_ptr = (char *)&CN_CONST(const_idx);
06858 c_char_ptr = (char *)&CN_CONST(OPND_IDX((*opnd)));
06859
06860 for (i = 0; i < CN_INT_TO_C(TYP_IDX(a_type_idx)); i++) {
06861 char_ptr[i] = (i >= CN_INT_TO_C(TYP_IDX(c_type_idx))) ?
06862 ' ' : c_char_ptr[i];
06863 }
06864
06865
06866
06867 while ((++i) % TARGET_CHARS_PER_WORD != 0) {
06868 char_ptr[i] = ' ';
06869 }
06870
06871 ATD_FLD(attr_idx) = CN_Tbl_Idx;
06872 ATD_CONST_IDX(attr_idx) = const_idx;
06873 }
06874 break;
06875 }
06876 }
06877
06878 if (cif_flags & INFO_RECS) {
06879 cif_named_constant_rec(attr_idx, const_line, const_column);
06880 }
06881
06882 EXIT:
06883
06884 TRACE (Func_Exit, "merge_parameter", NULL);
06885
06886 return;
06887
06888 }
06889
06890
06891
06892
06893
06894
06895
06896
06897
06898
06899
06900
06901
06902
06903
06904
06905
06906
06907
06908
06909
06910
06911
06912 void issue_undefined_type_msg(int attr_idx,
06913 int line,
06914 int column)
06915
06916 {
06917 int host_attr_idx;
06918