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