[cfe-dev] Patch for compilation on msvc

Chris Lattner clattner at apple.com
Sun Feb 17 12:04:29 PST 2008


On Feb 17, 2008, at 11:59 AM, Ted Kremenek wrote:

>
> On Feb 16, 2008, at 2:21 PM, Cédric Venet wrote:
>
>> Mainly project change but also a few missing std include header and  
>> one
>> compiler bug (or not, I don't know what the standard say):
>>
>> for (GRExprEngine::null_iterator I=CheckerState->null_begin(),
>>         E=CheckerState->null_end(); I!=E; ++I) {
>>
>>      const PostStmt& L = cast<PostStmt>((*I)->getLocation());
>>      Expr* E = cast<Expr>(L.getStmt());
>>
>>      Diag.Report(FullSourceLoc(E->getExprLoc(),  
>> Ctx.getSourceManager()),
>>                  diag::chkr_null_deref_after_check);
>>    }
>>
>> Not Expr* E who redefine E from the for initialization. Is it the  
>> same
>> scope? The strangest thing was that MSVC didn't complain about  
>> redefinition
>> but seemed to ignore the Expr* E; definition and was thinking E was a
>> null_iterator. Took me some time to understand the problem.
>
> I'm not as adroit in interpreting the C99 standard as others, but I  
> believe that one could interpret the prose of the standard to say  
> that the loop condition has a different scope than the loop body, or  
> at least variables declared in within the parentheses of "for(...)"  
> are visible to the other expressions in the for(...) (variables  
> declared in the loop body are not visible to subexpression  
> representing the loop condition or the optional "increment"  
> expression) (6.8.5.3):
>
> The statement
>
>   for ( clause-1 ;expression-2 ;expression-3 ) statement
>
> behaves as follows: The expression "expression-2" is the controlling  
> expression that is  evaluated before each execution of the loop  
> body. The expression "expression-3" is evaluated as a void  
> expression after each execution of the loop body. If clause-1is a  
> declaration, the scope of any variables it declares is the remainder  
> of the declaration and  the entire loop, including the other two  
> expressions; it is reached in the order of execution before the  
> first evaluation of the controlling expression.

That's true, but the {}'s introduce a new scope.  VC++ has bugs in  
this area, and we've hit them in other parts of LLVM.  I'd just  
suggest renaming the inner E to work around this...

-Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080217/9ac87760/attachment.html>


More information about the cfe-dev mailing list