https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92220
R. Diez <rdiez-2006 at rd10 dot de> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rdiez-2006 at rd10 dot de --- Comment #7 from R. Diez <rdiez-2006 at rd10 dot de> --- This shortcoming has annoyed me for quite some time. Here is the test case I am using to convey the issue: // Compile with -Wconversion #include <stdint.h> int main ( void ) { volatile uint64_t a = 123; volatile uint16_t b = 2; // warning: conversion from 'long unsigned int' to 'uint16_t' // {aka 'short unsigned int'} may change value [-Wconversion] uint16_t result = a % b; return result; } It is available here to play with: https://godbolt.org/z/aKPqEozjW I am trying to write a safe wrapper to prevent the warning like this: template < typename TypeA, typename TypeB > TypeB ModuloToSmallerSize ( const TypeA a, const TypeB b ) throw() { if constexpr ( sizeof( TypeA ) <= sizeof( TypeB ) ) { // If there is no need for tricks, do not use any. return a % b; } else { return static_cast< TypeB >( a % b ); } } But I am not sure whether that implementation is a good idea. Should I check whether both integer types are signed or both are unsigned? Or does it not matter at all?