From 9e3f64733359a6ca802b5e913ffc4c6626746ad8 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 25 Feb 2022 21:56:09 +0100 Subject: [PATCH] * var, type, threadvar, const sections require also in classes etc. at least one declaration, resolves #39599 --- compiler/pdecobj.pas | 14 +++++++++++++- tests/webtfs/tw39599a.pp | 10 ++++++++++ tests/webtfs/tw39599b.pp | 10 ++++++++++ tests/webtfs/tw39599c.pp | 10 ++++++++++ tests/webtfs/tw39599d.pp | 10 ++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/webtfs/tw39599a.pp create mode 100644 tests/webtfs/tw39599b.pp create mode 100644 tests/webtfs/tw39599c.pp create mode 100644 tests/webtfs/tw39599d.pp diff --git a/compiler/pdecobj.pas b/compiler/pdecobj.pas index 4fc70e6391..0fff0a20c9 100644 --- a/compiler/pdecobj.pas +++ b/compiler/pdecobj.pas @@ -1194,18 +1194,27 @@ implementation Message(parser_e_type_var_const_only_in_records_and_classes); consume(_TYPE); object_member_blocktype:=bt_type; + { expect at least one type declaration } + if token<>_ID then + consume(_ID); end; _VAR : begin check_unbound_attributes; rtti_attrs_def := nil; parse_var(false); + { expect at least one var declaration } + if token<>_ID then + consume(_ID); end; _CONST: begin check_unbound_attributes; rtti_attrs_def := nil; - parse_const + parse_const; + { expect at least one constant declaration } + if token<>_ID then + consume(_ID); end; _THREADVAR : begin @@ -1217,6 +1226,9 @@ implementation is_classdef:=true; end; parse_var(true); + { expect at least one threadvar declaration } + if token<>_ID then + consume(_ID); end; _ID : begin diff --git a/tests/webtfs/tw39599a.pp b/tests/webtfs/tw39599a.pp new file mode 100644 index 0000000000..e7bbf2b73a --- /dev/null +++ b/tests/webtfs/tw39599a.pp @@ -0,0 +1,10 @@ +{ %fail } +program project1; +{$mode objfpc} +type + TMyClass = class(TObject) + const + procedure A; virtual; abstract; // should not be allowed + end; +begin +end. diff --git a/tests/webtfs/tw39599b.pp b/tests/webtfs/tw39599b.pp new file mode 100644 index 0000000000..524c57ce4b --- /dev/null +++ b/tests/webtfs/tw39599b.pp @@ -0,0 +1,10 @@ +{ %fail } +program project1; +{$mode objfpc} +type + TMyClass = class(TObject) + type + procedure A; virtual; abstract; // should not be allowed + end; +begin +end. diff --git a/tests/webtfs/tw39599c.pp b/tests/webtfs/tw39599c.pp new file mode 100644 index 0000000000..3fd56f9f52 --- /dev/null +++ b/tests/webtfs/tw39599c.pp @@ -0,0 +1,10 @@ +{ %fail } +program project1; +{$mode objfpc} +type + TMyClass = class(TObject) + var + procedure A; virtual; abstract; // should not be allowed + end; +begin +end. diff --git a/tests/webtfs/tw39599d.pp b/tests/webtfs/tw39599d.pp new file mode 100644 index 0000000000..dd976e1fd7 --- /dev/null +++ b/tests/webtfs/tw39599d.pp @@ -0,0 +1,10 @@ +{ %fail } +program project1; +{$mode objfpc} +type + TMyClass = class(TObject) + threadvar + procedure A; virtual; abstract; // should not be allowed + end; +begin +end.