www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Error: expression `update` of type `void` does not have a boolean

reply Josphe Brigmo <JospheBrigmo gmail.com> writes:
auto foo(bool update = false)()
{
     static if(update)
     { }
}

and the compiler, after upgrading to 2.082 from 2.080 now says:

Error: expression `update` of type `void` does not have a boolean 
value

when update is clearly a bool.

Why the hell is the compiler now thinking update is a void?

1. This code compiles fine in a test app and 2. when I rename 
update to something else it works fine.

2. There is no other use of update in the entire module(not that 
it should matter)

Seems this is a compiler bug but only has a problem in context. 
Remember, it worked find before I updated dmd and there is no 
reason why it shouldn't work.
Sep 07 2018
next sibling parent reply Alex <sascha.orlov gmail.com> writes:
On Saturday, 8 September 2018 at 03:12:56 UTC, Josphe Brigmo 
wrote:
 auto foo(bool update = false)()
 {
     static if(update)
     { }
 }

 and the compiler, after upgrading to 2.082 from 2.080 now says:

 Error: expression `update` of type `void` does not have a 
 boolean value

 when update is clearly a bool.

 Why the hell is the compiler now thinking update is a void?

 1. This code compiles fine in a test app and 2. when I rename 
 update to something else it works fine.

 2. There is no other use of update in the entire module(not 
 that it should matter)

 Seems this is a compiler bug but only has a problem in context. 
 Remember, it worked find before I updated dmd and there is no 
 reason why it shouldn't work.
Could you show some more code, as this works for me: ´´´ import std.stdio; void main() { foo; } auto foo(bool update = false)() { static if(update) { } } ´´´ compiled with dmd --version DMD64 D Compiler v2.082.0 Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright dmd ./source/app.d used on a Mac with Darwin Kernel Version 17.7.0
Sep 07 2018
parent reply Josphe Brigmo <JospheBrigmo gmail.com> writes:
On Saturday, 8 September 2018 at 05:39:39 UTC, Alex wrote:
 On Saturday, 8 September 2018 at 03:12:56 UTC, Josphe Brigmo 
 wrote:
 auto foo(bool update = false)()
 {
     static if(update)
     { }
 }

 and the compiler, after upgrading to 2.082 from 2.080 now says:

 Error: expression `update` of type `void` does not have a 
 boolean value

 when update is clearly a bool.

 Why the hell is the compiler now thinking update is a void?

 1. This code compiles fine in a test app and 2. when I rename 
 update to something else it works fine.

 2. There is no other use of update in the entire module(not 
 that it should matter)

 Seems this is a compiler bug but only has a problem in 
 context. Remember, it worked find before I updated dmd and 
 there is no reason why it shouldn't work.
Could you show some more code, as this works for me: ´´´ import std.stdio; void main() { foo; } auto foo(bool update = false)() { static if(update) { } } ´´´ compiled with dmd --version DMD64 D Compiler v2.082.0 Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright dmd ./source/app.d used on a Mac with Darwin Kernel Version 17.7.0
I can't, the code is from a very large project and it's too intertwined. I already said it worked in simple form and that it worked with a previous compiler, so this is a regression. Changing no code and only swapping compilers produces this bug... and as you can see, it's obviously a bug given the form of the function and the error message and that it worked before without changes. Why the specific term update? I don't know. My project does not use the term update at all in any other context except that one. But I did find: void update(K, V, C, U)(ref V[K] aa, K key, scope C create, scope U update)
Sep 07 2018
parent reply Alex <sascha.orlov gmail.com> writes:
On Saturday, 8 September 2018 at 06:56:40 UTC, Josphe Brigmo 
wrote:
 My project does not use the term update at all in any other 
 context except that one. But I did find:

 void update(K, V, C, U)(ref V[K] aa, K key, scope C create, 
 scope U update)
Ok... found something here: https://dlang.org/changelog/2.082.0.html#require_update and here: https://dlang.org/spec/hash-map.html#advanced_updating It seems, they were added in 2.082.0. No idea why they are conflicting with your existing code, however... And even whether they are the source of conflict...
Sep 08 2018
parent Josphe Brigmo <JospheBrigmo gmail.com> writes:
On Saturday, 8 September 2018 at 07:30:35 UTC, Alex wrote:
 On Saturday, 8 September 2018 at 06:56:40 UTC, Josphe Brigmo 
 wrote:
 My project does not use the term update at all in any other 
 context except that one. But I did find:

 void update(K, V, C, U)(ref V[K] aa, K key, scope C create, 
 scope U update)
Ok... found something here: https://dlang.org/changelog/2.082.0.html#require_update and here: https://dlang.org/spec/hash-map.html#advanced_updating It seems, they were added in 2.082.0. No idea why they are conflicting with your existing code, however... And even whether they are the source of conflict...
obviously who ever added it screwed the pooch.
Sep 08 2018
prev sibling parent Basile B. <b2.temp gmx.com> writes:
On Saturday, 8 September 2018 at 03:12:56 UTC, Josphe Brigmo 
wrote:
 auto foo(bool update = false)()
 {
     static if(update)
     { }
 }

 and the compiler, after upgrading to 2.082 from 2.080 now says:

 Error: expression `update` of type `void` does not have a 
 boolean value

 when update is clearly a bool.

 Why the hell is the compiler now thinking update is a void?

 1. This code compiles fine in a test app and 2. when I rename 
 update to something else it works fine.

 2. There is no other use of update in the entire module(not 
 that it should matter)

 Seems this is a compiler bug but only has a problem in context. 
 Remember, it worked find before I updated dmd and there is no 
 reason why it shouldn't work.
- put `pragma(msg, __FILE_FULL_PATH__ ~ "(" ~ __LINE__.stringof ~ "):" ~ typeof(return).stringof);` in your update function. - recompile. - look at the compiler output You should be sure at this point if the problem comes from your update function of from the recent addition in object.d
Sep 08 2018