Browse Source

fcl-passrc: parser: record property must have type

git-svn-id: trunk@40650 -
Mattias Gaertner 6 years ago
parent
commit
6ff287637a

+ 3 - 1
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;

+ 19 - 2
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);

+ 18 - 1
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;