diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index 9dc94cd449..079a9144aa 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -3134,13 +3134,14 @@ begin Value:=nil; ExternalClass:=(msExternalClass in CurrentModeSwitches) and (Parent is TPasClassType) ; - H:=H+CheckHint(Nil,Full); - if Full then - Mods:=GetVariableModifiers(Parent,VarMods,aLibName,aExpName,ExternalClass) - else if ExternalClass then + H:=H+CheckHint(Nil,False); + if Full or Externalclass then begin + NextToken; + If Curtoken<>tkSemicolon then + UnGetToken; Mods:=GetVariableModifiers(Parent,VarMods,aLibName,aExpName,ExternalClass) ; - if mods='' then + if (mods='') and (CurToken<>tkSemicolon) then NextToken; end else diff --git a/packages/fcl-passrc/tests/tcclasstype.pas b/packages/fcl-passrc/tests/tcclasstype.pas index 385bdeb7a3..782370d4eb 100644 --- a/packages/fcl-passrc/tests/tcclasstype.pas +++ b/packages/fcl-passrc/tests/tcclasstype.pas @@ -92,7 +92,8 @@ type procedure TestHintFieldExperimental; procedure TestHintFieldLibraryError; procedure TestHintFieldUninmplemented; - Procedure TestOneVarFieldExternamName; + Procedure TestOneVarFieldExternalName; + procedure TestOneVarFieldExternalNameSemicolon; Procedure TestMethodSimple; Procedure TestMethodSimpleComment; Procedure TestMethodWithDotFails; @@ -783,7 +784,7 @@ begin AssertMemberName('unimplemented'); end; -procedure TTestClassType.TestOneVarFieldExternamName; +procedure TTestClassType.TestOneVarFieldExternalName; begin Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass]; StartExternalClass('','myname',''); @@ -794,6 +795,17 @@ begin AssertMemberName('unimplemented'); end; +procedure TTestClassType.TestOneVarFieldExternalNameSemicolon; +begin + Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass]; + StartExternalClass('','myname',''); + AddMember('unimplemented: integer; external name ''uni'''); + ParseClass; + AssertEquals('1 members',1,TheClass.members.Count); + AssertNotNull('Have field',Field1); + AssertMemberName('unimplemented'); +end; + procedure TTestClassType.TestMethodSimple; begin AddMember('Procedure DoSomething'); diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index e2968d47df..3cc0a09fe0 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -344,6 +344,7 @@ type Procedure TestClass_Sealed; Procedure TestClass_SealedDescendFail; Procedure TestClass_VarExternal; + Procedure TestClass_VarExternalSemicolon; Procedure TestClass_External; // Todo: Fail to use class.method in constant or type, e.g. const p = @o.doit; @@ -5362,6 +5363,19 @@ begin ParseProgram; end; +procedure TTestResolver.TestClass_VarExternalSemicolon; +begin + StartProgram(false); + Add('type'); + Add('{$modeswitch externalclass}'); + Add(' TObject = class'); + Add(' Id: longint; external name ''$Id'';'); + Add(' Data: longint; external name ''$Data'';'); + Add(' end;'); + Add('begin'); + ParseProgram; +end; + procedure TTestResolver.TestClass_External; begin StartProgram(false); diff --git a/packages/fcl-passrc/tests/tcvarparser.pas b/packages/fcl-passrc/tests/tcvarparser.pas index 2a827443e2..60041a3aa9 100644 --- a/packages/fcl-passrc/tests/tcvarparser.pas +++ b/packages/fcl-passrc/tests/tcvarparser.pas @@ -44,6 +44,7 @@ Type Procedure TestVarExternal; Procedure TestVarExternalLib; Procedure TestVarExternalLibName; + procedure TestVarExternalNoSemiColon; Procedure TestVarCVar; Procedure TestVarCVarExternal; Procedure TestVarPublic; @@ -269,6 +270,12 @@ begin AssertEquals('Variable modifiers',[vmexternal],TheVar.VarModifiers); end; +procedure TTestVarParser.TestVarExternalNoSemiColon; +begin + ParseVar('integer external',''); + AssertEquals('Variable modifiers',[vmexternal],TheVar.VarModifiers); +end; + procedure TTestVarParser.TestVarExternalLib; begin ParseVar('integer; external name ''mylib''','');