https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39170

Albi <albrecht.guendel at web dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |albrecht.guendel at web dot de

--- Comment #16 from Albi <albrecht.guendel at web dot de> ---
Here is a type safe C++ solution:

template<unsigned int N, typename T> union NBitValueUnion
{
        static_assert((sizeof(T)*8) > N, "Strange Bitfield Width");
private:
        const T Data;
public:
        struct
        {
                const T Value : N;
                const T : (sizeof(T)*8-N);
        };
        NBitValueUnion(const T& _Data): Data(_Data) {}
};
template<unsigned int N, typename T> const NBitValueUnion<N, T> NBitValue(const
T& _Data)
{ return NBitValueUnion<N, T>(_Data); }


Usage:
Bitfield.Member = VariableName; //Triggers -Wconversion
Bitfield.Member = NBitValue<FieldWidth>(VariableName).Value; //Silent.

Unfortnunately it triggers -Waggregate-return (which is a topic for it self
since its a type thats fits in a register, so its an aggregate.. but not in
hardware.)

Any improvements are welcome.

Reply via email to