Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
August 08, 2012 Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
You currently can't use Tuples with std.container.Array (Bug #8284) To fix this, I tried to overload the opEquals(R)(R rhs) of Tuple with a const version opEquals(R)(R rhs) const. But the compiler does not use the overload if opEquals is called on a const tuple instance. See this thread in d.learn http://forum.dlang.org/thread/vghlctzlpqxhoeojqqxt@forum.dlang.org The orignal bug is solved, if you mark the current opEquals const, but I don't know if this would brake code outside of phobos, so I tried the overload. Coming to the question: Is it a bug that the const overload is not considered and what is the correct way to fix std.typecons.Tuple? |
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tobias Pankrath | In the declaration of std.typecons.Tuple:
bool opEquals(R)(R rhs) if (isTuple!R)
{
// [snip]
}
bool opEquals(R)(R rhs) const if (isTuple!R)
{
// same as non-const version
}
Adding const version works correctly.
What's the problem?
Kenji Hara
2012/8/8 Tobias Pankrath <tobias@pankrath.net>:
> You currently can't use Tuples with std.container.Array (Bug #8284)
>
> To fix this, I tried to overload the opEquals(R)(R rhs) of Tuple with
> a const version opEquals(R)(R rhs) const. But the compiler does not use the
> overload if opEquals is called on a const tuple instance.
>
> See this thread in d.learn http://forum.dlang.org/thread/vghlctzlpqxhoeojqqxt@forum.dlang.org
>
> The orignal bug is solved, if you mark the current opEquals const, but I don't know if this would brake code outside of phobos, so I tried the overload.
>
> Coming to the question: Is it a bug that the const overload is not considered and what is the correct way to fix std.typecons.Tuple?
>
>
>
|
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
I found a dmd bug. Is this the bug which you have seen? http://d.puremagic.com/issues/show_bug.cgi?id=8522 Kenji Hara 2012/8/9 kenji hara <k.hara.pg@gmail.com>: > In the declaration of std.typecons.Tuple: > > bool opEquals(R)(R rhs) if (isTuple!R) > { > // [snip] > } > > bool opEquals(R)(R rhs) const if (isTuple!R) > { > // same as non-const version > } > > Adding const version works correctly. > What's the problem? > > Kenji Hara > > 2012/8/8 Tobias Pankrath <tobias@pankrath.net>: >> You currently can't use Tuples with std.container.Array (Bug #8284) >> >> To fix this, I tried to overload the opEquals(R)(R rhs) of Tuple with >> a const version opEquals(R)(R rhs) const. But the compiler does not use the >> overload if opEquals is called on a const tuple instance. >> >> See this thread in d.learn http://forum.dlang.org/thread/vghlctzlpqxhoeojqqxt@forum.dlang.org >> >> The orignal bug is solved, if you mark the current opEquals const, but I don't know if this would brake code outside of phobos, so I tried the overload. >> >> Coming to the question: Is it a bug that the const overload is not considered and what is the correct way to fix std.typecons.Tuple? >> >> >> |
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kenji hara | On Wednesday, 8 August 2012 at 15:01:23 UTC, kenji hara wrote: > In the declaration of std.typecons.Tuple: > > bool opEquals(R)(R rhs) if (isTuple!R) > { > // [snip] > } > > bool opEquals(R)(R rhs) const if (isTuple!R) > { > // same as non-const version > } > > Adding const version works correctly. > What's the problem? > > Kenji Hara > That's exactly what I've tried first. Using a git clone from yesterday and within phobos directory, using > make -f posix.mak everything works. Now I'm adding the const version of opEquals and I get: http://pastebin.com/akRdFfAJ But it's similar with the reduced example from the thread in d.learn. Does that work for you? I'm using dmd cef1bbfdcd9282934ff6f1b07617254753334799 and phobos 90eb9313030340dc274d2fd82144a7f30d0e4ae5 |
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kenji hara | On Wednesday, 8 August 2012 at 15:25:04 UTC, kenji hara wrote:
> I found a dmd bug. Is this the bug which you have seen?
> http://d.puremagic.com/issues/show_bug.cgi?id=8522
>
Using postfix const.
|
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tobias Pankrath | 2012/8/9 Tobias Pankrath <tobias@pankrath.net>: > On Wednesday, 8 August 2012 at 15:01:23 UTC, kenji hara wrote: >> >> In the declaration of std.typecons.Tuple: >> >> bool opEquals(R)(R rhs) if (isTuple!R) >> { >> // [snip] >> } >> >> bool opEquals(R)(R rhs) const if (isTuple!R) >> { >> // same as non-const version >> } >> >> Adding const version works correctly. >> What's the problem? >> >> Kenji Hara >> > That's exactly what I've tried first. Using a git clone from yesterday and within phobos directory, using > >> make -f posix.mak > > > everything works. Now I'm adding the const version of opEquals and I get: http://pastebin.com/akRdFfAJ > > But it's similar with the reduced example from the thread in d.learn. Does that work for you? I've tried following code now, and it is exactly the bug 8522. struct Point { bool opEquals(R)(R rhs) { return true; } bool opEquals(R)(R rhs) const { return true; } } void main() { Point mp; const Point cp; assert(mp == mp); assert(mp == cp); assert(cp == mp); assert(cp == cp); } This code doesn't work with current git head of dmd, but works with my patch. https://github.com/D-Programming-Language/dmd/pull/1075 Kenji Hara |
August 08, 2012 Re: Can not overload template method function with const. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kenji hara | On Wednesday, 8 August 2012 at 15:54:43 UTC, kenji hara wrote:
> I've tried following code now, and it is exactly the bug 8522.
>
> struct Point
> {
> bool opEquals(R)(R rhs) { return true; }
> bool opEquals(R)(R rhs) const { return true; }
> }
> void main()
> {
> Point mp;
> const Point cp;
> assert(mp == mp);
> assert(mp == cp);
> assert(cp == mp);
> assert(cp == cp);
> }
>
> This code doesn't work with current git head of dmd, but works with my patch.
> https://github.com/D-Programming-Language/dmd/pull/1075
>
Thank you. Your patch works for me as well.
|
Copyright © 1999-2021 by the D Language Foundation