September 24, 2013 [Issue 11120] New: Compiler calls wrong property when using type tuple of length 1 | ||||
---|---|---|---|---|
| ||||
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@puremagic.com ReportedBy: andrej.mitrovich@gmail.com --- Comment #0 from Andrej Mitrovic <andrej.mitrovich@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: ------- |
Copyright © 1999-2021 by the D Language Foundation