This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/42810] New: Enumeration with sequential values has its for-loop exit condition optimized out.
- From: "tony3 at GarlandConsulting dot us" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Jan 2010 22:51:52 -0000
- Subject: [Bug c++/42810] New: Enumeration with sequential values has its for-loop exit condition optimized out.
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
An enumeration with sequentially-assigned values is used as an index of a for
loop. The loop operates properly at optimization levels -O0 and -O1. At level
-O2 the optimizer "optimizes out" the test for the exit condition and the loop
never exits.
I'll be attaching the *.i file, but below is the test source file which shows
the situation. At -O2, the loop itself never exits and a separate counter
which is part of the test triggers a break itself--after printing that the test
has failed.
/*
Sample program to demonstrate comparison failure involving sequential
enumeration when optimized. To reproduce the failure:
g++ -O2 test.cpp && ./a.out
Any one of the following changes correct the problem:
- Change optimization (omit or use -O0 or -O1).
- Set ENUM_VALUE_FIRST to 0.
- Delete one of the enum values between first and last (one less
value).
- Insert an addition enum value between first and last (one more
value).
agarland at fluke dot com
*/
// Compile at -O1 or uncomment any one of the following to "fix" the problem.
//#define FIX1 // Omit an enum value.
//#define FIX2 // Add an extra enum value.
//#define FIX3 // Start first value at zero rather than 1.
#include <stdio.h>
enum ENUM_VALUE
{
#ifdef FIX3
ENUM_VALUE_FIRST = 0,
#else
ENUM_VALUE_FIRST = 1,
#endif
ENUM_VALUE_A,
#ifndef FIX1
ENUM_VALUE_B,
#endif
ENUM_VALUE_C,
ENUM_VALUE_D,
ENUM_VALUE_E,
#ifdef FIX2
ENUM_VALUE_F,
#endif
ENUM_VALUE_LAST
};
main()
{
printf("Compiled on %s %s\n", __DATE__, __TIME__);
unsigned int count = 0;
for (
ENUM_VALUE id = ENUM_VALUE_FIRST;
id <= ENUM_VALUE_LAST;
id = static_cast<ENUM_VALUE>(id+1)
)
{
printf("id=%d\n", id);
if (100 == count++)
{
// Should never get here.
printf("ENUMERATION COMPARISON FAILED!\n");
break;
}
}
}
--
Summary: Enumeration with sequential values has its for-loop exit
condition optimized out.
Product: gcc
Version: 4.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: tony3 at GarlandConsulting dot us
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42810