From: johanknol Date: Sun, 9 Sep 2001 16:05:20 +0000 (+0000) Subject: One big shot, to finally solve the pointer "whatever * whatever * whatever" issue. X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=6fac777686463dc4ecde13a69a9779ea5fca33e4;p=fw%2Fsdcc One big shot, to finally solve the pointer "whatever * whatever * whatever" issue. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1248 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/SDCC.lex b/src/SDCC.lex index cc81d1ec..8d2dc055 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -170,16 +170,6 @@ struct options save_options ; "_naked" { count(); TKEYWORD(NAKED); } "while" { count(); return(WHILE); } "xdata" { count(); TKEYWORD(XDATA); } -"_data" { count(); TKEYWORD(_NEAR); } -"_code" { count(); TKEYWORD(_CODE); } -"_eeprom" { count(); TKEYWORD(_EEPROM); } -"_flash" { count(); TKEYWORD(_CODE); } -"_generic" { count(); TKEYWORD(_GENERIC); } -"_near" { count(); TKEYWORD(_NEAR); } -"_sram" { count(); TKEYWORD(_XDATA);} -"_xdata" { count(); TKEYWORD(_XDATA);} -"_pdata" { count(); TKEYWORD(_PDATA); } -"_idata" { count(); TKEYWORD(_IDATA); } "..." { count(); return(VAR_ARGS);} {L}({L}|{D})* { count(); return(check_type()); } 0[xX]{H}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } diff --git a/src/SDCC.y b/src/SDCC.y index e58af299..c9864860 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -83,7 +83,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT %token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED BANKED %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT -%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA _EEPROM +%token STRUCT UNION ENUM ELIPSIS RANGE FAR %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN %token NAKED %token INLINEASM @@ -103,7 +103,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %type storage_class_specifier struct_or_union_specifier %type declaration_specifiers sfr_reg_bit type_specifier2 %type using_reentrant using_reentrant_interrupt enum_specifier -%type abstract_declarator abstract_declarator2 far_near_pointer far_near +%type abstract_declarator abstract_declarator2 unqualified_pointer %type parameter_type_list parameter_list parameter_declaration opt_assign_expr %type stag opt_stag %type primary_expr @@ -933,18 +933,18 @@ declarator2 ; pointer - : far_near_pointer { $$ = $1 ;} - | far_near_pointer type_specifier_list + : unqualified_pointer { $$ = $1 ;} + | unqualified_pointer type_specifier_list { $$ = $1 ; DCL_TSPEC($1) = $2; } - | far_near_pointer pointer + | unqualified_pointer pointer { $$ = $1 ; $$->next = $2 ; } - | far_near_pointer type_specifier_list pointer + | unqualified_pointer type_specifier_list pointer { $$ = $1 ; if (IS_SPEC($2) && DCL_TYPE($3) == UPOINTER) { @@ -966,6 +966,7 @@ pointer case S_CODE: DCL_PTR_CONST($3) = 1; DCL_TYPE($3) = CPOINTER ; + break; case S_EEPROM: DCL_TYPE($3) = EEPPOINTER; break; @@ -979,28 +980,14 @@ pointer } ; -far_near_pointer - : far_near '*' { - if ($1 == NULL) { - $$ = newLink(); - DCL_TYPE($$) = POINTER ; - } - else - $$ = $1 ; +unqualified_pointer + : '*' + { + $$ = newLink(); + DCL_TYPE($$)=UPOINTER; } ; -far_near - : _XDATA { $$ = newLink() ; DCL_TYPE($$) = FPOINTER ; } - | _CODE { $$ = newLink() ; DCL_TYPE($$) = CPOINTER ; DCL_PTR_CONST($$) = 1;} - | _PDATA { $$ = newLink() ; DCL_TYPE($$) = PPOINTER ; } - | _IDATA { $$ = newLink() ; DCL_TYPE($$) = IPOINTER ; } - | _NEAR { $$ = NULL ; } - | _GENERIC { $$ = newLink() ; DCL_TYPE($$) = GPOINTER ; } - | _EEPROM { $$ = newLink() ; DCL_TYPE($$) = EEPPOINTER ;} - | { $$ = newLink() ; DCL_TYPE($$) = UPOINTER ; } - ; - type_specifier_list : type_specifier | type_specifier_list type_specifier { $$ = mergeSpec ($1,$2, "type_specifier_list"); } diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 2a2000d5..a22a3ce9 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -442,13 +442,13 @@ addDecl (symbol * sym, int type, sym_link * p) } } - /* if the type is a unknown pointer and has + /* if the type is an unknown pointer and has a tspec then take the storage class const & volatile attribute from the tspec & make it those of this symbol */ if (p && !IS_SPEC (p) && - DCL_TYPE (p) == UPOINTER && + //DCL_TYPE (p) == UPOINTER && DCL_TSPEC (p)) { if (!IS_SPEC (sym->etype))