/*
 * Copyright (c) 2016 - present Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

class Polygon {
 protected:
  int width, height;

 public:
  virtual ~Polygon();
  void set_values(int a, int b) {
    width = a;
    height = b;
  }
  virtual int area() { return 0; }
};

class Rectangle : public Polygon {
 public:
  ~Rectangle();
  int area() { return width * height; }
};

class Triangle : public Polygon {
 public:
  ~Triangle(){};
  int area() {
    int x = width * height;
    return x - 10;
  }
};

int rect_area() {
  Rectangle rect;
  Polygon* ppoly1 = ▭
  ppoly1->set_values(4, 5);
  return 1 / (ppoly1->area() - 20);
}

int tri_area() {
  Triangle trgl;
  Polygon poly;
  Polygon* ppoly2 = &trgl;
  ppoly2->set_values(4, 5);
  return 1 / (ppoly2->area() - 10);
}

int poly_area() {
  Polygon poly;
  Polygon* ppoly3 = &poly;
  return 1 / ppoly3->area();
}

int tri_not_virtual_area() {
  Triangle trgl;
  Polygon poly;
  Polygon* ppoly2 = &trgl;
  ppoly2->set_values(4, 5);
  return 1 / ppoly2->Polygon::area();
}

// dynamic dispatch in this case still doesn't work,
// one need special dealing with names for destructors.
// But the call gets the virtual flag.
void call_virtual_destructor() {
  Polygon* trgl = new Triangle;
  delete trgl;
}