David A. Black wrote:

> Hi --
>
> On Wed, 23 Nov 2005, Sean E. Russell wrote:
>
>> On Tuesday 22 November 2005 15:37, David A. Black wrote:
>>
>>> Actually I meant what I wrote.  Since 1 is always true, there's no
>>> point ever testing it for truth.  (I purposely chose an example where
>>> you get the warning, which you don't if there's any point to the
>>> test.)
>>
>>
>> Yeah, but I think what he was getting at was:
>>
>>     def foo x
>>         if n = x
>>             blah(n)
>>         end
>>     end
>>
>> ... which he'd like to be able to do without being told that he's made a
>> mistake.  Which he hasn't.  Hence, his request that the warning be 
>> reworded
>> to "might", rather than "should".
>>
>> I think the point here is that the message that Ruby is giving is 
>> provably
>> wrong.  If Stefan wrote the above code, then Ruby is wrong to tell 
>> him that
>> he "should" be performing a comparison rather than an assignment.
>
>
Exactly.

> But that code doesn't produce a warning:
>
>   irb(main):011:0> def foo(x); if n = x; end; end
>   => nil
>   irb(main):012:0> foo(true)
>   => nil
>
> The warning is "intelligent".  It only appears in cases where there
> really is no possibility that the "if" can ever have two branches:
>
>   irb(main):013:0> if n = true; end
>   (irb):13: warning: found = in conditional, should be ==
>   => nil

This doesn't really make it any better. There is no way a program could 
read the programmers mind to an extent that would enable the program to 
know whether the assigment wasn't put there on purpose.

Telling me I've made a mistake when I haven't, is a mistake ;-)

So Ruby can't know whether occurence of an equal sign inside an "if" 
condition is a programmers intention or not, unless the LHS of the 
assignment is a constant expression. But that is a completely different 
error.

And why do I get this warning even if I haven't turned warnings on? This 
seems wrong too.

-- stefan