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

OvermindDL1
Thu, 02 Oct 2008 18:52:33 -0000

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.

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.

On Thu, Oct 2, 2008 at 12:33 PM, Argiris Kirtzidis <akyrtzi at
gmail.com>wrote:

> 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-init-statement:
>
> 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.
> }
>
>
> -Argiris
>
> > --------------------------------------------------
> > 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
> >
> >
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20081002/c263084d/attachment.html>