https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67650
Jan Hubicka <hubicka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at redhat dot com --- Comment #8 from Jan Hubicka <hubicka at gcc dot gnu.org> --- I think this is a bug in testcase and/or C++ FE. I get: main.cpp:33:8: warning: �void AN<OC, RC>::rp() [with OC = LR<I, IE, ((const char*)(& ET))>::LLC; RC = BLKC]� used but never defined /tmp/ccT1Jzgh.o:main.cpp:function main: error: undefined reference to 'operator new(unsigned long)' /tmp/ccT1Jzgh.o:main.cpp:function LK<LR<I, IE, &ET>::LL>::rb(): error: undefined reference to 'AN<LR<I, IE, &ET>::LLC, BLKC>::rp()' _ZN2ANIN2LRI1I2IEXadL_ZL2ETEEE3LLCE4BLKCE2rpEv is virtual function that is not defined: _ZN2ANIN2LRI1I2IEXadL_ZL2ETEEE3LLCE4BLKCE2rpEv/504 (void AN<OC, RC>::rp() [with OC = LR<I, IE, ((const char*)(& ET))>::LLC; RC = BLKC]) @0x7ffff5aa2000 Type: function Visibility: external public virtual References: Referring: First run: 0 Function flags: Called by: _ZN2REI2ELIN2LRI1I2IEXadL_ZL2ETEEE3LLCEEE2axEv/485 (1.00 per call) (can throw external) Calls: and is used as: _ZN2LKIN2LRI1I2IEXadL_ZL2ETEEE2LLEE2rbEv/484 (void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL]) @0x7ffff5a4fa10 Type: function definition analyzed Visibility: prevailing_def_ironly virtual Address is taken. References: Referring: _ZTV2LKIN2LRI1I2IEXadL_ZL2ETEEE2LLEE/441 (addr) Availability: available First run: 0 Function flags: body Called by: Calls: _ZN2ANIN2LRI1I2IEXadL_ZL2ETEEE3LLCE4BLKCE2rpEv/504 (1.00 per call) (can throw external) Now with -fno-devirtualize we get: /484 (void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL]) @0x7ffff5a4fa10 Type: function definition analyzed Visibility: prevailing_def_ironly virtual Address is taken. References: Referring: _ZTV2LKIN2LRI1I2IEXadL_ZL2ETEEE2LLEE/441 (addr) Availability: available First run: 0 Function flags: body Called by: Calls: Polymorphic indirect call of type struct RE token:0(1.00 per call) (can throw external) nothing known So it is simply devirtualization of: ;; Function void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL] (_ZN2LKIN2LRI1I2IEXadL_ZL2ETEEE2LLEE2rbEv, funcdef_no=1102, decl_uid=24008, cgraph_uid=438, symbol_order=484) void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL] (struct LK * const this) { struct RE * _1; int (*__vtbl_ptr_type) () * _3; int (*__vtbl_ptr_type) () _4; <bb 2>: _1 = &MEM[(struct LL *)0B].D.25771.D.25733; _3 = MEM[(struct RE *)0B]._vptr.RE; _4 = *_3; OBJ_TYPE_REF(_4;(struct RE)_1->0) (_1); return; } to ;; Function void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL] (_ZN2LKIN2LRI1I2IEXadL_ZL2ETEEE2LLEE2rbEv, funcdef_no=1102, decl_uid=24008, cgraph_uid=438, symbol_order=484) void LK<T>::rb() [with T = LR<I, IE, ((const char*)(& ET))>::LL] (struct LK * const this) { struct RE * _1; <bb 2>: _1 = &MEM[(struct LL *)0B].D.25771.D.25733; AN<LR<I, IE, ((const char*)(& ET))>::LLC, BLKC>::rp (_1); return; } which seems legit to me. Generally you need to provide definitions for virtual functions you declare. Jason, can you please take a look if that is really a non-bug?