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

            Bug ID: 63265
           Summary: Constexpr variables can trigger spurious compiler
                    warnings
           Product: gcc
           Version: 4.9.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: oneill+gccbugs at cs dot hmc.edu

This code defines two constexpr values that are equivalent.  But one of them
produces a spurious warning

template <int lshift>
struct DoesntWarn {
    static constexpr unsigned int v = lshift < 32 ? 1U << lshift : 0;
};

static_assert(DoesntWarn<32>::v == 0, "Impossible occurred");

template <int lshift>
struct SpuriouslyWarns {
    static constexpr bool okay = lshift < 32;
    static constexpr unsigned int v = okay ? 1U << lshift : 0;
};

static_assert(SpuriouslyWarns<32>::v == 0, "Impossible occurred");

Compiling with 4.9.1, we get

spurious.cpp: In instantiation of ‘constexpr const unsigned int
SpuriouslyWarns<32>::v’:
spurious.cpp:14:36:   required from here
spurious.cpp:11:49: warning: left shift count >= width of type
     static constexpr unsigned int v = okay ? 1U << lshift : 0;
                                                 ^

Reply via email to