[cfe-commits] r76911 - /cfe/trunk/lib/Analysis/CFG.cpp

Ted Kremenek kremenek at apple.com
Thu Jul 23 22:03:45 PDT 2009


On Jul 23, 2009, at 9:33 PM, Eli Friedman wrote:

>>> +    // See if this is a known constant.
>>> +    int KnownVal = TryEvaluateBool(B->getLHS());
>>> +    if (KnownVal != -1 && (B->getOpcode() == BinaryOperator::LOr))
>>> +      KnownVal = !KnownVal;
>>> +
>>>     // Now link the LHSBlock with RHSBlock.
>>>     if (B->getOpcode() == BinaryOperator::LOr) {
>>> -      if (KnownTrue)
>>> +      if (KnownVal == true)
>>>         LHSBlock->addSuccessor(0);
>>>       else
>>>         LHSBlock->addSuccessor(ConfluenceBlock);
>>> -      if (KnownFalse)
>>> +      if (KnownVal == false)
>>>         LHSBlock->addSuccessor(0);
>>
>> Hi Mike,
>>
>> This looks a little suspicious to me.  Doesn't '-1' convert to 'true'
>> when an int is casted to a bool?  This would cause 'KnowVal == true'
>> to evaluate to true even when 'KnownVal' is -1.
>
> (int)x == false is semantically equivalent to (int)x == 0 due to
> integer promotion rules.  That said, it is slightly confusing the way
> it's written.


The problem isn't with 'x == 0', but with 'x == -1'.  Since (I  
believe) both '1' and '-1' convert to true when int is casted to a  
bool, the 'KnownVal == true' would evaluate to true in both cases  
(which isn't the desired behavior).



More information about the cfe-commits mailing list