Jump to page: 1 2
Thread overview
enum for beginners
Nov 14, 2011
Johannes Totz
Nov 14, 2011
Timon Gehr
Nov 15, 2011
Johannes Totz
Nov 15, 2011
Johannes Totz
Nov 15, 2011
Johannes Totz
Nov 15, 2011
Johannes Totz
Nov 15, 2011
Mike Wey
Nov 15, 2011
Johannes Totz
Nov 15, 2011
bearophile
Nov 15, 2011
Johannes Totz
November 14, 2011
Hi!

I'm having trouble with named typed enums.
This works (unnamed):

enum : string
{
  a = "a",
  b = "b"
}

int main(string[] argv)
{
  writeln(a);
  return 0;
}


But this does not:

enum X : string
{
  a = "a",  // Error: Integer constant expression expected
            //  instead of "a"
  b = "b"   // Error: Integer constant expression expected
            //  instead of "b"
}

int main(string[] argv)
{
  writeln(X.a);
  return 0;
}


What did I miss?


Johannes
November 14, 2011
On 11/14/2011 11:25 PM, Johannes Totz wrote:
> Hi!
>
> I'm having trouble with named typed enums.
> This works (unnamed):
>
> enum : string
> {
> a = "a",
> b = "b"
> }
>
> int main(string[] argv)
> {
> writeln(a);
> return 0;
> }
>
>
> But this does not:
>
> enum X : string
> {
> a = "a", // Error: Integer constan

t expression expected
> // instead of "a"
> b = "b" // Error: Integer constant expression expected
> // instead of "b"
> }
>
> int main(string[] argv)
> {
> writeln(X.a);
> return 0;
> }
>
>
> What did I miss?
>

I don't know. It works for me.

import std.stdio;

enum X : string{
    a = "a",
    b = "b",
}


int main(string[] argv) {
    writeln(X.a);
    return 0;
}

compiles, runs and prints "a" as expected.

Are you using the latest version of the compiler? (DMD v2.056)
















November 15, 2011
On 14/11/2011 22:32, Timon Gehr wrote:
> On 11/14/2011 11:25 PM, Johannes Totz wrote:
>> Hi!
>>
>> I'm having trouble with named typed enums.
>> This works (unnamed):
>>
>> enum : string
>> {
>> a = "a",
>> b = "b"
>> }
>>
>> int main(string[] argv)
>> {
>> writeln(a);
>> return 0;
>> }
>>
>>
>> But this does not:
>>
>> enum X : string
>> {
>> a = "a", // Error: Integer constan
>
> t expression expected
>> // instead of "a"
>> b = "b" // Error: Integer constant expression expected
>> // instead of "b"
>> }
>>
>> int main(string[] argv)
>> {
>> writeln(X.a);
>> return 0;
>> }
>>
>>
>> What did I miss?
>>
>
> I don't know. It works for me.
>
> import std.stdio;
>
> enum X : string{
> a = "a",
> b = "b",
> }
>
>
> int main(string[] argv) {
> writeln(X.a);
> return 0;
> }
>
> compiles, runs and prints "a" as expected.
>
> Are you using the latest version of the compiler? (DMD v2.056)

I had 2.055 and just upgraded.
But this seems to be some issue with VisualD. Compiling on the command line (with 2.056) works fine as expected.
November 15, 2011
On 15/11/2011 15:43, Johannes Totz wrote:
> On 14/11/2011 22:32, Timon Gehr wrote:
>> On 11/14/2011 11:25 PM, Johannes Totz wrote:
>>> Hi!
>>>
>>> I'm having trouble with named typed enums.
>>> This works (unnamed):
>>>
>>> enum : string
>>> {
>>> a = "a",
>>> b = "b"
>>> }
>>>
>>> int main(string[] argv)
>>> {
>>> writeln(a);
>>> return 0;
>>> }
>>>
>>>
>>> But this does not:
>>>
>>> enum X : string
>>> {
>>> a = "a", // Error: Integer constan
>>
>> t expression expected
>>> // instead of "a"
>>> b = "b" // Error: Integer constant expression expected
>>> // instead of "b"
>>> }
>>>
>>> int main(string[] argv)
>>> {
>>> writeln(X.a);
>>> return 0;
>>> }
>>>
>>>
>>> What did I miss?
>>>
>>
>> I don't know. It works for me.
>>
>> import std.stdio;
>>
>> enum X : string{
>> a = "a",
>> b = "b",
>> }
>>
>>
>> int main(string[] argv) {
>> writeln(X.a);
>> return 0;
>> }
>>
>> compiles, runs and prints "a" as expected.
>>
>> Are you using the latest version of the compiler? (DMD v2.056)
>
> I had 2.055 and just upgraded.
> But this seems to be some issue with VisualD. Compiling on the command
> line (with 2.056) works fine as expected.

