Thread overview
module private symbols collide?
Oct 15, 2004
Buchan
Oct 17, 2004
Regan Heath
Oct 18, 2004
Buchan
Oct 18, 2004
Regan Heath
Oct 20, 2004
Sean Kelly
Nov 01, 2004
larrycowan
October 15, 2004
Output is:
D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit conflicts with ctype.isdigit at D:\dmd\bin\..\src\phobos\std\ctype.d(14)
D:\Coding\magiccards\main.d: module main stream.isdigit is private

in stream.d:
private bit isdigit(char c) {...}

in ctype.d:
int isdigit(dchar c)  {...}

why are these colliding? if I import both, should I not be able to use isdigit from ctype without specifing the full path?

-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
October 17, 2004
On Sat, 16 Oct 2004 04:06:54 +1300, Buchan <kbuchan@xtra.co.nz> wrote:
> Output is:
> D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit conflicts  with ctype.isdigit at D:\dmd\bin\..\src\phobos\std\ctype.d(14)
> D:\Coding\magiccards\main.d: module main stream.isdigit is private
>
> in stream.d:
> private bit isdigit(char c) {...}
>
> in ctype.d:
> int isdigit(dchar c)  {...}
>
> why are these colliding? if I import both, should I not be able to use  isdigit from ctype without specifing the full path?

The solution is to use:

  alias std.ctype.isdigit isdigit;

or to use the full path i.e.

if (std.ctype.isdigit(5)) {}

to tell the compiler which 'isdigit' you mean.

The problem. as I understand it, is that the compiler cannot choose between the 'std.ctype' or 'std.stream' isdigit method, because it might guess wrong. You have to explicitly tell it which one you mean.

Regan

-- 
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
October 18, 2004
On Mon, 18 Oct 2004 10:21:29 +1300, Regan Heath <regan@netwin.co.nz> wrote:

> On Sat, 16 Oct 2004 04:06:54 +1300, Buchan <kbuchan@xtra.co.nz> wrote:
>> Output is:
>> D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit conflicts  with ctype.isdigit at D:\dmd\bin\..\src\phobos\std\ctype.d(14)
>> D:\Coding\magiccards\main.d: module main stream.isdigit is private
>>
>> in stream.d:
>> private bit isdigit(char c) {...}
>>
>> in ctype.d:
>> int isdigit(dchar c)  {...}
>>
>> why are these colliding? if I import both, should I not be able to use  isdigit from ctype without specifing the full path?
>
> The solution is to use:
>
>    alias std.ctype.isdigit isdigit;
>
> or to use the full path i.e.
>
> if (std.ctype.isdigit(5)) {}
>
> to tell the compiler which 'isdigit' you mean.
>
> The problem. as I understand it, is that the compiler cannot choose between the 'std.ctype' or 'std.stream' isdigit method, because it might guess wrong. You have to explicitly tell it which one you mean.
>
> Regan
>

Yeah, if they are both public. The compiler SHOULD be smart enough to not
try to call a private function, or am I missing something?

-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
October 18, 2004
On Mon, 18 Oct 2004 18:41:59 +1300, Buchan <kbuchan@xtra.co.nz> wrote:
> On Mon, 18 Oct 2004 10:21:29 +1300, Regan Heath <regan@netwin.co.nz> wrote:
>
>> On Sat, 16 Oct 2004 04:06:54 +1300, Buchan <kbuchan@xtra.co.nz> wrote:
>>> Output is:
>>> D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit  conflicts  with ctype.isdigit at  D:\dmd\bin\..\src\phobos\std\ctype.d(14)
>>> D:\Coding\magiccards\main.d: module main stream.isdigit is private
>>>
>>> in stream.d:
>>> private bit isdigit(char c) {...}
>>>
>>> in ctype.d:
>>> int isdigit(dchar c)  {...}
>>>
>>> why are these colliding? if I import both, should I not be able to use   isdigit from ctype without specifing the full path?
>>
>> The solution is to use:
>>
>>    alias std.ctype.isdigit isdigit;
>>
>> or to use the full path i.e.
>>
>> if (std.ctype.isdigit(5)) {}
>>
>> to tell the compiler which 'isdigit' you mean.
>>
>> The problem. as I understand it, is that the compiler cannot choose  between the 'std.ctype' or 'std.stream' isdigit method, because it might  guess wrong. You have to explicitly tell it which one you mean.
>>
>> Regan
>>
>
> Yeah, if they are both public. The compiler SHOULD be smart enough to not
> try to call a private function, or am I missing something?

Good point. From my experiments it seems the import order also matters, if you import the private one first then you also get an error about the function being private.

Here is a test case.

--[inc.d]--
module inc;

import prifn;
import pubfn;

void main()
{
	fn('a');
}

--[prifn.d]--
module prifn;

private bit fn(char c)
{
	return false;
}

--[pubfn.f]--
module pubfn;

bit fn(char c)
{
	return false;
}

The above gives the following errors:

  prifn.d(3): function fn conflicts with pubfn.fn at pubfn.d(3)
  inc.d: module inc prifn.fn is private

changing the import order in inc.d gives only:

  pubfn.d(3): function fn conflicts with prifn.fn at prifn.d(3)



In addition to the above bugs/problems the std library needs a tidy up. std.stream should be using std.ctypes functions isdigit etc and std.ctypes isdigit should return bool (AKA bit) and not int.

Regan

-- 
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
October 20, 2004
In article <opsfw2xskk44buww@simon.mshome.net>, Buchan says...
>
>Output is:
>D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit conflicts
>with ctype.isdigit at D:\dmd\bin\..\src\phobos\std\ctype.d(14)
>D:\Coding\magiccards\main.d: module main stream.isdigit is private
>
>in stream.d:
>private bit isdigit(char c) {...}
>
>in ctype.d:
>int isdigit(dchar c)  {...}
>
>why are these colliding? if I import both, should I not be able to use isdigit from ctype without specifing the full path?

I bumped into this bug today when experimenting with restructuring Phobos.  I sincerely hope this is fixed soon, as there's no easy workaround for it from the client side.


Sean


November 01, 2004
In article <cl66rd$3s5$1@digitaldaemon.com>, Sean Kelly says...
>
>In article <opsfw2xskk44buww@simon.mshome.net>, Buchan says...
>>
>>Output is:
>>D:\dmd\bin\..\src\phobos\std\stream.d(2132): function isdigit conflicts
>>with ctype.isdigit at D:\dmd\bin\..\src\phobos\std\ctype.d(14)
>>D:\Coding\magiccards\main.d: module main stream.isdigit is private
>>
>>in stream.d:
>>private bit isdigit(char c) {...}
>>
>>in ctype.d:
>>int isdigit(dchar c)  {...}
>>
>>why are these colliding? if I import both, should I not be able to use isdigit from ctype without specifing the full path?
>
>I bumped into this bug today when experimenting with restructuring Phobos.  I sincerely hope this is fixed soon, as there's no easy workaround for it from the client side.
>
>
>Sean
>
>
Two things are involved here.  The error shown is in streams which has a private definition and is pulling in the public one as a conflict.  This needs to be dealt with.  It could make the use of other peoples libraries and even the phobos ones problematic to say the least.  The language needs a public reservation system for function names?  Every reference in every library needs full specification to protect it from what it may be used with?

If as is implied, a call to isdigit() in the main(), errors out with the same
conflict, that is wrong - in main, the private one shouldn't even be seen, or
"private" is useless when used in this way.

Both problems may be correctable at once if, as is likely, the answer is that the private marking in streams is being somehow ignored or lost.