Bug 2532 – '=' does not give a boolean result

Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2008-12-21T11:04:00Z
Last change time
2015-06-09T01:20:50Z
Keywords
diagnostic, patch
Assigned to
nobody
Creator
adolf.mathias

Comments

Comment #0 by adolf.mathias — 2008-12-21T11:04:45Z
Using a boolean assignment in an if condition e.g. as follows gives IMHO an unjustified error message. When a new variable is declared in the if() condition, everything is OK: // tst.d void main() { bool b; if(b=false) { b = true; } if(bool c=false) { c = true; } } $ dmd tst tst.d(4): Error: '=' does not give a boolean result
Comment #1 by jarrett.billingsley — 2008-12-21T11:47:07Z
= does not give a boolean result for good reason: it's to avoid the common mistake in C/C++ where: if(x = 5) { ... } is used when: if(x == 5) { ... } was meant.
Comment #2 by 2korden — 2008-12-21T11:49:38Z
It works as designed. It is designed to avoid mistakes. "if (var = expr) {" is disallowed on purpose to avoid mistakes where you inteded to write "if (var == expr) {": int a = ...; if (a = 42) { // oops, what a typo! I ment if (a == 42) here... Bool is no different from int in this expression. However, "if (type var == expression) {" is not a valid construct, so there is no chance to make a mistake and thus "if (type var = expression) {" is allowed. There is no 'special cases' for bools.
Comment #3 by ddparnell — 2008-12-21T15:35:57Z
The text of the message is not true if the variable being assigned to is ALREADY a bool. I know that the syntax form 'if (a = b)' is to avoided, but to say that, IN THIS CASE, the result is not a boolean is plainly wrong. bool a; bool b; b = (a = true); // A boolean expression (a = true) is used to assign to 'b'. As we know that (a = b) is a boolean expression, it seems wrong to say that it is a boolean EXCEPT in an 'if' construct. We do this to no other data type. So maybe the wording of the message can be changed to reflect what is actually being disallowed. Something like ... "The syntax form 'if (a = b)' is not allowed". That takes the argument away from the datatype issue and makes it a syntax issue instead.
Comment #4 by shro8822 — 2008-12-21T17:46:31Z
Might "expression is not a valid condition" be better?
Comment #5 by 2korden — 2008-12-22T04:35:05Z
Reopening as an enhancement.
Comment #6 by gide — 2008-12-22T04:40:48Z
Added keyword diagnostic.
Comment #7 by dfj1esp02 — 2008-12-22T05:55:29Z
Hmm... After all D has switched to strict booleans?
Comment #8 by yebblies — 2011-06-13T09:01:42Z
*** Issue 4163 has been marked as a duplicate of this issue. ***
Comment #9 by yebblies — 2011-06-13T13:52:46Z
https://github.com/D-Programming-Language/dmd/pull/122 A better message for all? Error: assignment cannot be used as a condition
Comment #10 by bugzilla — 2011-11-08T00:46:56Z