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

            Bug ID: 91993
           Summary: Spurious -Wconversion warning with
                    -fsanitize=undefined
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: TonyELewis at hotmail dot com
  Target Milestone: ---

Compiling:

auto fn( const unsigned char &a,
         const unsigned char &b,
         const unsigned char &c ) {
   return static_cast<unsigned char>(
              static_cast<unsigned char>(
                   a << 1U
              )
              |
              b
          )
          |
          c;
}

...with:

g++ -fsanitize=undefined -Werror -Wconversion -std=c++17 -fsyntax-only a.cpp

...I get:

a.cpp: In function ‘auto fn(const unsigned char&, const unsigned char&, const
unsigned char&)’:
a.cpp:4:11: error: conversion from ‘int’ to ‘unsigned char’ may change value
[-Werror=conversion]
    4 |    return static_cast<unsigned char>(
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
    5 |               static_cast<unsigned char>(
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    6 |                    a << 1U
      |                    ~~~~~~~
    7 |               )
      |               ~
    8 |               |
      |               ~
    9 |               b
      |               ~
   10 |           )
      |           ~
cc1plus: all warnings being treated as errors

...which I think is spurious. Interestingly, the warning goes away if I remove
`-fsanitize=undefined` (and I can't persuade clang-tidy or `clang -Weverything`
to complain about it).

I'm seeing this on g++ (GCC) 9.2.0 (Ubuntu 18.04.3 LTS, Linux
4.15.0-65-generic) but I've registered it as 10.0 because I see the same
behaviour on GCC master on Godbolt.

The closest to an active duplicate that I can see is
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91179 but that doesn't mention
`-fsanitize=undefined` so I suspect that's different.

Reply via email to