Browse Source

Use “set of (op_unary, op_binary)” to check for supported operator overloads.

Rika Ichinose 9 months ago
parent
commit
7343a12908
1 changed files with 50 additions and 90 deletions
  1. 50 90
      compiler/htypechk.pas

+ 50 - 90
compiler/htypechk.pas

@@ -32,13 +32,12 @@ interface
       pgentype;
       pgentype;
 
 
     type
     type
+      TSupportedOpOverload = (op_unary, op_binary);
       Ttok2nodeRec=record
       Ttok2nodeRec=record
         tok : ttoken;
         tok : ttoken;
         nod : tnodetype;
         nod : tnodetype;
         inr : tinlinenumber;
         inr : tinlinenumber;
-        op_overloading_supported : boolean;
-        minargs : longint;
-        maxargs : longint;
+        supported_op_overloads: set of TSupportedOpOverload;
       end;
       end;
 
 
       Ttok2opRec=record
       Ttok2opRec=record
@@ -118,33 +117,33 @@ interface
     const
     const
       tok2nodes=27;
       tok2nodes=27;
       tok2node:array[1..tok2nodes] of ttok2noderec=(
       tok2node:array[1..tok2nodes] of ttok2noderec=(
-        (tok:_PLUS       ;nod:addn;inr:in_none;op_overloading_supported:true;minargs:1;maxargs:2),      { binary overloading supported }
-        (tok:_MINUS      ;nod:subn;inr:in_none;op_overloading_supported:true;minargs:1;maxargs:2),      { binary and unary overloading supported }
-        (tok:_STAR       ;nod:muln;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_SLASH      ;nod:slashn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),    { binary overloading supported }
-        (tok:_EQ         ;nod:equaln;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),    { binary overloading supported }
-        (tok:_GT         ;nod:gtn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),       { binary overloading supported }
-        (tok:_LT         ;nod:ltn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),       { binary overloading supported }
-        (tok:_GTE        ;nod:gten;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_LTE        ;nod:lten;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_SYMDIF     ;nod:symdifn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),   { binary overloading supported }
-        (tok:_STARSTAR   ;nod:starstarn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2), { binary overloading supported }
-        (tok:_OP_AS      ;nod:asn;inr:in_none;op_overloading_supported:false;minargs:0;maxargs:0),      { binary overloading NOT supported }
-        (tok:_OP_IN      ;nod:inn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),       { binary overloading supported }
-        (tok:_OP_IS      ;nod:isn;inr:in_none;op_overloading_supported:false;minargs:0;maxargs:0),      { binary overloading NOT supported }
-        (tok:_OP_OR      ;nod:orn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),       { binary overloading supported }
-        (tok:_OP_AND     ;nod:andn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_OP_DIV     ;nod:divn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_OP_NOT     ;nod:notn;inr:in_none;op_overloading_supported:true;minargs:1;maxargs:1),      { unary overloading supported }
-        (tok:_OP_MOD     ;nod:modn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_OP_SHL     ;nod:shln;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_OP_SHR     ;nod:shrn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_OP_XOR     ;nod:xorn;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),      { binary overloading supported }
-        (tok:_ASSIGNMENT ;nod:assignn;inr:in_none;op_overloading_supported:true;minargs:1;maxargs:1),   { unary overloading supported }
-        (tok:_OP_EXPLICIT;nod:assignn;inr:in_none;op_overloading_supported:true;minargs:1;maxargs:1),   { unary overloading supported }
-        (tok:_NE         ;nod:unequaln;inr:in_none;op_overloading_supported:true;minargs:2;maxargs:2),  { binary overloading supported }
-        (tok:_OP_INC     ;nod:inlinen;inr:in_inc_x;op_overloading_supported:true;minargs:1;maxargs:1),  { unary overloading supported }
-        (tok:_OP_DEC     ;nod:inlinen;inr:in_dec_x;op_overloading_supported:true;minargs:1;maxargs:1)   { unary overloading supported }
+        (tok:_PLUS       ;nod:addn     ;inr:in_none ;supported_op_overloads:[op_unary,op_binary]),
+        (tok:_MINUS      ;nod:subn     ;inr:in_none ;supported_op_overloads:[op_unary,op_binary]),
+        (tok:_STAR       ;nod:muln     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_SLASH      ;nod:slashn   ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_EQ         ;nod:equaln   ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_GT         ;nod:gtn      ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_LT         ;nod:ltn      ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_GTE        ;nod:gten     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_LTE        ;nod:lten     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_SYMDIF     ;nod:symdifn  ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_STARSTAR   ;nod:starstarn;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_AS      ;nod:asn      ;inr:in_none ;supported_op_overloads:[]),
+        (tok:_OP_IN      ;nod:inn      ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_IS      ;nod:isn      ;inr:in_none ;supported_op_overloads:[]),
+        (tok:_OP_OR      ;nod:orn      ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_AND     ;nod:andn     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_DIV     ;nod:divn     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_NOT     ;nod:notn     ;inr:in_none ;supported_op_overloads:[op_unary]),
+        (tok:_OP_MOD     ;nod:modn     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_SHL     ;nod:shln     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_SHR     ;nod:shrn     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_XOR     ;nod:xorn     ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_ASSIGNMENT ;nod:assignn  ;inr:in_none ;supported_op_overloads:[op_unary]),
+        (tok:_OP_EXPLICIT;nod:assignn  ;inr:in_none ;supported_op_overloads:[op_unary]),
+        (tok:_NE         ;nod:unequaln ;inr:in_none ;supported_op_overloads:[op_binary]),
+        (tok:_OP_INC     ;nod:inlinen  ;inr:in_inc_x;supported_op_overloads:[op_unary]),
+        (tok:_OP_DEC     ;nod:inlinen  ;inr:in_dec_x;supported_op_overloads:[op_unary])
       );
       );
 
 
       tok2ops=4;
       tok2ops=4;
