summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cpp/Gen.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2013-07-31 18:42:40 +0200
committerJose <jose@zeroc.com>2013-07-31 18:42:40 +0200
commit2391dbfcca87486c5809b6e7bce00541bd1d5d80 (patch)
tree6ee7fbe6bf87e6b1404ec13305cac93a72816066 /cpp/src/slice2cpp/Gen.cpp
parentICE-5330 - reset "/dev/urandom" state at fork. (diff)
downloadice-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.cpp23
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())
{