[Issue 14246] RAII - proper destruction of partially constructed objects/structs

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=14246

--- Comment #8 from github-bugzi...@puremagic.com ---
Commits pushed to master at https://github.com/dlang/dmd

https://github.com/dlang/dmd/commit/1e755c648e5142719d50dcf984f10ace5b8f8357
fix Issue 14246 - RAII - proper destruction of partially constructed
objects/structs

https://github.com/dlang/dmd/commit/6b3d406be3670613d862ec6eda1bf3669443a926
Merge pull request #6816 from WalterBright/fix14246

fix Issue 14246 - RAII - proper destruction of partially constructed …
merged-on-behalf-of: Andrei Alexandrescu 

--


[Issue 17489] ICE in ddmd/argtypes.d

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17489

--- Comment #2 from greensunn...@gmail.com ---
It seems that argtypemerge has troubles when confronted with an error:

/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1046,60):
Error: parameter index must be in range 0..3 not 3LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
Error: template instance std.traits.ParameterStorageClassTuple!(void
function(FreeListRef!(shared(int), true), int delegate(int, int) pure nothrow
@nogc @safe, int, int) nothrow @nogc @system).StorageClass!3LU error
instantiating
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
   instantiated from here: StorageClass!2LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
   instantiated from here: StorageClass!1LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1052,44):
   instantiated from here: StorageClass!0LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/typecons.d(4273,22):
   ... (4 instantiations, -v to show) ...
source/vibe/core/concurrency.d(1146,34):instantiated from here:
toDelegate!(void function(FreeListRef!(shared(int), true), int delegate(int,
int) pure nothrow @nogc @safe, int, int) nothrow @nogc @system)
source/vibe/core/concurrency.d(1187,15):instantiated from here:
async!(int delegate(int, int) pure nothrow @nogc @safe, int, int)
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/functional.d(1224,13):
Error: CTFE failed because of previous errors in generateFunction
argtypemerge(, _error_, 0)
argtypemerge(_error_, void*, 0)
core.exception.AssertError@ddmd/argtypes.d(201): Assertion failure

--


[Issue 17489] ICE in ddmd/argtypes.d

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17489

--- Comment #1 from greensunn...@gmail.com ---
It seems that argtypemerge has troubles when confronted with an error:

/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1046,60):
Error: parameter index must be in range 0..3 not 3LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
Error: template instance std.traits.ParameterStorageClassTuple!(void
function(FreeListRef!(shared(int), true), int delegate(int, int) pure nothrow
@nogc @safe, int, int) nothrow @nogc @system).StorageClass!3LU error
instantiating
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
   instantiated from here: StorageClass!2LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1047,25):
   instantiated from here: StorageClass!1LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/traits.d(1052,44):
   instantiated from here: StorageClass!0LU
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/typecons.d(4273,22):
   ... (4 instantiations, -v to show) ...
source/vibe/core/concurrency.d(1146,34):instantiated from here:
toDelegate!(void function(FreeListRef!(shared(int), true), int delegate(int,
int) pure nothrow @nogc @safe, int, int) nothrow @nogc @system)
source/vibe/core/concurrency.d(1187,15):instantiated from here:
async!(int delegate(int, int) pure nothrow @nogc @safe, int, int)
/home/seb/dlang/dmd/generated/linux/debug/64/../../../../../phobos/std/functional.d(1224,13):
Error: CTFE failed because of previous errors in generateFunction
argtypemerge(, _error_, 0)
argtypemerge(_error_, void*, 0)
core.exception.AssertError@ddmd/argtypes.d(201): Assertion failure

--


[Issue 17489] New: ICE in ddmd/argtypes.d

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17489

  Issue ID: 17489
   Summary: ICE in ddmd/argtypes.d
   Product: D
   Version: D2
  Hardware: x86_64
OS: Linux
Status: NEW
  Severity: major
  Priority: P1
 Component: dmd
  Assignee: nob...@puremagic.com
  Reporter: greensunn...@gmail.com

