Viewing file: devirt-29.C (1.25 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do run { target c++11 } } */ /* There is a devirtualizable call. In PR60306 we deduced wrong target to cxa_pure_virtual. For gcc 4.10 we temporarily disable the devirtualization. */ /* { dg-options "-O3" } */
#include <vector>
using std::vector;
class Object { public:
virtual Object* clone() const =0;
virtual int type() const {return 0;}
Object& operator=(const Object&) {return *this;}
Object() {} Object(const Object&) {} virtual ~Object() {} };
Object* f(const Object&o) { return o.clone(); }
template<typename T> class Box: public Object, public T { public: Box<T>* clone() const {return new Box<T>(*this);}
Box<T>& operator=(const Box<T>& t) { T::operator=(t); return *this; }
Box<T>& operator=(const T& t) { T::operator=(t); return *this; }
Box() = default; Box(const Box<T>&) = default; explicit Box(const T& t):T(t) {} };
template <typename T> using Vector = Box<vector<T>>;
typedef Vector<int> OVector;
OVector edges_connecting_to_node(int n) { OVector branch_list_; for(int i=0;i<n;i++) branch_list_.push_back(i);
return branch_list_; }
int main(int argc,char* argv[]) { for(int n=0; n < argc; n++) { auto x = edges_connecting_to_node(1); x.clone(); f(x); } }
|