mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 05:59:27 +02:00
* Patch from Mattias Gaertner
- assigned(array) - open array: override, pass array literal, pass var - reporting type mismatches shows full path if necessary - fixed comparing basetype from different units - types with unitname git-svn-id: trunk@35681 -
This commit is contained in:
parent
bfd78af212
commit
0653c7045e
File diff suppressed because it is too large
Load Diff
@ -162,12 +162,15 @@ type
|
|||||||
Procedure TestAlias2Type;
|
Procedure TestAlias2Type;
|
||||||
Procedure TestAliasTypeRefs;
|
Procedure TestAliasTypeRefs;
|
||||||
Procedure TestAliasOfVarFail;
|
Procedure TestAliasOfVarFail;
|
||||||
|
Procedure TestAliasType_UnitPrefix;
|
||||||
|
Procedure TestAliasType_UnitPrefix_CycleFail;
|
||||||
Procedure TestTypeAliasType; // ToDo
|
Procedure TestTypeAliasType; // ToDo
|
||||||
|
|
||||||
// var, const
|
// var, const
|
||||||
Procedure TestVarLongint;
|
Procedure TestVarLongint;
|
||||||
Procedure TestVarInteger;
|
Procedure TestVarInteger;
|
||||||
Procedure TestConstInteger;
|
Procedure TestConstInteger;
|
||||||
|
Procedure TestConstInteger2;
|
||||||
Procedure TestDuplicateVar;
|
Procedure TestDuplicateVar;
|
||||||
Procedure TestVarInitConst;
|
Procedure TestVarInitConst;
|
||||||
Procedure TestVarOfVarFail;
|
Procedure TestVarOfVarFail;
|
||||||
@ -196,6 +199,7 @@ type
|
|||||||
// enums
|
// enums
|
||||||
Procedure TestEnums;
|
Procedure TestEnums;
|
||||||
Procedure TestSets;
|
Procedure TestSets;
|
||||||
|
Procedure TestSetConstRange;
|
||||||
Procedure TestSetOperators;
|
Procedure TestSetOperators;
|
||||||
Procedure TestEnumParams;
|
Procedure TestEnumParams;
|
||||||
Procedure TestSetParams;
|
Procedure TestSetParams;
|
||||||
@ -230,6 +234,7 @@ type
|
|||||||
Procedure TestTypeCastBooleanToDoubleFail;
|
Procedure TestTypeCastBooleanToDoubleFail;
|
||||||
Procedure TestHighLow;
|
Procedure TestHighLow;
|
||||||
Procedure TestAssign_Access;
|
Procedure TestAssign_Access;
|
||||||
|
Procedure TestAssignedIntFail;
|
||||||
|
|
||||||
// statements
|
// statements
|
||||||
Procedure TestForLoop;
|
Procedure TestForLoop;
|
||||||
@ -268,6 +273,7 @@ type
|
|||||||
Procedure TestProcOverloadWithClassTypes;
|
Procedure TestProcOverloadWithClassTypes;
|
||||||
Procedure TestProcOverloadWithInhClassTypes;
|
Procedure TestProcOverloadWithInhClassTypes;
|
||||||
Procedure TestProcOverloadWithInhAliasClassTypes;
|
Procedure TestProcOverloadWithInhAliasClassTypes;
|
||||||
|
Procedure TestProcOverloadBaseTypeOtherUnit;
|
||||||
Procedure TestProcDuplicate;
|
Procedure TestProcDuplicate;
|
||||||
Procedure TestNestedProc;
|
Procedure TestNestedProc;
|
||||||
Procedure TestForwardProc;
|
Procedure TestForwardProc;
|
||||||
@ -281,6 +287,7 @@ type
|
|||||||
Procedure TestUnitIntfMismatchArgName;
|
Procedure TestUnitIntfMismatchArgName;
|
||||||
Procedure TestProcOverloadIsNotFunc;
|
Procedure TestProcOverloadIsNotFunc;
|
||||||
Procedure TestProcCallMissingParams;
|
Procedure TestProcCallMissingParams;
|
||||||
|
Procedure TestProcArgDefaultValue;
|
||||||
Procedure TestProcArgDefaultValueTypeMismatch;
|
Procedure TestProcArgDefaultValueTypeMismatch;
|
||||||
Procedure TestProcPassConstToVar;
|
Procedure TestProcPassConstToVar;
|
||||||
Procedure TestBuiltInProcCallMissingParams;
|
Procedure TestBuiltInProcCallMissingParams;
|
||||||
@ -311,7 +318,8 @@ type
|
|||||||
Procedure TestClass_Method;
|
Procedure TestClass_Method;
|
||||||
Procedure TestClass_MethodWithoutClassFail;
|
Procedure TestClass_MethodWithoutClassFail;
|
||||||
Procedure TestClass_MethodWithParams;
|
Procedure TestClass_MethodWithParams;
|
||||||
Procedure TestClass_MethodUnresolved;
|
Procedure TestClass_MethodUnresolvedPrg;
|
||||||
|
Procedure TestClass_MethodUnresolvedUnit;
|
||||||
Procedure TestClass_MethodAbstract;
|
Procedure TestClass_MethodAbstract;
|
||||||
Procedure TestClass_MethodAbstractWithoutVirtualFail;
|
Procedure TestClass_MethodAbstractWithoutVirtualFail;
|
||||||
Procedure TestClass_MethodAbstractHasBodyFail;
|
Procedure TestClass_MethodAbstractHasBodyFail;
|
||||||
@ -443,7 +451,8 @@ type
|
|||||||
Procedure TestStaticArray;
|
Procedure TestStaticArray;
|
||||||
Procedure TestArrayOfArray;
|
Procedure TestArrayOfArray;
|
||||||
Procedure TestFunctionReturningArray;
|
Procedure TestFunctionReturningArray;
|
||||||
Procedure TestLowHighArray;
|
Procedure TestArray_LowHigh;
|
||||||
|
Procedure TestArray_Assigned;
|
||||||
Procedure TestPropertyOfTypeArray;
|
Procedure TestPropertyOfTypeArray;
|
||||||
Procedure TestArrayElementFromFuncResult_AsParams;
|
Procedure TestArrayElementFromFuncResult_AsParams;
|
||||||
Procedure TestArrayEnumTypeRange;
|
Procedure TestArrayEnumTypeRange;
|
||||||
@ -457,6 +466,7 @@ type
|
|||||||
Procedure TestArray_PassArrayElementToVarParam;
|
Procedure TestArray_PassArrayElementToVarParam;
|
||||||
Procedure TestArray_OpenArrayOfString;
|
Procedure TestArray_OpenArrayOfString;
|
||||||
Procedure TestArray_OpenArrayOfString_IntFail;
|
Procedure TestArray_OpenArrayOfString_IntFail;
|
||||||
|
Procedure TestArray_OpenArrayOverride;
|
||||||
|
|
||||||
// procedure types
|
// procedure types
|
||||||
Procedure TestProcTypesAssignObjFPC;
|
Procedure TestProcTypesAssignObjFPC;
|
||||||
@ -476,6 +486,7 @@ type
|
|||||||
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail1;
|
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail1;
|
||||||
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail2;
|
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail2;
|
||||||
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail3;
|
Procedure TestProcType_TNotifyEvent_NoAtFPC_Fail3;
|
||||||
|
Procedure TestProcType_WhileListCompare;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LinesToStr(Args: array of const): string;
|
function LinesToStr(Args: array of const): string;
|
||||||
@ -1736,6 +1747,30 @@ begin
|
|||||||
CheckParserException('Expected type, but got variable',PParser.nParserExpectedTypeButGot);
|
CheckParserException('Expected type, but got variable',PParser.nParserExpectedTypeButGot);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestAliasType_UnitPrefix;
|
||||||
|
begin
|
||||||
|
StartUnit(false);
|
||||||
|
Add('interface');
|
||||||
|
Add('type');
|
||||||
|
Add(' {#a}a=longint;');
|
||||||
|
Add(' {#b}{=a}b=afile.a;');
|
||||||
|
Add('var');
|
||||||
|
Add(' {=a}c: a;');
|
||||||
|
Add(' {=b}d: b;');
|
||||||
|
Add('implementation');
|
||||||
|
ParseUnit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestAliasType_UnitPrefix_CycleFail;
|
||||||
|
begin
|
||||||
|
StartUnit(false);
|
||||||
|
Add('interface');
|
||||||
|
Add('type');
|
||||||
|
Add(' {#a}a=afile.a;');
|
||||||
|
Add('implementation');
|
||||||
|
CheckResolverException('identifier not found "a"',nIdentifierNotFound);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestTypeAliasType;
|
procedure TTestResolver.TestTypeAliasType;
|
||||||
begin
|
begin
|
||||||
// ToDo
|
// ToDo
|
||||||
@ -1809,7 +1844,7 @@ var
|
|||||||
begin
|
begin
|
||||||
StartProgram(true);
|
StartProgram(true);
|
||||||
Add('const');
|
Add('const');
|
||||||
Add(' c1:integer=3;'); // defined in system.pp
|
Add(' c1: integer=3;'); // defined in system.pp
|
||||||
Add('begin');
|
Add('begin');
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
AssertEquals('1 declaration',1,PasProgram.ProgramSection.Declarations.Count);
|
AssertEquals('1 declaration',1,PasProgram.ProgramSection.Declarations.Count);
|
||||||
@ -1828,6 +1863,15 @@ begin
|
|||||||
AssertEquals('c1 expr value','3',ExprC1.Value);
|
AssertEquals('c1 expr value','3',ExprC1.Value);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestConstInteger2;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('const');
|
||||||
|
Add(' c1 = 3');
|
||||||
|
Add(' c2: longint=c1;'); // defined in system.pp
|
||||||
|
Add('begin');
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestDuplicateVar;
|
procedure TTestResolver.TestDuplicateVar;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -2163,6 +2207,16 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestSetConstRange;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('const');
|
||||||
|
Add(' MinInt = -1;');
|
||||||
|
Add(' MaxInt = +1;');
|
||||||
|
Add(' {#TMyInt}TMyInt = MinInt..MaxInt;');
|
||||||
|
Add('begin');
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestSetOperators;
|
procedure TTestResolver.TestSetOperators;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -2862,6 +2916,16 @@ begin
|
|||||||
CheckAccessMarkers;
|
CheckAccessMarkers;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestAssignedIntFail;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('var i: longint;');
|
||||||
|
Add('begin');
|
||||||
|
Add(' if Assigned(i) then ;');
|
||||||
|
CheckResolverException('Incompatible type arg no. 1: Got "Longint", expected "class or array"',
|
||||||
|
nIncompatibleTypeArgNo);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestForLoop;
|
procedure TTestResolver.TestForLoop;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -3343,7 +3407,9 @@ end;
|
|||||||
procedure TTestResolver.TestProcParam;
|
procedure TTestResolver.TestProcParam;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add('procedure Proc1(a: longint);');
|
Add('type');
|
||||||
|
Add(' integer = longint;');
|
||||||
|
Add('procedure Proc1(a: integer);');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
Add(' a:=3;');
|
Add(' a:=3;');
|
||||||
Add('end;');
|
Add('end;');
|
||||||
@ -3354,8 +3420,10 @@ end;
|
|||||||
procedure TTestResolver.TestProcParamAccess;
|
procedure TTestResolver.TestProcParamAccess;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add('procedure DoIt(vI: longint; const vJ: longint; var vK: longint);');
|
Add('type');
|
||||||
Add('var vL: longint;');
|
Add(' integer = longint;');
|
||||||
|
Add('procedure DoIt(vI: integer; const vJ: integer; var vK: integer);');
|
||||||
|
Add('var vL: integer;');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
Add(' vi:=vi+1;');
|
Add(' vi:=vi+1;');
|
||||||
Add(' vl:=vj+1;');
|
Add(' vl:=vj+1;');
|
||||||
@ -3366,7 +3434,7 @@ begin
|
|||||||
Add(' DoIt(vk,vk,vk);');
|
Add(' DoIt(vk,vk,vk);');
|
||||||
Add(' DoIt(vl,vl,vl);');
|
Add(' DoIt(vl,vl,vl);');
|
||||||
Add('end;');
|
Add('end;');
|
||||||
Add('var i: longint;');
|
Add('var i: integer;');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
Add(' DoIt(i,i,i);');
|
Add(' DoIt(i,i,i);');
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
@ -3495,6 +3563,29 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestProcOverloadBaseTypeOtherUnit;
|
||||||
|
begin
|
||||||
|
AddModuleWithIntfImplSrc('unit2.pp',
|
||||||
|
LinesToStr([
|
||||||
|
'procedure Val(var d: double);',
|
||||||
|
//'procedure Val(var i: integer);',
|
||||||
|
'']),
|
||||||
|
LinesToStr([
|
||||||
|
'procedure Val(var d: double); begin end;',
|
||||||
|
'procedure Val(var i: integer); begin end;',
|
||||||
|
'']));
|
||||||
|
|
||||||
|
StartProgram(true);
|
||||||
|
Add('uses unit2;');
|
||||||
|
Add('var');
|
||||||
|
Add(' d: double;');
|
||||||
|
Add(' i: integer;');
|
||||||
|
Add('begin');
|
||||||
|
//Add(' Val(i);');
|
||||||
|
Add(' Val(d);');
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestProcDuplicate;
|
procedure TTestResolver.TestProcDuplicate;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -3674,6 +3765,17 @@ begin
|
|||||||
PasResolver.nWrongNumberOfParametersForCallTo);
|
PasResolver.nWrongNumberOfParametersForCallTo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestProcArgDefaultValue;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('const {#DefA}DefA = 3;');
|
||||||
|
Add('procedure Proc1(a: longint = {@DefA}DefA);');
|
||||||
|
Add('begin');
|
||||||
|
Add('end;');
|
||||||
|
Add('begin');
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestProcArgDefaultValueTypeMismatch;
|
procedure TTestResolver.TestProcArgDefaultValueTypeMismatch;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -4177,7 +4279,7 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestClass_MethodUnresolved;
|
procedure TTestResolver.TestClass_MethodUnresolvedPrg;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add('type');
|
Add('type');
|
||||||
@ -4190,6 +4292,20 @@ begin
|
|||||||
CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
|
CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestClass_MethodUnresolvedUnit;
|
||||||
|
begin
|
||||||
|
StartUnit(false);
|
||||||
|
Add('interface');
|
||||||
|
Add('type');
|
||||||
|
Add(' TObject = class');
|
||||||
|
Add(' end;');
|
||||||
|
Add(' TClassA = class');
|
||||||
|
Add(' procedure ProcA;');
|
||||||
|
Add(' end;');
|
||||||
|
Add('implementation');
|
||||||
|
CheckResolverException('forward proc not resolved',PasResolver.nForwardProcNotResolved);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestClass_MethodAbstract;
|
procedure TTestResolver.TestClass_MethodAbstract;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -6214,7 +6330,8 @@ begin
|
|||||||
Add(' property B: longint read FB;');
|
Add(' property B: longint read FB;');
|
||||||
Add(' end;');
|
Add(' end;');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
CheckResolverException('Longint expected, but String found',PasResolver.nXExpectedButYFound);
|
CheckResolverException('Incompatible types: got "Longint" expected "String"',
|
||||||
|
PasResolver.nIncompatibleTypesGotExpected);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestPropertyReadAccessorProcNotFunc;
|
procedure TTestResolver.TestPropertyReadAccessorProcNotFunc;
|
||||||
@ -6280,7 +6397,8 @@ begin
|
|||||||
Add(' property B: longint write FB;');
|
Add(' property B: longint write FB;');
|
||||||
Add(' end;');
|
Add(' end;');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
CheckResolverException('Longint expected, but String found',PasResolver.nXExpectedButYFound);
|
CheckResolverException('Incompatible types: got "Longint" expected "String"',
|
||||||
|
PasResolver.nIncompatibleTypesGotExpected);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestPropertyWriteAccessorFuncNotProc;
|
procedure TTestResolver.TestPropertyWriteAccessorFuncNotProc;
|
||||||
@ -6851,7 +6969,7 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestLowHighArray;
|
procedure TTestResolver.TestArray_LowHigh;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add('type');
|
Add('type');
|
||||||
@ -6866,6 +6984,15 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestArray_Assigned;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('var a: array of longint;');
|
||||||
|
Add('begin');
|
||||||
|
Add(' if Assigned(a) then ;');
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestPropertyOfTypeArray;
|
procedure TTestResolver.TestPropertyOfTypeArray;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -7101,6 +7228,28 @@ begin
|
|||||||
CheckResolverException('Incompatible types: got "Longint" expected "String"',nIncompatibleTypesGotExpected);
|
CheckResolverException('Incompatible types: got "Longint" expected "String"',nIncompatibleTypesGotExpected);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestArray_OpenArrayOverride;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('type');
|
||||||
|
Add(' TObject = class');
|
||||||
|
Add(' end;');
|
||||||
|
Add(' Exception = class');
|
||||||
|
Add(' constructor CreateFmt(const Msg: string; const Args: array of string); virtual;');
|
||||||
|
Add(' end;');
|
||||||
|
Add(' ESome = class(Exception)');
|
||||||
|
Add(' constructor CreateFmt(const Msg: string; const Args: array of string); override;');
|
||||||
|
Add(' end;');
|
||||||
|
Add('constructor Exception.CreateFmt(const Msg: string; const Args: array of string);');
|
||||||
|
Add('begin end;');
|
||||||
|
Add('constructor ESome.CreateFmt(const Msg: string; const Args: array of string);');
|
||||||
|
Add('begin');
|
||||||
|
Add(' inherited CreateFmt(Msg,Args);');
|
||||||
|
Add('end;');
|
||||||
|
Add('begin');
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestProcTypesAssignObjFPC;
|
procedure TTestResolver.TestProcTypesAssignObjFPC;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -7599,6 +7748,21 @@ begin
|
|||||||
nWrongNumberOfParametersForCallTo);
|
nWrongNumberOfParametersForCallTo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestProcType_WhileListCompare;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add('type');
|
||||||
|
Add(' integer = longint;');
|
||||||
|
Add(' TArrInt = array of Integer;');
|
||||||
|
Add(' TListCompare = function(Item1, Item2: Integer): integer;');
|
||||||
|
Add('procedure Sort(P: Integer; const List: TArrInt; const Compare: TListCompare);');
|
||||||
|
Add('begin');
|
||||||
|
Add(' while Compare(P,List[0])>0 do ;');
|
||||||
|
Add('end;');
|
||||||
|
Add('begin');
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
RegisterTests([TTestResolver]);
|
RegisterTests([TTestResolver]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user