diff options
author | Jose <jose@zeroc.com> | 2013-07-31 18:42:40 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2013-07-31 18:42:40 +0200 |
commit | 2391dbfcca87486c5809b6e7bce00541bd1d5d80 (patch) | |
tree | 6ee7fbe6bf87e6b1404ec13305cac93a72816066 /cpp/src/slice2cpp/Gen.cpp | |
parent | ICE-5330 - reset "/dev/urandom" state at fork. (diff) | |
download | ice-2391dbfcca87486c5809b6e7bce00541bd1d5d80.tar.bz2 ice-2391dbfcca87486c5809b6e7bce00541bd1d5d80.tar.xz ice-2391dbfcca87486c5809b6e7bce00541bd1d5d80.zip |
Fixed ICE-5395 - invalid code generated with ["cpp:virtual"]
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index d1effc81427..caf5ddcb89f 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -4762,7 +4762,7 @@ Slice::Gen::ObjectVisitor::emitGCClearCode(const TypePtr& p, const string& prefi } bool -Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, bool virtualInheritance) +Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, bool virtualInheritance, bool direct) { DataMemberList allDataMembers = p->allDataMembers(); if(allDataMembers.empty()) @@ -4770,18 +4770,23 @@ Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, boo return false; } - if(virtualInheritance) + ClassList bases = p->bases(); + if(!bases.empty() && !bases.front()->isInterface()) { - ClassList bases = p->bases(); - if(!bases.empty() && !bases.front()->isInterface()) + if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"), false)) { - if(emitVirtualBaseInitializers(bases.front(), virtualInheritance)) - { - H << ','; - } + H << ','; } } + // + // Do not call non direct base classes constructor if not using virtual inheritance. + // + if(!direct && !virtualInheritance) + { + return false; + } + string upcall = "("; for(DataMemberList::const_iterator q = allDataMembers.begin(); q != allDataMembers.end(); ++q) { @@ -4828,7 +4833,7 @@ Slice::Gen::ObjectVisitor::emitOneShotConstructor(const ClassDefPtr& p) ClassDefPtr base; if(!bases.empty() && !bases.front()->isInterface()) { - if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"))) + if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"), true)) { if(!dataMembers.empty()) { |