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

Argiris Kirtzidis akyrtzi at gmail.com
Thu Oct 2 11:33:06 PDT 2008

Jay Freeman (saurik) wrote:
> gcc is correct. According to the ISO specification, the for-init-statement 
> is supposed to inject any variable names into the same declarative scope as 
> the condition of an equivalent restructuring of the loop in the form of a 
> while statement, which in turn fronts the declaration to an extra scope that 
> surrounds the /entire/ loop construct. VC++ seems to be scoping the 
> variables as if they were /inside/ of the loop and not creating this extra 
> scope. Frowny. -J

Actually, gcc is wrong and VC++ got it right.
 From the C++ standard, 6.4p3:

> A name introduced by a declaration in a condition (either introduced 
> by the type-specifier-seq or the declarator of the
> condition) is in scope from its point of declaration until the end of 
> the substatements controlled by the condition. 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.

Which gives us:

while (int x=0) {
    int x=0;   // error: redeclaration, clashes with condition

Both gcc and VC++ emit a compilation error for the above.

Then the standard says this, 6.5.3p1:

> names declared in the for-init-statement are in the same 
> declarative-region as those declared in the condition

So names inside the 'for' loop clash with both the condition and the 

for (int x=0;;) {
    int x=0;   // error: redeclaration, clashes with for-init-statement

but gcc, incorrectly, does not emit a compilation error.

And while we are on the subject, gcc is also wrong on this one:

if (int x=0) {
    int x=0;   // error: redeclaration, but gcc does not emit any errors.


> --------------------------------------------------
> From: "Yanko" <yhdezalvarez at gmail.com>
> Sent: Thursday, October 02, 2008 8:12 AM
> To: <llvmdev at cs.uiuc.edu>
> Subject: [LLVMdev] MS C++ gives error C2371 on this code while 
> (obviously)gcc compiles it fine
> ...
>> makes the code compilable by MS C++. But as a curiosity (and I really
>> don't know the answer because I can barely read C++): Which compiler
>> got it right? 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

More information about the llvm-dev mailing list