Following program generates different outputs for -O1 and -O3 optimization
levels.

#include <stdio.h>

typedef struct _airInfo{
        unsigned int craftNo : 16;
        unsigned int onAir:1;
        unsigned int numCrew:2;
        unsigned int numPassenger:2;
        unsigned int onLand:1;
        unsigned int fuelTank:2;
        unsigned int height: 8;
} airInfo_t ;

#pragma pack(1)
typedef struct _atmosphere {
        int temp:24;
        int humidity:24;
        int pressure:24;
        int altitude:24;
}atmosphere_t;

typedef struct _mixedInfo {
        airInfo_t    ai;
        atmosphere_t atm;
}mixedInfo_t;

#pragma pack()

int main() {
        mixedInfo_t mi ;

        mi.ai.height       = 17;
        mi.ai.craftNo      = 1;
        mi.ai.onAir        = 0;
        mi.ai.numCrew      = 2;
        mi.ai.numPassenger = 2;
        mi.ai.onLand       = 0;
        mi.ai.fuelTank     = 0;

        printf("ai in num = %u\n", (*((unsigned int *)(&mi.ai)))) ;
        return 0 ;
}

// Output from program when compiled with -O1
$ g++ -O1 test1.cxx ; ./a.out 
ai in num = 286523393

// Output from program when compiled with -O3
$ g++ -O3 test1.cxx ; ./a.out 
ai in num = 1310720


-- 
           Summary: Optimization level -O3 changes the program behavior
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: mor_gopal at yahoo dot com


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

Reply via email to