Jump to page: 1 2
Thread overview
classes inside functions?!
Apr 30, 2006
Hasan Aljudy
Apr 30, 2006
Sean Kelly
Apr 30, 2006
kellywilson
Apr 30, 2006
Hasan Aljudy
May 01, 2006
Bruno Medeiros
May 01, 2006
Sean Kelly
May 02, 2006
Don Clugston
May 03, 2006
Bruno Medeiros
May 04, 2006
Don Clugston
May 04, 2006
Bruno Medeiros
May 03, 2006
Bruno Medeiros
May 03, 2006
Sean Kelly
April 30, 2006
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
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
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
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
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
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
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
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
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
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
« First   ‹ Prev
1 2