Browse Source

* PChar -> PAnsiChar

Michaël Van Canneyt 2 years ago
parent
commit
889e3a15b6

+ 1 - 1
packages/fcl-passrc/examples/pasrewrite.pp

@@ -177,7 +177,7 @@ Var
   FileResolver: TFileResolver;
   InputFileName : string;
   Parser: TPasParser;
-  Start, CurPos: PChar;
+  Start, CurPos: PAnsiChar;
   Scanner: TPascalScanner;
 
   procedure ProcessCmdLinePart;

+ 6 - 6
packages/fcl-passrc/examples/testunit1.pp

@@ -597,12 +597,12 @@ TYpe
   msg,curtokenname : string;
   TheCustomer: Passenger;
   L: ^LongInt;
-  P: PPChar;
+  P: PPAnsiChar;
   S,T: Ar;
   M, X,Y : Double;
   Done : Boolean;
   Weather,Good: Boolean;  
-  c : char;
+  c : AnsiChar;
   j,dwarfs,i,Number,Block : integer;
   exp1,exp2,exp3,exp4,exp5,exp6,exp7,exp8,exp9 : boolean;
   o : Tobject;
@@ -820,8 +820,8 @@ TYpe
     z : tdays;
     today,tomorrow : tday;
     bs : set of byte;
-    cs : set of char;
-    cc : char;  
+    cs : set of AnsiChar;
+    cc : AnsiChar;  
     W : TShortDays;
     buffer : array[1..10] of byte;
     P : Pointer;
@@ -847,11 +847,11 @@ TYpe
  cs:= ['A'..'Z','a'..'z','0'..'9'];
 
  i:= Byte('A');
- cc:= Char(48);
+ cc:= AnsiChar(48);
  ad:= boolean(1);
  i:= longint(@Buffer);
  i:= Integer('A');
- cc:= Char(225);
+ cc:= AnsiChar(225);
  i:= Word(@Buffer);
 
  B:= Byte(C);

+ 29 - 29
packages/fcl-passrc/src/pasresolveeval.pas

@@ -33,7 +33,7 @@ Works:
 - string:
   - #65, '', 'a', 'ab'
   - +, =, <>, <, >, <=, >=
-  - pred(), succ(), chr(), ord(), low(char), high(char)
+  - pred(), succ(), chr(), ord(), low(AnsiChar), high(AnsiChar)
   - s[]
   - length(string)
   - #$DC00
@@ -41,7 +41,7 @@ Works:
 - enum
   - ord(), low(), high(), pred(), succ()
   - typecast enumtype(integer)
-- set of enum, set of char, set of bool, set of int
+- set of enum, set of AnsiChar, set of bool, set of int
   - [a,b,c..d]
   - +, -, *, ><, =, <>, >=, <=, in
   - error on duplicate in const set
@@ -434,9 +434,9 @@ type
     {$endif}
     revkUnicodeString, // TResEvalUTF16
     revkEnum,     // TResEvalEnum
-    revkRangeInt, // TResEvalRangeInt: range of enum, int, char, widechar, e.g. 1..2
+    revkRangeInt, // TResEvalRangeInt: range of enum, int, AnsiChar, widechar, e.g. 1..2
     revkRangeUInt, // TResEvalRangeUInt: range of uint, e.g. 1..2
-    revkSetOfInt,  // set of enum, int, char, widechar, e.g. [1,2..3]
+    revkSetOfInt,  // set of enum, int, AnsiChar, widechar, e.g. [1,2..3]
     revkExternal // TResEvalExternal: an external const
     );
   TREVKinds = set of TREVKind;
@@ -833,7 +833,7 @@ function GetElementNameAndParams(El: TPasElement; MaxLvl: integer = 3): string;
 function GetTypeParamNames(Templates: TFPList; MaxLvl: integer = 3): string;
 function dbgs(const Flags: TResEvalFlags): string; overload;
 function dbgs(v: TResEvalValue): string; overload;
-function LastPos(c: char; const s: string): sizeint;
+function LastPos(c: AnsiChar; const s: string): sizeint;
 
 implementation
 
@@ -1023,25 +1023,25 @@ begin
   case CodePoint of
     0..$7f:
       begin
-        Result:=char(byte(CodePoint));
+        Result:=AnsiChar(byte(CodePoint));
       end;
     $80..$7ff:
       begin
-        Result:=char(byte($c0 or (CodePoint shr 6)))
-               +char(byte($80 or (CodePoint and $3f)));
+        Result:=AnsiChar(byte($c0 or (CodePoint shr 6)))
+               +AnsiChar(byte($80 or (CodePoint and $3f)));
       end;
     $800..$ffff:
       begin
-        Result:=char(byte($e0 or (CodePoint shr 12)))
-               +char(byte((CodePoint shr 6) and $3f) or $80)
-               +char(byte(CodePoint and $3f) or $80);
+        Result:=AnsiChar(byte($e0 or (CodePoint shr 12)))
+               +AnsiChar(byte((CodePoint shr 6) and $3f) or $80)
+               +AnsiChar(byte(CodePoint and $3f) or $80);
       end;
     $10000..$10ffff:
       begin
-        Result:=char(byte($f0 or (CodePoint shr 18)))
-               +char(byte((CodePoint shr 12) and $3f) or $80)
-               +char(byte((CodePoint shr 6) and $3f) or $80)
-               +char(byte(CodePoint and $3f) or $80);
+        Result:=AnsiChar(byte($f0 or (CodePoint shr 18)))
+               +AnsiChar(byte((CodePoint shr 12) and $3f) or $80)
+               +AnsiChar(byte((CodePoint shr 6) and $3f) or $80)
+               +AnsiChar(byte(CodePoint and $3f) or $80);
       end;
   else
     Result:='';
@@ -1189,7 +1189,7 @@ begin
     Result:=v.AsDebugString;
 end;
 
-function LastPos(c: char; const s: string): sizeint;
+function LastPos(c: AnsiChar; const s: string): sizeint;
 var
   i: SizeInt;
 begin
@@ -3846,7 +3846,7 @@ begin
         RangeStart:=StringToOrd(Value,nil);
         if RangeStart>$ffff then
           begin
-          // set of string (not of char)
+          // set of string (not of AnsiChar)
           ReleaseEvalValue(TResEvalValue(Result));
           exit;
           end;
@@ -3861,7 +3861,7 @@ begin
           RaiseNotYetImplemented(20170713201516,El);
         if length(TResEvalUTF16(Value).S)<>1 then
           begin
-          // set of string (not of char)
+          // set of string (not of AnsiChar)
           ReleaseEvalValue(TResEvalValue(Result));
           exit;
           end;
@@ -4180,7 +4180,7 @@ begin
       begin
       if PosEl<>nil then
         RaiseMsg(20170522221143,nXExpectedButYFound,sXExpectedButYFound,
-          ['char','string'],PosEl)
+          ['AnsiChar','string'],PosEl)
       else
         exit(Invalid);
       end
@@ -4191,7 +4191,7 @@ begin
         begin
         if PosEl<>nil then
           RaiseMsg(20190124180407,nXExpectedButYFound,sXExpectedButYFound,
-            ['char','string'],PosEl)
+            ['AnsiChar','string'],PosEl)
         else
           exit(Invalid);
         end;
@@ -4207,7 +4207,7 @@ begin
       begin
       if PosEl<>nil then
         RaiseMsg(20170522221358,nXExpectedButYFound,sXExpectedButYFound,
-          ['char','string'],PosEl)
+          ['AnsiChar','string'],PosEl)
       else
         exit(Invalid);
       end
@@ -4286,7 +4286,7 @@ var
   end;
 {$ENDIF}
 
-  procedure AddSrc(h: String);
+  procedure AddSrc(h: AnsiString);
   {$ifdef FPC_HAS_CPSTRING}
   var
     ValueAnsi: TResEvalString;
@@ -4304,7 +4304,7 @@ var
         // append non ASCII -> needs codepage
         OnlyASCII:=false;
         FetchSourceCP;
-        SetCodePage(rawbytestring(h),SourceCP,false);
+        SetCodePage(RawByteString(h),SourceCP,false);
         break;
         end;
 
@@ -4368,7 +4368,7 @@ var
   var
     StartP: Integer;
     u: longword;
-    c: Char;
+    c: AnsiChar;
     {$ifdef FPC_HAS_CPSTRING}
     ValueAnsi: TResEvalString;
     ValueUTF16: TResEvalUTF16;
@@ -4479,7 +4479,7 @@ var
 
 var
   p, StartP, l: integer;
-  c: Char;
+  c: AnsiChar;
   S: String;
 begin
   Result:=nil;
@@ -4794,7 +4794,7 @@ begin
       revskChar:
         if Value.Kind in revkAllStrings then
           begin
-          // string in char..char
+          // string in AnsiChar..AnsiChar
           CharIndex:=StringToOrd(Value,ValueExpr);
           if (CharIndex<RgInt.RangeStart) or (CharIndex>RgInt.RangeEnd) then
             begin
@@ -5345,10 +5345,10 @@ end;
 function TResExprEvaluator.CheckValidUTF8(const s: RawByteString;
   ErrorEl: TPasElement): boolean;
 var
-  p, EndP: PChar;
+  p, EndP: PAnsiChar;
   l: SizeInt;
 begin
-  p:=PChar(s);
+  p:=PAnsiChar(s);
   EndP:=p+length(s);
   while p<EndP do
     begin
@@ -6081,7 +6081,7 @@ begin
   case ElKind of
     revskEnum: Result:='enum range';
     revskInt: Result:='integer range';
-    revskChar: Result:='char range';
+    revskChar: Result:='AnsiChar range';
     revskBool: Result:='boolean range';
   else
     Result:='integer range';

+ 68 - 51
packages/fcl-passrc/src/pasresolver.pp

@@ -43,7 +43,7 @@ Works:
   - fail to write a loop var inside the loop
 - spot duplicates
 - type cast base types
