<div dir="ltr">Ah, interesting, have not ran across that before (as I always strive to never use the same name as any scope previously), but rather interesting that GCC gets it wrong while VC++ gets it right, kind of a switch.<br>
<br>And yes, that switch I mentioned is for VC6 style in VC7.1 (what I use), you have to switch it to make it conformant, nice to hear VC8 does it correctly by default now.<br><br>On Thu, Oct 2, 2008 at 12:33 PM, Argiris Kirtzidis <span dir="ltr"><<a href="mailto:akyrtzi@gmail.com">akyrtzi@gmail.com</a>></span> wrote:<br>
<div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">Jay Freeman (saurik) wrote:<br>
> gcc is correct. According to the ISO specification, the for-init-statement<br>
> is supposed to inject any variable names into the same declarative scope as<br>
> the condition of an equivalent restructuring of the loop in the form of a<br>
> while statement, which in turn fronts the declaration to an extra scope that<br>
> surrounds the /entire/ loop construct. VC++ seems to be scoping the<br>
> variables as if they were /inside/ of the loop and not creating this extra<br>
> scope. Frowny. -J<br>
><br>
<br>
</div>Actually, gcc is wrong and VC++ got it right.<br>
 From the C++ standard, 6.4p3:<br>
<br>
> A name introduced by a declaration in a condition (either introduced<br>
> by the type-specifier-seq or the declarator of the<br>
> condition) is in scope from its point of declaration until the end of<br>
> the substatements controlled by the condition. If the<br>
> name is re-declared in the outermost block of a substatement<br>
> controlled by the condition, the declaration that re-declares<br>
> the name is ill-formed.<br>
<br>
Which gives us:<br>
<br>
while (int x=0) {<br>
    int x=0;   // error: redeclaration, clashes with condition<br>
}<br>
<br>
Both gcc and VC++ emit a compilation error for the above.<br>
<br>
Then the standard says this, 6.5.3p1:<br>
<br>
> names declared in the for-init-statement are in the same<br>
> declarative-region as those declared in the condition<br>
<br>
So names inside the 'for' loop clash with both the condition and the<br>
for-init-statement:<br>
<br>
for (int x=0;;) {<br>
    int x=0;   // error: redeclaration, clashes with for-init-statement<br>
}<br>
<br>
but gcc, incorrectly, does not emit a compilation error.<br>
<br>
And while we are on the subject, gcc is also wrong on this one:<br>
<br>
if (int x=0) {<br>
    int x=0;   // error: redeclaration, but gcc does not emit any errors.<br>
}<br>
<font color="#888888"><br>
<br>
-Argiris<br>
</font><div><div></div><div class="Wj3C7c"><br>
> --------------------------------------------------<br>
> From: "Yanko" <<a href="mailto:yhdezalvarez@gmail.com">yhdezalvarez@gmail.com</a>><br>
> Sent: Thursday, October 02, 2008 8:12 AM<br>
> To: <<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>><br>
> Subject: [LLVMdev] MS C++ gives error C2371 on this code while<br>
> (obviously)gcc compiles it fine<br>
><br>
> ...<br>
><br>
>> makes the code compilable by MS C++. But as a curiosity (and I really<br>
>> don't know the answer because I can barely read C++): Which compiler<br>
>> got it right?<br>
>><br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br></div>