[Issue 12753] All enum members trait, and missing function return values

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri May 16 02:26:04 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=12753

Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |INVALID

--- Comment #1 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to bearophile_hugs from comment #0)
> import std.traits: EnumMembers;
> enum Foo { A, B, C }
> int bar1(immutable Foo x) {
>     foreach (immutable pos, immutable y; EnumMembers!Foo)
>         if (x == y)
>             return pos;
> }
> int bar2(immutable Foo x) {
>     foreach (immutable pos, immutable y; [EnumMembers!Foo])
>         if (x == y)
>             return pos;
> }
> void main() {}
> 
> 
> With dmd 2.066alpha gives errors:
> 
> temp.d(3,5): Error: function temp.bar1 no return exp; or assert(0); at end
> of function
> temp.d(8,5): Error: function temp.bar2 no return exp; or assert(0); at end
> of function
> 
> 
> But I think the D compiler should be able to understand that a foreach on
> the whole range of an enum (found with EnumMembers) covers its all possible
> values, so those two functions always return a value and don't need the
> assert(0) at the end.

It's wrong assumption. By using cast, you can give undefined enum value to bar1
and bar2.

bar1(cast(Foo)99);
bar2(cast(Foo)99);

Therefore, the compiler error is legitimate.

--


More information about the Digitalmars-d-bugs mailing list