| Thread overview | ||||||||
|---|---|---|---|---|---|---|---|---|
|
December 25, 2012 is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
http://dpaste.dzfl.pl/0cda8d0f bug or feature? | ||||
December 25, 2012 Re: is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to mist | 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
| |||
December 26, 2012 Re: is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali Çehreli:
> I don't know the answer but this works:
That difference smells of compiler bug :-)
Bye,
bearophile
| |||
December 26, 2012 Re: is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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
| |||
December 26, 2012 Re: is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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
| |||
December 26, 2012 Re: is(T == const) for function types | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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 :) | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply