Commit 16cb6cf9 authored by Kenton Varda's avatar Kenton Varda

Delete default construcrtor on builders, so that people don't incorrectly try to…

Delete default construcrtor on builders, so that people don't incorrectly try to just declare a Builder on the stack and then start setting its fields.  Instead, a Builder can be explicitly assigned to nullptr, which makes it clearer that it isn't safe to use.
parent c339019b
...@@ -1069,7 +1069,9 @@ private: ...@@ -1069,7 +1069,9 @@ private:
"public:\n" "public:\n"
" typedef ", unqualifiedParentType, " Builds;\n" " typedef ", unqualifiedParentType, " Builds;\n"
"\n" "\n"
" Builder() = default;\n" " Builder() = delete; // Deleted to discourage incorrect usage.\n"
" // You can explicitly initialize to nullptr instead.\n"
" inline Builder(decltype(nullptr)) {}\n"
" inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}\n" " inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}\n"
" inline operator Reader() const { return Reader(_builder.asReader()); }\n" " inline operator Reader() const { return Reader(_builder.asReader()); }\n"
" inline Reader asReader() const { return *this; }\n" " inline Reader asReader() const { return *this; }\n"
......
This diff is collapsed.
...@@ -159,7 +159,9 @@ class Token::Builder { ...@@ -159,7 +159,9 @@ class Token::Builder {
public: public:
typedef Token Builds; typedef Token Builds;
Builder() = default; Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); } inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; } inline Reader asReader() const { return *this; }
...@@ -292,7 +294,9 @@ class Statement::Builder { ...@@ -292,7 +294,9 @@ class Statement::Builder {
public: public:
typedef Statement Builds; typedef Statement Builds;
Builder() = default; Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); } inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; } inline Reader asReader() const { return *this; }
...@@ -382,7 +386,9 @@ class LexedTokens::Builder { ...@@ -382,7 +386,9 @@ class LexedTokens::Builder {
public: public:
typedef LexedTokens Builds; typedef LexedTokens Builds;
Builder() = default; Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); } inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; } inline Reader asReader() const { return *this; }
...@@ -443,7 +449,9 @@ class LexedStatements::Builder { ...@@ -443,7 +449,9 @@ class LexedStatements::Builder {
public: public:
typedef LexedStatements Builds; typedef LexedStatements Builds;
Builder() = default; Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); } inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; } inline Reader asReader() const { return *this; }
......
...@@ -1031,7 +1031,7 @@ private: ...@@ -1031,7 +1031,7 @@ private:
StructLayout::StructOrGroup& fieldScope, StructLayout::StructOrGroup& fieldScope,
bool isInUnion) bool isInUnion)
: parent(&parent), codeOrder(codeOrder), isInUnion(isInUnion), : parent(&parent), codeOrder(codeOrder), isInUnion(isInUnion),
decl(decl), fieldScope(&fieldScope) {} decl(decl), node(nullptr), fieldScope(&fieldScope) {}
inline MemberInfo(MemberInfo& parent, uint codeOrder, inline MemberInfo(MemberInfo& parent, uint codeOrder,
const Declaration::Reader& decl, const Declaration::Reader& decl,
schema::Node::Builder node, schema::Node::Builder node,
......
...@@ -1608,9 +1608,7 @@ ReaderFor<typeName> DynamicValue::Reader::AsImpl<typeName>::apply(const Reader& ...@@ -1608,9 +1608,7 @@ ReaderFor<typeName> DynamicValue::Reader::AsImpl<typeName>::apply(const Reader&
return reader.name##Value; \ return reader.name##Value; \
} \ } \
BuilderFor<typeName> DynamicValue::Builder::AsImpl<typeName>::apply(Builder& builder) { \ BuilderFor<typeName> DynamicValue::Builder::AsImpl<typeName>::apply(Builder& builder) { \
KJ_REQUIRE(builder.type == discrim, "Value type mismatch.") { \ KJ_REQUIRE(builder.type == discrim, "Value type mismatch."); \
return BuilderFor<typeName>(); \
} \
return builder.name##Value; \ return builder.name##Value; \
} }
......
...@@ -187,7 +187,8 @@ class DynamicObject::Builder: public kj::DisallowConstCopy { ...@@ -187,7 +187,8 @@ class DynamicObject::Builder: public kj::DisallowConstCopy {
public: public:
typedef DynamicObject Builds; typedef DynamicObject Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
Builder(Builder&) = default; Builder(Builder&) = default;
Builder(Builder&&) = default; Builder(Builder&&) = default;
...@@ -276,7 +277,8 @@ class DynamicStruct::Builder { ...@@ -276,7 +277,8 @@ class DynamicStruct::Builder {
public: public:
typedef DynamicStruct Builds; typedef DynamicStruct Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::STRUCT>> template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::STRUCT>>
inline Builder(T&& value): Builder(toDynamic(value)) {} inline Builder(T&& value): Builder(toDynamic(value)) {}
...@@ -428,7 +430,8 @@ class DynamicList::Builder { ...@@ -428,7 +430,8 @@ class DynamicList::Builder {
public: public:
typedef DynamicList Builds; typedef DynamicList Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::LIST>> template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::LIST>>
inline Builder(T&& value): Builder(toDynamic(value)) {} inline Builder(T&& value): Builder(toDynamic(value)) {}
......
...@@ -94,6 +94,8 @@ TEST(Encoding, Defaults) { ...@@ -94,6 +94,8 @@ TEST(Encoding, Defaults) {
checkTestMessage(reader.getRoot<TestDefaults>()); checkTestMessage(reader.getRoot<TestDefaults>());
checkTestMessage(readMessageUnchecked<TestDefaults>(nullRoot.words)); checkTestMessage(readMessageUnchecked<TestDefaults>(nullRoot.words));
checkTestMessage(TestDefaults::Reader());
} }
TEST(Encoding, DefaultInitialization) { TEST(Encoding, DefaultInitialization) {
......
...@@ -134,7 +134,8 @@ struct List<T, Kind::PRIMITIVE> { ...@@ -134,7 +134,8 @@ struct List<T, Kind::PRIMITIVE> {
public: public:
typedef List<T> Builds; typedef List<T> Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {} inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); } inline operator Reader() { return Reader(builder.asReader()); }
...@@ -241,7 +242,8 @@ struct List<T, Kind::STRUCT> { ...@@ -241,7 +242,8 @@ struct List<T, Kind::STRUCT> {
public: public:
typedef List<T> Builds; typedef List<T> Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {} inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); } inline operator Reader() { return Reader(builder.asReader()); }
...@@ -371,7 +373,8 @@ struct List<List<T>, Kind::LIST> { ...@@ -371,7 +373,8 @@ struct List<List<T>, Kind::LIST> {
public: public:
typedef List<List<T>> Builds; typedef List<List<T>> Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {} inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); } inline operator Reader() { return Reader(builder.asReader()); }
...@@ -488,7 +491,8 @@ struct List<T, Kind::BLOB> { ...@@ -488,7 +491,8 @@ struct List<T, Kind::BLOB> {
public: public:
typedef List<T> Builds; typedef List<T> Builds;
Builder() = default; Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {} inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); } inline operator Reader() { return Reader(builder.asReader()); }
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment