[Issue 11120] New: Compiler calls wrong property when using type tuple of length 1
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Sep 24 16:04:31 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11120
Summary: Compiler calls wrong property when using type tuple of
length 1
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: andrej.mitrovich at gmail.com
--- Comment #0 from Andrej Mitrovic <andrej.mitrovich at gmail.com> 2013-09-24 16:04:30 PDT ---
-----
module test;
int glob;
struct K
{
@property void max(int) { }
@disable @property ref int max() { return glob; }
alias setMax = _chainerFunc!max;
template _chainerFunc(alias symbol)
{
import std.traits;
alias Params = ParameterTypeTuple!symbol;
auto ref _chainerFunc(Params[0] args) // ok
{
symbol = args;
return this;
}
}
}
struct F
{
@property void max(int) { }
@disable @property ref int max() { return glob; }
alias setMax = _chainerFunc!max;
template _chainerFunc(alias symbol)
{
import std.traits;
alias Params = ParameterTypeTuple!symbol;
auto ref _chainerFunc(Params args) // fail
{
symbol = args; // Error: attempts to call getter
return this;
}
}
}
void main()
{
K k;
k.max = 2;
k.setMax(1).setMax(2); // chaining example
F f;
f.max = 2;
f.setMax(1).setMax(2); // ditto
}
-----
$ dmd test.d
fail.d(39): Error: function test.F.max is not callable because it is annotated
with @disable
fail.d(39): Error: cannot implicitly convert expression (tuple(_param_0)) of
type (int) to int
The code in "main()" is not needed but demonstrates the usage. Note how the
compiler wants to call the wrong @property function (the getter instead of the
setter).
The above hurts generic code having to use Params[0] when the length is already
known to equal 1.
-- Please note: The bug goes away if there is no getter property, but only a
@property setter is available. Observe:
-----
module test;
struct K
{
@property void max(int) { }
// commented out
// @property int max() { return 1; }
alias setMax = _chainerFunc!max;
template _chainerFunc(alias symbol)
{
import std.traits;
alias Params = ParameterTypeTuple!symbol;
// ok, now works without Params[0]
auto ref _chainerFunc(Params args)
{
symbol = args;
return this;
}
}
}
void main()
{
K k;
k.max = 2;
k.setMax(1).setMax(2); // chaining example
}
-----
So I think this is a bug, and not an enhancement.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list