aboutsummaryrefslogtreecommitdiff
path: root/odb/validator.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-08-31 10:03:45 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-08-31 10:03:45 +0200
commitc0957cfe1c73ecb6c96314e45e7d29b4199b20d6 (patch)
tree96a747f7196baa335cf83ff160527bb8333ca9e3 /odb/validator.cxx
parented52acc5e65dd9ea2fb2d9c851c2faa61d5cb2d9 (diff)
Add support for virtual data members
New test: common/virtual.
Diffstat (limited to 'odb/validator.cxx')
-rw-r--r--odb/validator.cxx97
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_;