summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xsd/cxx/tree/tree-header.cxx17
-rw-r--r--xsd/cxx/tree/tree-source.cxx6
2 files changed, 18 insertions, 5 deletions
diff --git a/xsd/cxx/tree/tree-header.cxx b/xsd/cxx/tree/tree-header.cxx
index 320e0c6..f576645 100644
--- a/xsd/cxx/tree/tree-header.cxx
+++ b/xsd/cxx/tree/tree-header.cxx
@@ -2342,7 +2342,8 @@ namespace CXX
// If renamed name is empty then we do not need to generate
// anything for this type.
//
- if (renamed_type (c, name) && !name)
+ bool renamed (renamed_type (c, name));
+ if (renamed && !name)
return;
SemanticGraph::Context& ctx (c.context ());
@@ -3296,8 +3297,18 @@ namespace CXX
os << "virtual " << name << "*" << endl
<< "_clone (" << flags_type << " f = 0," << endl
- << container << "* c = 0) const" <<
- (c.abstract_p () ? " = 0" : "") << ";"
+ << container << "* c = 0) const";
+
+ // Make the _clone() function pure virtual if the type is
+ // abstract or we are generating a polymorphic base for a
+ // custom implementation (in which case the base must be
+ // inherited from and _clone() overridden).
+ //
+ if (c.abstract_p () ||
+ (renamed && polymorphic && polymorphic_p (c)))
+ os << " = 0";
+
+ os << ";"
<< endl;
// operator=
diff --git a/xsd/cxx/tree/tree-source.cxx b/xsd/cxx/tree/tree-source.cxx
index 5720dbd..96a0286 100644
--- a/xsd/cxx/tree/tree-source.cxx
+++ b/xsd/cxx/tree/tree-source.cxx
@@ -2296,7 +2296,8 @@ namespace CXX
// If renamed name is empty then we do not need to generate
// anything for this type.
//
- if (renamed_type (c, name) && !name)
+ bool renamed (renamed_type (c, name));
+ if (renamed && !name)
return;
SemanticGraph::Context& ctx (c.context ());
@@ -3317,7 +3318,8 @@ namespace CXX
// _clone
//
- if (!c.abstract_p ())
+ if (!(c.abstract_p () ||
+ (renamed && polymorphic && polymorphic_p (c))))
os << name << "* " << name << "::" << endl
<< "_clone (" << flags_type << " f," << endl
<< container << "* c) const"