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

            Bug ID: 63715
           Summary: Compiler giving "reinterpret_cast from integer to
                    pointer" in constexpr function
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mbenda at omsquare dot com

Created attachment 33865
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33865&action=edit
Code snippet giving the error

Hi!

I have a code that involves casting from integers to pointers and back
(barebone I/O register access on ARM) and to achieve optimal machine code I use
constexpr on such expressions. Everything compiles fine with gcc-4.8.3, the
resulting code works. But after upgrading to gcc-4.9.2 I get several
"reinterpret_cast from integer to pointer" compilation errors. The gcc used is
compiled with --target=arm-none-eabi.

A simplified code snippet that manifests this error (also attached):

-----------
typedef unsigned int u32;

struct IO { u32 reg; };

constexpr IO* io = (IO*) 0x40000000;

inline constexpr u32 addr(u32& reg) {
    return reinterpret_cast<u32>(&reg);
}

struct IOTraits {
    static constexpr u32 addr1 = reinterpret_cast<u32>(&io->reg); // works fine
    static constexpr u32 addr2 = addr(io->reg); // compilation error
};
-----------

Both IOTraits::addr1 and addr2 are initialized with the same expression. The
only difference is that in the latter case, part of the expression is
encapsulated in an inline constexpr function (addr). The line with addr2 gives:

gccbug.cc:15:43: error: reinterpret_cast from integer to pointer

But the result of the expression is well-defined in compile time... Moreover,
gcc-4.8.3 compiles this code just fine.

The following bugs are probably related to this problem: #56728 and #49171.

Reply via email to