diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index e1203395ba..3f660db4b5 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -5257,7 +5257,9 @@ begin begin Result.VarType := ParseType(Result,CurSourcePos); NextToken; - end; + end + else if not IsClass then + ParseExcTokenError(':'); if CurTokenIsIdentifier('INDEX') then begin NextToken; diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index 4773e832b3..fc5e0638f8 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -489,8 +489,7 @@ type // advanced record Procedure TestAdvRecord; Procedure TestAdvRecord_Private; - // ToDO: Procedure TestAdvRecord_PropertyWithoutTypeFail; - // Todo: Procedure TestAdvRecord_ForwardFail + Procedure TestAdvRecord_StrictPrivate; // ToDo // ToDo: public, private, strict private // ToDo: TestAdvRecordPublishedFail // ToDo: TestAdvRecord_VirtualFail @@ -7858,6 +7857,24 @@ begin ParseProgram; end; +procedure TTestResolver.TestAdvRecord_StrictPrivate; +begin + exit; + StartProgram(false); + Add([ + '{$modeswitch advancedrecords}', + 'type', + ' TRec = record', + ' strict private', + ' A: word;', + ' end;', + 'var', + ' r: TRec;', + 'begin', + ' r.a:=r.a;']); + CheckResolverException('aaa',123); +end; + procedure TTestResolver.TestClass; begin StartProgram(false); diff --git a/packages/fcl-passrc/tests/tctypeparser.pas b/packages/fcl-passrc/tests/tctypeparser.pas index 0b68e8dbed..08f5578e07 100644 --- a/packages/fcl-passrc/tests/tctypeparser.pas +++ b/packages/fcl-passrc/tests/tctypeparser.pas @@ -353,6 +353,8 @@ type Procedure TestPropertyFail; Procedure TestAdvRec_Property; Procedure TestAdvRec_PropertyImplementsFail; + Procedure TestAdvRec_PropertyNoTypeFail; + Procedure TestAdvRec_ForwardFail; end; { TTestProcedureTypeParser } @@ -1283,7 +1285,8 @@ begin except on E: EParserError do begin - AssertEquals('Expected {'+Msg+'}, but got msg {'+Parser.LastMsg+'}',MsgNumber,Parser.LastMsgNumber); + AssertEquals('Expected {'+Msg+'} '+IntToStr(MsgNumber)+', but got msg {'+Parser.LastMsg+'} '+IntToStr(Parser.LastMsgNumber),MsgNumber,Parser.LastMsgNumber); + AssertEquals('Expected {'+Msg+'}, but got msg {'+Parser.LastMsg+'}',Msg,Parser.LastMsg); ok:=true; end; end; @@ -2543,6 +2546,20 @@ begin ParseRecordFail('Expected ";"',nParserExpectTokenError); end; +procedure TTestRecordTypeParser.TestAdvRec_PropertyNoTypeFail; +begin + StartRecord(true); + AddMember('Property Something;'); + ParseRecordFail('Expected ":"',nParserExpectTokenError); +end; + +procedure TTestRecordTypeParser.TestAdvRec_ForwardFail; +begin + StartRecord(true); + FDecl.Add(';TMyRecord = record'); + ParseRecordFail('Syntax error in type',nParserTypeSyntaxError); +end; + { TBaseTestTypeParser } Function TBaseTestTypeParser.ParseType(ASource: String; ATypeClass: TClass;