@@ -706,9 +705,7 @@ implementation
                       if tok2node[i].tok=optoken then
                       if tok2node[i].tok=optoken then
                         begin
                         begin
                           result:=
                           result:=
-                            tok2node[i].op_overloading_supported and
-                            (tok2node[i].minargs<=1) and
-                            (tok2node[i].maxargs>=1) and
+                            (op_unary in tok2node[i].supported_op_overloads) and
                             isunaryoperatoroverloadable(tok2node[i].nod,tok2node[i].inr,ld);
                             isunaryoperatoroverloadable(tok2node[i].nod,tok2node[i].inr,ld);
                           break;
                           break;
                         end;
                         end;
@@ -718,15 +715,13 @@ implementation
                   end;
                   end;
               end;
               end;
           2 : begin
           2 : begin
+                ld:=tparavarsym(pf.parast.SymList[0]).vardef;
+                rd:=tparavarsym(pf.parast.SymList[1]).vardef;
                 for i:=1 to tok2nodes do
                 for i:=1 to tok2nodes do
                   if tok2node[i].tok=optoken then
                   if tok2node[i].tok=optoken then
                     begin
                     begin
-                      ld:=tparavarsym(pf.parast.SymList[0]).vardef;
-                      rd:=tparavarsym(pf.parast.SymList[1]).vardef;
                       result:=
                       result:=
-                        tok2node[i].op_overloading_supported and
-                        (tok2node[i].minargs<=2) and
-                        (tok2node[i].maxargs>=2) and
+                        (op_binary in tok2node[i].supported_op_overloads) and
                         isbinaryoperatoroverloadable(tok2node[i].nod,ld,nothingn,rd,nothingn);
                         isbinaryoperatoroverloadable(tok2node[i].nod,ld,nothingn,rd,nothingn);
                       break;
                       break;
                     end;
                     end;
@@ -878,7 +873,7 @@ implementation
         operpd  : tprocdef;
         operpd  : tprocdef;
         ht      : tnode;
         ht      : tnode;
         ppn     : tcallparanode;
         ppn     : tcallparanode;
-        cand_cnt : integer;
+        i,cand_cnt : sizeint;
 
 
         function search_operator(optoken:ttoken;generror:boolean): integer;
         function search_operator(optoken:ttoken;generror:boolean): integer;
           var
           var
@@ -975,57 +970,22 @@ implementation
           it is not overloaded }
           it is not overloaded }
         result:=not (ocf_check_only in ocf);
         result:=not (ocf_check_only in ocf);
 
 
-        case t.nodetype of
-           equaln:
-             optoken:=_EQ;
-           unequaln:
-             optoken:=_NE;
-           addn:
-             optoken:=_PLUS;
-           subn:
-             optoken:=_MINUS;
-           muln:
-             optoken:=_STAR;
-           starstarn:
-             optoken:=_STARSTAR;
-           slashn:
-             optoken:=_SLASH;
-           ltn:
-             optoken:=_LT;
-           gtn:
-             optoken:=_GT;
-           lten:
-             optoken:=_LTE;
-           gten:
-             optoken:=_GTE;
-           symdifn :
-             optoken:=_SYMDIF;
-           modn :
-             optoken:=_OP_MOD;
-           orn :
-             optoken:=_OP_OR;
-           xorn :
-             optoken:=_OP_XOR;
-           andn :
-             optoken:=_OP_AND;
-           divn :
-             optoken:=_OP_DIV;
-           shln :
-             optoken:=_OP_SHL;
-           shrn :
-             optoken:=_OP_SHR;
-           inn :
-             optoken:=_OP_IN;
-           else
-             begin
-               if not (ocf_check_only in ocf) then
-                 begin
-                   CGMessage(parser_e_operator_not_overloaded);
-                   t:=cnothingnode.create;
-                 end;
-               exit;
-             end;
-        end;
+        optoken:=NOTOKEN;
+        for i:=1 to tok2nodes do
+          if (t.nodetype=tok2node[i].nod) and (op_binary in tok2node[i].supported_op_overloads) then
+            begin
+              optoken:=tok2node[i].tok;
+              break;
+            end;
+        if optoken=NOTOKEN then
+          begin
+            if not (ocf_check_only in ocf) then
+              begin
+                CGMessage(parser_e_operator_not_overloaded);
+                t:=cnothingnode.create;
+              end;
+            exit;
+          end;
 
 
         cand_cnt:=search_operator(optoken,(optoken<>_NE) and not (ocf_check_only in ocf));
         cand_cnt:=search_operator(optoken,(optoken<>_NE) and not (ocf_check_only in ocf));