// icf_virtual_function_folding_test.cc -- a test case for gold

// Copyright (C) 2010-2021 Free Software Foundation, Inc.
// Written by Sriraman Tallam <tmsriram@google.com>.

// This file is part of gold.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

// Foo::fn1 is folded into fn2 with ICF.  Since this file is linked as a
// position independent executable, a dynamic reloc is needed
// for the virtual call fn1 entry in the vtable.  This test makes sure
// the call to Foo::fn1 works correctly after the folding.

int fn2(void *)
{
  return 0xA;
}

namespace
{

class Bar
{
 public:
  virtual ~Bar() { }
  virtual int fn1();
};

int Bar::fn1()
{
  return 123;
}

class Foo : public Bar
{
  virtual int fn1();
};

int Foo::fn1()
{
  return 0xA;
}

Bar* get()
{
  Bar *f = new Foo();
  return f;
}

} // end of anonymous namespace.

int main()
{
  Bar *f = get();
  f->fn1();
  return 0;
}
