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

Reply via email to