Ah, when I compile on the command line with:

dmd -g -debug main.d

main.d(6): Error: enum main.X base type must be of integral type, not char[]
main.d(8): Error: cannot implicitly convert expression ("a") of type char[1u] to int
main.d(9): Error: cannot implicitly convert expression ("b") of type char[1u] to int
November 15, 2011
On Tue, 15 Nov 2011 10:47:22 -0500, Johannes Totz <johannes@jo-t.de> wrote:

> On 15/11/2011 15:43, Johannes Totz wrote:
>> On 14/11/2011 22:32, Timon Gehr wrote:
>>> On 11/14/2011 11:25 PM, Johannes Totz wrote:
>>>> Hi!
>>>>
>>>> I'm having trouble with named typed enums.
>>>> This works (unnamed):
>>>>
>>>> enum : string
>>>> {
>>>> a = "a",
>>>> b = "b"
>>>> }
>>>>
>>>> int main(string[] argv)
>>>> {
>>>> writeln(a);
>>>> return 0;
>>>> }
>>>>
>>>>
>>>> But this does not:
>>>>
>>>> enum X : string
>>>> {
>>>> a = "a", // Error: Integer constan
>>>
>>> t expression expected
>>>> // instead of "a"
>>>> b = "b" // Error: Integer constant expression expected
>>>> // instead of "b"
>>>> }
>>>>
>>>> int main(string[] argv)
>>>> {
>>>> writeln(X.a);
>>>> return 0;
>>>> }
>>>>
>>>>
>>>> What did I miss?
>>>>
>>>
>>> I don't know. It works for me.
>>>
>>> import std.stdio;
>>>
>>> enum X : string{
>>> a = "a",
>>> b = "b",
>>> }
>>>
>>>
>>> int main(string[] argv) {
>>> writeln(X.a);
>>> return 0;
>>> }
>>>
>>> compiles, runs and prints "a" as expected.
>>>
>>> Are you using the latest version of the compiler? (DMD v2.056)
>>
>> I had 2.055 and just upgraded.
>> But this seems to be some issue with VisualD. Compiling on the command
>> line (with 2.056) works fine as expected.
>
> Ah, when I compile on the command line with:
>
> dmd -g -debug main.d
>
> main.d(6): Error: enum main.X base type must be of integral type, not char[]
> main.d(8): Error: cannot implicitly convert expression ("a") of type char[1u] to int
> main.d(9): Error: cannot implicitly convert expression ("b") of type char[1u] to int

dmd must map to a D1 version, where string literals were char[N], not immutable(char)[].  In D1, you could not have enums that were strings.

-Steve
November 15, 2011
On Tue, 15 Nov 2011 10:55:44 -0500, Steven Schveighoffer <schveiguy@yahoo.com> wrote:

> On Tue, 15 Nov 2011 10:47:22 -0500, Johannes Totz <johannes@jo-t.de> wrote:
>> Ah, when I compile on the command line with:
>>
>> dmd -g -debug main.d
>>
>> main.d(6): Error: enum main.X base type must be of integral type, not char[]
>> main.d(8): Error: cannot implicitly convert expression ("a") of type char[1u] to int
>> main.d(9): Error: cannot implicitly convert expression ("b") of type char[1u] to int
>
> dmd must map to a D1 version, where string literals were char[N], not immutable(char)[].  In D1, you could not have enums that were strings.

to check, type dmd without args on the command line, it will tell you the version.

