www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - is(T == const) for function types

reply "mist" <none none.none> writes:
http://dpaste.dzfl.pl/0cda8d0f

bug or feature?
Dec 25 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 12/25/2012 12:59 PM, mist wrote:
 http://dpaste.dzfl.pl/0cda8d0f

 bug or feature?
For convenience to others, here is your code: struct Test { void delegate() const deleg; } void main() { static assert( is(typeof(Test.deleg) == const) ); } I don't know the answer but this works: struct Test { alias void delegate() Deleg; const Deleg deleg; } void main() { static assert( is(typeof(Test.deleg) == const) ); } Ali
Dec 25 2012
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
Ali Çehreli:

 I don't know the answer but this works:
That difference smells of compiler bug :-) Bye, bearophile
Dec 25 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 12/25/2012 04:13 PM, bearophile wrote:
 Ali Çehreli:

 I don't know the answer but this works:
That difference smells of compiler bug :-) Bye, bearophile
Hmmm. I think the compiler is right. That const that is applied "at the end" in that syntax is I think allowed only for member functions. Otherwise these two work as well: // These work: const(void delegate()) deleg; const void delegate() deleg; // This is a compilation error: void delegate() const deleg; Ali
Dec 25 2012
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
Ali Çehreli:

 Hmmm. I think the compiler is right. That const that is applied 
 "at the end" in that syntax is I think allowed only for member 
 functions. Otherwise these two work as well:
You seem right. The positional syntax of those tags tricks me sometimes still. Bye, bearophile
Dec 25 2012
prev sibling parent "mist" <none none.none> writes:
On Wednesday, 26 December 2012 at 00:47:28 UTC, Ali Çehreli wrote:
 On 12/25/2012 04:13 PM, bearophile wrote:
 Ali Çehreli:

 I don't know the answer but this works:
That difference smells of compiler bug :-) Bye, bearophilee
Hmmm. I think the compiler is right. That const that is applied "at the end" in that syntax is I think allowed only for member functions. Otherwise these two work as well: // These work: const(void delegate()) deleg; const void delegate() deleg; // This is a compilation error: void delegate() const deleg; Ali
Yes, looks like I was not checking http://dlang.org/declaration.html good enough and assumed C-like model where "Type const var" is as legal as "const Type var". There is a surprising revelation provided by Kenji in context of member variable delegates: struct Test { void delegate() const deleg; } void main() { static if (is(typeof(Test.deleg) F == delegate)) { pragma(msg, "Sure, delegate"); static assert( is(F == const) ); } } "Delegate type qualifier cannot test directly. You should extract function type from it, then test const." (c) Kenji Copying it here from github for any possible lucky googlers :)
Dec 26 2012