From c0957cfe1c73ecb6c96314e45e7d29b4199b20d6 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 31 Aug 2012 10:03:45 +0200 Subject: Add support for virtual data members New test: common/virtual. --- odb/validator.cxx | 97 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 41 deletions(-) (limited to 'odb/validator.cxx') diff --git a/odb/validator.cxx b/odb/validator.cxx index 0f67100..55f7edf 100644 --- a/odb/validator.cxx +++ b/odb/validator.cxx @@ -54,8 +54,23 @@ namespace virtual void traverse (type& m) { - if (transient (m)) - return; + semantics::class_& c (dynamic_cast (m.scope ())); + + // If the class is marked transient, then mark each non-virtual + // data member as transient. + // + { + bool t (transient (m)); + + if (!t && c.count ("transient") && !m.count ("virtual")) + { + m.set ("transient", true); + t = true; + } + + if (t) + return; + } count_++; semantics::names* hint; @@ -369,6 +384,19 @@ namespace } } + // Check members. + // + member_.count_ = 0; + names (c); + + if (member_.count_ == 0 && !base) + { + os << c.file () << ":" << c.line () << ":" << c.column () << ":" + << " error: no persistent data members in the class" << endl; + + valid_ = false; + } + // Check special members. // semantics::data_member* id (0); @@ -543,19 +571,6 @@ namespace if (poly_root != 0) c.set ("polymorphic-root", poly_root); - // Check members. - // - member_.count_ = 0; - names (c); - - if (member_.count_ == 0 && !base) - { - os << c.file () << ":" << c.line () << ":" << c.column () << ":" - << " error: no persistent data members in the class" << endl; - - valid_ = false; - } - // Update features set based on this object. // if (class_file (c) == unit.file ()) @@ -647,6 +662,19 @@ namespace } } + // Check members. + // + member_.count_ = 0; + names (c); + + if (member_.count_ == 0) + { + os << c.file () << ":" << c.line () << ":" << c.column () << ":" + << " error: no persistent data members in the class" << endl; + + valid_ = false; + } + // Check id. // semantics::data_member* id (0); @@ -676,19 +704,6 @@ namespace valid_ = false; } - // Check members. - // - member_.count_ = 0; - names (c); - - if (member_.count_ == 0) - { - os << c.file () << ":" << c.line () << ":" << c.column () << ":" - << " error: no persistent data members in the class" << endl; - - valid_ = false; - } - // Update features set based on this view. // if (class_file (c) == unit.file ()) @@ -732,6 +747,19 @@ namespace } } + // Check members. + // + member_.count_ = 0; + names (c); + + if (member_.count_ == 0 && !base) + { + os << c.file () << ":" << c.line () << ":" << c.column () << ":" + << " error: no persistent data members in the class" << endl; + + valid_ = false; + } + // Check id. // semantics::data_member* id (0); @@ -760,19 +788,6 @@ namespace valid_ = false; } - - // Check members. - // - member_.count_ = 0; - names (c); - - if (member_.count_ == 0 && !base) - { - os << c.file () << ":" << c.line () << ":" << c.column () << ":" - << " error: no persistent data members in the class" << endl; - - valid_ = false; - } } bool& valid_; -- cgit v1.1