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 static char USMID[] = "\n@(#)5.0_pl/sources/p_dcl_attr.c 5.2 06/17/99 09:28:10\n";
00038
00039 # include "defines.h"
00040
00041 # include "host.m"
00042 # include "host.h"
00043 # include "target.m"
00044 # include "target.h"
00045
00046 # include "globals.m"
00047 # include "tokens.m"
00048 # include "sytb.m"
00049 # include "p_globals.m"
00050 # include "debug.m"
00051
00052 # include "globals.h"
00053 # include "tokens.h"
00054 # include "sytb.h"
00055 # include "p_globals.h"
00056
00057
00058
00059
00060
00061 static void parse_attrs(boolean (*func) (boolean, int, int, int));
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 static void parse_attrs(boolean (*merge_function) ())
00083
00084 {
00085 int array_idx;
00086 int attr_idx;
00087 boolean blk_err = FALSE;
00088 int column;
00089 boolean found_attr;
00090 boolean found_end = FALSE;
00091 int line;
00092 int name_idx;
00093 int new_sb_idx;
00094 int sb_idx;
00095
00096
00097 TRACE (Func_Entry, "parse_attrs", NULL);
00098
00099 if (LA_CH_VALUE == COLON &&
00100 matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct)) {
00101
00102
00103 }
00104
00105 if ((STMT_OUT_OF_ORDER(curr_stmt_category, stmt_type) ||
00106 STMT_CANT_BE_IN_BLK(stmt_type, CURR_BLK)) && iss_blk_stk_err()) {
00107
00108
00109
00110 blk_err = TRUE;
00111 }
00112 else {
00113 curr_stmt_category = Declaration_Stmt_Cat;
00114 }
00115
00116 do {
00117 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00118 line = TOKEN_LINE(token);
00119 column = TOKEN_COLUMN(token);
00120 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
00121 &name_idx);
00122 found_attr = TRUE;
00123
00124 if (attr_idx == NULL_IDX) {
00125 found_attr = FALSE;
00126 attr_idx = ntr_sym_tbl(&token, name_idx);
00127 LN_DEF_LOC(name_idx) = TRUE;
00128
00129
00130 }
00131 else if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
00132 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00133 LN_DEF_LOC(name_idx) = TRUE;
00134 }
00135
00136 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
00137 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
00138 }
00139
00140 if (LA_CH_VALUE == LPAREN) {
00141
00142 switch (stmt_type) {
00143
00144 case Allocatable_Stmt:
00145 case Automatic_Stmt:
00146 case Dimension_Stmt:
00147 case Pointer_Stmt:
00148 case Target_Stmt:
00149 array_idx = parse_array_spec(attr_idx);
00150
00151 merge_dimension(attr_idx, line, column, array_idx);
00152
00153 if (!found_attr) {
00154 SET_IMPL_TYPE(attr_idx);
00155 }
00156 found_attr = TRUE;
00157 break;
00158
00159 default:
00160 if (parse_err_flush(Find_Rparen, ", or " EOS_STR)) {
00161 NEXT_LA_CH;
00162 }
00163 break;
00164
00165 }
00166 }
00167 else if (stmt_type == Dimension_Stmt) {
00168
00169
00170
00171 # ifdef COARRAY_FORTRAN
00172
00173 if ((!cmd_line_flags.co_array_fortran) || LA_CH_VALUE != LBRKT) {
00174 parse_err_flush(Find_Comma, "(");
00175 AT_DCL_ERR(attr_idx) = TRUE;
00176 }
00177 # else
00178 parse_err_flush(Find_Comma, "(");
00179 AT_DCL_ERR(attr_idx) = TRUE;
00180 # endif
00181 }
00182
00183 # ifdef COARRAY_FORTRAN
00184
00185 if (LA_CH_VALUE == LBRKT && cmd_line_flags.co_array_fortran &&
00186 (stmt_type == Allocatable_Stmt ||
00187 stmt_type == Automatic_Stmt ||
00188 stmt_type == Dimension_Stmt ||
00189 stmt_type == Pointer_Stmt ||
00190 stmt_type == Target_Stmt)) {
00191 array_idx = parse_pe_array_spec(attr_idx);
00192 merge_co_array(found_attr, line, column, attr_idx, array_idx);
00193 }
00194 # endif
00195
00196 if (stmt_type != Dimension_Stmt) {
00197 (*merge_function) (found_attr, line, column, attr_idx);
00198 }
00199
00200 AT_DCL_ERR(attr_idx) = AT_DCL_ERR(attr_idx) | blk_err;
00201
00202 if ((cif_flags & XREF_RECS) != 0) {
00203 cif_usage_rec(attr_idx,
00204 AT_Tbl_Idx,
00205 line,
00206 column,
00207 CIF_Symbol_Declaration);
00208 }
00209 }
00210 else if (LA_CH_VALUE == SLASH &&
00211 (stmt_type == Save_Stmt ||
00212 stmt_type == Volatile_Stmt)) {
00213
00214 NEXT_LA_CH;
00215
00216 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00217 sb_idx = srch_stor_blk_tbl(TOKEN_STR(token),
00218 TOKEN_LEN(token),
00219 curr_scp_idx);
00220
00221 if (sb_idx == NULL_IDX) {
00222 sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00223 TOKEN_LEN(token),
00224 TOKEN_LINE(token),
00225 TOKEN_COLUMN(token),
00226 Common);
00227 SB_COMMON_NEEDS_OFFSET(sb_idx) = TRUE;
00228 }
00229 else if (SB_USE_ASSOCIATED(sb_idx) || SB_HOST_ASSOCIATED(sb_idx)) {
00230
00231
00232
00233
00234
00235 new_sb_idx = ntr_stor_blk_tbl(TOKEN_STR(token),
00236 TOKEN_LEN(token),
00237 TOKEN_LINE(token),
00238 TOKEN_COLUMN(token),
00239 Common);
00240 SB_MERGED_BLK_IDX(sb_idx) = new_sb_idx;
00241 SB_COMMON_NEEDS_OFFSET(new_sb_idx) = TRUE;
00242 SB_HIDDEN(sb_idx) = TRUE;
00243 SB_DEF_MULT_SCPS(sb_idx) = TRUE;
00244 sb_idx = new_sb_idx;
00245 }
00246
00247 SB_DCL_ERR(sb_idx) = SB_DCL_ERR(sb_idx) | blk_err;
00248
00249 if (stmt_type == Save_Stmt) {
00250
00251 if (SB_SAVED(sb_idx)) {
00252
00253
00254
00255 PRINTMSG(TOKEN_LINE(token), 110, Error, TOKEN_COLUMN(token),
00256 SB_NAME_PTR(sb_idx));
00257 }
00258
00259 SB_SAVED(sb_idx) = TRUE;
00260 }
00261 else {
00262 SB_VOLATILE(sb_idx) = TRUE;
00263 }
00264
00265 if ((cif_flags & XREF_RECS) != 0) {
00266 cif_sb_usage_rec(sb_idx,
00267 TOKEN_LINE(token),
00268 TOKEN_COLUMN(token),
00269 CIF_Symbol_Declaration);
00270 }
00271
00272 if (LA_CH_VALUE == SLASH) {
00273 NEXT_LA_CH;
00274 }
00275 else {
00276 parse_err_flush(Find_Comma, "/");
00277 }
00278 }
00279 else {
00280 parse_err_flush(Find_Comma, "common-block-name");
00281 }
00282 }
00283 else {
00284 parse_err_flush(Find_Comma, ((stmt_type == Save_Stmt ||
00285 stmt_type == Volatile_Stmt) ?
00286 "object-name or /" : "object-name"));
00287 }
00288
00289 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
00290 parse_err_flush(Find_Comma, ", or " EOS_STR);
00291 }
00292
00293 if (LA_CH_VALUE == COMMA) {
00294 NEXT_LA_CH;
00295 }
00296 else if (LA_CH_VALUE == EOS) {
00297 found_end = TRUE;
00298 NEXT_LA_CH;
00299 }
00300 }
00301 while (!found_end);
00302
00303 TRACE (Func_Exit, "parse_attrs", NULL);
00304
00305 return;
00306
00307
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 void parse_access_stmt()
00331
00332 {
00333 access_type access;
00334 int attr_idx;
00335 boolean found_end;
00336
00337
00338 TRACE (Func_Entry, "parse_access_stmt", NULL);
00339
00340 access = (TOKEN_VALUE(token) == Tok_Kwd_Private) ? Private : Public;
00341
00342 if (CURR_BLK == Derived_Type_Blk && access == Private) {
00343
00344 if (LA_CH_VALUE == EOS) {
00345
00346 if (ATT_PRIVATE_CPNT(CURR_BLK_NAME)) {
00347
00348
00349
00350 PRINTMSG(TOKEN_LINE(token), 41, Error, TOKEN_COLUMN(token),
00351 "PRIVATE", AT_OBJ_NAME_PTR(CURR_BLK_NAME));
00352 }
00353 else if (ATT_FIRST_CPNT_IDX(CURR_BLK_NAME) != NULL_IDX) {
00354
00355
00356
00357 PRINTMSG(TOKEN_LINE(token), 8, Error, TOKEN_COLUMN(token),
00358 "PRIVATE", AT_OBJ_NAME_PTR(CURR_BLK_NAME));
00359 }
00360
00361 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Module) {
00362 ATT_PRIVATE_CPNT(CURR_BLK_NAME) = TRUE;
00363 }
00364 else {
00365 iss_blk_stk_err();
00366 }
00367 }
00368 else {
00369 parse_err_flush(Find_EOS, EOS_STR);
00370 }
00371 curr_stmt_category = Declaration_Stmt_Cat;
00372 }
00373 else {
00374
00375 if (LA_CH_VALUE == EOS) {
00376
00377 if (CURR_BLK == Module_Blk) {
00378
00379 if (AT_ACCESS_SET(SCP_ATTR_IDX(curr_scp_idx))) {
00380
00381
00382
00383 PRINTMSG(TOKEN_LINE(token), 656, Error, TOKEN_COLUMN(token),
00384 AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
00385 access = (access_type) AT_PRIVATE(SCP_ATTR_IDX(curr_scp_idx));
00386 }
00387
00388 AT_ACCESS_SET(SCP_ATTR_IDX(curr_scp_idx)) = TRUE;
00389 AT_PRIVATE(SCP_ATTR_IDX(curr_scp_idx)) = access;
00390 }
00391 else {
00392
00393
00394 }
00395 }
00396 else {
00397 found_end = FALSE;
00398
00399 if (LA_CH_VALUE == COLON) {
00400 matched_specific_token(Tok_Punct_Colon_Colon, Tok_Class_Punct);
00401 }
00402
00403 do {
00404 if (parse_generic_spec()) {
00405 attr_idx = generic_spec_semantics();
00406
00407 if (CURR_BLK == Module_Blk) {
00408 merge_access(attr_idx, TOKEN_LINE(token),
00409 TOKEN_COLUMN(token), access);
00410 }
00411 }
00412
00413 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
00414 parse_err_flush(Find_Comma, ", or " EOS_STR);
00415 }
00416
00417 if (LA_CH_VALUE == COMMA) {
00418 NEXT_LA_CH;
00419 }
00420 else if (LA_CH_VALUE == EOS) {
00421 found_end = TRUE;
00422 }
00423 }
00424 while (!found_end);
00425 }
00426
00427 if ((CURR_BLK != Module_Blk ||
00428 STMT_OUT_OF_ORDER(curr_stmt_category, stmt_type)) &&
00429 iss_blk_stk_err()) {
00430
00431 }
00432 else {
00433 curr_stmt_category = Declaration_Stmt_Cat;
00434 }
00435 }
00436 NEXT_LA_CH;
00437
00438 TRACE (Func_Exit, "parse_access_stmt", NULL);
00439 return;
00440
00441 }
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 void parse_allocatable_stmt (void)
00462
00463 {
00464 TRACE (Func_Entry, "parse_allocatable_stmt", NULL);
00465
00466 parse_attrs(merge_allocatable);
00467
00468 TRACE (Func_Exit, "parse_allocatable_stmt", NULL);
00469
00470 return;
00471
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 void parse_automatic_stmt (void)
00491
00492 {
00493 TRACE (Func_Entry, "parse_automatic_stmt", NULL);
00494
00495 PRINTMSG(stmt_start_line, 1253, Ansi, stmt_start_col, "AUTOMATIC");
00496
00497 parse_attrs(merge_automatic);
00498
00499 TRACE (Func_Exit, "parse_automatic_stmt", NULL);
00500
00501 return;
00502
00503 }
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523 void parse_dimension_stmt (void)
00524
00525 {
00526 TRACE (Func_Entry, "parse_dimension_stmt", NULL);
00527
00528 parse_attrs(NULL);
00529
00530 TRACE (Func_Exit, "parse_dimension_stmt", NULL);
00531
00532 return;
00533
00534 }
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553 void parse_external_stmt (void)
00554
00555 {
00556 TRACE (Func_Entry, "parse_external_stmt", NULL);
00557
00558 parse_attrs(merge_external);
00559
00560 TRACE (Func_Exit, "parse_external_stmt", NULL);
00561
00562 return;
00563
00564 }
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 void parse_intent_stmt (void)
00583
00584 {
00585 int stmt_number;
00586
00587 TRACE (Func_Entry, "parse_intent_stmt", NULL);
00588
00589 stmt_number = statement_number;
00590
00591 if (LA_CH_VALUE != LPAREN) {
00592 parse_err_flush(Find_EOS, "(");
00593 NEXT_LA_CH;
00594 }
00595 else {
00596 colon_recovery = TRUE;
00597 new_intent = parse_intent_spec();
00598 colon_recovery = FALSE;
00599
00600 if (new_intent != Intent_Unseen) {
00601 parse_attrs(merge_intent);
00602
00603 if (cif_flags & MISC_RECS) {
00604
00605 if (new_intent == Intent_In) {
00606 cif_stmt_type_rec(TRUE, CIF_Intent_In_Stmt, stmt_number);
00607 }
00608 else if (new_intent == Intent_Out) {
00609 cif_stmt_type_rec(TRUE, CIF_Intent_Out_Stmt, stmt_number);
00610 }
00611 else {
00612 cif_stmt_type_rec(TRUE, CIF_Intent_Inout_Stmt, stmt_number);
00613 }
00614 }
00615 }
00616 else {
00617 parse_err_flush(Find_EOS, NULL);
00618 NEXT_LA_CH;
00619 }
00620 }
00621
00622 TRACE (Func_Exit, "parse_intent_stmt", NULL);
00623
00624 return;
00625
00626 }
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646 void parse_intrinsic_stmt (void)
00647
00648 {
00649 TRACE (Func_Entry, "parse_intrinsic_stmt", NULL);
00650 parse_attrs(merge_intrinsic);
00651 TRACE (Func_Exit, "parse_intrinsic_stmt", NULL);
00652
00653 return;
00654
00655 }
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674 void parse_optional_stmt(void)
00675
00676 {
00677 TRACE (Func_Entry, "parse_optional_stmt", NULL);
00678
00679 parse_attrs(merge_optional);
00680
00681 TRACE (Func_Exit, "parse_optional_stmt", NULL);
00682
00683 return;
00684
00685 }
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704 void parse_pointer_stmt (void)
00705
00706 {
00707 int array_idx;
00708 int attr_idx;
00709 int name_idx;
00710 boolean parse_err;
00711 int pointer_idx;
00712 token_type pointee_name;
00713 token_type pointer_name;
00714 boolean semantic_err;
00715
00716 # if defined(_NO_CRAY_CHARACTER_PTR)
00717 int lparen_col;
00718 int lparen_line;
00719 # endif
00720
00721
00722
00723 TRACE (Func_Entry, "parse_pointer_stmt", NULL);
00724
00725 if (LA_CH_VALUE != LPAREN) {
00726 parse_attrs(merge_pointer);
00727 goto EXIT;
00728 }
00729
00730
00731
00732 if ((STMT_OUT_OF_ORDER(curr_stmt_category, Pointer_Stmt) ||
00733 STMT_CANT_BE_IN_BLK(Pointer_Stmt, CURR_BLK)) && iss_blk_stk_err()) {
00734
00735 }
00736 else {
00737 curr_stmt_category = Declaration_Stmt_Cat;
00738 PRINTMSG(stmt_start_line, 134, Ansi, stmt_start_col);
00739 }
00740
00741 do {
00742 parse_err = FALSE;
00743 semantic_err = FALSE;
00744
00745 if (LA_CH_VALUE == LPAREN) {
00746
00747 # if defined(_NO_CRAY_CHARACTER_PTR)
00748 lparen_line = LA_CH_LINE;
00749 lparen_col = LA_CH_COLUMN;
00750 # endif
00751
00752 NEXT_LA_CH;
00753
00754 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00755 pointer_name = token;
00756
00757 if (LA_CH_VALUE == COMMA) {
00758 NEXT_LA_CH;
00759
00760 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
00761 pointee_name = token;
00762 array_idx = (LA_CH_VALUE == LPAREN) ?
00763 parse_array_spec(AT_WORK_IDX) : NULL_IDX;
00764
00765 if (LA_CH_VALUE != RPAREN) {
00766 parse_err_flush(Find_Rparen, ")");
00767 parse_err = TRUE;
00768 }
00769 }
00770 else {
00771 parse_err_flush(Find_Rparen, "pointee name");
00772 parse_err = TRUE;
00773 }
00774 }
00775 else {
00776 parse_err_flush(Find_Rparen, ",");
00777 parse_err = TRUE;
00778 }
00779 }
00780 else {
00781 parse_err_flush(Find_Rparen, "Cray pointer name");
00782 parse_err = TRUE;
00783 }
00784
00785 if (LA_CH_VALUE == RPAREN) {
00786 NEXT_LA_CH;
00787 }
00788
00789 if (LA_CH_VALUE != COMMA && LA_CH_VALUE != EOS) {
00790 parse_err_flush(Find_Comma, ", or " EOS_STR);
00791 parse_err = TRUE;
00792 }
00793
00794 if (LA_CH_VALUE == COMMA) {
00795 NEXT_LA_CH;
00796 }
00797 }
00798 else {
00799 parse_err_flush(Find_Lparen, "(");
00800 parse_err = TRUE;
00801 }
00802
00803 if (parse_err) {
00804 continue;
00805 }
00806
00807 attr_idx = srch_sym_tbl(TOKEN_STR(pointee_name),
00808 TOKEN_LEN(pointee_name), &name_idx);
00809
00810 if (attr_idx == NULL_IDX) {
00811 attr_idx = ntr_sym_tbl(&pointee_name, name_idx);
00812 LN_DEF_LOC(name_idx) = TRUE;
00813 SET_IMPL_TYPE(attr_idx);
00814 ATD_CLASS(attr_idx) = CRI__Pointee;
00815 }
00816 else if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
00817 TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Character) {
00818
00819 if (fnd_semantic_err(Obj_Cri_Ch_Pointee,
00820 TOKEN_LINE(pointee_name),
00821 TOKEN_COLUMN(pointee_name),
00822 attr_idx,
00823 TRUE)) {
00824
00825 semantic_err = TRUE;
00826
00827 CREATE_ERR_ATTR(attr_idx,
00828 TOKEN_LINE(pointee_name),
00829 TOKEN_COLUMN(pointee_name),
00830 Data_Obj);
00831 SET_IMPL_TYPE(attr_idx);
00832 }
00833 else {
00834 # ifndef _EXTENDED_CRI_CHAR_POINTER
00835 if (TYP_CHAR_CLASS(ATD_TYPE_IDX(attr_idx)) != Assumed_Size_Char) {
00836 PRINTMSG(TOKEN_LINE(pointee_name), 1390, Warning,
00837 TOKEN_COLUMN(pointee_name),
00838 AT_OBJ_NAME_PTR(attr_idx));
00839
00840
00841
00842 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00843 TYP_TYPE(TYP_WORK_IDX) = Character;
00844 TYP_LINEAR(TYP_WORK_IDX) = Character_1;
00845 TYP_DESC(TYP_WORK_IDX) = Default_Typed;
00846 TYP_DCL_VALUE(TYP_WORK_IDX) = 0;
00847 TYP_CHAR_CLASS(TYP_WORK_IDX) = Assumed_Size_Char;
00848 ATD_TYPE_IDX(attr_idx) = ntr_type_tbl();
00849 }
00850 # endif
00851
00852 if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
00853 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00854 LN_DEF_LOC(name_idx) = TRUE;
00855 }
00856 }
00857
00858 # if defined(_NO_CRAY_CHARACTER_PTR)
00859 PRINTMSG(lparen_line, 541, Error, lparen_col);
00860 # endif
00861
00862 }
00863 else if (fnd_semantic_err(Obj_Cri_Pointee,
00864 TOKEN_LINE(pointee_name),
00865 TOKEN_COLUMN(pointee_name),
00866 attr_idx,
00867 TRUE)) {
00868 CREATE_ERR_ATTR(attr_idx,
00869 TOKEN_LINE(pointee_name),
00870 TOKEN_COLUMN(pointee_name),
00871 Data_Obj);
00872 SET_IMPL_TYPE(attr_idx);
00873 semantic_err = TRUE;
00874 }
00875
00876 # if !defined(_POINTEES_CAN_BE_STRUCT)
00877 else if (TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Structure) {
00878 PRINTMSG (TOKEN_LINE(pointee_name), 651, Error,
00879 TOKEN_COLUMN(pointee_name),
00880 AT_OBJ_NAME_PTR(attr_idx));
00881 CREATE_ERR_ATTR(attr_idx,
00882 TOKEN_LINE(pointee_name),
00883 TOKEN_COLUMN(pointee_name),
00884 Data_Obj);
00885 SET_IMPL_TYPE(attr_idx);
00886 semantic_err = TRUE;
00887 }
00888 # endif
00889 else if (AT_REFERENCED(attr_idx) == Char_Rslt_Bound_Ref) {
00890 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00891 LN_DEF_LOC(name_idx) = TRUE;
00892 }
00893
00894 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
00895 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
00896 }
00897
00898
00899 ATD_CLASS(attr_idx) = CRI__Pointee;
00900
00901 if ((cif_flags & XREF_RECS) != 0) {
00902 cif_usage_rec(attr_idx,
00903 AT_Tbl_Idx,
00904 TOKEN_LINE(pointee_name),
00905 TOKEN_COLUMN(pointee_name),
00906 CIF_Symbol_Declaration);
00907 }
00908
00909 if (array_idx != NULL_IDX) {
00910 merge_dimension(attr_idx,
00911 TOKEN_LINE(pointee_name),
00912 TOKEN_COLUMN(pointee_name),
00913 array_idx);
00914 }
00915
00916 pointer_idx = srch_sym_tbl(TOKEN_STR(pointer_name),
00917 TOKEN_LEN(pointer_name), &name_idx);
00918
00919 if (pointer_idx == NULL_IDX) {
00920 pointer_idx = ntr_sym_tbl(&pointer_name, name_idx);
00921 LN_DEF_LOC(name_idx) = TRUE;
00922 }
00923 else if (fnd_semantic_err(Obj_Cri_Ptr,
00924 TOKEN_LINE(pointer_name),
00925 TOKEN_COLUMN(pointer_name),
00926 pointer_idx,
00927 TRUE)) {
00928 semantic_err = TRUE;
00929 CREATE_ERR_ATTR(pointer_idx,
00930 TOKEN_LINE(pointer_name),
00931 TOKEN_COLUMN(pointer_name),
00932 Data_Obj);
00933 }
00934 else if (AT_REFERENCED(pointer_idx) == Char_Rslt_Bound_Ref) {
00935 AT_ATTR_LINK(pointer_idx) = NULL_IDX;
00936 LN_DEF_LOC(name_idx) = TRUE;
00937 }
00938
00939 if (AT_OBJ_CLASS(pointer_idx) == Data_Obj) {
00940 ATD_SEEN_OUTSIDE_IMP_DO(pointer_idx) = TRUE;
00941 }
00942
00943 if ((cif_flags & XREF_RECS) != 0) {
00944 cif_usage_rec(pointer_idx,
00945 AT_Tbl_Idx,
00946 TOKEN_LINE(pointer_name),
00947 TOKEN_COLUMN(pointer_name),
00948 CIF_Symbol_Declaration);
00949 }
00950
00951 if (TYP_TYPE(ATD_TYPE_IDX(attr_idx)) != Character) {
00952 ATD_TYPE_IDX(pointer_idx) = CRI_Ptr_8;
00953 }
00954 else {
00955 ATD_TYPE_IDX(pointer_idx) = CRI_Ch_Ptr_8;
00956 }
00957
00958 AT_TYPED(pointer_idx) = TRUE;
00959 ATD_PTR_IDX(attr_idx) = pointer_idx;
00960
00961 if (semantic_err) {
00962 AT_DCL_ERR(pointer_idx)= TRUE;
00963 AT_DCL_ERR(attr_idx) = TRUE;
00964 }
00965 }
00966 while (LA_CH_VALUE != EOS);
00967
00968 NEXT_LA_CH;
00969
00970 EXIT:
00971
00972 TRACE (Func_Exit, "parse_pointer_stmt", NULL);
00973
00974 return;
00975
00976 }
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995 void parse_save_stmt (void)
00996
00997 {
00998 TRACE (Func_Entry, "parse_save_stmt", NULL);
00999
01000 if (LA_CH_VALUE == EOS) {
01001
01002 if ((STMT_CANT_BE_IN_BLK(Save_Stmt, CURR_BLK) ||
01003 STMT_OUT_OF_ORDER(curr_stmt_category, Save_Stmt)) &&
01004 iss_blk_stk_err()) {
01005
01006 }
01007 else {
01008 if (ATP_SAVE_ALL(SCP_ATTR_IDX(curr_scp_idx))) {
01009 PRINTMSG(TOKEN_LINE(token), 133, Ansi, TOKEN_COLUMN(token));
01010 }
01011 ATP_SAVE_ALL(SCP_ATTR_IDX(curr_scp_idx)) = TRUE;
01012 curr_stmt_category = Declaration_Stmt_Cat;
01013
01014 if (ATP_STACK_DIR(SCP_ATTR_IDX(curr_scp_idx))) {
01015
01016
01017
01018
01019 PRINTMSG(TOKEN_LINE(token), 1144, Warning,
01020 TOKEN_COLUMN(token),
01021 "STACK");
01022 ATP_STACK_DIR(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01023 }
01024 }
01025 NEXT_LA_CH;
01026 }
01027 else {
01028
01029 if (ATP_SAVE_ALL(SCP_ATTR_IDX(curr_scp_idx))) {
01030 PRINTMSG (stmt_start_line, 133, Ansi, stmt_start_col);
01031 }
01032
01033 parse_attrs(merge_save);
01034 }
01035
01036 TRACE (Func_Exit, "parse_save_stmt", NULL);
01037
01038 return;
01039
01040 }
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060 void parse_target_stmt (void)
01061
01062 {
01063 TRACE (Func_Entry, "parse_target_stmt", NULL);
01064
01065 parse_attrs(merge_target);
01066
01067 TRACE (Func_Exit, "parse_target_stmt", NULL);
01068
01069 return;
01070
01071 }
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089 void parse_volatile_stmt (void)
01090
01091 {
01092 TRACE (Func_Entry, "parse_volatile_stmt", NULL);
01093
01094 PRINTMSG(stmt_start_line, 1253, Ansi, stmt_start_col, "VOLATILE");
01095
01096 parse_attrs(merge_volatile);
01097
01098 TRACE (Func_Exit, "parse_volatile_stmt", NULL);
01099
01100 return;
01101
01102 }
01103