[LLVMdev] MS C++ gives error C2371 on this code while (obviously)gcc compiles it fine

Argiris Kirtzidis akyrtzi at gmail.com
Thu Oct 2 12:32:30 PDT 2008

Jay Freeman (saurik) wrote:
> Those rules only apply to if and switch statements. (Yes, this is insane, 
> but true.) The entire section you are quoting from, 6.4, is titled 
> "Selection statements [stmt.select]", which specifically covers these two 
> cases. A for is an iteration statement, not a selection statement.

See 6.4p2: "The rules for conditions apply both to selection-statements 
and to the for and while statements"

> So, if you read 6.5.3p1 (which is actually about for statements) it states 
> that a for loop is rewritten as a while loop where names defined by the 
> for-init-statement are declared in the declaration space of the condition of 
> the while statement. Then, if you read 6.5.1p2 it states:
> <quote>
> -2- When the condition of a while statement is a declaration, the scope of 
> the variable that is declared extends from its point of declaration 
> (basic.scope.pdecl) to the end of the while statement. A while statement of 
> the form
> while (T t = x) statement
> is equivalent to
> label:
> {                               //  start of condition scope
>     T t = x;
>     if (t) {
> 	statement
> 	goto label;
>     }
> }                               //  end of condition scope
> </quote>
> Unlike the case of the for statement, there are no subsequent rules that 
> redefine where this declaration is scoped. This rewrite means that the rules 
> you cite in 6.4 simply do not apply: for loops don't cause conditions in 
> selection statements, and therefore should not be scoped in that manner. 
> They almost are, but the rules for while statements actually force the 
> declaration outside of the condition of the if statement.

Again, see the 6.4p2 reference. 'while' statements should also follow 
this rule:

> If the name is re-declared in the outermost block of a substatement 
> controlled by the condition, the declaration that re-declares the name 
> is ill-formed.

gcc correctly scopes the declaration inside the while statement:

while (int x=0) {
   int x=0;   // error: redeclaration.


> You are correct, though, that gcc should be emitting an error in the case of 
> the if statement. Naughty gcc.
> -J

More information about the llvm-dev mailing list