0.7.31-rc.2 triggers an ICE in dmd when compiled as follows (i.e. as on
Jenkins)

> dub test --combined --compiler=$HOME/dlang/dmd/generated/linux/debug/64/dmd 
> --config=libevent

/home/seb/dlang/dmd/generated/linux/debug/64/dmd -c
-of.dub/build/vibe-d-test-libevent-unittest-linux.posix-x86_64-dmd_2075-719818DEDFB0B36C9A066E0B0EEC8BB5/vibe-d-test-libevent.o
-debug -g -unittest -w -version=VibeCustomMain -version=VibeLibeventDriver
-version=Have_vibe_d -version=Have_libevent -version=Have_openssl
-version=Have_vibe_d_utils -version=Have_vibe_d_data -version=Have_vibe_d_core
-version=Have_diet_ng -version=Have_vibe_d_http -version=Have_vibe_d_diet
-version=Have_vibe_d_mail -version=Have_vibe_d_mongodb
-version=Have_vibe_d_redis -version=Have_vibe_d_web -Isource/
-I../../../.dub/packages/libevent-2.0.2_2.0.16/libevent
-I../../../.dub/packages/openssl-1.1.5_1.0.1g/openssl
-I../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/
../../../../../tmp/dub_test_root-fe45c364-3805-45d7-ab7a-3f1bd8a878b7.d
source/vibe/d.d source/vibe/vibe.d source/vibe/core/args.d
source/vibe/core/concurrency.d source/vibe/core/connectionpool.d
source/vibe/core/core.d source/vibe/core/driver.d
source/vibe/core/drivers/libasync.d source/vibe/core/drivers/libevent2.d
source/vibe/core/drivers/libevent2_tcp.d source/vibe/core/drivers/native.d
source/vibe/core/drivers/threadedfile.d source/vibe/core/drivers/timerqueue.d
source/vibe/core/drivers/utils.d source/vibe/core/drivers/win32.d
source/vibe/core/drivers/winrt.d source/vibe/core/file.d source/vibe/core/log.d
source/vibe/core/net.d source/vibe/core/stream.d source/vibe/core/sync.d
source/vibe/core/task.d source/vibe/crypto/cryptorand.d
source/vibe/crypto/passwordhash.d source/vibe/inet/message.d
source/vibe/inet/mimetypes.d source/vibe/inet/path.d source/vibe/inet/url.d
source/vibe/inet/urltransfer.d source/vibe/inet/webform.d
source/vibe/stream/base64.d source/vibe/stream/botan.d
source/vibe/stream/counting.d source/vibe/stream/memory.d
source/vibe/stream/multicast.d source/vibe/stream/openssl.d
source/vibe/stream/operations.d source/vibe/stream/stdio.d
source/vibe/stream/taskpipe.d source/vibe/stream/tls.d
source/vibe/stream/wrapper.d source/vibe/stream/zlib.d
source/vibe/textfilter/html.d source/vibe/textfilter/markdown.d
source/vibe/textfilter/urlencode.d source/vibe/data/bson.d
source/vibe/data/json.d source/vibe/data/serialization.d
source/vibe/internal/meta/all.d source/vibe/internal/meta/codegen.d
source/vibe/internal/meta/funcattr.d source/vibe/internal/meta/traits.d
source/vibe/internal/meta/typetuple.d source/vibe/internal/meta/uda.d
source/vibe/internal/rangeutil.d source/vibe/internal/win32.d
source/vibe/utils/array.d source/vibe/utils/dictionarylist.d
source/vibe/utils/hashmap.d source/vibe/utils/memory.d
source/vibe/utils/string.d source/vibe/utils/validation.d
source/vibe/templ/diet.d source/vibe/templ/parsertools.d
source/vibe/templ/utils.d source/vibe/http/auth/basic_auth.d
source/vibe/http/auth/digest_auth.d source/vibe/http/client.d
source/vibe/http/common.d source/vibe/http/dist.d source/vibe/http/fileserver.d
source/vibe/http/form.d source/vibe/http/log.d source/vibe/http/proxy.d
source/vibe/http/router.d source/vibe/http/server.d source/vibe/http/session.d
source/vibe/http/status.d source/vibe/http/websockets.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/defs.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/dom.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/html.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/input.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/internal/html.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/internal/string.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/parser.d
../../../.dub/packages/diet-ng-1.2.1/diet-ng/source/diet/traits.d
source/vibe/mail/smtp.d source/vibe/db/mongo/client.d
source/vibe/db/mongo/collection.d source/vibe/db/mongo/connection.d
source/vibe/db/mongo/cursor.d source/vibe/db/mongo/database.d
source/vibe/db/mongo/flags.d source/vibe/db/mongo/mongo.d
source/vibe/db/mongo/settings.d source/vibe/db/redis/idioms.d
source/vibe/db/redis/redis.d source/vibe/db/redis/sessionstore.d
source/vibe/db/redis/types.d source/vibe/web/auth.d source/vibe/web/common.d
source/vibe/web/i18n.d source/vibe/web/internal/rest/common.d
source/vibe/web/internal/rest/jsclient.d source/vibe/web/rest.d
source/vibe/web/validation.d source/vibe/web/web.d source/vibe/appmain.d
-vcolumns
source/vibe/http/server.d(286,33): Deprecation: alias
diet.traits.FilterCallback is deprecated 

