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

            Bug ID: 101622
           Summary: Type erasure (upcasting) in constexpr/consteval
                    context
           Product: gcc
           Version: 10.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sjeltsch at gmail dot com
  Target Milestone: ---

Source:

```
template <typename T> void fun() {}                     

template<typename T> inline constexpr bool var = false; 

consteval bool funC() {                                 
  void (*a)() = fun<int>;                               
  void (*b)() = fun<float>;                             
  return a == b;                                        
}                                                       

constexpr auto x = funC();                              

consteval bool varC() {                                 
  const void* a = &var<int>;                            
  const void* b = &var<float>;                          
  return a == b;                                        
}                                                       

constexpr auto y = varC();                              

int main() { return 0; } 
```                               

output:

Using built-in specs.             
COLLECT_GCC=g++     
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa:hsa
OFFLOAD_TARGET_DEFAULT=1                 
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 10.2.1-6'
--with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with
-gcc-major-version-only --program-suffix=-10 --program-prefix=x86_64-linux-gnu-
--enable-shared --enable-linker-build-id --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --libdir=/usr/lib 
--enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin --ena
ble-default-pie --with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch
--disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-
list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-10-Km9U7s/gcc-10-10.2.1/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-10-Km9U7s/gcc-10-10.2.1/debian/tmp-gcn
/usr,hsa --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-mutex
Thread model: posix                                                             
Supported LTO compression algorithms: zlib zstd                                 
gcc version 10.2.1 20210110 (Debian 10.2.1-6)                                   
COLLECT_GCC_OPTIONS='-std=c++2a' '-v' '-o' 'foo' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/10/cc1plus -quiet -v -imultiarch
x86_64-linux-gnu -D_GNU_SOURCE foo.cc -quiet -dumpbase foo.cc -mtune=generic
-march=x86-64 -auxbase foo -std=c++2a -version -fasynchronous-unwind-t
ables -o /tmp/ccp7WoOR.s                                                        
GNU C++17 (Debian 10.2.1-6) version 10.2.1 20210110 (x86_64-linux-gnu)
        compiled by GNU C version 10.2.1 20210110, GMP version 6.2.1, MPFR
version 4.1.0, MPC version 1.2.0, isl version isl-0.23-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072      
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/10"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/include-fixed"
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/10                                                           
                                                                               
                                                   
/usr/include/x86_64-linux-gnu/c++/10                                           
                                                                               
                                                   /usr/include/c++/10/backward
                                                                               
                                                                               
                      /usr/lib/gcc/x86_64-linux-gnu/10/include                 
                                                                               
                                                                        
/usr/local/include                                                             
                                                                               
                                                  
/usr/include/x86_64-linux-gnu                                                   
 /usr/include      
End of search list.                            
GNU C++17 (Debian 10.2.1-6) version 10.2.1 20210110 (x86_64-linux-gnu)
        compiled by GNU C version 10.2.1 20210110, GMP version 6.2.1, MPFR
version 4.1.0, MPC version 1.2.0, isl version isl-0.23-GMP                      

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 048fcaee3460a99eb0d68522358720e1
foo.cc:8:12: error: ‘(fun<int> == fun<float>)’ is not a constant expression
    8 |   return a == b;                                                        
      |          ~~^~~~
foo.cc:16:12: error: ‘(((const void*)(& var<int>)) == ((const void*)(&
var<float>)))’ is not a constant expression
   16 |   return a == b;
      |          ~~^~~~
make: *** [<builtin>: foo] Error 1



AFAIU there are some limits to static/reinterpret casting that you can do in a
constexpr/consteval context. However, if that was the case here I would rather
expect the variable assignment to fail. 
(Not as an argument but rather as some extra signal, the above code compiles
with clang. If in fact it shouldn't compile, I'm happy to take the bug to
clang).

Thanks!

Reply via email to