-Steve
November 15, 2011
On 15/11/2011 15:56, Steven Schveighoffer wrote:
> On Tue, 15 Nov 2011 10:55:44 -0500, Steven Schveighoffer
> <schveiguy@yahoo.com> wrote:
>
>> On Tue, 15 Nov 2011 10:47:22 -0500, Johannes Totz <johannes@jo-t.de>
>> wrote:
>>> Ah, when I compile on the command line with:
>>>
>>> dmd -g -debug main.d
>>>
>>> main.d(6): Error: enum main.X base type must be of integral type, not
>>> char[]
>>> main.d(8): Error: cannot implicitly convert expression ("a") of type
>>> char[1u] to int
>>> main.d(9): Error: cannot implicitly convert expression ("b") of type
>>> char[1u] to int
>>
>> dmd must map to a D1 version, where string literals were char[N], not
>> immutable(char)[]. In D1, you could not have enums that were strings.
>
> to check, type dmd without args on the command line, it will tell you
> the version.

There is a 1.071 version somewhere in the path...
C:\Users\...>dmd
DMD32 D Compiler v1.071

But if I do...
C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe -g -debug main.d
main.d(8): Error: Integer constant expression expected instead of "a"
main.d(9): Error: Integer constant expression expected instead of "b"
main.d(8): Error: Integer constant expression expected instead of "a"
main.d(9): Error: Integer constant expression expected instead of "b"

However...
C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe main.d
C:\Users\...>main.exe
a


Getting rid of 1.071...
C:\Users\...>dmd
DMD32 D Compiler v2.056

C:\Users\...>dmd -g -debug main.d
main.d(8): Error: Integer constant expression expected instead of "a"
main.d(9): Error: Integer constant expression expected instead of "b"
main.d(8): Error: Integer constant expression expected instead of "a"
main.d(9): Error: Integer constant expression expected instead of "b"
November 15, 2011
On Tue, 15 Nov 2011 11:15:01 -0500, Johannes Totz <johannes@jo-t.de> wrote:

> On 15/11/2011 15:56, Steven Schveighoffer wrote:
>> On Tue, 15 Nov 2011 10:55:44 -0500, Steven Schveighoffer
>> <schveiguy@yahoo.com> wrote:
>>
>>> On Tue, 15 Nov 2011 10:47:22 -0500, Johannes Totz <johannes@jo-t.de>
>>> wrote:
>>>> Ah, when I compile on the command line with:
>>>>
>>>> dmd -g -debug main.d
>>>>
>>>> main.d(6): Error: enum main.X base type must be of integral type, not
>>>> char[]
>>>> main.d(8): Error: cannot implicitly convert expression ("a") of type
>>>> char[1u] to int
>>>> main.d(9): Error: cannot implicitly convert expression ("b") of type
>>>> char[1u] to int
>>>
>>> dmd must map to a D1 version, where string literals were char[N], not
>>> immutable(char)[]. In D1, you could not have enums that were strings.
>>
>> to check, type dmd without args on the command line, it will tell you
>> the version.
>
> There is a 1.071 version somewhere in the path...
> C:\Users\...>dmd
> DMD32 D Compiler v1.071
>
> But if I do...
> C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe -g -debug main.d
> main.d(8): Error: Integer constant expression expected instead of "a"
> main.d(9): Error: Integer constant expression expected instead of "b"
> main.d(8): Error: Integer constant expression expected instead of "a"
> main.d(9): Error: Integer constant expression expected instead of "b"
>
> However...
> C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe main.d
> C:\Users\...>main.exe
> a
>
>
> Getting rid of 1.071...
> C:\Users\...>dmd
> DMD32 D Compiler v2.056
>
> C:\Users\...>dmd -g -debug main.d
> main.d(8): Error: Integer constant expression expected instead of "a"
> main.d(9): Error: Integer constant expression expected instead of "b"
> main.d(8): Error: Integer constant expression expected instead of "a"
> main.d(9): Error: Integer constant expression expected instead of "b"

Don't have a windows box handy, but this works on Linux:

steves@steve-laptop:~/testd$ cat testenum.d
import std.stdio;

enum X : string {
    a = "a",
    b = "b",
}

void main()
{
    writeln(X.b);
}
steves@steve-laptop:~/testd$ ~/dmd-2.056/linux/bin32/dmd -g -debug testenum.d
steves@steve-laptop:~/testd$ ./testenum
b

