r12-7608 FAIL Probably FAIL long ago: gcc-8 FAIL gcc version 8.0.1 20180125 (experimental) [trunk revision 257061] (GCC) $ g++ -fsanitize=undefined -c -o x.o x.ii && nm -u --reverse-sort x.o U _ZTI1S $ g++ -c -o x.o x.ii && nm -u --reverse-sort x.o $ cat x.ii struct a {}; struct b { a c; }; struct S : a { virtual int d(); }; struct e : b { unsigned f(); }; unsigned e::f() { static_cast<S *>(&c); return 0; } $ ~/arch-gcc/gcc_current/bin/g++ -v Using built-in specs. COLLECT_GCC=/home/dimhen/arch-gcc/gcc_current/bin/g++ COLLECT_LTO_WRAPPER=/home/dimhen/arch-gcc/gcc_current/libexec/gcc/x86_64-pc-linux-gnu/12.0.1/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none Target: x86_64-pc-linux-gnu Configured with: /home/dimhen/src/gcc_current/configure --prefix=/home/dimhen/arch-gcc/gcc_current --enable-checking=yes,df,fold,rtl,extra --enable-languages=c,c++,lto --disable-multilib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=native --enable-libstdcxx-debug Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 12.0.1 20220311 (experimental) [master r12-7608-g5e28be89665] (GCC)
And the bug is? The S class doesn't have the key method defined, so some other TU needs to define it and thus provide the vtable and rtti for it. Without -fsanitize=vptr the typeinfo isn't needed on this particular testcase and the vtable isn't needed either, which is why you don't get an undefined symbol in that case and you get it with -fsanitize=vptr or -fsanitize=undefined that implies that.
(In reply to Jakub Jelinek from comment #1) > And the bug is? > The S class doesn't have the key method defined, so some other TU needs to > define it and thus provide the vtable and rtti for it. > Without -fsanitize=vptr the typeinfo isn't needed on this particular > testcase and the vtable isn't needed either, which is why you don't get an > undefined symbol in that case and you get it with -fsanitize=vptr or > -fsanitize=undefined that implies that. Thank you, Jakub. So, close as 'INVALID'?
.