diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-01-23 12:21:49 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-01-23 12:30:06 +0200 |
commit | c67f2b63a9769d8ae3a07f78afd0c7dd2873563a (patch) | |
tree | a38f59861153646bc20be54298b23070ed3c25ad /odb/processor.cxx | |
parent | 465a4467adec94bb8fe996732ea378664fcf5e86 (diff) |
Diagnose lack of default constructor in pointed-to objects
Lack of the default constructor will lead to uncompilable generated code.
Diffstat (limited to 'odb/processor.cxx')
-rw-r--r-- | odb/processor.cxx | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/odb/processor.cxx b/odb/processor.cxx index 291dcd3..a6f18e0 100644 --- a/odb/processor.cxx +++ b/odb/processor.cxx @@ -1313,6 +1313,9 @@ namespace } } + bool poly (polymorphic (*c)); + bool abst (abstract (*c)); + // Make sure the pointed-to class is complete. // if (!c->complete ()) @@ -1334,7 +1337,7 @@ namespace // Make sure the pointed-to class is not reuse-abstract. // - if (abstract (*c) && !polymorphic (*c)) + if (abst && !poly) { os << m.file () << ":" << m.line () << ":" << m.column () << ": " << "error: pointed-to class '" << class_fq_name (*c) << "' " @@ -1362,6 +1365,23 @@ namespace throw operation_failed (); } + // Make sure the pointed-to class has a default ctor. Since we will + // use database::load() in the generated code, lack of a default ctor + // will lead to uncompilable generated code. Poly-abstract is Ok. + // + if (!c->default_ctor () && !(abst && poly)) + { + os << m.file () << ":" << m.line () << ":" << m.column () << ": " + << "error: pointed-to class '" << class_fq_name (*c) << "' " + << "has no default constructor" << endl; + + os << c->file () << ":" << c->line () << ":" << c->column () << ": " + << "info: class '" << class_name (*c) << "' is defined here" + << endl; + + throw operation_failed (); + } + // See if this is the inverse side of a bidirectional relationship. // If so, then resolve the member and cache it in the context. // |