Search code examples
c++gcccompiler-warningsinteger-promotion

Compiler warnings conversion


We are compiling using gcc with -Wconversion enabled. I get following warnings when I left shift result returned by isBitSet function below.

warning: conversion to 'u_int16_t {aka short unsigned int}' from 'int' may alter its value [-Wconversion]

#include <stdint.h>

using namespace std;

void convertToPos(uint16 in) {

    auto isBitSet = [&in](uint8_t position) -> bool{
        return (in & (1 << position));
    };

    uint16_t signal = 0;
    signal |= isBitSet(1) << 9;  // Calibrated
    signal |= isBitSet(2) << 10; // Corresponds to digital map
    signal |= isBitSet(5) << 13; // DR
    signal |= isBitSet(8) << 15; // 3D Fix

}

int main(int argc)
{
    convertToPos(4);
    return 0;
}

I tried changing lambda to below, but still I get the same error. How can I fix it?

auto isBitSet = [&in](uint8_t position) -> uint16_t {
    return (in & (1 << position)) ? 1u:0u;
};

Solution

  • To avoid the warning, you may do:

    signal = uint16_t(signal | isBitSet(1u) << 9);
    

    as operator | promotes operator uint16_t to int.