diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-08-31 10:03:45 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-08-31 10:03:45 +0200 |
commit | c0957cfe1c73ecb6c96314e45e7d29b4199b20d6 (patch) | |
tree | 96a747f7196baa335cf83ff160527bb8333ca9e3 /odb/validator.cxx | |
parent | ed52acc5e65dd9ea2fb2d9c851c2faa61d5cb2d9 (diff) |
Add support for virtual data members
New test: common/virtual.
Diffstat (limited to 'odb/validator.cxx')
-rw-r--r-- | odb/validator.cxx | 97 |
1 files changed, 56 insertions, 41 deletions
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<semantics::class_&> (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_; |