https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67650
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |link-failure --- Comment #29 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Vincent from comment #27) > Sorry for the silly check, are you sure you are trying with -O3 or > -fdevirtualize -O2? I've tried both. I'm using x86_64-pc-linux-gnu though. > You can try this with 8.1: > > void *v; > > template <typename T> > struct LK: public BLKC > { > void rb(){((T*)v)->ax();} > static T* st; > }; > > As a replacement to the call to null, and the missing definition problem is > reported. OK now I can reproduce it with trunk. (In reply to Vincent from comment #28) > Other silly check, did you try with my code or your reduced code ? Yours. Here's the reduced form that gives a link-error with trunk: #include <string> template <typename T> struct RE { virtual void rp()=0; void ax(){rp();} }; struct EN : RE<int> { EN(::std::string = ""){} void rp(){} }; template <typename OC> struct AN : RE<OC> { void rp(){} }; template <typename T> struct LK { T* p = nullptr; virtual void rb(){p->ax();} }; template <const char* K> struct LR { virtual ~LR(){} struct LLC { virtual ~LLC(){} }; LK<AN<LLC>> l; }; constexpr char ET[]=""; struct I : EN { LR<ET> _e; }; int main(){new I();} $ ~/gcc/8.1.0/bin/g++ -Wall -O1 -fdevirtualize main.cc main.cc:19:8: warning: ‘void AN<OC>::rp() [with OC = LR<(& ET)>::LLC]’ used but never defined void rp(){} ^~ /tmp/cc4IHAPf.o: In function `LK<AN<LR<&ET>::LLC> >::rb()': main.cc:(.text+0x37): undefined reference to `AN<LR<&ET>::LLC>::rp()' collect2: error: ld returned 1 exit status