mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 09:29:07 +02:00
* Parse complete expressions for default arguments
git-svn-id: trunk@21832 -
This commit is contained in:
parent
9c52d89f95
commit
15f59192ed
@ -36,6 +36,7 @@ resourcestring
|
|||||||
SParserExpectedCommaRBracket = 'Expected "," or ")"';
|
SParserExpectedCommaRBracket = 'Expected "," or ")"';
|
||||||
SParserExpectedCommaSemicolon = 'Expected "," or ";"';
|
SParserExpectedCommaSemicolon = 'Expected "," or ";"';
|
||||||
SParserExpectedCommaColon = 'Expected "," or ":"';
|
SParserExpectedCommaColon = 'Expected "," or ":"';
|
||||||
|
SParserOnlyOneArgumentCanHaveDefault = 'A default value can only be assigned to 1 parameter';
|
||||||
SParserExpectedLBracketColon = 'Expected "(" or ":"';
|
SParserExpectedLBracketColon = 'Expected "(" or ":"';
|
||||||
SParserExpectedLBracketSemicolon = 'Expected "(" or ";"';
|
SParserExpectedLBracketSemicolon = 'Expected "(" or ";"';
|
||||||
SParserExpectedColonSemicolon = 'Expected ":" or ";"';
|
SParserExpectedColonSemicolon = 'Expected ":" or ";"';
|
||||||
@ -2323,7 +2324,8 @@ procedure TPasParser.ParseArgList(Parent: TPasElement; Args: TFPList; EndToken:
|
|||||||
var
|
var
|
||||||
ArgNames: TStringList;
|
ArgNames: TStringList;
|
||||||
IsUntyped: Boolean;
|
IsUntyped: Boolean;
|
||||||
Name, Value: String;
|
Name : String;
|
||||||
|
Value : TPasExpr;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
Arg: TPasArgument;
|
Arg: TPasArgument;
|
||||||
Access: TArgumentAccess;
|
Access: TArgumentAccess;
|
||||||
@ -2371,17 +2373,29 @@ begin
|
|||||||
else if CurToken <> tkComma then
|
else if CurToken <> tkComma then
|
||||||
ParseExc(SParserExpectedCommaColon);
|
ParseExc(SParserExpectedCommaColon);
|
||||||
end;
|
end;
|
||||||
SetLength(Value, 0);
|
Value:=Nil;
|
||||||
if not IsUntyped then
|
if not IsUntyped then
|
||||||
begin
|
|
||||||
ArgType := ParseType(nil);
|
|
||||||
NextToken;
|
|
||||||
if CurToken = tkEqual then
|
|
||||||
begin
|
begin
|
||||||
Value := ParseExpression(Parent);
|
ArgType := ParseType(nil);
|
||||||
end else
|
try
|
||||||
|
NextToken;
|
||||||
|
if CurToken = tkEqual then
|
||||||
|
begin
|
||||||
|
if (ArgNames.Count>1) then
|
||||||
|
begin
|
||||||
|
FreeAndNil(ArgType);
|
||||||
|
ParseExc(SParserOnlyOneArgumentCanHaveDefault);
|
||||||
|
end;
|
||||||
|
NextToken;
|
||||||
|
Value := DoParseExpression(Parent,Nil);
|
||||||
|
// After this, we're on ), which must be unget.
|
||||||
|
end;
|
||||||
UngetToken;
|
UngetToken;
|
||||||
end;
|
except
|
||||||
|
FreeAndNil(ArgType);
|
||||||
|
Raise;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
for i := 0 to ArgNames.Count - 1 do
|
for i := 0 to ArgNames.Count - 1 do
|
||||||
begin
|
begin
|
||||||
@ -2390,7 +2404,8 @@ begin
|
|||||||
Arg.ArgType := ArgType;
|
Arg.ArgType := ArgType;
|
||||||
if (i > 0) and Assigned(ArgType) then
|
if (i > 0) and Assigned(ArgType) then
|
||||||
ArgType.AddRef;
|
ArgType.AddRef;
|
||||||
Arg.Value := Value;
|
Arg.ValueExpr := Value;
|
||||||
|
Value:=Nil; // Only the first gets a value. OK, since Var A,B : Integer = 1 is not allowed.
|
||||||
Args.Add(Arg);
|
Args.Add(Arg);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user