Browse Source

compiler: allow Inc, Dec, Explicit operators for other fpc modes

git-svn-id: trunk@16637 -
paul 14 năm trước cách đây
mục cha
commit
c0c7e40b65
3 tập tin đã thay đổi với 89 bổ sung38 xóa
  1. 1 0
      .gitattributes
  2. 39 38
      compiler/pdecsub.pas
  3. 49 0
      tests/test/toperator11.pp

+ 1 - 0
.gitattributes

@@ -9598,6 +9598,7 @@ tests/test/tobject7.pp svneol=native#text/plain
 tests/test/tobject8.pp svneol=native#text/plain
 tests/test/toperator1.pp svneol=native#text/plain
 tests/test/toperator10.pp svneol=native#text/pascal
+tests/test/toperator11.pp svneol=native#text/pascal
 tests/test/toperator2.pp svneol=native#text/plain
 tests/test/toperator3.pp svneol=native#text/plain
 tests/test/toperator4.pp svneol=native#text/plain

+ 39 - 38
compiler/pdecsub.pas

@@ -821,44 +821,45 @@ implementation
                 _CARET:
                   Message1(parser_e_overload_operator_failed,'**');
                 _ID:
-                  if lastidtoken=_ENUMERATOR then
-                    optoken:=_OP_ENUMERATOR
-                  else
-                  if (m_delphi in current_settings.modeswitches) then
-                    case lastidtoken of
-                      _IMPLICIT:optoken:=_ASSIGNMENT;
-                      _EXPLICIT:optoken:=_OP_EXPLICIT;
-                      _NEGATIVE:optoken:=_MINUS;
-//                         _POSITIVE:optoken:=_PLUS;
-                      _INC:optoken:=_OP_INC;
-                      _DEC:optoken:=_OP_DEC;
-                      _LOGICALNOT:optoken:=_OP_NOT;
-                      _IN:optoken:=_OP_IN;
-                      _EQUAL:optoken:=_EQ;
-                      _NOTEQUAL:optoken:=_NE;
-                      _GREATERTHAN:optoken:=_GT;
-                      _GREATERTHANOREQUAL:optoken:=_GTE;
-                      _LESSTHAN:optoken:=_LT;
-                      _LESSTHANOREQUAL:optoken:=_LTE;
-                      _ADD:optoken:=_PLUS;
-                      _SUBTRACT:optoken:=_MINUS;
-                      _MULTIPLY:optoken:=_STAR;
-                      _DIVIDE:optoken:=_SLASH;
-                      _INTDIVIDE:optoken:=_OP_DIV;
-                      _MODULUS:optoken:=_OP_MOD;
-                      _LEFTSHIFT:optoken:=_OP_SHL;
-                      _RIGHTSHIFT:optoken:=_OP_SHR;
-                      _LOGICALAND:optoken:=_OP_AND;
-                      _LOGICALOR:optoken:=_OP_OR;
-                      _LOGICALXOR:optoken:=_OP_XOR;
-                      _BITWISEAND:optoken:=_OP_AND;
-                      _BITWISEOR:optoken:=_OP_OR;
-                      _BITWISEXOR:optoken:=_OP_XOR;
-                      else
-                        Message1(parser_e_overload_operator_failed,'');
-                    end
-                  else
-                    Message1(parser_e_overload_operator_failed,'');
+                  case lastidtoken of
+                    _ENUMERATOR:optoken:=_OP_ENUMERATOR;
+                    _EXPLICIT:optoken:=_OP_EXPLICIT;
+                    _INC:optoken:=_OP_INC;
+                    _DEC:optoken:=_OP_DEC;
+                    else
+                    if (m_delphi in current_settings.modeswitches) then
+                      case lastidtoken of
+                        _IMPLICIT:optoken:=_ASSIGNMENT;
+                        _NEGATIVE:optoken:=_MINUS;
+  //                         _POSITIVE:optoken:=_PLUS;
+                        _LOGICALNOT:optoken:=_OP_NOT;
+                        _IN:optoken:=_OP_IN;
+                        _EQUAL:optoken:=_EQ;
+                        _NOTEQUAL:optoken:=_NE;
+                        _GREATERTHAN:optoken:=_GT;
+                        _GREATERTHANOREQUAL:optoken:=_GTE;
+                        _LESSTHAN:optoken:=_LT;
+                        _LESSTHANOREQUAL:optoken:=_LTE;
+                        _ADD:optoken:=_PLUS;
+                        _SUBTRACT:optoken:=_MINUS;
+                        _MULTIPLY:optoken:=_STAR;
+                        _DIVIDE:optoken:=_SLASH;
+                        _INTDIVIDE:optoken:=_OP_DIV;
+                        _MODULUS:optoken:=_OP_MOD;
+                        _LEFTSHIFT:optoken:=_OP_SHL;
+                        _RIGHTSHIFT:optoken:=_OP_SHR;
+                        _LOGICALAND:optoken:=_OP_AND;
+                        _LOGICALOR:optoken:=_OP_OR;
+                        _LOGICALXOR:optoken:=_OP_XOR;
+                        _BITWISEAND:optoken:=_OP_AND;
+                        _BITWISEOR:optoken:=_OP_OR;
+                        _BITWISEXOR:optoken:=_OP_XOR;
+                        else
+                          Message1(parser_e_overload_operator_failed,'');
+                      end
+                    else
+                      Message1(parser_e_overload_operator_failed,'');
+                  end
                 else
                   Message1(parser_e_overload_operator_failed,'');
               end;

+ 49 - 0
tests/test/toperator11.pp

@@ -0,0 +1,49 @@
+program toperator11;
+
+{$mode objfpc}{$H+}
+{$apptype console}
+
+type
+  TFoo = record
+    F: Integer;
+  end;
+
+operator Inc(a: TFoo): TFoo;
+begin
+  Result.F := a.F + 1;
+end;
+
+operator Dec(a: TFoo): TFoo;
+begin
+  Result.F := a.F - 1;
+end;
+
+operator :=(a: TFoo): Integer;
+begin
+  Result := a.F;
+end;
+
+operator explicit(a: TFoo): Integer;
+begin
+  Result := a.F + 1;
+end;
+
+var
+  a: TFoo;
+  i: Integer;
+begin
+  a.F := 1;
+  inc(a);
+  if a.F <> 2 then
+    halt(1);
+  dec(a);
+  if a.F <> 1 then
+    halt(2);
+  i := a;
+  if i <> 1 then
+    halt(3);
+  if Integer(a) <> 2 then
+    halt(4);
+  WriteLn('ok');
+end.
+