www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - static if (__ctfe)

reply "Yuriy" <yuriy.glukhov gmail.com> writes:
Hello, is there any way to static if(__ctfe)? I want to declare 
class members which are only available in ctfe. Thanx.
May 07 2014
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:
 Hello, is there any way to static if(__ctfe)? I want to declare 
 class members which are only available in ctfe. Thanx.
Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
May 07 2014
parent reply "Yuriy" <yuriy.glukhov gmail.com> writes:
On Wednesday, 7 May 2014 at 09:51:01 UTC, John Colvin wrote:
 On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:
 Hello, is there any way to static if(__ctfe)? I want to 
 declare class members which are only available in ctfe. Thanx.
Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
Well, i'm currently playing with std.variant so it can be ctfe-friendly. And it works pretty much, however i need to use T.stringof.ptr/length instead of typeid (typeid is ctfeable), and i'm not sure if it's good for performance in runtime. So for type comparison i'd like to compare TypeInfos in rt, and T.stringof in ct. Using both with rt if will likely generate more code.
May 07 2014
parent Timon Gehr <timon.gehr gmx.ch> writes:
On 05/07/2014 12:07 PM, Yuriy wrote:
 On Wednesday, 7 May 2014 at 09:51:01 UTC, John Colvin wrote:
 On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:
 Hello, is there any way to static if(__ctfe)? I want to declare class
 members which are only available in ctfe. Thanx.
Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
Well, i'm currently playing with std.variant so it can be ctfe-friendly. And it works pretty much, however i need to use T.stringof.ptr/length instead of typeid (typeid is ctfeable), and i'm not sure if it's good for performance in runtime. So for type comparison i'd like to compare TypeInfos in rt, and T.stringof in ct. Using both with rt if will likely generate more code.
I'd suggest to just look into making typeid's comparable in CTFE. I have grepped around DMD's source code a little bit, but I am not familiar with it. (And I don't want to get involved in DMD development, because the code base is horrid.) If you add in ctfeexpr.c/isCtfeComparable the conjunct 'x->op != TOKsymoff' (which probably is a very blunt way of enabling typeid comparisons and should be done more precisely), then you will notice that comparisons now work but always return 'false' for some types. I have attempted a fix for this for classes as follows in typinf.c: TypeInfoDeclaration *TypeClass::getTypeInfoDeclaration(){ if(!sym->vclassinfo){ if (sym->isInterfaceDeclaration()) return TypeInfoInterfaceDeclaration::create(this); // still buggy! else{ sym->vclassinfo = TypeInfoClassDeclaration::create(this); } } return sym->vclassinfo; } I.e. the problem is that the frontend always creates new TypeInfoDeclarations instead of reusing a single existing one. After this, typeid comparisons appear to work correctly for classes at least. You might look into getting this fixed completely for all types (or at least file a bug containing the above information.)
May 08 2014