-- char
+- AnsiChar
   - ord(), chr()
 - record
   - variants
@@ -101,7 +101,7 @@ Works:
   - cast integer to enum, enum to integer
   - $ScopedEnums
 - sets - TPasSetType
-  - set of char
+  - set of AnsiChar
   - set of integer
   - set of boolean
   - set of enum
@@ -120,7 +120,7 @@ Works:
 - procedure inc/dec(var ordinal; decr: ordinal = 1)
 - function Assigned(Pointer or Class or Class-Of): boolean
 - arrays TPasArrayType
-  - TPasEnumType, char, integer, range
+  - TPasEnumType, AnsiChar, integer, range
   - low, high, length, setlength, assigned
   - function concat(array1,array2,...): array
   - function copy(array): array, copy(a,start), copy(a,start,end)
@@ -132,7 +132,7 @@ Works:
   - open array, override, pass array literal, pass var
   - type cast array to arrays with same dimensions and compatible element type
   - static array range checking
-  - const array of char = string
+  - const array of AnsiChar = string
   - a:=[...]   // assignation using constant array
   - a:=[[...],[...]]
   - a:=[...]+[...]  a+[]  []+a   modeswitch arrayoperators
@@ -176,7 +176,7 @@ Works:
   - integer ranges
   - boolean ranges
   - enum ranges
-  - char ranges
+  - AnsiChar ranges
   - +, -, *, div, mod, /, shl, shr, or, and, xor, in, ^^, ><
   - =, <>, <, <=, >, >=
   - ord(), low(), high(), pred(), succ(), length()
@@ -190,9 +190,9 @@ Works:
     rg:=rg, rg1:=rg2, rg:=enum, =, <>, in
     array[rg], low(array), high(array)
 - for..in..do :
-  - type boolean, char, byte, shortint, word, smallint, longword, longint
-  - type enum range, char range, integer range
-  - type/var set of: enum, enum range, integer, integer range, char, char range
+  - type boolean, AnsiChar, byte, shortint, word, smallint, longword, longint
+  - type enum range, AnsiChar range, integer range
+  - type/var set of: enum, enum range, integer, integer range, AnsiChar, AnsiChar range
   - array var
   - function: enumerator
   - class
@@ -255,7 +255,7 @@ ToDo:
    - operator enumerator
    - binaryexpr
    - advanced records
-- Include/Exclude for set of int/char/bool
+- Include/Exclude for set of int/AnsiChar/bool
 - error if property method resolution is not used
 - $H-hintpos$H+
 - $pop, $push
@@ -340,7 +340,7 @@ type
     btContext,     // any source declared type with LoTypeEl/HiTypeEl
     btModule,
     btUntyped,     // TPasArgument without ArgType
-    btChar,        // char
+    btChar,        // AnsiChar
     {$ifdef FPC_HAS_CPSTRING}
     btAnsiChar,    // ansichar
     {$endif}
@@ -476,7 +476,7 @@ const
     'Context',
     'Module',
     'Untyped',
-    'Char',
+    'AnsiChar',
     {$ifdef FPC_HAS_CPSTRING}
     'AnsiChar',
     {$endif}
@@ -1600,8 +1600,7 @@ type
       Scope: TPasIdentifierScope; OnlyLocal: boolean): TPasProcedure;
   protected
     procedure SetCurrentParser(AValue: TPasParser); override;
-    procedure ScannerWarnDirective(Sender: TObject; Identifier: string;
-      State: TWarnMsgState; var Handled: boolean); virtual;
+    procedure ScannerWarnDirective(Sender: TObject; Identifier: TPasScannerString; State: TWarnMsgState; var Handled: boolean); virtual;
     procedure SetRootElement(const AValue: TPasModule); virtual;
     procedure CheckTopScope(ExpectedClass: TPasScopeClass; AllowDescendants: boolean = false);
     function AddIdentifier(Scope: TPasIdentifierScope;
@@ -5655,7 +5654,7 @@ begin
 end;
 
 procedure TPasResolver.ScannerWarnDirective(Sender: TObject;
-  Identifier: string; State: TWarnMsgState; var Handled: boolean);
+  Identifier: TPasScannerString; State: TWarnMsgState; var Handled: boolean);
 var
   MsgNumbers: TIntegerDynArray;
   i: Integer;
@@ -6249,7 +6248,7 @@ begin
       BaseTypeData:=TResElDataBaseType(EnumType.CustomData);
       if BaseTypeData.BaseType in (btAllChars+[btBoolean,btByte]) then
         exit;
-      RaiseXExpectedButYFound(20170216151553,'char or boolean',
+      RaiseXExpectedButYFound(20170216151553,'AnsiChar or boolean',
         GetElementTypeName(EnumType),GetEnumTypePosEl);
       end;
     end;
@@ -6597,7 +6596,7 @@ begin
         RaiseXExpectedButYFound(20171009193514,'range',GetElementTypeName(RangeResolved.IdentEl),Expr);
       end
     else if RangeResolved.BaseType in btArrayRangeTypes then
-      // full range, e.g. array[char]
+      // full range, e.g. array[AnsiChar]
     else if (RangeResolved.BaseType=btContext) and (RangeResolved.LoTypeEl is TPasEnumType) then
       // e.g. array[enumtype]
     else if (RangeResolved.BaseType=btContext) and (RangeResolved.LoTypeEl is TPasGenericTemplateType) then
@@ -7728,7 +7727,7 @@ begin
                       GetResolverResultDescription(VarResolved,true),loop.VariableName);
                 revskChar:
                   if VarRangeInt.ElKind<>revskChar then
