Checking for manifest constants

Petar Petar
Fri Mar 5 14:42:07 UTC 2021


On Friday, 5 March 2021 at 08:23:09 UTC, Bogdan wrote:
> I was using a trick with dmd to check for manifest constants 
> which worked until dmd v2.094. Yesterday I tried it on the 
> latest compiler and it failed with:
>
>
> source/introspection/manifestConstant.d(37,28): Error: need 
> this for name of type string
> source/introspection/type.d(156,13): Error: value of this is 
> not known at compile time
>
> any ideas how to fix it? or, is it a bug with dmd?
>
> ```
>
> /// Check if a member is manifest constant
> bool isManifestConstant(T, string name)() {
>   mixin(`return is(typeof(T.init.` ~ name ~ `)) && 
> !is(typeof(&T.init.` ~ name ~ `));`);
> }
>
> /// ditto
> bool isManifestConstant(alias T)() {
>   return is(typeof(T)) && !is(typeof(&T));
> }
>
> enum globalConfig = 32;
> int globalValue = 22;
>
> unittest {
>   struct Test {
>     enum config = 3;
>     int value = 2;
>   }
>
>   static assert(isManifestConstant!(Test.config));
>   static assert(isManifestConstant!(Test, "config"));
>   static assert(isManifestConstant!(globalConfig));
>
>   static assert(!isManifestConstant!(Test.value));
>   static assert(!isManifestConstant!(Test, "value"));
>   static assert(!isManifestConstant!(globalValue));
> }
>
> void main() {}
>
>
> ```

I suggest this:

     enum globalConfig = 32;
     int globalValue = 22;
     immutable globaImmutablelValue = 22;

     enum isManifestConstant(alias symbol) =
       __traits(compiles, { enum e = symbol; }) &&
       !__traits(compiles, { const ptr = &symbol; });

     unittest {
       struct Test {
         enum config = 3;
         int value = 2;
       }

       static assert(isManifestConstant!(Test.config));
       static assert(isManifestConstant!(mixin("Test.config")));

       static assert(isManifestConstant!(globalConfig));
       static assert(isManifestConstant!(mixin("globalConfig")));

       static assert(!isManifestConstant!(Test.value));
       static assert(!isManifestConstant!(mixin("Test.value")));

       static assert(!isManifestConstant!(globalValue));
       static assert(!isManifestConstant!(mixin("globalValue")));

       static assert(!isManifestConstant!(globaImmutablelValue));
       static 
assert(!isManifestConstant!(mixin("globaImmutablelValue")));
     }


More information about the Digitalmars-d-learn mailing list