Thread overview | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
April 30, 2006 classes inside functions?! | ||||
---|---|---|---|---|
| ||||
I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies. Oddly enough, you cannot define a template in the same way I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. Walter, is this the correct behaviour? The following compiles ok ## void main() { enum X { A, B, } struct Y { int x; int y; char a; } class R { Y g; X d; } } ##/ but the following doesn't work ## void main() { class R { Y g; X d; } template kill(X) { void kill() { } } } ##/ gives the following error messeges: # found 'template' instead of statement |
April 30, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hasan Aljudy | Hasan Aljudy wrote:
> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies.
> Oddly enough, you cannot define a template in the same way
>
> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not.
>
> Walter, is this the correct behaviour?
It is. Templates are merely a special case as they must have external linkage.
Sean
|
April 30, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Hey guys, My parser (based on 0.149) allows the first example and rejects the second. Thus the grammar that I have seems to confirm what Sean has said, as well. If anyone wants a copy of the pre-release (based on the Elkhound GLR parser generator) then just email me at: wilsonk-at-cpsc-dot-ucalgary-dot-ca Thanks, Kelly Wilson P.S. Ivan (or BCS), if you want an update then please email (I have fixed about 7 or 8 problems from the original...though there are still some minor things to clean up). In article <e321m5$100h$1@digitaldaemon.com>, Sean Kelly says... > >Hasan Aljudy wrote: >> I don't know if this is a bug or what, but for some reason, dmd allows >> you to define classes/structs/unions/enums as statements inside function >> bodies. >> Oddly enough, you cannot define a template in the same way >> >> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. >> >> Walter, is this the correct behaviour? > >It is. Templates are merely a special case as they must have external linkage. > > >Sean |
April 30, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to kellywilson | kellywilson@nowhere.com wrote: > Hey guys, > > My parser (based on 0.149) allows the first example and rejects the second. Thus > the grammar that I have seems to confirm what Sean has said, as well. > > If anyone wants a copy of the pre-release (based on the Elkhound GLR parser > generator) then just email me at: > > wilsonk-at-cpsc-dot-ucalgary-dot-ca I'm sort of working on my own parser ;) btw I study at UofC too!! > > Thanks, > Kelly Wilson > > P.S. Ivan (or BCS), if you want an update then please email (I have fixed about > 7 or 8 problems from the original...though there are still some minor things to > clean up). > > In article <e321m5$100h$1@digitaldaemon.com>, Sean Kelly says... > >>Hasan Aljudy wrote: >> >>>I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies. >>>Oddly enough, you cannot define a template in the same way >>> >>>I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. >>> >>>Walter, is this the correct behaviour? >> >>It is. Templates are merely a special case as they must have external linkage. >> >> >>Sean > > > |
May 01, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Sean Kelly wrote: > Hasan Aljudy wrote: >> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies. >> Oddly enough, you cannot define a template in the same way >> >> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. >> >> Walter, is this the correct behaviour? > > It is. Templates are merely a special case as they must have external linkage. > > > Sean What do you mean by that? What is external linkage? Did you meant an extern(al) storage class? (I just found out now something I unknew, that are two distinct "extern" keywords/concepts in D) And how exactly does that restricts templates not being allowed inside functions? -- Bruno Medeiros - CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D |
May 01, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bruno Medeiros | Bruno Medeiros wrote:
> Sean Kelly wrote:
>> Hasan Aljudy wrote:
>>> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies.
>>> Oddly enough, you cannot define a template in the same way
>>>
>>> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not.
>>>
>>> Walter, is this the correct behaviour?
>>
>> It is. Templates are merely a special case as they must have external linkage.
>
> What do you mean by that? What is external linkage? Did you meant an extern(al) storage class? (I just found out now something I unknew, that are two distinct "extern" keywords/concepts in D)
> And how exactly does that restricts templates not being allowed inside functions?
External linkage means that a symbol is visible from another module. But I mis-spoke. Template parameters must have external linkage. Templates themselves may only be defined at module or class scope. This is a carryover from C++, and I'm not certain whether there's a technical obstacle to function-scope templates or not. There doesn't seem to be, but then I've never implemented template support in a compiler before. Perhaps Walter could explain further.
Sean
|
May 02, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Sean Kelly wrote:
> Bruno Medeiros wrote:
>> Sean Kelly wrote:
>>> Hasan Aljudy wrote:
>>>> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies.
>>>> Oddly enough, you cannot define a template in the same way
>>>>
>>>> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not.
>>>>
>>>> Walter, is this the correct behaviour?
>>>
>>> It is. Templates are merely a special case as they must have external linkage.
>>
>> What do you mean by that? What is external linkage? Did you meant an extern(al) storage class? (I just found out now something I unknew, that are two distinct "extern" keywords/concepts in D)
>> And how exactly does that restricts templates not being allowed inside functions?
>
> External linkage means that a symbol is visible from another module. But I mis-spoke. Template parameters must have external linkage. Templates themselves may only be defined at module or class scope. This is a carryover from C++, and I'm not certain whether there's a technical obstacle to function-scope templates or not. There doesn't seem to be, but then I've never implemented template support in a compiler before. Perhaps Walter could explain further.
There's some weird stuff in there. Mixins can be local, and because of alias template parameters, there's a name mangling for templates which are defined local to functions.
|
May 03, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Don Clugston | Don Clugston wrote: > Sean Kelly wrote: >> Bruno Medeiros wrote: >>> Sean Kelly wrote: >>>> Hasan Aljudy wrote: >>>>> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies. >>>>> Oddly enough, you cannot define a template in the same way >>>>> >>>>> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. >>>>> >>>>> Walter, is this the correct behaviour? >>>> >>>> It is. Templates are merely a special case as they must have external linkage. >>> >>> What do you mean by that? What is external linkage? Did you meant an extern(al) storage class? (I just found out now something I unknew, that are two distinct "extern" keywords/concepts in D) >>> And how exactly does that restricts templates not being allowed inside functions? >> >> External linkage means that a symbol is visible from another module. But I mis-spoke. Template parameters must have external linkage. Templates themselves may only be defined at module or class scope. This is a carryover from C++, and I'm not certain whether there's a technical obstacle to function-scope templates or not. There doesn't seem to be, but then I've never implemented template support in a compiler before. Perhaps Walter could explain further. > > There's some weird stuff in there. Mixins can be local, and because of alias template parameters, there's a name mangling for templates which are defined local to functions. There are no templates *defined* local to functions. Did you mean mixin instantiations? I think (normal) template instances are quite different from mixin instances in that regard. Mixin instances have copy-paste behaviour and are each unique, and the mixin name part has no name-magling at all in the case of an anonymous mixin, or has the name which is defined in the named mixin. (Normal) template instances have name-mangling dependent on the template arguments, because that is what _identifies_ the template instance. There is no such parallel with mixins, as they are unique. I can't test any of these suppositions yet, as I can't check the .obj's symbols or ASM (I'm planning to get the EUP soon), but I'm fairly sure it's something more or less like this. -- Bruno Medeiros - CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D |
May 03, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Sean Kelly wrote: > Bruno Medeiros wrote: >> Sean Kelly wrote: >>> Hasan Aljudy wrote: >>>> I don't know if this is a bug or what, but for some reason, dmd allows you to define classes/structs/unions/enums as statements inside function bodies. >>>> Oddly enough, you cannot define a template in the same way >>>> >>>> I didn't find in the docs any mention of whether aggregates are allowed inside function bodies or not. >>>> >>>> Walter, is this the correct behaviour? >>> >>> It is. Templates are merely a special case as they must have external linkage. >> >> What do you mean by that? What is external linkage? Did you meant an extern(al) storage class? (I just found out now something I unknew, that are two distinct "extern" keywords/concepts in D) >> And how exactly does that restricts templates not being allowed inside functions? > > External linkage means that a symbol is visible from another module. But I mis-spoke. Template parameters must have external linkage. Templates themselves may only be defined at module or class scope. This is a carryover from C++, and I'm not certain whether there's a technical obstacle to function-scope templates or not. There doesn't seem to be, but then I've never implemented template support in a compiler before. Perhaps Walter could explain further. > > > Sean I see. Hum, can a local variable (local to a function) be external? -- Bruno Medeiros - CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D |
May 03, 2006 Re: classes inside functions?! | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bruno Medeiros | Bruno Medeiros wrote:
>
> I see. Hum, can a local variable (local to a function) be external?
Sort of. A static local variable has external linkage in D (and I think in C++ as well, though the meaning of 'static' is a bit different there). Here's an example:
import std.c.stdio;
template templ( alias A )
{
void templ()
{
printf( "%i\n", A );
}
}
int i = 5;
void main()
{
templ!(i);
int j = 6;
templ!(j);
}
Change the "int j = 6" to "static int j = 6" and everything compiles.
Sean
|
Copyright © 1999-2021 by the D Language Foundation