/* derived from PR optimization/11440  */
/* { dg-additional-options "-std=gnu17" } */

extern void abort(void);
extern void exit(int);

typedef _Bool bool;
const bool false = 0;
const bool true = 1;

enum EPosition {
    STATIC,
    RELATIVE,
    ABSOLUTE,
    FIXED
};
typedef enum EPosition EPosition;

enum EFloat {
    FNONE = 0,
    FLEFT,
    FRIGHT
};
typedef enum EFloat EFloat;

struct RenderBox {
    int unused[6];
    short m_verticalPosition;

    bool m_layouted : 1;
    bool m_unused : 1;
    bool m_minMaxKnown : 1;
    bool m_floating : 1;

    bool m_positioned : 1;
    bool m_overhangingContents : 1;
    bool m_relPositioned : 1;
    bool m_paintSpecial : 1;

    bool m_isAnonymous : 1;
    bool m_recalcMinMax : 1;
    bool m_isText : 1;
    bool m_inline : 1;

    bool m_replaced : 1;
    bool m_mouseInside : 1;
    bool m_hasFirstLine : 1;
    bool m_isSelectionBorder : 1;

    bool (*isTableCell)(struct RenderBox *this);
};

typedef struct RenderBox RenderBox;

struct RenderStyle {
    struct NonInheritedFlags {
        union {
            struct
            {
                unsigned int _display : 4;
                unsigned int _bg_repeat : 2;
                bool _bg_attachment : 1;
                unsigned int _overflow : 4;
                unsigned int _vertical_align : 4;
                unsigned int _clear : 2;
                EPosition _position : 2;
                EFloat _floating : 2;
                unsigned int _table_layout : 1;
                bool _flowAroundFloats : 1;

                unsigned int _styleType : 3;
                bool _hasHover : 1;
                bool _hasActive : 1;
                bool _clipSpecified : 1;
                unsigned int _unicodeBidi : 2;
                int _unused : 1;
            } f;
            int _niflags;
        };
    } noninherited_flags;
};

typedef struct RenderStyle RenderStyle;

extern void RenderObject_setStyle(RenderBox *this, RenderStyle *_style);
extern void removeFromSpecialObjects(RenderBox *this);


void RenderBox_setStyle(RenderBox *thisin, RenderStyle *_style) {
    RenderBox *this = thisin;
    bool oldpos, tmp;
    EPosition tmppo;

    tmp = this->m_positioned;

    oldpos = tmp;

    RenderObject_setStyle(this, _style);

    tmppo = _style->noninherited_flags.f._position;

    switch (tmppo) {
    case ABSOLUTE:
    case FIXED: {
        bool ltrue = true;
        this->m_positioned = ltrue;
        break;
    }

    default: {
        EFloat tmpf;
        EPosition tmpp;
        if (oldpos) {
            bool ltrue = true;
            this->m_positioned = ltrue;
            removeFromSpecialObjects(this);
        }
        {
            bool lfalse = false;
            this->m_positioned = lfalse;
        }

        tmpf = _style->noninherited_flags.f._floating;

        if (!this->isTableCell(this) && !(tmpf == FNONE)) {
            bool ltrue = true;
            this->m_floating = ltrue;
        } else {
            tmpp = _style->noninherited_flags.f._position;
            if (tmpp == RELATIVE) {
                bool ltrue = true;
                this->m_relPositioned = ltrue;
            }
        }
    }
    }
}


RenderBox g_this;
RenderStyle g__style;

void RenderObject_setStyle(RenderBox *this, RenderStyle *_style) {
    (void)this;
    (void)_style;
}

void removeFromSpecialObjects(RenderBox *this) {
    (void)this;
}

bool RenderBox_isTableCell(RenderBox *this) {
    (void)this;
    return false;
}

int main(void) {

    g_this.m_relPositioned = false;
    g_this.m_positioned = false;
    g_this.m_floating = false;
    g_this.isTableCell = RenderBox_isTableCell;

    g__style.noninherited_flags.f._position = FIXED;
    g__style.noninherited_flags.f._floating = FNONE;

    RenderBox_setStyle(&g_this, &g__style);

    if (g_this.m_positioned != true)
        abort();
    if (g_this.m_relPositioned != false)
        abort();
    if (g_this.m_floating != false)
        abort();

    exit(0);
}
