Re: Erroneous for-loop variable used with /Zc:forScope
On Mon, 20 Aug 2007 10:00:12 -0000, Felipe <felipe.m.almeida@gmail.com>
wrote:
Even with /Zc:forScope used, Compiling this code with Visual C++
Express 2005 tells me he is using the i from the most nested for-loop,
which is wrong! And gives an error for not having a assignment
operator. Proving is trying to use the i from the nested for-loop.
This compiles fine on Visual C++ 7.1 (2003) Professional and Visual C+
+ Express 9.0 Beta 2.
int main()
{
struct A {
A& operator++();
bool operator!=(int) const;
//A& operator=(int);
};
for(int i = 0; i < 10; i++)
{
for(A i; i != 20; ++i)
{
}
i = 5;
}
}
The error message:
subprojects\misvc\src\tnef_conversion.cpp(322) : warning C4822:
'try_convert_from_rfc2822::A::operator ++' : local class member
function does not have a body
subprojects\misvc\src\tnef_conversion.cpp(323) : warning C4822:
'try_convert_from_rfc2822::A::operator !=' : local class member
function does not have a body
subprojects\misvc\src\tnef_conversion.cpp(333) : warning C4288:
nonstandard extension used : 'i' : loop control variable declared in
the for-loop is used outside the for-loop scope; it conflicts with the
declaration in the outer scope
subprojects\misvc\src\tnef_conversion.cpp(328) : definition of
'i' used
subprojects\misvc\src\tnef_conversion.cpp(326) : definition of
'i' ignored
subprojects\misvc\src\tnef_conversion.cpp(333) : error C2679: binary
'=' : no operator found which takes a right-hand operand of type
'int' (or there is no acceptable conversion)
That's not a program, or even a legal fragment, because member functions of
a local class must be defined within the class body. When I define the
member functions, VC2005, SP1, SP-Vista emits:
X>cl -c a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for
80x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp(15) : warning C4258: 'i' : definition from the for loop is ignored;
the definition from the enclosing scope is used
a.cpp(10) : definition of 'i' ignored
a.cpp(8) : definition of 'i' used
No problem there. Your C4288 does look like a bug in the Express Edition,
but try defining the member functions to see if you still get it in a legal
program. If you do, you can report the problem here:
http://connect.microsoft.com/feedback/default.aspx?SiteID=210
See also if there is an updated version or service pack to apply, as the
problem doesn't occur in the (patched) full version of VC2005.
--
Doug Harrison
Visual C++ MVP