-                    RaiseXExpectedButYFound(20171109200753,'char',
+                    RaiseXExpectedButYFound(20171109200753,'AnsiChar',
                       GetResolverResultDescription(VarResolved,true),loop.VariableName);
                 revskBool:
                   if VarRangeInt.ElKind<>revskBool then
@@ -13322,7 +13321,7 @@ begin
           if (Bin.Kind=pekRange) and (LeftResolved.BaseType in btAllChars) then
             begin
             if not (RightResolved.BaseType in btAllChars) then
-              RaiseXExpectedButYFound(20170216152603,'char',BaseTypeNames[RightResolved.BaseType],Bin.Right);
+              RaiseXExpectedButYFound(20170216152603,'AnsiChar',BaseTypeNames[RightResolved.BaseType],Bin.Right);
             SetResolverValueExpr(ResolvedEl,btRange,
               FBaseTypes[LeftResolved.BaseType],FBaseTypes[LeftResolved.BaseType],
               Bin,[rrfReadable]);
@@ -14046,7 +14045,7 @@ begin
   {$ENDIF}
   if ResolvedEl.BaseType in btAllStrings then
     begin
-    // stringvar[] => char
+    // stringvar[] => AnsiChar
     case GetActualBaseType(ResolvedEl.BaseType) of
     {$ifdef FPC_HAS_CPSTRING}
     btAnsiString,btRawByteString,btShortString:
@@ -14750,7 +14749,7 @@ begin
     begin
     if RBT in btAllChars then
       exit;
-    RaiseXExpectedButYFound(20170216152702,'char',BaseTypeNames[RHS.BaseType],Right);
+    RaiseXExpectedButYFound(20170216152702,'AnsiChar',BaseTypeNames[RHS.BaseType],Right);
     end
   else if LBT=btContext then
     begin
@@ -14835,7 +14834,7 @@ begin
         LHS.BaseType:=GetCombinedChar(LHS,RHS,Right);
         exit;
         end;
-      RaiseXExpectedButYFound(20170420093024,'char',BaseTypeNames[RHS.BaseType],Right);
+      RaiseXExpectedButYFound(20170420093024,'AnsiChar',BaseTypeNames[RHS.BaseType],Right);
       end
     else if LBT in btAllStrings then
       begin
@@ -14961,7 +14960,14 @@ end;
 
 function TPasResolver.IsCharLiteral(const Value: string; ErrorPos: TPasElement
   ): TResolverBaseType;
-// returns true if Value is a Pascal char literal
+
+{$IFDEF FPC_HAS_CPSTRING}
+{$IF SIZEOF(CHAR)=1}
+  {$DEFINE USESINGLEBYTE}
+{$ENDIF}
+{$ENDIF}
+
+// returns true if Value is a Pascal AnsiChar literal
 // btAnsiChar: #65, #$50, ^G, 'a'
 // btWideChar: #10000, 'ä'
 var
@@ -14978,7 +14984,7 @@ begin
     begin
     inc(p);
     if p>l then exit;
-    {$ifdef FPC_HAS_CPSTRING}
+    {$ifdef USESINGLEBYTE}
     case Value[2] of
     '''':
       if Value='''''''''' then
@@ -14989,7 +14995,7 @@ begin
     #192..#255:
       if BaseTypeChar=btWideChar then
         begin
-        // default char is widechar: UTF-8 'ä' is a widechar
+        // default AnsiChar is widechar: UTF-8 'ä' is a widechar
         i:=Utf8CodePointLen(@Value[2],4,false);
         //writeln('TPasResolver.IsCharLiteral "',Value,'" ',length(Value),' i=',i);
         if i<2 then
@@ -15008,7 +15014,10 @@ begin
     #$DC00..#$DFFF: ;
     else
       if (l=3) and (Value[3]='''') then
-        Result:=btWideChar; // e.g. 'a'
+        if Ord(Value[2])<128 then
+          Result:=btAnsiChar // e.g. 'a'
+        else
+          Result:=btWideChar; // e.g. 'a'
     end;
     {$endif}
     end;
@@ -15956,7 +15965,7 @@ begin
       {$ifdef FPC_HAS_CPSTRING}
       else if (bt=btAnsiChar) or ((bt=btChar) and (BaseTypeChar=btAnsiChar)) then
         try
-          Result:=TResEvalString.CreateValue(Char(Int));
+          Result:=TResEvalString.CreateValue(AnsiChar(Int));
         except
           RaiseMsg(20180125112510,nRangeCheckError,sRangeCheckError,[],Params);
         end
@@ -16019,7 +16028,7 @@ begin
         begin
         // ansichar(ansistring)
         if fExprEvaluator.StringToOrd(Value,nil)>$ffff then
-          RaiseXExpectedButYFound(20181005141025,'char','string',Params);
+          RaiseXExpectedButYFound(20181005141025,'AnsiChar','string',Params);
         Result:=Value;
         Value:=nil;
         end
@@ -16032,7 +16041,7 @@ begin
           Value:=nil;
           end
         else
-          RaiseXExpectedButYFound(20181005141058,'char','string',Params);
+          RaiseXExpectedButYFound(20181005141058,'AnsiChar','string',Params);
         end
       else if (bt=btAnsiString) or ((bt=btString) and (BaseTypeString=btAnsiString)) then
         begin
@@ -19018,7 +19027,7 @@ begin
   Params:=TParamsExpr(Expr);
 
   // first Param0: set variable
-  // todo set of int, set of char, set of bool
+  // todo set of int, set of AnsiChar, set of bool
   Param0:=Params.Params[0];
   ComputeElement(Param0,Param0Resolved,[rcNoImplicitProc]);
   Param1:=Params.Params[1];
@@ -19392,7 +19401,7 @@ begin
     exit(cIncompatible);
   Params:=TParamsExpr(Expr);
 
-  // first param: bool, integer, enum or char
+  // first param: bool, integer, enum or AnsiChar
   Param:=Params.Params[0];
   ComputeElement(Param,ParamResolved,[]);
   Result:=cIncompatible;
@@ -19419,7 +19428,7 @@ begin
       end;
     end;
   if Result=cIncompatible then
-    exit(CheckRaiseTypeArgNo(20170216152334,1,Param,ParamResolved,'enum or char',RaiseOnError));
+    exit(CheckRaiseTypeArgNo(20170216152334,1,Param,ParamResolved,'enum or AnsiChar',RaiseOnError));
 
   Result:=CheckBuiltInMaxParamCount(Proc,Params,1,RaiseOnError);
 end;
@@ -19473,13 +19482,13 @@ begin
     exit(cIncompatible);
   Params:=TParamsExpr(Expr);
 
-  // first param: enumtype, range, built-in ordinal type (char, longint, ...)
+  // first param: enumtype, range, built-in ordinal type (AnsiChar, longint, ...)
   Param:=Params.Params[0];
   ComputeElement(Param,ParamResolved,[]);
   Result:=cIncompatible;
   bt:=ParamResolved.BaseType;
   if bt in btAllRanges then
-    // e.g. high(char)
+    // e.g. high(AnsiChar)
     Result:=cExact
   else if bt=btSet then
     Result:=cExact
@@ -19782,7 +19791,7 @@ begin
     exit(cIncompatible);
   Params:=TParamsExpr(Expr);
 
-  // first param: enum, range, set, char or integer
+  // first param: enum, range, set, AnsiChar or integer
   Param:=Params.Params[0];
   ComputeElement(Param,ParamResolved,[]);
   Result:=cIncompatible;
@@ -20265,7 +20274,7 @@ begin
 
   for i:=0 to length(Params.Params)-1 do
     begin
-    // all params: char or string
+    // all params: AnsiChar or string
     Param:=Params.Params[i];
     ComputeElement(Param,ParamResolved,[]);
     if not (rrfReadable in ParamResolved.Flags)
@@ -20288,7 +20297,7 @@ begin
   ParamsArr:=Params.Params;
   for i:=0 to length(ParamsArr)-1 do
     begin
-    // all params: char or string
+    // all params: AnsiChar or string
     Param:=ParamsArr[i];
     ComputeElement(Param,ParamResolved,[]);
     if i=0 then
@@ -20316,7 +20325,7 @@ begin
   try
     for i:=0 to length(Params.Params)-1 do
       begin
-      // all params: char or string
+      // all params: AnsiChar or string
       Param:=Params.Params[i];
       Value:=Eval(Param,Flags);
       if Value=nil then
@@ -22353,11 +22362,11 @@ begin
         @BI_Assigned_OnGetCallCompatibility,@BI_Assigned_OnGetCallResult,
         nil,@BI_Assigned_OnFinishParamsExpr,bfAssigned);
   if bfChr in TheBaseProcs then
-    AddBuiltInProc('Chr','function Chr(const Integer): char',
+    AddBuiltInProc('Chr','function Chr(const Integer): AnsiChar',
         @BI_Chr_OnGetCallCompatibility,@BI_Chr_OnGetCallResult,
         @BI_Chr_OnEval,nil,bfChr);
   if bfOrd in TheBaseProcs then
-    AddBuiltInProc('Ord','function Ord(const Enum or Char): integer',
+    AddBuiltInProc('Ord','function Ord(const Enum or AnsiChar): integer',
         @BI_Ord_OnGetCallCompatibility,@BI_Ord_OnGetCallResult,
         @BI_Ord_OnEval,nil,bfOrd);
   if bfLow in TheBaseProcs then
@@ -23396,9 +23405,10 @@ procedure TPasResolver.RaiseIncompatibleTypeDesc(id: TMaxPrecInt; MsgNumber: int
     if ArgNo>High(Args) then
       exit('invalid param '+IntToStr(ArgNo));
     case Args[ArgNo].VType of
-{$IFDEF PAS2JS}    
+{$IFDEF PAS2JS}
     vtUnicodeString: Result:=Args[ArgNo].VUnicodeString;
-{$ELSE}    
+{$ELSE}
+    vtUnicodeString: Result:=UnicodeString(Args[ArgNo].VUnicodeString);
     vtAnsiString: Result:=AnsiString(Args[ArgNo].VAnsiString);
 {$ENDIF}    
     else
@@ -26605,7 +26615,7 @@ function TPasResolver.CheckAssignCompatibilityArrayType(const LHS,
   procedure Check_ArrayOfChar_String(ArrType: TPasArrayType;
     ArrLength: integer; const ElTypeResolved: TPasResolverResult;
     Expr: TPasExpr; ErrorEl: TPasElement);
-  // check if assigning a string to an array of char fits
+  // check if assigning a string to an array of AnsiChar fits
   var
     Value: TResEvalValue;
     ElBT: TResolverBaseType;
@@ -26619,7 +26629,7 @@ function TPasResolver.CheckAssignCompatibilityArrayType(const LHS,
     ElBT:=GetActualBaseType(ElTypeResolved.BaseType);
     if length(ArrType.Ranges)=0 then
       begin
-      // dynamic array of char can hold any string
+      // dynamic array of AnsiChar can hold any string
       // ToDo: check if value can be converted without loss
       Result:=cExact;
       exit;
@@ -26974,12 +26984,19 @@ function TPasResolver.CheckAssignCompatibilityArrayType(const LHS,
             [IntToStr(ExpectedCount),'1'],ErrorEl);
         exit;
         end;
-      if (Values.BaseType in btAllStrings) and (ElTypeResolved.BaseType in btAllChars) then
-        begin
-        // e.g. array of char = ''
-        Check_ArrayOfChar_String(ArrType,ExpectedCount,ElTypeResolved,Expr,ErrorEl);
-        exit;
-        end;
+      if (ElTypeResolved.BaseType in btAllChars) then
+        if (Values.BaseType in btAllStrings) then
+          begin
+          // e.g. array of AnsiChar = ''
+          Check_ArrayOfChar_String(ArrType,ExpectedCount,ElTypeResolved,Expr,ErrorEl);
+          exit;
+          end
+        else if (Values.BaseType=btWidechar) then
+          begin
+          // Widechar is (usually) 2 ansichars.
+          Check_ArrayOfChar_String(ArrType,ExpectedCount,ElTypeResolved,Expr,ErrorEl);
+          exit;
+          end;
       if (ExpectedCount>1) then
         begin
         if RaiseOnIncompatible then
@@ -27266,7 +27283,7 @@ begin
             begin
             FromTypeEl:=FromResolved.LoTypeEl;
             if FromTypeEl.ClassType=TPasEnumType then
-              // e.g. char(TEnum)
+              // e.g. AnsiChar(TEnum)
               Result:=cCompatible;
             end;
           end
@@ -30448,7 +30465,7 @@ function TPasResolver.CheckClassIsClass(SrcType, DestType: TPasType): integer;
 // check if Src is equal or descends from Dest
 // Generics: TBird<T> is both directions a TBird<word>
 //       and TBird<TMap<T>> is both directions a TBird<TMap<word>>
-//       but a TBird<word> is not a TBird<char>
+//       but a TBird<word> is not a TBird<AnsiChar>
 
   function CheckSpecialized(SrcScope, DestScope: TPasGenericScope): boolean;
   var

File diff suppressed because it is too large
+ 184 - 182
packages/fcl-passrc/src/pastree.pp


+ 1 - 1
packages/fcl-passrc/src/paswrite.pp

@@ -739,7 +739,7 @@ end;
 procedure TPasWriter.WriteConst(AConst: TPasConst);
 
 Const
-  Seps : Array[Boolean] of Char = ('=',':');
+  Seps : Array[Boolean] of AnsiChar = ('=',':');
 
 Var
   Vart,Decl : String;

+ 4 - 4
packages/fcl-passrc/src/pparser.pp

@@ -635,7 +635,7 @@ Function SplitCommandLine(S: String) : TStringDynArray;
   Var
     Wstart,wend : Integer;
     InLiteral : Boolean;
-    LastLiteral : Char;
+    LastLiteral : AnsiChar;
 
     Procedure AppendToResult;
 
@@ -779,7 +779,7 @@ end;
 function ParseSource(AEngine: TPasTreeContainer;
   const FPCCommandLine, OSTarget, CPUTarget: String): TPasModule;
 var
-  FPCParams: TStringDynArray;
+  FPCParams: TRTLStringDynArray;
 begin
   FPCParams:=SplitCommandLine(FPCCommandLine);
   Result:=ParseSource(AEngine, FPCParams, OSTarget, CPUTarget,[]);
@@ -789,7 +789,7 @@ end;
 function ParseSource(AEngine: TPasTreeContainer;
   const FPCCommandLine, OSTarget, CPUTarget: String; UseStreams : Boolean): TPasModule;
 var
-  FPCParams: TStringDynArray;
+  FPCParams: TRTLStringDynArray;
 begin
   FPCParams:=SplitCommandLine(FPCCommandLine);
   if UseStreams then
@@ -3425,7 +3425,7 @@ Var
 begin
   StartPos:=CurTokenPos;
   if SkipHeader then
-    N:=ChangeFileExt(Scanner.CurFilename,'')
+    N:=ChangeFileExt(Scanner.CurFilename,RTLString(''))
   else
     begin
     N:=ExpectIdentifier;

File diff suppressed because it is too large
+ 216 - 206
packages/fcl-passrc/src/pscanner.pp


+ 4 - 2
packages/fcl-passrc/tests/tcbaseparser.pas

@@ -2,6 +2,8 @@ unit tcbaseparser;
 
 {$mode objfpc}{$H+}
 
+{$define NOCONSOLE}
+
 interface
 
 uses
@@ -416,11 +418,11 @@ begin
     FFileName:=MainFilename;
   FResolver.AddStream(FFileName,TStringStream.Create(FSource.Text));
   FScanner.OpenFile(FFileName);
-  {$ifndef NOCONSOLE} // JC: To get the tests to run with GUI
+  { $ifndef NOCONSOLE} // JC: To get the tests to run with GUI
   Writeln('// Test : ',Self.TestName);
   for i:=0 to FSource.Count-1 do
     Writeln(Format('%:4d: ',[i+1]),FSource[i]);
-  {$EndIf}
+  { $EndIf}
 end;
 
 procedure TTestParser.ParseDeclarations;

+ 1 - 1
packages/fcl-passrc/tests/tcclasstype.pas

@@ -1954,7 +1954,7 @@ begin
   '    TWord = word;',
   '    [Blue]',
   '    [Green]',
-  '    TChar = char;',
+  '    TChar = AnsiChar;',
   '  end;',
   '']);
   ParseDeclarations;

+ 2 - 2
packages/fcl-passrc/tests/tcexprparser.pas

@@ -1002,14 +1002,14 @@ end;
 
 procedure TTestExpressions.TestPrimitiveChar;
 begin
-  DeclareVar('char');
+  DeclareVar('AnsiChar');
   ParseExpression('#32');
   AssertExpression('Simple string',theExpr,pekString,'#32');
 end;
 
 procedure TTestExpressions.TestPrimitiveControlChar;
 begin
-  DeclareVar('char');
+  DeclareVar('AnsiChar');
   ParseExpression('^M');
   AssertExpression('Simple string',theExpr,pekString,'^M');
 end;

+ 1 - 1
packages/fcl-passrc/tests/tconstparser.pas

@@ -520,7 +520,7 @@ end;
 
 procedure TTestConstParser.TestTypedNilConst;
 begin
-  Typed:='PChar';
+  Typed:='PAnsiChar';
   DoTestSimpleNilConst
 end;
 

+ 3 - 0
packages/fcl-passrc/tests/tcpassrcutil.pas

@@ -1,6 +1,7 @@
 unit tcpassrcutil;
 
 {$mode objfpc}{$H+}
+{$DEFINE NOCONSOLE}
 
 interface
 
@@ -399,8 +400,10 @@ begin
   AddLine('end.');
   FSrc.SaveToStream(FStream);
   FStream.Position:=0;
+{$IFNDEF NOCONSOLE}
   Writeln('// Test name : ',Self.TestName);
   Writeln(FSrc.Text);
+{$ENDIF}
 end;
 
 procedure TPasSrcUtilTest.AssertList(Msg: String; Els: array of string);

+ 12 - 12
packages/fcl-passrc/tests/tcresolvegenerics.pas

@@ -1604,7 +1604,7 @@ begin
   '  TObject = class end;',
   '  TBird<T> = class F: T; end;',
   '  TBirdWord = TBird<Word>;',
-  '  TBirdChar = TBird<Char>;',
+  '  TBirdChar = TBird<AnsiChar>;',
   'var',
   '  w: TBirdWord;',
   '  c: TBirdChar;',
@@ -1612,7 +1612,7 @@ begin
   '  w:=TBirdWord(c);',
   '']);
   ParseProgram;
-  CheckResolverHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird<System.Char>" and "TBird<System.Word>" are not related');
+  CheckResolverHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird<System.AnsiChar>" and "TBird<System.Word>" are not related');
 end;
 
 procedure TTestResolveGenerics.TestGen_Class_List;
@@ -2487,11 +2487,11 @@ begin
   'generic procedure {#B}Run<M,N>(a: M);',
   'begin',
   '  specialize {@A}Run<M>(a);',
-  '  specialize {@B}Run<double,char>(1.3);',
+  '  specialize {@B}Run<double,AnsiChar>(1.3);',
   'end;',
   'begin',
   '  specialize {@A}Run<word>(3);',
-  '  specialize {@B}Run<word,char>(4);',
+  '  specialize {@B}Run<word,AnsiChar>(4);',
   '']);
   ParseProgram;
 end;
@@ -2507,14 +2507,14 @@ begin
   'begin',
   '  specialize {@A}Run<M>;',
   '  specialize {@A}Run<M>();',
-  '  specialize {@B}Run<double,char>;',
-  '  specialize {@B}Run<double,char>();',
+  '  specialize {@B}Run<double,AnsiChar>;',
+  '  specialize {@B}Run<double,AnsiChar>();',
   'end;',
   'begin',
   '  specialize {@A}Run<word>;',
   '  specialize {@A}Run<word>();',
-  '  specialize {@B}Run<word,char>;',
-  '  specialize {@B}Run<word,char>();',
+  '  specialize {@B}Run<word,AnsiChar>;',
+  '  specialize {@B}Run<word,AnsiChar>();',
   '']);
   ParseProgram;
 end;
@@ -3004,12 +3004,12 @@ begin
   'generic procedure TObject.Run<M,N>(a: M);',
   'begin',
   '  specialize {@A}Run<M>(a);',
-  '  specialize {@B}Run<double,char>(1.3);',
+  '  specialize {@B}Run<double,AnsiChar>(1.3);',
   'end;',
   'var obj: TObject;',
   'begin',
   '  obj.specialize {@A}Run<word>(3);',
-  '  obj.specialize {@B}Run<word,char>(4);',
+  '  obj.specialize {@B}Run<word,AnsiChar>(4);',
   '']);
   ParseProgram;
 end;
@@ -3030,12 +3030,12 @@ begin
   'procedure TObject.Run<M,N>(a: M);',
   'begin',
   '  {@A}Run<M>(a);',
-  '  {@B}Run<double,char>(1.3);',
+  '  {@B}Run<double,AnsiChar>(1.3);',
   'end;',
   'var obj: TObject;',
   'begin',
   '  obj.{@A}Run<word>(3);',
-  '  obj.{@B}Run<word,char>(4);',
+  '  obj.{@B}Run<word,AnsiChar>(4);',
   '']);
   ParseProgram;
 end;

+ 135 - 88
packages/fcl-passrc/tests/tcresolver.pas

@@ -13,8 +13,11 @@
 *)
 unit TCResolver;
 
-{$mode objfpc}{$H+}
+{$mode objfpc}
+{$H+}
+{$codepage Utf8}
 
+{$DEFINE NOCONSOLE}
 interface
 
 uses
@@ -39,7 +42,7 @@ type
   end;
 
 const
-  SrcMarker: array[TSrcMarkerKind] of char = (
+  SrcMarker: array[TSrcMarkerKind] of AnsiChar = (
     '#', // mkLabel
     '@', // mkResolverReference
     '='  // mkDirectReference
@@ -129,7 +132,7 @@ type
     procedure OnCheckElementParent(El: TPasElement; arg: pointer);
     procedure FreeSrcMarkers;
     procedure OnPasResolverLog(Sender: TObject; const Msg: String);
-    procedure OnScannerDirective(Sender: TObject; Directive, Param: String;
+    procedure OnScannerDirective(Sender: TObject; Directive, Param: TPasScannerString;
       var Handled: boolean);
     procedure OnScannerLog(Sender: TObject; const Msg: String);
   Protected
@@ -1206,11 +1209,13 @@ begin
       aFilename:=E.Filename;
       aRow:=E.Row;
       aCol:=E.Column;
+{$IFNDEF NOCONSOLE}
       WriteSources(aFilename,aRow,aCol);
       writeln('ERROR: TTestResolver.ParseMain ',ExpectedModuleClass.ClassName,' Parser: '+E.ClassName+':'+E.Message,
         ' Scanner at'
         +' '+aFilename+'('+IntToStr(aRow)+','+IntToStr(aCol)+')'
         +' Line="'+Scanner.CurLine+'"');
+{$ENDIF}
       Fail(E.Message);
       end;
     on E: EPasResolve do
@@ -1223,14 +1228,18 @@ begin
         aFilename:=E.PasElement.SourceFilename;
         ResolverEngine.UnmangleSourceLineNumber(E.PasElement.SourceLinenumber,aRow,aCol);
         end;
+{$IFNDEF NOCONSOLE}
       WriteSources(aFilename,aRow,aCol);
       writeln('ERROR: TTestResolver.ParseMain ',ExpectedModuleClass.ClassName,' PasResolver: '+E.ClassName+':'+E.Message
         +' at '+aFilename+'('+IntToStr(aRow)+','+IntToStr(aCol)+')');
+{$ENDIF}
       Fail(E.Message);
       end;
     on E: Exception do
       begin
+{$IFNDEF NOCONSOLE}
       writeln('ERROR: TTestResolver.ParseMain ',ExpectedModuleClass.ClassName,' Exception: '+E.ClassName+':'+E.Message);
+{$ENDIF}
       Fail(E.Message);
       end;
   end;
@@ -1329,7 +1338,7 @@ var
     while p^ in ['a'..'z','A'..'Z','_','0'..'9'] do inc(p);
     Result:='';
     SetLength(Result,p-StartP);
-    Move(StartP^,Result[1],length(Result));
+    Move(StartP^,Result[1],length(Result)*SizeOf(Char));
   end;
 
   procedure AddLabel;
@@ -1369,7 +1378,7 @@ var
 
   procedure ParseCode(SrcLines: TStringList; aFilename: string);
   var
-    p: PChar;
+    p,pstart,pend: PChar;
     IsDirective: Boolean;
   begin
     //writeln('TTestResolver.CheckReferenceDirectives.ParseCode File=',aFilename);
@@ -1382,10 +1391,14 @@ var
       SrcLine:=SrcLines[LineNumber-1];
       if SrcLine='' then continue;
       //writeln('TTestResolver.CheckReferenceDirectives Line=',SrcLine);
-      p:=PChar(SrcLine);
+
+      pstart:=PChar(SrcLine);
+      pend:=pstart;
+      inc(PEnd,length(SrcLine));
+      p:=pstart;
       repeat
         case p^ of
-          #0: if (p-PChar(SrcLine)=length(SrcLine)) then break;
+          #0: if (p>=pend) then break;
           '{':
             begin
             CommentStartP:=p;
@@ -1396,7 +1409,7 @@ var
             repeat
               case p^ of
               #0:
-                if (p-PChar(SrcLine)=length(SrcLine)) then
+                if (p>=pend) then
                   begin
                   // multi line comment
                   if IsDirective then
@@ -1407,7 +1420,10 @@ var
                     SrcLine:=SrcLines[LineNumber-1];
                     //writeln('TTestResolver.CheckReferenceDirectives Comment Line=',SrcLine);
                   until SrcLine<>'';
-                  p:=PChar(SrcLine);
+                  pstart:=PChar(SrcLine);
+                  pend:=pstart;
+                  inc(PEnd,length(SrcLine));
+                  p:=pstart;
                   continue;
                   end;
               '}':
@@ -1480,12 +1496,14 @@ var
       for i:=0 to ReferenceElements.Count-1 do
         begin
         El:=TPasElement(ReferenceElements[i]);
+{$IFNDEF NOCONSOLE}
         write('Reference candidate for "',aMarker^.Identifier,'" at reference ',aMarker^.Filename,'(',aMarker^.Row,',',aMarker^.StartCol,'-',aMarker^.EndCol,')');
         write(' El=',GetObjName(El));
         if EL is TPrimitiveExpr then
           begin
            writeln('CheckResolverReference ',TPrimitiveExpr(El).Value);
           end;
+{$ENDIF}
         Ref:=nil;
         if El.CustomData is TResolvedReference then
           Ref:=TResolvedReference(El.CustomData).Declaration
@@ -1493,6 +1511,7 @@ var
           Ref:=TPasPropertyScope(El.CustomData).AncestorProp
         else if El.CustomData is TPasSpecializeTypeData then
           Ref:=TPasSpecializeTypeData(El.CustomData).SpecializedType;
+{$IFNDEF NOCONSOLE}
         if Ref<>nil then
           begin
           write(' Decl=',GetObjName(Ref));
@@ -1502,7 +1521,9 @@ var
         else
           write(' has no TResolvedReference. El.CustomData=',GetObjName(El.CustomData));
         writeln;
+{$ENDIF}
         end;
+{$IFNDEF NOCONSOLE}
       for i:=0 to LabelElements.Count-1 do
         begin
         El:=TPasElement(LabelElements[i]);
@@ -1510,6 +1531,7 @@ var
         write(' El=',GetObjName(El));
         writeln;
         end;
+{$ENDIF}
 
       RaiseErrorAtSrcMarker('wrong resolved reference "'+aMarker^.Identifier+'"',aMarker);
     finally
@@ -1581,6 +1603,7 @@ var
           end;
         end;
       // failed -> show candidates
+{$IFNDEF NOCONSOLE}
       writeln('CheckDirectReference failed: Labels:');
       for j:=0 to LabelElements.Count-1 do
         begin
@@ -1595,6 +1618,7 @@ var
         //if EL is TPasVariable then
         //  writeln('CheckDirectReference ',GetObjPath(TPasVariable(El).VarType),' ',ResolverEngine.GetElementSourcePosStr(TPasVariable(EL).VarType));
         end;
+{$ENDIF}
       RaiseErrorAtSrcMarker('wrong direct reference "'+aMarker^.Identifier+'"',aMarker);
     finally
       LabelElements.Free;
@@ -1658,6 +1682,7 @@ begin
     end;
 
   // needed message missing -> show emitted messages
+{$IFNDEF NOCONSOLE}
   WriteSources('',0,0);
   for i:=0 to MsgCount-1 do
     begin
@@ -1668,6 +1693,7 @@ begin
       write(' '+ExtractFileName(Item.SourcePos.FileName),'(',Item.SourcePos.Row,',',Item.SourcePos.Column,')');
     writeln(' {',Item.Msg,'}');
     end;
+{$ENDIF}
   str(MsgType,Expected);
   Actual:='Missing '+Expected+' ('+IntToStr(MsgNumber)+')';
   if Marker<>nil then
@@ -2077,6 +2103,7 @@ var
   i, j: Integer;
   SrcLines: TStringList;
   SrcFilename, Line: string;
+
 begin
   for i:=0 to Resolver.Streams.Count-1 do
     begin
@@ -2099,12 +2126,16 @@ end;
 
 procedure TCustomTestResolver.RaiseErrorAtSrc(Msg: string; const aFilename: string;
   aRow, aCol: integer);
+
 var
   s: String;
+
 begin
-  WriteSources(aFilename,aRow,aCol);
   s:='[TTestResolver.RaiseErrorAtSrc] '+aFilename+'('+IntToStr(aRow)+','+IntToStr(aCol)+') Error: '+Msg;
+  {$IFNDEF NOCONSOLE}
+  WriteSources(aFilename,aRow,aCol);
   writeln('ERROR: ',s);
+  {$ENDIF}
   Fail(s);
 end;
 
@@ -2122,6 +2153,7 @@ begin
   ErrFilename:=CurEngine.Scanner.CurFilename;
   ErrRow:=CurEngine.Scanner.CurRow;
   ErrCol:=CurEngine.Scanner.CurColumn;
+  {$IFNDEF NOCONSOLE}
   writeln('ERROR: TCustomTestResolver.HandleError during parsing: '+E.ClassName+':'+E.Message
     +' File='+ErrFilename
     +' LineNo='+IntToStr(ErrRow)
@@ -2129,6 +2161,7 @@ begin
     +' Line="'+CurEngine.Scanner.CurLine+'"'
     );
   WriteSources(ErrFilename,ErrRow,ErrCol);
+  {$ENDIF}
   Fail(E.Message);
 end;
 
@@ -2220,8 +2253,8 @@ begin
     //'  LineEnding = #10;',
     //'  DirectorySeparator = ''/'';',
     //'  DriveSeparator = '''';',
-    //'  AllowDirectorySeparators : set of char = [''\'',''/''];',
-    //'  AllowDriveSeparators : set of char = [];',
+    //'  AllowDirectorySeparators : set of AnsiChar = [''\'',''/''];',
+    //'  AllowDriveSeparators : set of AnsiChar = [];',
   if supTObject in Parts then
     begin
     Intf.AddStrings([
@@ -2492,7 +2525,9 @@ var
   begin
     s:='TTestResolver.OnCheckElementParent El='+GetTreeDbg(El)+' '+
       ResolverEngine.GetElementSourcePosStr(El)+' '+Msg;
+{$IFNDEF NOCONSOLE}
     writeln('ERROR: ',s);
+{$ENDIF}
     Fail(s);
   end;
 
@@ -2597,7 +2632,7 @@ begin
 end;
 
 procedure TCustomTestResolver.OnScannerDirective(Sender: TObject; Directive,
-  Param: String; var Handled: boolean);
+  Param: TPasScannerString; var Handled: boolean);
 var
   aScanner: TPascalScanner;
 begin
@@ -2736,7 +2771,7 @@ procedure TTestResolver.TestAliasOfVarFail;
 begin
   StartProgram(false);
   Add('var');
-  Add('  a: char;');
+  Add('  a: AnsiChar;');
   Add('type');
   Add('  t=a;');
   Add('begin');
@@ -2912,7 +2947,7 @@ procedure TTestResolver.TestVarOfVarFail;
 begin
   StartProgram(false);
   Add('var');
-  Add('  a: char;');
+  Add('  a: AnsiChar;');
   Add('  b: a;');
   Add('begin');
   CheckParserException('Expected type, but got variable',PParser.nParserExpectedTypeButGot);
@@ -3508,7 +3543,7 @@ begin
   StartProgram(false);
   Add([
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  i: longint;',
   'begin',
   '  i:=ord(c);',
@@ -3542,7 +3577,7 @@ begin
   Add([
   'var',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   'begin',
   '  if s[1]=s then ;',
   '  if s=s[2] then ;',
@@ -3581,7 +3616,7 @@ end;
 procedure TTestResolver.TestStringElement_AsVarArgFail;
 begin
   StartProgram(false);
-  Add('procedure DoIt(var c: char);');
+  Add('procedure DoIt(var c: AnsiChar);');
   Add('begin');
   Add('end;');
   Add('var s: string;');
@@ -3630,7 +3665,7 @@ begin
   //'  j=length(a);',
   //'  k=chr(97);',
   //'  l=ord(a[1]);',
-  //'  m=low(char)+high(char);',
+  //'  m=low(AnsiChar)+high(AnsiChar);',
   //'  n = string(''A'');',
   //'  o = UnicodeString(''A'');',
   //'  p = ^C''bird'';',
@@ -3675,8 +3710,8 @@ begin
   '  s2 = [''a'',''b''];',
   '  s3 = [''a''..''c''];',
   '  s4 = [''a''..''b'',''d''..''e'',''f''];',
-  '  s5 = [low(Char)..high(Char)];',
-  '  s6 = [succ(low(Char))..pred(high(Char))];',
+  '  s5 = [low(AnsiChar)..high(AnsiChar)];',
+  '  s6 = [succ(low(AnsiChar))..pred(high(AnsiChar))];',
   '  s7 = [''a''..''c'']*[''b''..''d''];',
   '  s8 = [''a''..''e'']-[''b'',''e''];',
   '  s9 = [''a'',''c''..''d'']+[''b'',''e''];',
@@ -3688,7 +3723,7 @@ begin
   '  s15 = ''a'' in [''a'',''b''];',
   '  s16 = [#0..#127,#22823..#23398];',
   '  s17 = #22823 in s16;',
-  'var c: char;',
+  'var c: AnsiChar;',
   'begin',
   '  if c in s3 then ;']);
   ParseProgram;
@@ -3706,7 +3741,7 @@ begin
   'const',
   '  crg: TCharRg = ''b'';',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  crg2: TCharRg2;',
   '  s: TSetOfCharRg;',
   'begin',
@@ -3728,11 +3763,11 @@ begin
   StartProgram(false);
   Add([
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  s: string;',
   'begin',
   '  c:=s;']);
-  CheckResolverException('Incompatible types: got "String" expected "Char"',
+  CheckResolverException('Incompatible types: got "String" expected "AnsiChar"',
     nIncompatibleTypesGotExpected);
 end;
 
@@ -3742,15 +3777,15 @@ begin
   Add([
   'type',
   '  TCharRg = ''a''..''z'';',
-  '  TSetOfChar = set of char;',
+  '  TSetOfChar = set of AnsiChar;',
   '  TSetOfCharRg = set of TCharRg;',
   'const Foo = ''foo'';',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  cr: TCharRg;',
   '  s: string;',
-  '  a: array of char;',
-  '  b: array[1..3] of char;',
+  '  a: array of AnsiChar;',
+  '  b: array[1..3] of AnsiChar;',
   '  soc: TSetOfChar;',
   '  socr: TSetOfCharRg;',
   'begin',
@@ -3758,7 +3793,7 @@ begin
   '  for c in s do;',
   '  for c in a do;',
   '  for c in b do;',
-  '  for c in char do;',
+  '  for c in AnsiChar do;',
   '  for c in TCharRg do;',
   '  for c in TSetOfChar do;',
   '  for c in TSetOfCharRg do;',
@@ -3830,7 +3865,7 @@ begin
   Add('type');
   Add('  {#TFlag}TFlag = ({#Red}Red, {#Green}Green, {#Blue}Blue, {#Gray}Gray, {#Black}Black, {#White}White);');
   Add('  {#TFlags}TFlags = set of TFlag;');
-  Add('  {#TChars}TChars = set of Char;');
+  Add('  {#TChars}TChars = set of AnsiChar;');
   Add('  {#TMyInt}TMyInt = 0..17;');
   Add('  {#TMyInts}TMyInts = set of TMyInt;');
   Add('  {#TMyBools}TMyBools = set of boolean;');
@@ -3868,7 +3903,7 @@ begin
   Add('type');
   Add('  {#TFlag}TFlag = ({#Red}Red, {#Green}Green, {#Blue}Blue, {#Gray}Gray, {#Black}Black, {#White}White);');
   Add('  {#TFlags}TFlags = set of TFlag;');
-  Add('  {#TChars}TChars = set of Char;');
+  Add('  {#TChars}TChars = set of AnsiChar;');
   Add('  {#TMyInt}TMyInt = 0..17;');
   Add('  {#TMyInts}TMyInts = set of TMyInt;');
   Add('  {#TMyBools}TMyBools = set of boolean;');
@@ -4560,7 +4595,7 @@ begin
   StartProgram(false);
   Add('var');
   Add('  vstring:string;');
-  Add('  vchar:char;');
+  Add('  vchar:AnsiChar;');
   Add('begin');
   Add('  vstring:='''';');
   Add('  vstring:=''abc'';');
@@ -4588,7 +4623,7 @@ begin
   Add('  v:longint;');
   Add('begin');
   Add('  v:=''A'';');
-  CheckResolverException('Incompatible types: got "Char" expected "Longint"',
+  CheckResolverException('Incompatible types: got "AnsiChar" expected "Longint"',
     nIncompatibleTypesGotExpected);
 end;
 
@@ -4670,7 +4705,7 @@ begin
   Add([
   'var',
   '  i,j:string;',
-  '  k:char;',
+  '  k:AnsiChar;',
   '  w:widechar;',
   'begin',
   '  i:='''';',
@@ -4684,7 +4719,7 @@ begin
   '  k:=''a'';',
   '  k:='''''''';',
   '  k:=j[1];',
-  '  k:=char(#10);',
+  '  k:=AnsiChar(#10);',
   '  w:=k;',
   '  w:=#66;',
   '  w:=#6666;',
@@ -4701,7 +4736,7 @@ begin
   ResolverEngine.BaseTypeString:=btUnicodeString;
   StartProgram(false);
   Add('var');
-  Add('  k:char;');
+  Add('  k:AnsiChar;');
   Add('  w:widechar;');
   Add('begin');
   Add('  w:=k;');
@@ -4753,7 +4788,7 @@ begin
   Add('  TFlags = set of TFlag;');
   Add('var');
   Add('  i: longint;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  s: string;');
   Add('  d: double;');
   Add('  f: TFlag;');
@@ -4794,7 +4829,7 @@ begin
   '  fs: single;',
   '  d: double;',
   '  b: boolean;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  s: string;',
   'begin',
   '  d:=double({#a_read}i);',
@@ -4809,9 +4844,9 @@ begin
   '  b:=boolean({#k_read}i);',
   '  i:=longint({#l_read}b);',
   '  d:=double({#m_read}i);',
-  '  c:=char({#n_read}c);',
-  '  c:=char({#o_read}i);',
-  '  c:=char(65);',
+  '  c:=AnsiChar({#n_read}c);',
+  '  c:=AnsiChar({#o_read}i);',
+  '  c:=AnsiChar(65);',
   '  s:=string({#p_read}s);',
   '  s:=string({#q_read}c);',
   '']);
@@ -4827,13 +4862,13 @@ begin
   Add('  TCaption = string;');
   Add('  TYesNo = boolean;');
   Add('  TFloat = double;');
-  Add('  TChar = char;');
+  Add('  TChar = AnsiChar;');
   Add('var');
   Add('  i: longint;');
   Add('  s: string;');
   Add('  b: boolean;');
   Add('  d: double;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('begin');
   Add('  i:=integer({#a_read}i);');
   Add('  i:=integer({#h_read}b);');
@@ -4863,9 +4898,9 @@ begin
   StartProgram(false);
   Add('var');
   Add('  s: string;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('begin');
-  Add('  c:=char(s);');
+  Add('  c:=AnsiChar(s);');
   CheckResolverException(sIllegalTypeConversionTo,nIllegalTypeConversionTo);
 end;
 
@@ -4957,13 +4992,13 @@ begin
   'var',
   '  bo: boolean;',
   '  by: byte;',
-  '  ch: char;',
+  '  ch: AnsiChar;',
   '  s: string;',
   '  i: longint = high(abc);',
   'begin',
   '  for bo:=low(boolean) to high(boolean) do;',
   '  for by:=low(byte) to high(byte) do;',
-  '  for ch:=low(char) to high(char) do;',
+  '  for ch:=low(AnsiChar) to high(AnsiChar) do;',
   '  for i:=low(s) to high(s) do;',
   '']);
   ParseProgram;
@@ -5029,11 +5064,11 @@ procedure TTestResolver.TestStr_CharFail;
 begin
   StartProgram(false);
   Add('var');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  aString: string;');
   Add('begin');
   Add('  Str(c,aString);');
-  CheckResolverException('Incompatible type for arg no. 1: Got "Char", expected "boolean, integer, enum value"',
+  CheckResolverException('Incompatible type for arg no. 1: Got "AnsiChar", expected "boolean, integer, enum value"',
     nIncompatibleTypeArgNo);
 end;
 
@@ -5335,7 +5370,7 @@ begin
   '  i: longint;',
   '  f: TFlag;',
   '  b: boolean;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  s: string;',
   'begin',
   '  case i of',
@@ -5384,7 +5419,7 @@ begin
   Add('  case i of');
   Add('  ''1'': ;');
   Add('  end;');
-  CheckResolverException('Incompatible types: got "Char" expected "Longint"',
+  CheckResolverException('Incompatible types: got "AnsiChar" expected "Longint"',
     nIncompatibleTypesGotExpected);
 end;
 
@@ -5625,10 +5660,10 @@ end;
 procedure TTestResolver.TestForLoopStartIncompFail;
 begin
   StartProgram(false);
-  Add('var i: char;');
+  Add('var i: AnsiChar;');
   Add('begin');
   Add('  for i:=1 to 2 do ;');
-  CheckResolverException('Incompatible types: got "Longint" expected "Char"',
+  CheckResolverException('Incompatible types: got "Longint" expected "AnsiChar"',
     nIncompatibleTypesGotExpected);
 end;
 
@@ -5638,7 +5673,7 @@ begin
   Add('var i: longint;');
   Add('begin');
   Add('  for i:=1 to ''2'' do ;');
-  CheckResolverException('Incompatible types: got "Char" expected "Longint"',
+  CheckResolverException('Incompatible types: got "AnsiChar" expected "Longint"',
     nIncompatibleTypesGotExpected);
 end;
 
@@ -6539,7 +6574,7 @@ begin
   Add('procedure {#int64}DoIt(p: int64); external;  var i6: int64;');
   Add('procedure {#comp}DoIt(p: comp); external;  var co: comp;');
   Add('procedure {#boolean}DoIt(p: boolean); external;  var bo: boolean;');
-  Add('procedure {#char}DoIt(p: char); external;  var ch: char;');
+  Add('procedure {#AnsiChar}DoIt(p: AnsiChar); external;  var ch: AnsiChar;');
   Add('procedure {#widechar}DoIt(p: widechar); external;  var wc: widechar;');
   Add('procedure {#string}DoIt(p: string); external;  var st: string;');
   Add('procedure {#widestring}DoIt(p: widestring); external;  var ws: widestring;');
@@ -6557,7 +6592,7 @@ begin
   Add('  {@int64}DoIt(i6);');
   Add('  {@comp}DoIt(co);');
   Add('  {@boolean}DoIt(bo);');
-  Add('  {@char}DoIt(ch);');
+  Add('  {@AnsiChar}DoIt(ch);');
   Add('  {@widechar}DoIt(wc);');
   Add('  {@string}DoIt(st);');
   Add('  {@widestring}DoIt(ws);');
@@ -6618,7 +6653,7 @@ begin
   Add([
   'function {#a}StrToDate(const a: String): double; begin end;',
   'function {#b}StrToDate(const a: String; const b: string): double; begin end;',
-  'function {#c}StrToDate(const a: String; const b: string; c: char): double; begin end;',
+  'function {#c}StrToDate(const a: String; const b: string; c: AnsiChar): double; begin end;',
   'var d: double;',
   'begin',
   '  d:={@a}StrToDate('''');',
@@ -7168,7 +7203,7 @@ begin
   StartProgram(false);
   Add([
   'function DoIt: string;',
-  '  function Sub: char;',
+  '  function Sub: AnsiChar;',
   '  begin',
   '    {#a1}DoIt:=#65;',
   '    {#a2}DoIt[1]:=#66;',
@@ -7792,7 +7827,7 @@ begin
   'procedure DoIt(p: Pointer);',
   'var',
   '  s: string absolute p;',
-  '  t: array of char absolute s;',
+  '  t: array of AnsiChar absolute s;',
   'begin',
   'end;',
   'begin']);
@@ -10484,12 +10519,12 @@ begin
   StartProgram(false);
   Add('type');
   Add('  TObject = class');
-  Add('    procedure ProcA(c: char); virtual; abstract;');
+  Add('    procedure ProcA(c: AnsiChar); virtual; abstract;');
   Add('  end;');
   Add('  TClassA = class');
-  Add('    procedure ProcA(c: char); override;');
+  Add('    procedure ProcA(c: AnsiChar); override;');
   Add('  end;');
-  Add('procedure TClassA.ProcA(c: char);');
+  Add('procedure TClassA.ProcA(c: AnsiChar);');
   Add('begin');
   Add('  inherited ProcA(c);');
   Add('end;');
@@ -13376,17 +13411,23 @@ begin
   aMarker:=FirstSrcMarker;
   while aMarker<>nil do
     begin
+{$IFNDEF NOCONSOLE}
     writeln('TTestResolver.TestPropertyInherited ',aMarker^.Identifier,' ',aMarker^.StartCol,' ',aMarker^.EndCol);
+{$ENDIF}
     Elements:=FindElementsAt(aMarker);
     try
       for i:=0 to Elements.Count-1 do
         begin
         El:=TPasElement(Elements[i]);
+{$IFNDEF NOCONSOLE}
         writeln('TTestResolver.TestPropertyInherited ',aMarker^.Identifier,' ',i,'/',Elements.Count,' El=',GetObjName(El),' CustomData=',GetObjName(El.CustomData));
+{$ENDIF}
         if not (El.CustomData is TResolvedReference) then continue;
         Ref:=TResolvedReference(El.CustomData);
         if not (Ref.Declaration is TPasProperty) then continue;
+{$IFNDEF NOCONSOLE}
         writeln('TTestResolver.TestPropertyInherited ',GetObjName(Ref.Declaration),' Ref.Access=',Ref.Access);
+{$ENDIF}
         case aMarker^.Identifier of
         'A': if Ref.Access<>rraAssign then
           RaiseErrorAtSrcMarker('expected property write at "#'+aMarker^.Identifier+', but got "'+dbgs(Ref.Access),aMarker);
@@ -14624,7 +14665,7 @@ begin
   StartProgram(false);
   Add('type');
   Add('  TArrA = array[1..2] of longint;');
-  Add('  TArrB = array[char] of boolean;');
+  Add('  TArrB = array[AnsiChar] of boolean;');
   Add('  TArrC = array[byte,''a''..''z''] of longint;');
   Add('const');
   Add('  ArrA: TArrA = (3,4);');
@@ -14647,18 +14688,22 @@ begin
   StartProgram(false);
   Add([
   'type',
-  '  TArrA = array[1..3] of char;',
+  '  TArrA = array[1..3] of AnsiChar;',
   'const',
+  {
   '  A: TArrA = (''p'',''a'',''p'');', // duplicate allowed, this bracket is not a set
   '  B: TArrA = ''pas'';',
   '  Three = length(TArrA);',
-  '  C: array[1..Three] of char = ''pas'';',
+  '  C: array[1..Three] of AnsiChar = ''pas'';',
   '  D = ''pp'';',
-  '  E: array[length(D)..Three] of char = D;',
+  '  E: array[length(D)..Three] of AnsiChar = D;',
   '  F: array[1..2] of widechar = ''äö'';',
-  '  G: array[1..2] of char = ''ä'';',
-  '  H: array[1..4] of char = ''äö'';',
-  '  I: array[1..4] of char = ''ä''+''ö'';',
+  }
+  '  G: array[1..2] of AnsiChar = ''ä'';',
+  {
+  '  H: array[1..4] of AnsiChar = ''äö'';',
+  '  I: array[1..4] of AnsiChar = ''ä''+''ö'';',
+  }
   'begin']);
   ParseProgram;
 end;
@@ -14669,18 +14714,18 @@ begin
   Add([
   '{$mode delphi}',
   'type',
-  '  TArrA = array[1..3] of char;',
+  '  TArrA = array[1..3] of AnsiChar;',
   'const',
   '  A: TArrA = (''p'',''a'',''p'');', // duplicate allowed, this bracket is not a set
   '  B: TArrA = ''pas'';',
   '  Three = length(TArrA);',
-  '  C: array[1..Three] of char = ''pas'';',
+  '  C: array[1..Three] of AnsiChar = ''pas'';',
   '  D = ''pp'';',
-  '  E: array[length(D)..Three] of char = D;',
+  '  E: array[length(D)..Three] of AnsiChar = D;',
   '  F: array[1..2] of widechar = ''äö'';',
-  '  G: array[1..2] of char = ''ä'';',
-  '  H: array[1..4] of char = ''äö'';',
-  '  I: array[1..4] of char = ''ä''+''ö'';',
+  '  G: array[1..2] of AnsiChar = ''ä'';',
+  '  H: array[1..4] of AnsiChar = ''äö'';',
+  '  I: array[1..4] of AnsiChar = ''ä''+''ö'';',
   'begin']);
   ParseProgram;
 end;
@@ -14702,11 +14747,11 @@ begin
   Add([
   'procedure {#a}Run(const s: string); overload;',
   'begin end;',
-  'procedure {#b}Run(const a: array of char); overload;',
+  'procedure {#b}Run(const a: array of AnsiChar); overload;',
   'begin end;',
   'var',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   'begin',
   '  {@a}Run(''foo'');',
   '  {@a}Run(s);',
@@ -14772,10 +14817,10 @@ procedure TTestResolver.TestArray_LowHigh;
 begin
   StartProgram(false);
   Add('type');
-  Add('  TArrA = array[char] of longint;');
+  Add('  TArrA = array[AnsiChar] of longint;');
   Add('  TArrB = array of TArrA;');
   Add('var');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  i: longint;');
   Add('begin');
   Add('  for c:=low(TArrA) to High(TArrA) do ;');
@@ -15044,7 +15089,7 @@ begin
   '  Aliases: TarrStr = (''foo'',''b'');',
   '  OneInt: TArrInt = (7);',
   '  OneInt2: array of integer = (7);',
-  '  Chars: array of char = ''aoc'';',
+  '  Chars: array of AnsiChar = ''aoc'';',
   '  Names: array of string = (''a'',''foo'');',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   'procedure DoIt(Ints: TArrInt);',
@@ -15086,7 +15131,7 @@ begin
   '  Aliases: TarrStr = {#aliases_array}[''foo'',''b'',''b''];',
   '  OneInt: TArrInt = {#oneint_array}[7];',
   '  TwoInt: array of integer = {#twoint1_array}[7]+{#twoint2_array}[8];',
-  '  Chars: array of char = ''aoc'';',
+  '  Chars: array of AnsiChar = ''aoc'';',
   '  Names: array of string = {#names_array}[''a'',''a''];',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   'procedure {#DoArrOfSet}DoIt(const s: TArrOfSet); overload; begin end;',
@@ -15374,10 +15419,10 @@ begin
   StartProgram(false);
   Add([
   '{$mode delphi}',
-  'Function CharInSet(Ch: Char;Const CSet : array of char) : Boolean;',
+  'Function CharInSet(Ch: AnsiChar;Const CSet : array of AnsiChar) : Boolean;',
   'begin',
   'end;',
-  'var Key: Char;',
+  'var Key: AnsiChar;',
   'begin',
   '  if CharInSet(Key, [^V, ^X, ^C]) then ;',
   '  CharInSet(Key,''abc'');',
@@ -15391,9 +15436,9 @@ begin
   StartProgram(false);
   Add([
   '{$mode delphi}',
-  'type TArrChr = array of char;',
+  'type TArrChr = array of AnsiChar;',
   'var',
-  '  Key: Char;',
+  '  Key: AnsiChar;',
   '  s: string;',
   '  a: TArrChr;',
   'begin',
@@ -18040,7 +18085,9 @@ begin
       for i:=0 to Elements.Count-1 do
         begin
         El:=TPasElement(Elements[i]);
+{$IFNDEF NOCONSOLE}
         writeln('TTestResolver.TestClassHelper_WithDo ',aMarker^.Identifier,' ',i,'/',Elements.Count,' El=',GetObjName(El),' ',GetObjName(El.CustomData));
+{$ENDIF}
         if not (El.CustomData is TResolvedReference) then continue;
         Ref:=TResolvedReference(El.CustomData);
         if Ref.WithExprScope<>nil then
@@ -18804,7 +18851,7 @@ begin
   '  TStringHelper = type helper for String',
   '    procedure DoIt;',
   '  end;',
-  '  TCharHelper = type helper for char',
+  '  TCharHelper = type helper for AnsiChar',
   '    procedure Fly;',
   '  end;',
   'procedure TStringHelper.DoIt;',
@@ -18833,7 +18880,7 @@ begin
     '  TStringHelper = type helper for String',
     '    procedure DoIt;',
     '  end;',
-    '  TCharHelper = type helper for char',
+    '  TCharHelper = type helper for AnsiChar',
     '    procedure Fly;',
     '  end;',
     '']),

+ 20 - 16
packages/fcl-passrc/tests/tcscanner.pas

@@ -2,6 +2,8 @@ unit tcscanner;
 
 {$mode objfpc}{$H+}
 
+{$define NOCONSOLE}
+
 interface
 
 uses
@@ -50,7 +52,7 @@ type
   end;
 
   { TTestScanner }
-  TTestScanner= class(TTestCase)
+  TTestScanner = class(TTestCase)
   Private
     FLI: String;
     FLibAlias: String;
@@ -64,8 +66,8 @@ type
     FPathPrefix : String;
     FTestTokenString: String;
   protected
-    procedure DoComment(Sender: TObject; aComment: String);
-    procedure DoLinkLib(Sender: TObject; const aLibName,aAlias,aOptions : String; var aHandled : Boolean);
+    procedure DoComment(Sender: TObject; aComment: TPasScannerString);
+    procedure DoLinkLib(Sender: TObject; const aLibName,aAlias,aOptions : TPasScannerString; var aHandled : Boolean);
     procedure SetUp; override;
     procedure TearDown; override;
     Procedure DoMultilineError;
@@ -75,10 +77,10 @@ type
     Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitch); overload;
     Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitches); overload;
     // creates a virtual source file with name 'afile.pp', prepended with PathPrefix
-    procedure NewSource(Const Source : string; DoClear : Boolean = True);
-    Procedure DoTestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True);
-    Procedure TestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True);
-    Procedure TestTokens(t : array of TToken; Const ASource : String; Const CheckEOF : Boolean = True;Const DoClear : Boolean = True);
+    procedure NewSource(Const Source : RawBytestring; DoClear : Boolean = True);
+    Procedure DoTestToken(t : TToken; Const ASource : RawByteString; Const CheckEOF : Boolean = True);
+    Procedure TestToken(t : TToken; Const ASource : RawByteString; Const CheckEOF : Boolean = True);
+    Procedure TestTokens(t : array of TToken; Const ASource : RawByteString; Const CheckEOF : Boolean = True;Const DoClear : Boolean = True);
     Property LastIDentifier : String Read FLI Write FLi;
     Property Scanner : TPascalScanner Read FScanner;
     // Path for source filename.
@@ -432,13 +434,13 @@ end;
   TTestScanner
   ---------------------------------------------------------------------}
 
-procedure TTestScanner.DoComment(Sender: TObject; aComment: String);
+procedure TTestScanner.DoComment(Sender: TObject; aComment: TPasScannerString);
 begin
   FDoCommentCalled:=True;
   FComment:=aComment;
 end;
 
-procedure TTestScanner.DoLinkLib(Sender: TObject; const aLibName, aAlias, aOptions: String; var aHandled: Boolean);
+procedure TTestScanner.DoLinkLib(Sender: TObject; const aLibName, aAlias, aOptions: TPasScannerString; var aHandled: Boolean);
 begin
   FLibName:=aLibName;
   FLibAlias:=aAlias;
@@ -509,10 +511,12 @@ begin
   AssertEquals(Msg,ToString(Expected),ToString(Actual));
 end;
 
-procedure TTestScanner.NewSource(const Source: string; DoClear : Boolean = True);
+procedure TTestScanner.NewSource(const Source: RawBytestring; DoClear : Boolean = True);
 
+Const
+  afilename : TPasTreeString = TPasTreeString('afile.pp');
 Var
-  aFile : String;
+  aFile : TPasTreeString;
 
 begin
   aFile:='';
@@ -520,7 +524,7 @@ begin
     FResolver.Clear;
   if (FPathPrefix<>'') then
      aFile:=IncludeTrailingPathDelimiter(FPathPrefix);
-  aFile:=aFile+'afile.pp';
+  aFile:=aFile+aFileName;
   FResolver.AddStream(aFile,TStringStream.Create(Source));
   {$ifndef NOCONSOLE} // JC: To get the tests to run with GUI
   Writeln('// '+TestName);
@@ -531,7 +535,7 @@ begin
   FScanner.OpenFile(aFile);
 end;
 
-procedure TTestScanner.DoTestToken(t: TToken; const ASource: String;
+procedure TTestScanner.DoTestToken(t: TToken; const ASource: RawByteString;
   const CheckEOF: Boolean);
 
 Var
@@ -551,7 +555,7 @@ begin
     end;
 end;
 
-procedure TTestScanner.TestToken(t: TToken; const ASource: String;
+procedure TTestScanner.TestToken(t: TToken; const ASource: RawByteString;
   const CheckEOF: Boolean);
 Var
   S : String;
@@ -567,7 +571,7 @@ begin
   DoTestToken(t,LowerCase(ASource),CheckEOF);
 end;
 
-procedure TTestScanner.TestTokens(t: array of TToken; const ASource: String;
+procedure TTestScanner.TestTokens(t: array of TToken; const ASource: RawByteString;
   const CheckEOF: Boolean; const DoClear: Boolean);
 Var
   tk : ttoken;
@@ -2163,7 +2167,7 @@ Const
 
 Var
   M : TModeSwitch;
-  C : Char;
+  C : AnsiChar;
 begin
   For M in TModeSwitch do
     for C in PlusMinus do

+ 3 - 3
packages/fcl-passrc/tests/tctypeparser.pas

@@ -3091,17 +3091,17 @@ end;
 
 procedure TTestTypeParser.TestSimpleTypeChar;
 begin
-  DoTestAliasType('CHAR','');
+  DoTestAliasType('AnsiChar','');
 end;
 
 procedure TTestTypeParser.TestSimpleTypeCharDeprecated;
 begin
-  DoTestAliasType('CHAR','deprecated');
+  DoTestAliasType('AnsiChar','deprecated');
 end;
 
 procedure TTestTypeParser.TestSimpleTypeCharPlatform;
 begin
-  DoTestAliasType('CHAR','platform');
+  DoTestAliasType('AnsiChar','platform');
 end;
 
 procedure TTestTypeParser.TestSimpleTypeInteger;

+ 5 - 5
packages/fcl-passrc/tests/tcuseanalyzer.pas

@@ -1850,7 +1850,7 @@ begin
   '  a = 13;',
   '  b: longint = 14;',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  d: longint = 15;',
   'begin',
   'end;',
@@ -1873,7 +1873,7 @@ begin
   '  a = 13;',
   '  b: longint = 14;',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  d: longint = 15;',
   'begin',
   '{$Hints off}',
@@ -1954,7 +1954,7 @@ begin
   Add('const');
   Add('  a: longint = 14;');
   Add('var');
-  Add('  b: char;');
+  Add('  b: AnsiChar;');
   Add('  c: longint = 15;');
   Add('begin');
   Add('  a:=16;');
@@ -2280,7 +2280,7 @@ begin
   Add('  {#a_notused}a = 13;');
   Add('  {#b_notused}b: longint = 14;');
   Add('var');
-  Add('  {#c_notused}c: char;');
+  Add('  {#c_notused}c: AnsiChar;');
   Add('  {#d_notused}d: longint = 15;');
   Add('  procedure {#sub_notused}Sub; begin end;');
   Add('asm end;');
@@ -2305,7 +2305,7 @@ begin
   '  {#a_notused}a = 13;',
   '  {#b_notused}b: longint = 14;',
   'var',
-  '  {#c_notused}c: char;',
+  '  {#c_notused}c: AnsiChar;',
   '  {#d_notused}d: longint = 15;',
   '  procedure {#sub_notused}Sub; begin end;',
   'asm end;',

+ 4 - 0
packages/fcl-passrc/tests/testpassrc.lpi

@@ -4,6 +4,7 @@
     <Version Value="12"/>
     <General>
       <Flags>
+        <SaveOnlyProjectUnits Value="True"/>
         <MainUnitHasCreateFormStatements Value="False"/>
         <MainUnitHasTitleStatement Value="False"/>
         <MainUnitHasScaledStatement Value="False"/>
@@ -140,6 +141,9 @@
       </Checks>
       <VerifyObjMethodCallValidity Value="True"/>
     </CodeGeneration>
+    <Other>
+      <CustomOptions Value="-tunicodertl"/>
+    </Other>
   </CompilerOptions>
   <Debugging>
     <Exceptions Count="3">

+ 3 - 0
packages/fcl-passrc/tests/testpassrc.lpr

@@ -3,6 +3,9 @@ program testpassrc;
 {$mode objfpc}{$H+}
 
 uses
+{$IFDEF UNIX}
+  cwstring,
+{$ENDIF}
   //MemCheck,
   Classes, consoletestrunner, tcscanner,  tctypeparser, tcstatements,
   tcbaseparser, tcmoduleparser, tconstparser, tcvarparser, tcclasstype,

Some files were not shown because too many files changed in this diff