From f1c334df04b17b48062a1c5110f52c6f525a56a0 Mon Sep 17 00:00:00 2001 From: Rika Ichinose Date: Mon, 12 Aug 2024 22:51:28 +0300 Subject: [PATCH] Allow DuplicateLocals for objects (unless in Delphi mode). --- compiler/symtable.pas | 3 ++- tests/webtbs/tw33221.pp | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/compiler/symtable.pas b/compiler/symtable.pas index caab08ae7b..5a5164eb23 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -2522,7 +2522,8 @@ implementation (tprocdef(defowner).owner.defowner=tprocdef(defowner).struct) and ( not(m_duplicate_names in current_settings.modeswitches) or - is_object(tprocdef(defowner).struct) + { Delphi allows duplicates in classes/records but disallows in objects. } + (m_delphi in current_settings.modeswitches) and is_object(tprocdef(defowner).struct) ) then result:=tprocdef(defowner).struct.symtable.checkduplicate(hashedid,sym); end; diff --git a/tests/webtbs/tw33221.pp b/tests/webtbs/tw33221.pp index cf24070ecd..3dfe53e41f 100644 --- a/tests/webtbs/tw33221.pp +++ b/tests/webtbs/tw33221.pp @@ -2,6 +2,7 @@ program Project1; {$mode objfpc}{$H+} {$ModeSwitch duplicatelocals} +{$ModeSwitch advancedrecords} type TClass1 = class(TObject) @@ -18,13 +19,50 @@ begin end; // Local variable has same name as member field. -// Unlike with delphi mode, this is compiler error, even with duplicatelocals! +// This is okay with duplicatelocals, too. procedure TClass1.Proc2; var X: Integer; begin end; +// Same for objects and managed records. (Though in Delphi mode, which implicitly enables duplicatelocals, disallowed specifically for objects.) +type + TRecord1 = record + public + X: Integer; + procedure Proc1(X: Integer); + procedure Proc2; + end; + +procedure TRecord1.Proc1(X: Integer); +begin +end; + +procedure TRecord1.Proc2; +var + X: Integer; +begin +end; + +type + TObject1 = object + public + X: Integer; + procedure Proc1(X: Integer); + procedure Proc2; + end; + +procedure TObject1.Proc1(X: Integer); +begin +end; + +procedure TObject1.Proc2; +var + X: Integer; +begin +end; + begin end.