classes inside functions?!

Don Clugston dac at nospam.com.au
Wed May 3 23:23:47 PDT 2006


Bruno Medeiros wrote:
> 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?

Yes, sorry.

> 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. 

Curiously, this isn't the whole story. There's a mangled name (difficult 
to access) which includes the name of the function that the mixin is 
defined in, and it includes the template arguments that were used -- 
it's almost the whole mechanism that you'd expect for templates which 
are local to functions. It's completely undocumented, of course.


(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. 



More information about the Digitalmars-d mailing list