(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
analyzer/
infinite-recursion-1.C
class widget
{
public:
  virtual void draw ()
  {
    /* no-op */
  }
};

class foo_widget : public widget
{
public:
  void draw ();
};

void foo_widget::draw ()
{
  // Bogus attempt to chain up to base class leading to infinite recursion:
  foo_widget::draw (); /* { dg-warning "infinite recursion" } */

  // [...snip...]
}

/* Infinite recursion due to a buggy "operator int".  */

class boxed_int
{
  int m_val;
public:
  operator int ();
};

boxed_int::operator int ()
{
  return *this; /* { dg-warning "infinite recursion" } */
}

template <typename T>
class buggy_getter
{
public:
  T get_value () const
  {
    return get_value (); /* { dg-warning "infinite recursion" } */
  }
};

int test_buggy_getter (buggy_getter<int> g)
{
  return g.get_value ();
}

/* Copy of g++.dg/warn/Winfinite-recursion.C  */

template <typename D>
struct C
{
  void foo ()
  {
    static_cast<D *>(this)->foo (); /* { dg-warning "-Wanalyzer-infinite-recursion" } */
  }
};

struct D : C<D>
{
  // this is missing:
  // void foo() {}
};

void f (D *d)
{
  d->foo ();
}


struct E : C<D>
{
  void foo() {}
};

void g (E *e)
{
  e->foo ();
}