View mode: basic / threaded / horizontal-split · Log in · Help
December 27, 2012
[Issue 9218] New: [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218

          Summary: [2.061] Correct signature of struct opCmp no longer
                   accepts enum structs
          Product: D
          Version: D2
         Platform: All
       OS/Version: All
           Status: NEW
         Keywords: rejects-valid
         Severity: regression
         Priority: P2
        Component: DMD
       AssignedTo: nobody@puremagic.com
       ReportedBy: siegelords_abode@yahoo.com


--- Comment #0 from siegelords_abode@yahoo.com 2012-12-27 10:00:40 PST ---
This code worked fine in 2.060, errors with 2.061 beta 1:

struct A
{
   enum zero = A(); // Error: A() is not an lvalue

   int opCmp(const ref A a) const
   //int opCmp(A a)
   {
       return 1;
   }
}

void main()
{
   A a;
   auto b = a > A.zero;
   assert(typeid(a).xopCmp !is null);
}

Obviously I could use a different signature for opCmp (e.g. the one I commented
out) but then the assert below will fail, as only the correct signature of
opCmp is accepted. Fixing either this bug or
http://d.puremagic.com/issues/show_bug.cgi?id=8561 would be good enough for me.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 27, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |andrej.mitrovich@gmail.com


--- Comment #1 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2012-12-27 14:57:01 PST ---
Since it's a struct you can also use:

int opCmp()(auto const ref A a) const

Otherwise I don't think this is a rejects-valid, it's a documentation issue.
Struct literals (manifests included) are no longer lvalues in 2.061, this is by
design.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 28, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218



--- Comment #2 from siegelords_abode@yahoo.com 2012-12-27 22:02:13 PST ---
(In reply to comment #1)
> Since it's a struct you can also use:
> 
> int opCmp()(auto const ref A a) const

This fails the assert.

> Otherwise I don't think this is a rejects-valid, it's a documentation issue.
> Struct literals (manifests included) are no longer lvalues in 2.061, this is by
> design.

Then this bug highlights what a bad set of design decisions it was to both make
struct literals not lvalues AND require the proper opCmp signature to function
only for lvalues.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 28, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218


SomeDude <lovelydear@mailmetrash.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |lovelydear@mailmetrash.com


--- Comment #3 from SomeDude <lovelydear@mailmetrash.com> 2012-12-28 04:57:16 PST ---
Tested on DPaste, this code runs successfully with DMD 2.x Git (UDA beta build)
(supposedly updated daily) both in 32 and 64 bits.

http://dpaste.dzfl.pl/fork/54f9a9e5

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218


Walter Bright <bugzilla@digitalmars.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |bugzilla@digitalmars.com


--- Comment #4 from Walter Bright <bugzilla@digitalmars.com> 2012-12-28 16:43:35 PST ---
(In reply to comment #3)
> Tested on DPaste, this code runs successfully with DMD 2.x Git (UDA beta build)
> (supposedly updated daily) both in 32 and 64 bits.
> 
> http://dpaste.dzfl.pl/fork/54f9a9e5

I haven't been able to open that link. In general, I think it's better to just
paste code examples inline here.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218



--- Comment #5 from Walter Bright <bugzilla@digitalmars.com> 2012-12-28 16:51:22 PST ---
Solving the rvalue reference problem, Issue 9238, is the correct way to resolve
this. Unfortunately, I think it would be too disruptive to add such a large
change with potential side effects in at the last minute, so I'd like to defer
this to the next version.

In the meantime, you can workaround by providing an overload:

   int opCmp(const A a) { return 1; }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218


bearophile_hugs@eml.cc changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |bearophile_hugs@eml.cc


--- Comment #6 from bearophile_hugs@eml.cc 2012-12-28 16:52:49 PST ---
(In reply to comment #4)
> I haven't been able to open that link.


The code:

struct A
{
   enum zero = A(); // Error: A() is not an lvalue

   int opCmp(const ref A a) const
   //int opCmp(A a)
   {
       return 1;
   }
}
void main()
{
   A a;
   auto b = a > A.zero;
   assert(typeid(a).xopCmp !is null);
}


test.d(3): Error: A() is not an lvalue

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218



--- Comment #7 from siegelords_abode@yahoo.com 2012-12-29 08:05:49 PST ---
I worked around this for now by adding this overload:

int opCmp(const A a) const
{
   return opCmp(a);
}

This seems to work because the compiler prefers the const ref version to the
const version.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218



--- Comment #8 from SomeDude <lovelydear@mailmetrash.com> 2012-12-29 08:11:17 PST ---
(In reply to comment #4)
> (In reply to comment #3)
> > Tested on DPaste, this code runs successfully with DMD 2.x Git (UDA beta build)
> > (supposedly updated daily) both in 32 and 64 bits.
> > 
> > http://dpaste.dzfl.pl/fork/54f9a9e5
> 
> I haven't been able to open that link. In general, I think it's better to just
> paste code examples inline here.

It's the code of the original problem description.
I copy it in DPaste because it offers a very convenient way to test it with the
three main D compilers in both 32 and 64 bits without having to install these
compilers on one's own computer. DPaste offers the 2.060 compilers as well as
the latest overnight version of the main branch, so it's quite convenient for
quick testing.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 29, 2012
[Issue 9218] [2.061] Correct signature of struct opCmp no longer accepts enum structs
http://d.puremagic.com/issues/show_bug.cgi?id=9218



--- Comment #9 from siegelords_abode@yahoo.com 2012-12-29 09:13:28 PST ---
Ok, that workabout is not quite complete (perhaps this is a different bug
now?). While it solves the code in the original comment, this code doesn't
work:

struct A
{
   enum A zero = {}; // Note the difference here

   int opCmp(const ref A a) const
   {
       return 1;
   }

   int opCmp(const A a) const
   {
       return opCmp(a);
   }
}

void main()
{
   A a;
   auto b = a >= A.zero; //The error is now here! test.d(21): Error: A() is
not an lvalue
   auto c = a > a;
   assert(typeid(a).xopCmp !is null);
   typeid(a).xopCmp(&a, &a);
}

Why would enum A zero = A(); work but enum A zero = {}; not work? Is it safe
(in terms of inadvertent GC usage) to use A() instead of {}?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home