On 2013-08-29 01:28, captaindet wrote:
a recent discussion (
http://forum.dlang.org/thread/kvje4r$1tff$1...@digitalmars.com ) about the
official enum dox ( http://dlang.org/enum.html ) was not conclusive whether

     enum IDENTIFIER;

is officially allowed/supported. jacob pointed out that it has an
important use case in that it can serve as UDA. as UDAs are fairly new,
this cannot be the reason why this syntax was allowed in the first place
though, *if* it is allowed.

No, but now it's a useful use case.

also, it might be used in meta stuff similar
to "#define IDENTIFIER" in C - playing with this idea i run into this
issue...

while much code behaves with such an empty enum declaration,

     writeln( __traits(compiles, IDENTIFIER) );    // true
     writeln( is( IDENTIFIER == enum ) );            // true

typeof() is not happy at all (DMD 2.063.2):

     writeln( typeof(IDENTIFIER).stringof );
     // Error: argument IDENTIFIER to typeof is not an expression

typeof() expects an expression and a bare identifier is a
"PrimaryExpression" ( http://dlang.org/expression.html#PrimaryExpression
) and hence a valid argument.

either the empty enum declaration is not allowed (and should be removed
from the dox and throw a compilation error) or there is a bug in typeof().

No, I previously misread your post.

enum foo;

The above declares a type, with the name "foo".

enum bar = 1;

Declares a manifest constant, short for:

enum int bar = 1;

The type is "int", the name of the constant is "bar".

typeof(bar); // ok, "bar" is not a type
typeof(int); // error, "int" is a type
typeof(foo); // error, "foo" is a type

Although I do think that typeof(type) should work and just return "type".

--
/Jacob Carlborg

Reply via email to