Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2020-07

Wrong Duplicate Identifier error message?

5 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Special

Hi,

the following unit throws an (I think wrong) compile error "Duplicate identifier 'Connection'". This happens Lazarus with 2.0.8 under Win 10 (64). According to Nicklaus Wirth and Kathleen Jensen ('Pascal User Manual and Report') there is no duplicate  identifier in this  unit, since 'Connection' in procedure Proc ist strictly local and does not interfere with Identfiers outside this procedure.

Code:

unit DoubleDefinition;
{$mode objfpc}{$H+}
interface
  uses
   Classes, SysUtils, sqlite3conn, Forms, Controls, Graphics, Dialogs;
  type
    { TForm1 }
    TForm1 = class(TForm)
     Connection: TSQLite3Connection;
     procedure Proc;
   end;
var Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.Proc;
var Connection: TSQLite3Connection;
begin
   Connection:=  TSQLite3Connection.Create(Form1);
   Connection.Free;
end;
end.

Regards --  Joe

Reply by email

Mattias Gaertner
to Special
Show quoted text 7 lines
[...] the following unit throws an (I think wrong) compile error "Duplicate identifier 'Connection'". This happens Lazarus with 2.0.8 under Win 10 (64). According to Nicklaus Wirth and Kathleen Jensen ('Pascal User Manual and Report') there is no duplicate  identifier in this unit, since 'Connection' in procedure Proc ist strictly local and does not interfere with Identfiers outside this procedure.

You are aware, that this manual was way before Object Pascal?

Code: unit DoubleDefinition; {$mode objfpc}{$H+}

$mode objfpc is more strict on duplicates.
FPC supports other modes like $mode Delphi, which allows this duplicate.

Mattias

Reply by email

Special
to Mattias Gaertner
Mattias Gaertner wrote 22 lines
On Wed, 1 Jul 2020 20:15:45 +0200 Special via lazarus wrote: > [...] > the following unit throws an (I think wrong) compile error "Duplicate > identifier 'Connection'". This happens Lazarus with 2.0.8 under Win > 10 (64). According to Nicklaus Wirth and Kathleen Jensen ('Pascal > User Manual and Report') there is no duplicate  identifier in this > unit, since 'Connection' in procedure Proc ist strictly local and > does not interfere with Identfiers outside this procedure. You are aware, that this manual was way before Object Pascal? > Code: > > unit DoubleDefinition; > {$mode objfpc}{$H+} $mode objfpc is more strict on duplicates. FPC supports other modes like $mode Delphi, which allows this duplicate. Mattias

Here there is no Duplicate Identifier error message:

program Duplicate;
{$mode objfpc}{$H+}
var TestVar: string;
procedure Proc;
var TestVar: string;
begin
   TestVar:= 'zwei';
   writeln (TestVar)
end;
begin
   TestVar:= 'eins';
   writeln (TestVar);
   Proc
end.

Why this inconsistency?

Regards --  Joe

Reply by email

Michael Van Canneyt
to Special
Special wrote 45 lines
Am 01.07.2020 um 20:36 schrieb Mattias Gaertner via lazarus: > On Wed, 1 Jul 2020 20:15:45 +0200 > Special via lazarus wrote: > >> [...] >> the following unit throws an (I think wrong) compile error "Duplicate >> identifier 'Connection'". This happens Lazarus with 2.0.8 under Win >> 10 (64). According to Nicklaus Wirth and Kathleen Jensen ('Pascal >> User Manual and Report') there is no duplicate  identifier in this >> unit, since 'Connection' in procedure Proc ist strictly local and >> does not interfere with Identfiers outside this procedure. > You are aware, that this manual was way before Object Pascal? > > >> Code: >> >> unit DoubleDefinition; >> {$mode objfpc}{$H+} > $mode objfpc is more strict on duplicates. > FPC supports other modes like $mode Delphi, which allows this > duplicate. > > Mattias Here there is no Duplicate Identifier error message: program Duplicate; {$mode objfpc}{$H+} var TestVar: string; procedure Proc; var TestVar: string; begin   TestVar:= 'zwei';   writeln (TestVar) end; begin   TestVar:= 'eins';   writeln (TestVar);   Proc end. Why this inconsistency?

There is no inconsistency: there is no object.

An object in some way represents a single scope of identifiers. In that sense, it makes sense to forbid duplicates. It's a thin line.

In practice, I find that the objfpc mode is less error prone than the Delphi mode. I had some nasty surprises in the past in Delphi with duplicate names in methods and properties.

Michael.

Michael.

Reply by email

Special
to Michael Van Canneyt
Michael Van Canneyt wrote 8 lines
An object in some way represents a single scope of identifiers. In that sense, it makes sense to forbid duplicates. It's a thin line. In practice, I find that the objfpc mode is less error prone than the Delphi mode. I had some nasty surprises in the past in Delphi with duplicate names in methods and properties. Michael.

Thanks for the clarification.
--  J o e

Reply by email