diff options
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 918e29097a3..73bff267ba7 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -2608,6 +2608,7 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p) bool hasBaseClass = !bases.empty() && !bases.front()->isInterface(); bool override = p->canBeCyclic() && (!hasBaseClass || !bases.front()->canBeCyclic()); + bool hasGCObjectBaseClass = basePreserved || override || preserved; if(!basePreserved && (override || preserved)) { H << ", public ::IceInternal::GCObject"; @@ -2800,11 +2801,23 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p) { H << nl << "virtual ::Ice::ObjectPtr ice_clone() const;"; + if(hasGCObjectBaseClass) + { + C.zeroIndent(); + C << sp; + C << nl << "#if defined(_MSC_VER) && (_MSC_VER >= 1900)"; + C << nl << "# pragma warning(push)"; + C << nl << "# pragma warning(disable:4589)"; + C << nl << "#endif"; + C.restoreIndent(); + } C << nl << "::Ice::ObjectPtr"; C << nl << scoped.substr(2) << "::ice_clone() const"; C << sb; if(!p->isAbstract()) { + + C << nl << "::Ice::Object* __p = new " << name << "(*this);"; C << nl << "return __p;"; } @@ -2816,6 +2829,14 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p) C << nl << "throw ::Ice::CloneNotImplementedException(__FILE__, __LINE__);"; } C << eb; + if(hasGCObjectBaseClass) + { + C.zeroIndent(); + C << nl << "#if defined(_MSC_VER) && (_MSC_VER >= 1900)"; + C << nl << "# pragma warning(pop)"; + C << nl << "#endif"; + C.restoreIndent(); + } } ClassList allBases = p->allBases(); |