[Issue 16108] `to!string` fails on struct with disabled postblit

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=16108

--- Comment #6 from github-bugzi...@puremagic.com ---
Commits pushed to master at https://github.com/dlang/phobos

https://github.com/dlang/phobos/commit/3d80936f0b1e56418d6826180a7a9dbb29e01b7f
Fix Issue 16108: tostrings fails on struct with disabled postblit

https://github.com/dlang/phobos/commit/4f2d89bc5721a2fbc75ca167b304c70fa8e81ba3
Merge pull request #5425 from JackStouffer/issue16108

Fix Issue 16108: to!string fails on struct with disabled postblit
merged-on-behalf-of: Sebastian Wilzbach 

--


[Issue 17488] Platform-inconsistent behavior from getTempDir()

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17488

Vladimir Panteleev  changed:

   What|Removed |Added

 CC||thecybersha...@gmail.com

--- Comment #1 from Vladimir Panteleev  ---
(In reply to dlang from comment #0)
> I can do the PR if I know the desired behaviour (add the slash to POSIX or
> remove it from Windows).

Definitely add it - double slashes will behave the same as a single slash, so
adding a slash where existing code also added one will not result in change of
behavior. Doing it the other way around is likely to break programs on Windows.

--


[Issue 17399] [REG2.071] core.checkedint.addu cannot inline function

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17399

Martin Krejcirik  changed:

   What|Removed |Added

Summary|core.checkedint.addu cannot |[REG2.071]
   |inline function |core.checkedint.addu cannot
   ||inline function

--


[Issue 16538] Parameter head-const-ness shouldn't matter but does

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=16538

--- Comment #2 from Walter Bright  ---
Fixed by https://github.com/dlang/dmd/pull/6731

--


[Issue 16600] Wrong error message for ambiguous mutable/immutable constructor

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=16600

Walter Bright  changed:

   What|Removed |Added

 Status|REOPENED|RESOLVED
 Resolution|--- |FIXED

--- Comment #3 from Walter Bright  ---
Fixed by https://github.com/dlang/dmd/pull/6731

--


[Issue 16303] covariant delegates should implicitly convert

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=16303

Walter Bright  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #3 from Walter Bright  ---
Fixed by https://github.com/dlang/dmd/pull/6731

--


[Issue 17407] [REG2.067] __traits(compiles) triggers assertion failure

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17407

Martin Krejcirik  changed:

   What|Removed |Added

Summary|[REG] __traits(compiles)|[REG2.067]
   |triggers assertion failure  |__traits(compiles) triggers
   ||assertion failure

--


[Issue 17354] An overload in a final class can silently hide base methods

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17354

b2.t...@gmx.com changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--


[Issue 17349] Covariant overrides should be allowed

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17349

github-bugzi...@puremagic.com changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--


[Issue 17349] Covariant overrides should be allowed

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17349

--- Comment #2 from github-bugzi...@puremagic.com ---
Commits pushed to master at https://github.com/dlang/dmd

https://github.com/dlang/dmd/commit/832031adddadc3b9b8a3bca94bd30be1393b570a
fix Issue 17349 - Covariant overrides should be allowed

https://github.com/dlang/dmd/commit/e07c3de8d93dee095edfeb0322f408726dcfd5a0
Merge pull request #6731 from WalterBright/fix17349

fix Issue 17349 - Covariant overrides should be allowed
merged-on-behalf-of: Andrei Alexandrescu 

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

Nemanja Boric <4bur...@gmail.com> changed:

   What|Removed |Added

 CC||4bur...@gmail.com

--- Comment #7 from Nemanja Boric <4bur...@gmail.com> ---
Not if you compile with `-w`:

```
C:\Users\Burgos>type test.d
void main()
{
int x;;
}

C:\Users\Burgos>dmd -w test.d
test.d(3): Warning: use '{ }' for an empty statement, not a ';'

```

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

Stefan Koch  changed:

   What|Removed |Added

 CC||uplink.co...@gmail.com

--- Comment #6 from Stefan Koch  ---
(In reply to Andrei Alexandrescu from comment #5)

> The warning has been in there for years. The basic idea is to convert
> warnings to errors.

I just tried :

int i;;

It compiles just fine without a warning.

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

--- Comment #5 from Andrei Alexandrescu  ---
(In reply to uplink.coder from comment #4)
> (In reply to Andrei Alexandrescu from comment #3)
> > No need for a DIP, we should just convert this to an error.
> 
> If we do this, then we have to special case for(;;).

We're in good shape, the semicolons in for are part of the grammar.

> Also it might break an unknown amount of code.
> At the very least we should have a cost/benefit analysis.

The warning has been in there for years. The basic idea is to convert warnings
to errors.

--


[Issue 17488] New: Platform-inconsistent behavior from getTempDir()

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17488

  Issue ID: 17488
   Summary: Platform-inconsistent behavior from getTempDir()
   Product: D
   Version: D2
  Hardware: All
OS: All
Status: NEW
  Severity: enhancement
  Priority: P1
 Component: phobos
  Assignee: nob...@puremagic.com
  Reporter: dl...@ryanjframe.com

On Windows, std.file's getTempDir() ends with a path separator, but on POSIX it
does not.

Consistent behaviour would allow cross-platform code to e.g., (if we add the
slash to POSIX) simply do "getTempDir() ~ myname.tmp", rather than require
checking for the platform.

I can do the PR if I know the desired behaviour (add the slash to POSIX or
remove it from Windows).

--


[Issue 17474] non-property being treated as a property

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17474

--- Comment #9 from Vladimir Panteleev  ---
(In reply to Eyal from comment #8)
> I don't see how a=b invoking a(b) when a isn't a @property is justifiable.

Yep, that `writeln = "Hello, world!";` works is an infamous weirdness about D
properties.

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

uplink.co...@googlemail.com changed:

   What|Removed |Added

 CC||uplink.co...@googlemail.com

--- Comment #4 from uplink.co...@googlemail.com ---
(In reply to Andrei Alexandrescu from comment #3)
> No need for a DIP, we should just convert this to an error.

If we do this, then we have to special case for(;;).
Also it might break an unknown amount of code.
At the very least we should have a cost/benefit analysis.

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

--- Comment #3 from Andrei Alexandrescu  ---
No need for a DIP, we should just convert this to an error.

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

dl...@ryanjframe.com changed:

   What|Removed |Added

 CC||dl...@ryanjframe.com

--- Comment #2 from dl...@ryanjframe.com ---
I had thought this was an error, but it's just a warning.

--


[Issue 17485] bringToFront and/or upperBound slow

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17485

--- Comment #3 from Steven Schveighoffer  ---
Indeed, memmove fixes the specific use case:

https://forums.dlang.org/post/ohgjec$1aar$1...@digitalmars.com

However, I think we should do a full examination of everything C++ does to
optimize rotate and include it all at once, instead of waiting for people to
find more cases where std::rotate outperforms D.

--


[Issue 17384] LDC x64 linker error in VS2017

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17384

--- Comment #3 from ki...@gmx.net ---
> Visual D doesn't use LDC's automatic detection because it doesn't allow
> using different versions of VS.

It is possible - via env variable `LDC_VSDIR`. For LDC 1.0.0 compatibility,
it'd have to end with a backslash, e.g., `LDC_VSDIR=C:\Program Files
(x86)\Microsoft Visual Studio 12.0\`.

--


[Issue 4559] Disallowing single semicolons

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4559

Infiltrator  changed:

   What|Removed |Added

 CC||and...@erdani.com,
   ||lt.infiltra...@gmail.com

--- Comment #1 from Infiltrator  ---
Does this need a DIP?

--


[Issue 4558] To spot a possible bug in code that doesn't change a value

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=4558

Infiltrator  changed:

   What|Removed |Added

 CC||lt.infiltra...@gmail.com

--- Comment #1 from Infiltrator  ---
So, if I understand correctly, you want the compiler to statically calculate
results where all the inputs are known at compile-time and detect when no
change has occurred in a "&=" (and presumably in other operator-assignment
operators?)  

In such cases, should the compiler raise a warning or an error?

This all fits in nicely with CTFE.

--


[Issue 17486] lazy parameters can be used to hijack the pure system

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17486

--- Comment #4 from Eyal  ---
The solution, clearly is to treat "lazy" is mere syntactic sugar to passing
delegates - thus adding syntactic support for @nogc/etc attribute annotation on
"lazy" parameters - and specifying their attributes just like is done for
delegates.

The assumption that lazy parameters are all pure is wrong (thus this ticket).
The assumption that lazy parameters are all gc/throw is wrong (thus the other
ticket).

It *cannot* be inferred unless lazy parameters make everything a template,
which would be unfortunate. Just like delegate parameter attributes cannot be
inferred  - you have to manually specify them or templatize over the delegate
type.

--


[Issue 17474] non-property being treated as a property

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17474

--- Comment #8 from Eyal  ---
Requiring @property on a for a=b to invoke a(b) sounds much more reasonable
than the opposite.

I don't see how a=b invoking a(b) when a isn't a @property is justifiable.

--


[Issue 17474] non-property being treated as a property

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17474

--- Comment #6 from Tomer Filiba (weka)  ---
(In reply to Walter Bright from comment #4)
> But I can suggest avoiding using default function arguments. Default
> arguments are a good solution for adding parameters without breaking
> existing code, but are not a good practice otherwise. 

that's exactly what happened -- i added this default parameter to an existing
function that did not have parameters, and it broke in a very peculiar way. i
ended up using

ref T _fiberLocal(T)(FiberLocalBlock* block) {...}
ref T fiberLocal(T)() {_fiberLocal!T(_currentFiberLocalBlock);}

again, i'm fine with this workaround, but unless our UTs caught that early on,
debugging it on a live system would have been impossible.

i agree with stefan that a function returning `ref` shouldn't be allowed in 
property-setter syntax. either it shouldn't be allowed at all, i.e., `foo =
bar` won't compile if foo returns `ref` and takes an argument -- or only allow
the lowering to `foo() = bar`

--


[Issue 17474] non-property being treated as a property

2017-06-10 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17474

--- Comment #7 from Tomer Filiba (weka)  ---
(In reply to Stefan Koch from comment #5)
> I am pretty sure the last thing you want is a function to be invoked as a
> setter property if it returns an Lvalue.

+1

--