mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-10 12:29:15 +02:00
fcl-passrc: resolver: nicer illegal qualifier error messages
git-svn-id: trunk@38162 -
This commit is contained in:
parent
ed695624ab
commit
740d141c2e
@ -153,6 +153,9 @@ const
|
||||
nConstructingClassXWithAbstractMethodY = 3080;
|
||||
nXIsNotSupported = 3081;
|
||||
nOperatorIsNotOverloadedAOpB = 3082;
|
||||
nIllegalQualifierAfter = 3004;
|
||||
nIllegalQualifierInFrontOf = 3005;
|
||||
nIllegalQualifierWithin = 3006;
|
||||
|
||||
// resourcestring patterns of messages
|
||||
resourcestring
|
||||
@ -238,6 +241,9 @@ resourcestring
|
||||
sConstructingClassXWithAbstractMethodY = 'Constructing a class "%s" with abstract method "%s"';
|
||||
sXIsNotSupported = '%s is not supported';
|
||||
sOperatorIsNotOverloadedAOpB = 'Operator is not overloaded: "%s" %s "%s"';
|
||||
sIllegalQualifierAfter = 'illegal qualifier "%s" after "%s"';
|
||||
sIllegalQualifierInFrontOf = 'illegal qualifier "%s" in front of "%s"';
|
||||
sIllegalQualifierWithin = 'illegal qualifier "%s" within "%s"';
|
||||
|
||||
|
||||
type
|
||||
|
@ -3283,7 +3283,8 @@ begin
|
||||
begin
|
||||
// El is the first element found -> raise error
|
||||
// ToDo: use the ( as error position
|
||||
RaiseMsg(20170216151525,nIllegalQualifier,sIllegalQualifier,['('],Data^.Params);
|
||||
RaiseMsg(20170216151525,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['(',El.ElementTypeName],Data^.Params);
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
@ -5979,7 +5980,7 @@ begin
|
||||
['set of '+BaseTypeNames[RightResolved.SubType],'set of '+BaseTypeNames[LeftResolved.SubType]],El.right);
|
||||
end
|
||||
else
|
||||
RaiseMsg(20170216152125,nIllegalQualifier,sIllegalQualifier,[AssignKindNames[El.Kind]],El);
|
||||
RaiseIncompatibleTypeRes(20180208115707,nOperatorIsNotOverloadedAOpB,[AssignKindNames[El.Kind]],RightResolved,LeftResolved,El);
|
||||
// store const expression result
|
||||
Eval(El.right,[]);
|
||||
end;
|
||||
@ -6425,7 +6426,8 @@ begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.ResolveSubIdent left=',GetObjName(Left),' right=',GetObjName(El.right),' leftresolved=',GetResolverResultDbg(LeftResolved));
|
||||
{$ENDIF}
|
||||
RaiseMsg(20170216152157,nIllegalQualifier,sIllegalQualifier,['.'],El);
|
||||
RaiseMsg(20170216152157,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['.',GetResolverResultDescription(LeftResolved)],El);
|
||||
end;
|
||||
|
||||
procedure TPasResolver.ResolveParamsExpr(Params: TParamsExpr;
|
||||
@ -6560,7 +6562,7 @@ begin
|
||||
if TypeEl is TPasProcedureType then
|
||||
CheckCallProcCompatibility(TPasProcedureType(TypeEl),Params,true)
|
||||
else
|
||||
RaiseMsg(20170405003522,nIllegalQualifier,sIllegalQualifier,['('],Params);
|
||||
RaiseMsg(20170405003522,nIllegalQualifierAfter,sIllegalQualifierAfter,['(',TypeEl.ElementTypeName],Params);
|
||||
end
|
||||
else
|
||||
RaiseNotYetImplemented(20161003134755,FindCallData.Found);
|
||||
@ -6660,22 +6662,25 @@ begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.ResolveFuncParamsExpr FoundEl=',GetObjName(FoundEl),' CustomData=',GetObjName(FoundEl.CustomData));
|
||||
{$ENDIF}
|
||||
RaiseMsg(20170306121908,nIllegalQualifier,sIllegalQualifier,['('],Params);
|
||||
RaiseMsg(20170306121908,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['(',TypeEl.ElementTypeName],Params);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
// FoundEl is not a type, maybe a var
|
||||
ComputeElement(FoundEl,ResolvedEl,[rcNoImplicitProc,rcSetReferenceFlags]);
|
||||
if ResolvedEl.TypeEl is TPasProcedureType then
|
||||
TypeEl:=ResolveAliasType(ResolvedEl.TypeEl);
|
||||
if TypeEl is TPasProcedureType then
|
||||
begin
|
||||
FinishProcParams(TPasProcedureType(ResolvedEl.TypeEl));
|
||||
FinishProcParams(TPasProcedureType(TypeEl));
|
||||
exit;
|
||||
end;
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.ResolveFuncParamsExpr FoundEl=',GetObjName(FoundEl),' CustomData=',GetObjName(FoundEl.CustomData),' Resolvedel=',GetResolverResultDbg(ResolvedEl));
|
||||
{$ENDIF}
|
||||
RaiseMsg(20170306104301,nIllegalQualifier,sIllegalQualifier,['('],Params);
|
||||
RaiseMsg(20170306104301,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['(',TypeEl.ElementTypeName],Params);
|
||||
end;
|
||||
end
|
||||
else if Value.ClassType=TParamsExpr then
|
||||
@ -6693,7 +6698,8 @@ begin
|
||||
exit;
|
||||
end
|
||||
end;
|
||||
RaiseMsg(20170216152202,nIllegalQualifier,sIllegalQualifier,['('],Params);
|
||||
RaiseMsg(20170216152202,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['(',SubParams.ElementTypeName],Params);
|
||||
end
|
||||
else
|
||||
RaiseNotYetImplemented(20161014085118,Params.Value);
|
||||
@ -6825,14 +6831,16 @@ begin
|
||||
else if ResolvedValue.TypeEl.ClassType=TPasArrayType then
|
||||
begin
|
||||
if ResolvedValue.IdentEl is TPasType then
|
||||
RaiseMsg(20170216152215,nIllegalQualifier,sIllegalQualifier,['['],Params);
|
||||
RaiseMsg(20170216152215,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['[',ResolvedValue.IdentEl.ElementTypeName],Params);
|
||||
CheckCallArrayCompatibility(TPasArrayType(ResolvedValue.TypeEl),Params,true,true);
|
||||
for i:=0 to length(Params.Params)-1 do
|
||||
AccessExpr(Params.Params[i],rraRead);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
RaiseMsg(20170216152217,nIllegalQualifier,sIllegalQualifier,['['],Params);
|
||||
RaiseMsg(20170216152217,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['[',GetResolverResultDescription(ResolvedValue,true)],Params);
|
||||
end;
|
||||
|
||||
function TPasResolver.ResolveBracketOperatorClass(Params: TParamsExpr;
|
||||
@ -6847,7 +6855,8 @@ begin
|
||||
begin
|
||||
// class has default property
|
||||
if (ResolvedValue.IdentEl is TPasType) and (not PropEl.IsClass) then
|
||||
RaiseMsg(20170216152213,nIllegalQualifier,sIllegalQualifier,['['],Params);
|
||||
RaiseMsg(20170216152213,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['[',GetResolverResultDescription(ResolvedValue,true)],Params);
|
||||
Value:=Params.Value;
|
||||
if Value.CustomData is TResolvedReference then
|
||||
SetResolvedRefAccess(Value,TResolvedReference(Value.CustomData),rraRead);
|
||||
@ -7996,7 +8005,7 @@ begin
|
||||
ComputeIndexProperty(TPasProperty(ResolvedEl.IdentEl))
|
||||
else if ResolvedEl.BaseType=btContext then
|
||||
begin
|
||||
TypeEl:=ResolvedEl.TypeEl;
|
||||
TypeEl:=ResolveAliasType(ResolvedEl.TypeEl);
|
||||
if TypeEl.ClassType=TPasClassType then
|
||||
begin
|
||||
ClassScope:=NoNil(TypeEl.CustomData) as TPasClassScope;
|
||||
@ -8016,7 +8025,8 @@ begin
|
||||
else if TypeEl.ClassType=TPasArrayType then
|
||||
begin
|
||||
if not (rrfReadable in ResolvedEl.Flags) then
|
||||
RaiseMsg(20170517001140,nIllegalQualifier,sIllegalQualifier,['['],Params);
|
||||
RaiseMsg(20170517001140,nIllegalQualifierAfter,sIllegalQualifierAfter,
|
||||
['[',TypeEl.ElementTypeName],Params);
|
||||
ArrayEl:=TPasArrayType(TypeEl);
|
||||
ArgNo:=0;
|
||||
repeat
|
||||
@ -15172,12 +15182,14 @@ begin
|
||||
if ResolvedEl.BaseType in (btAllInteger+btAllFloats) then
|
||||
exit
|
||||
else
|
||||
RaiseMsg(20170216152532,nIllegalQualifier,sIllegalQualifier,[OpcodeStrings[TUnaryExpr(El).OpCode]],El);
|
||||
RaiseMsg(20170216152532,nIllegalQualifierInFrontOf,sIllegalQualifierInFrontOf,
|
||||
[OpcodeStrings[TUnaryExpr(El).OpCode],GetResolverResultDescription(ResolvedEl)],El);
|
||||
eopNot:
|
||||
if ResolvedEl.BaseType in (btAllInteger+btAllBooleans) then
|
||||
exit
|
||||
else
|
||||
RaiseMsg(20170216152534,nIllegalQualifier,sIllegalQualifier,[OpcodeStrings[TUnaryExpr(El).OpCode]],El);
|
||||
RaiseMsg(20180208121532,nIllegalQualifierInFrontOf,sIllegalQualifierInFrontOf,
|
||||
[OpcodeStrings[TUnaryExpr(El).OpCode],GetResolverResultDescription(ResolvedEl)],El);
|
||||
eopAddress:
|
||||
if (ResolvedEl.BaseType=btProc) and (ResolvedEl.IdentEl is TPasProcedure) then
|
||||
begin
|
||||
@ -15185,13 +15197,15 @@ begin
|
||||
exit;
|
||||
end
|
||||
else
|
||||
RaiseMsg(20170216152535,nIllegalQualifier,sIllegalQualifier,[OpcodeStrings[TUnaryExpr(El).OpCode]],El);
|
||||
RaiseMsg(20180208121541,nIllegalQualifierInFrontOf,sIllegalQualifierInFrontOf,
|
||||
[OpcodeStrings[TUnaryExpr(El).OpCode],GetResolverResultDescription(ResolvedEl)],El);
|
||||
eopMemAddress:
|
||||
begin
|
||||
if (ResolvedEl.BaseType=btContext) and (ResolvedEl.TypeEl is TPasProcedureType) then
|
||||
exit
|
||||
else
|
||||
RaiseMsg(20170902145547,nIllegalQualifier,sIllegalQualifier,[OpcodeStrings[TUnaryExpr(El).OpCode]],El);
|
||||
RaiseMsg(20180208121549,nIllegalQualifierInFrontOf,sIllegalQualifierInFrontOf,
|
||||
[OpcodeStrings[TUnaryExpr(El).OpCode],GetResolverResultDescription(ResolvedEl)],El);
|
||||
end;
|
||||
end;
|
||||
RaiseNotYetImplemented(20160926142426,El);
|
||||
@ -15713,8 +15727,13 @@ end;
|
||||
|
||||
function TPasResolver.IsProcedureType(const ResolvedEl: TPasResolverResult;
|
||||
HasValue: boolean): boolean;
|
||||
var
|
||||
TypeEl: TPasType;
|
||||
begin
|
||||
if (ResolvedEl.BaseType<>btContext) or not (ResolvedEl.TypeEl is TPasProcedureType) then
|
||||
if (ResolvedEl.BaseType<>btContext) then
|
||||
exit(false);
|
||||
TypeEl:=ResolveAliasType(ResolvedEl.TypeEl);
|
||||
if not (TypeEl is TPasProcedureType) then
|
||||
exit(false);
|
||||
if HasValue and not (rrfReadable in ResolvedEl.Flags) then
|
||||
exit(false);
|
||||
|
@ -9668,8 +9668,8 @@ begin
|
||||
Add('var o: TObject;');
|
||||
Add('begin');
|
||||
Add(' if o[5]=6 then;');
|
||||
CheckResolverException('illegal qualifier "["',
|
||||
nIllegalQualifier);
|
||||
CheckResolverException('illegal qualifier "[" after "TObject"',
|
||||
nIllegalQualifierAfter);
|
||||
end;
|
||||
|
||||
procedure TTestResolver.TestIgnoreInterfaces;
|
||||
|
@ -13348,7 +13348,7 @@ begin
|
||||
Add(' p: Pointer;');
|
||||
Add('begin');
|
||||
Add(' p:=p[1];');
|
||||
SetExpectedPasResolverError('illegal qualifier "["',nIllegalQualifier);
|
||||
SetExpectedPasResolverError('illegal qualifier "[" after "Pointer"',nIllegalQualifierAfter);
|
||||
ConvertProgram;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user