classes inside functions?!

Bruno Medeiros brunodomedeirosATgmail at SPAM.com
Wed May 3 12:17:24 PDT 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



More information about the Digitalmars-d mailing list