Can you post your exact code that doesn't work with dmd 2.056?  This is all I have from your previous post.  I can't see why it wouldn't work.

-Steve
November 15, 2011
On 15/11/2011 16:30, Steven Schveighoffer wrote:
> On Tue, 15 Nov 2011 11:15:01 -0500, Johannes Totz <johannes@jo-t.de> wrote:
>
>> On 15/11/2011 15:56, Steven Schveighoffer wrote:
>>> On Tue, 15 Nov 2011 10:55:44 -0500, Steven Schveighoffer
>>> <schveiguy@yahoo.com> wrote:
>>>
>>>> On Tue, 15 Nov 2011 10:47:22 -0500, Johannes Totz <johannes@jo-t.de>
>>>> wrote:
>>>>> Ah, when I compile on the command line with:
>>>>>
>>>>> dmd -g -debug main.d
>>>>>
>>>>> main.d(6): Error: enum main.X base type must be of integral type, not
>>>>> char[]
>>>>> main.d(8): Error: cannot implicitly convert expression ("a") of type
>>>>> char[1u] to int
>>>>> main.d(9): Error: cannot implicitly convert expression ("b") of type
>>>>> char[1u] to int
>>>>
>>>> dmd must map to a D1 version, where string literals were char[N], not
>>>> immutable(char)[]. In D1, you could not have enums that were strings.
>>>
>>> to check, type dmd without args on the command line, it will tell you
>>> the version.
>>
>> There is a 1.071 version somewhere in the path...
>> C:\Users\...>dmd
>> DMD32 D Compiler v1.071
>>
>> But if I do...
>> C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe -g -debug main.d
>> main.d(8): Error: Integer constant expression expected instead of "a"
>> main.d(9): Error: Integer constant expression expected instead of "b"
>> main.d(8): Error: Integer constant expression expected instead of "a"
>> main.d(9): Error: Integer constant expression expected instead of "b"
>>
>> However...
>> C:\Users\...>C:\D\dmd2\windows\bin\dmd.exe main.d
>> C:\Users\...>main.exe
>> a
>>
>>
>> Getting rid of 1.071...
>> C:\Users\...>dmd
>> DMD32 D Compiler v2.056
>>
>> C:\Users\...>dmd -g -debug main.d
>> main.d(8): Error: Integer constant expression expected instead of "a"
>> main.d(9): Error: Integer constant expression expected instead of "b"
>> main.d(8): Error: Integer constant expression expected instead of "a"
>> main.d(9): Error: Integer constant expression expected instead of "b"
>
> Don't have a windows box handy, but this works on Linux:
>
> steves@steve-laptop:~/testd$ cat testenum.d
> import std.stdio;
>
> enum X : string {
> a = "a",
> b = "b",
> }
>
> void main()
> {
> writeln(X.b);
> }
> steves@steve-laptop:~/testd$ ~/dmd-2.056/linux/bin32/dmd -g -debug
> testenum.d
> steves@steve-laptop:~/testd$ ./testenum
> b
>
> Can you post your exact code that doesn't work with dmd 2.056? This is
> all I have from your previous post. I can't see why it wouldn't work.

-g is what makes it fail, -debug is fine.

----------------------------------------
module main;

import std.stdio;


enum X : string
{
	a = "a",
	b = "b"
}

int main(string[] argv)
{
	writeln(X.a);

	return 0;
}
----------------------------------------

November 15, 2011
On 11/14/2011 11:25 PM, Johannes Totz wrote:
> Hi!
>
> I'm having trouble with named typed enums.
> This works (unnamed):
>
> enum : string
> {
> a = "a",
> b = "b"
> }
>
> int main(string[] argv)
> {
> writeln(a);
> return 0;
> }
>
>
> But this does not:
>
> enum X : string
> {
> a = "a", // Error: Integer constant expression expected
> // instead of "a"
> b = "b" // Error: Integer constant expression expected
> // instead of "b"
> }
>
> int main(string[] argv)
> {
> writeln(X.a);
> return 0;
> }
>
>
> What did I miss?
>
>
> Johannes

It's a bug: string enums don't work with -g compiler switch.

http://d.puremagic.com/issues/show_bug.cgi?id=5168

-- 
Mike Wey
« First   ‹ Prev
1 2