www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2028] New: Can't create template class in module of same name

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028

           Summary: Can't create template class in module of same name
           Product: D
           Version: 2.012
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: jlquinn us.ibm.com


I'm not sure this is a bug or a language limitation, but it feels like a bug...

I have 2 modules:

a.d:
class a(T) {}

b.d:
import a;
class b {
  a!(int) x;
}

When I try to compile this, I get the following error:

~/dmd/bin/dmd -c a.d b.d
b.d(4): template instance a is not a template declaration, it is a import
b.d(4): Error: a!(int) is used as a type
b.d(4): variable b.b.x voids have no value

Why can't I do this?


-- 
Apr 24 2008
next sibling parent "Jarrett Billingsley" <kb3ctd2 yahoo.com> writes:
<d-bugmail puremagic.com> wrote in message 
news:bug-2028-3 http.d.puremagic.com/issues/...
 http://d.puremagic.com/issues/show_bug.cgi?id=2028

           Summary: Can't create template class in module of same name
           Product: D
           Version: 2.012
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: jlquinn us.ibm.com


 I'm not sure this is a bug or a language limitation, but it feels like a 
 bug...

 I have 2 modules:

 a.d:
 class a(T) {}

 b.d:
 import a;
 class b {
  a!(int) x;
 }

 When I try to compile this, I get the following error:

 ~/dmd/bin/dmd -c a.d b.d
 b.d(4): template instance a is not a template declaration, it is a import
 b.d(4): Error: a!(int) is used as a type
 b.d(4): variable b.b.x voids have no value

 Why can't I do this?
I don't think it's a "bug" but just a sort of unintuitive bit of symbol lookup. In b.d, when you import a, it creates an entry in b's symbol table that maps from 'a' to 'module a'. It also creates entries for all the symbols inside 'module a', except for anything that conflicts. So when you refer to 'a' in 'module b', it refers to 'module a' and not 'class a'. This is only a problem if the class (or really any symbol) name is the same as the *top-level name* of a module. So if you instead had "mylib.a" as the name of the module, accessing 'class a' would not be a problem. Of course, then accessing a symbol named "mylib" would.
Apr 24 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028





------- Comment #1 from webmaster villagersonline.com  2008-04-24 15:47 -------
I don't know whether to call this a bug or a language design issue, but I know
the workaround: specify the full name

Use
    a.a
instead of
    a


-- 
Apr 24 2008
prev sibling next sibling parent reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028





------- Comment #2 from wbaxter gmail.com  2008-04-24 17:04 -------
(In reply to comment #1)
 I don't know whether to call this a bug or a language design issue, but I know
 the workaround: specify the full name
 
 Use
     a.a
 instead of
     a
 
I think this can also be avoided by having the module in a package. Then DMD seems not to get confused. I've not totally understood the specifics, it seems modules and other symbols conflict in ways that package names don't. So I think if you put a.d into an 'a' directory, make it's module statement be "module a.a;" then do import a.a; then you won't get the conflict. Can anyone confirm this? Don't have time at the moment... --
Apr 24 2008
parent "Jarrett Billingsley" <kb3ctd2 yahoo.com> writes:
<d-bugmail puremagic.com> wrote in message 
news:fur052$309q$1 digitalmars.com...
 http://d.puremagic.com/issues/show_bug.cgi?id=2028





 ------- Comment #2 from wbaxter gmail.com  2008-04-24 17:04 -------
 (In reply to comment #1)
 I don't know whether to call this a bug or a language design issue, but I 
 know
 the workaround: specify the full name

 Use
     a.a
 instead of
     a
I think this can also be avoided by having the module in a package. Then DMD seems not to get confused. I've not totally understood the specifics, it seems modules and other symbols conflict in ways that package names don't. So I think if you put a.d into an 'a' directory, make it's module statement be "module a.a;" then do import a.a; then you won't get the conflict. Can anyone confirm this? Don't have time at the moment...
That wouldn't work either, since the top-level name is also a. It's that modules and packages have a higher precedence than the symbols within them.
Apr 24 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028





------- Comment #3 from wbaxter gmail.com  2008-04-24 18:23 -------
(In reply to comment #2)
 (In reply to comment #1)
 I don't know whether to call this a bug or a language design issue, but I know
 the workaround: specify the full name
 
 Use
     a.a
 instead of
     a
 
I think this can also be avoided by having the module in a package. Then DMD seems not to get confused. I've not totally understood the specifics, it seems modules and other symbols conflict in ways that package names don't. So I think if you put a.d into an 'a' directory, make it's module statement be "module a.a;" then do import a.a; then you won't get the conflict. Can anyone confirm this? Don't have time at the moment...
Jarrett Billingsley wrote:
That wouldn't work either, since the top-level name is also a.  It's that 
modules and packages have a higher precedence than the symbols within them. Ah, ok. So I guess when I've gotten rid of such problems in the past by putting the offending module in a package, it worked because I named the package something that didn't conflict. But this still does point out the issue with namespace pollution that arises when using top-level, no-package modules. Seems like that should be a general rule of thumb for D programming -- "Effective D": Rule #1: always put your classes in a package. --
Apr 24 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028


Jerry Quinn <jlquinn optonline.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jlquinn optonline.net


--- Comment #4 from Jerry Quinn <jlquinn optonline.net> 2012-01-13 21:38:36 PST
---
Any thoughts?  This bug is almost 4 years old and still present.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 13 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028


Jonathan M Davis <jmdavisProg gmx.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jmdavisProg gmx.com


--- Comment #5 from Jonathan M Davis <jmdavisProg gmx.com> 2012-01-13 22:00:37
PST ---
I'm not sure if this is a bug or not. Given that it would work if a.a weren't a
template, that would tend to indicate that it's a bug, but I don't know. The
problem probably is tied into the fact that a.a doesn't really exist until it's
instantiated.

Regardless, this is one of a long list of bugs which has been sitting around
for a long time without being looked at. The increased community involvement
with dmd has helped substantially in getting bugs fixed, but there are still
plenty of them like this sitting around. There is talk of putting greater focus
on older bugs (e.g. addressing the 10 oldest bugs in bugzill each release)
which may finally ameliorate the problem though.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 13 2012
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2028


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla digitalmars.com
         Resolution|                            |INVALID


--- Comment #6 from Walter Bright <bugzilla digitalmars.com> 2012-01-22
01:35:54 PST ---
The error you get is expected.

The statement:

    import a;

introduces the name 'a' into the current scope, where 'a' is a module name.
Names in the current scope are always searched before names in imported scopes.
Hence, the 'a' module name is found before 'a' the template.

a.a works because module 'a' is found, and then 'a' is looked up in the scope
of module 'a'.

This is how it is designed to work.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 22 2012