The following code gives different results with -O3 (or -O2) and no
optimization.The -O3 output is wrong. 

try:

$g++ -O3 test.cpp

$cat test.cpp

#include <iostream>

class foo
{
  int _type;
public:
  foo( int t ) : _type(t) {};
  bool is_1()   { return _type == 1; }
  bool is_23()  { return _type == 2 || _type == 3; }
};

void testit( foo& e1, foo& e2 )
{
  if ( e1.is_1() && e2.is_1() )
    std::cout << "If - 1.1\n";
  else if ( e1.is_23() && e2.is_23() )
    std::cout << "If - 23.23\n";
  else if ( e1.is_1() && e2.is_23() )
    std::cout << "If - 1.23\n";
  else if ( e1.is_23() && e2.is_1() )
    std::cout << "If - 23.1\n";
  else
    std::cout << "If - bad\n";
}

int main()
{
  for ( int i = 1; i < 4; ++i )
    for ( int j = 1; j < 4; ++j )
    {
      foo e1(i);
      foo e2(j);

      testit( e1, e2 );
    }

  return 0;
}


result with -O3 : 
$./a.out
If - 1.1
If - 1.23
If - 1.23
If - 23.1
If - 23.23
If - 23.23
If - bad
If - 23.23
If - 23.23

result without optimization :
$./a.out
If - 1.1
If - 1.23
If - 1.23
If - 23.1
If - 23.23
If - 23.23
If - 23.1
If - 23.23
If - 23.23

satya


-- 
           Summary: -O3 and -O2 give wrong results with gcc 4.1.2 on solaris
                    sparc
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: satyaakam at yahoo dot co dot in


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33249

Reply via email to