enable -Werror=suggest-override

*accidentally* overriding a function is almost guaranteed to be an
error. overriding a function without labeling it as such is merely
bad style, but bad style that makes the code harder to understand.

Change-Id: Ic0594f3d1604ab6b3c1a75cb5facc246effe45f0
This commit is contained in:
eldritch horrors 2024-07-22 17:15:57 +02:00
parent 0463cf2aef
commit c74eb81356
5 changed files with 22 additions and 19 deletions

View file

@ -445,6 +445,7 @@ add_project_arguments(
'-Werror=unused-result', '-Werror=unused-result',
'-Wdeprecated-copy', '-Wdeprecated-copy',
'-Wignored-qualifiers', '-Wignored-qualifiers',
'-Werror=suggest-override',
# Enable assertions in libstdc++ by default. Harmless on libc++. Benchmarked # Enable assertions in libstdc++ by default. Harmless on libc++. Benchmarked
# at ~1% overhead in `nix search`. # at ~1% overhead in `nix search`.
# #

View file

@ -82,28 +82,28 @@ class JSONSax : nlohmann::json_sax<json> {
public: public:
JSONSax(EvalState & state, Value & v) : state(state), rs(new JSONState(&v)) {}; JSONSax(EvalState & state, Value & v) : state(state), rs(new JSONState(&v)) {};
bool null() bool null() override
{ {
rs->value(state).mkNull(); rs->value(state).mkNull();
rs->add(); rs->add();
return true; return true;
} }
bool boolean(bool val) bool boolean(bool val) override
{ {
rs->value(state).mkBool(val); rs->value(state).mkBool(val);
rs->add(); rs->add();
return true; return true;
} }
bool number_integer(number_integer_t val) bool number_integer(number_integer_t val) override
{ {
rs->value(state).mkInt(val); rs->value(state).mkInt(val);
rs->add(); rs->add();
return true; return true;
} }
bool number_unsigned(number_unsigned_t val_) bool number_unsigned(number_unsigned_t val_) override
{ {
if (val_ > std::numeric_limits<NixInt::Inner>::max()) { if (val_ > std::numeric_limits<NixInt::Inner>::max()) {
throw Error("unsigned json number %1% outside of Nix integer range", val_); throw Error("unsigned json number %1% outside of Nix integer range", val_);
@ -114,14 +114,14 @@ public:
return true; return true;
} }
bool number_float(number_float_t val, const string_t & s) bool number_float(number_float_t val, const string_t & s) override
{ {
rs->value(state).mkFloat(val); rs->value(state).mkFloat(val);
rs->add(); rs->add();
return true; return true;
} }
bool string(string_t & val) bool string(string_t & val) override
{ {
rs->value(state).mkString(val); rs->value(state).mkString(val);
rs->add(); rs->add();
@ -129,7 +129,7 @@ public:
} }
#if NLOHMANN_JSON_VERSION_MAJOR >= 3 && NLOHMANN_JSON_VERSION_MINOR >= 8 #if NLOHMANN_JSON_VERSION_MAJOR >= 3 && NLOHMANN_JSON_VERSION_MINOR >= 8
bool binary(binary_t&) bool binary(binary_t&) override
{ {
// This function ought to be unreachable // This function ought to be unreachable
assert(false); assert(false);
@ -137,35 +137,37 @@ public:
} }
#endif #endif
bool start_object(std::size_t len) bool start_object(std::size_t len) override
{ {
rs = std::make_unique<JSONObjectState>(std::move(rs)); rs = std::make_unique<JSONObjectState>(std::move(rs));
return true; return true;
} }
bool key(string_t & name) bool key(string_t & name) override
{ {
dynamic_cast<JSONObjectState*>(rs.get())->key(name, state); dynamic_cast<JSONObjectState*>(rs.get())->key(name, state);
return true; return true;
} }
bool end_object() { bool end_object() override {
rs = rs->resolve(state); rs = rs->resolve(state);
rs->add(); rs->add();
return true; return true;
} }
bool end_array() { bool end_array() override {
return end_object(); return end_object();
} }
bool start_array(size_t len) { bool start_array(size_t len) override {
rs = std::make_unique<JSONListState>(std::move(rs), rs = std::make_unique<JSONListState>(std::move(rs),
len != std::numeric_limits<size_t>::max() ? len : 128); len != std::numeric_limits<size_t>::max() ? len : 128);
return true; return true;
} }
bool parse_error(std::size_t, const std::string&, const nlohmann::detail::exception& ex) { bool
parse_error(std::size_t, const std::string &, const nlohmann::detail::exception & ex) override
{
throw JSONParseError("%s", ex.what()); throw JSONParseError("%s", ex.what());
} }
}; };

View file

@ -976,7 +976,7 @@ bool LocalDerivationGoal::isAllowed(const DerivedPath & req)
struct RestrictedStoreConfig : virtual LocalFSStoreConfig struct RestrictedStoreConfig : virtual LocalFSStoreConfig
{ {
using LocalFSStoreConfig::LocalFSStoreConfig; using LocalFSStoreConfig::LocalFSStoreConfig;
const std::string name() { return "Restricted Store"; } const std::string name() override { return "Restricted Store"; }
}; };
/* A wrapper around LocalStore that only allows building/querying of /* A wrapper around LocalStore that only allows building/querying of

View file

@ -158,7 +158,7 @@ struct TunnelSink : Sink
{ {
Sink & to; Sink & to;
TunnelSink(Sink & to) : to(to) { } TunnelSink(Sink & to) : to(to) { }
void operator () (std::string_view data) void operator () (std::string_view data) override
{ {
to << STDERR_WRITE << data; to << STDERR_WRITE << data;
} }

View file

@ -211,7 +211,7 @@ struct TeeSink : Sink
{ {
Sink & sink1, & sink2; Sink & sink1, & sink2;
TeeSink(Sink & sink1, Sink & sink2) : sink1(sink1), sink2(sink2) { } TeeSink(Sink & sink1, Sink & sink2) : sink1(sink1), sink2(sink2) { }
virtual void operator () (std::string_view data) virtual void operator () (std::string_view data) override
{ {
sink1(data); sink1(data);
sink2(data); sink2(data);
@ -228,7 +228,7 @@ struct TeeSource : Source
Sink & sink; Sink & sink;
TeeSource(Source & orig, Sink & sink) TeeSource(Source & orig, Sink & sink)
: orig(orig), sink(sink) { } : orig(orig), sink(sink) { }
size_t read(char * data, size_t len) size_t read(char * data, size_t len) override
{ {
size_t n = orig.read(data, len); size_t n = orig.read(data, len);
sink({data, n}); sink({data, n});
@ -245,7 +245,7 @@ struct SizedSource : Source
size_t remain; size_t remain;
SizedSource(Source & orig, size_t size) SizedSource(Source & orig, size_t size)
: orig(orig), remain(size) { } : orig(orig), remain(size) { }
size_t read(char * data, size_t len) size_t read(char * data, size_t len) override
{ {
if (this->remain <= 0) { if (this->remain <= 0) {
throw EndOfFile("sized: unexpected end-of-file"); throw EndOfFile("sized: unexpected end-of-file");
@ -338,7 +338,7 @@ struct GeneratorSource : Source
{ {
GeneratorSource(Generator<Bytes> && g) : g(std::move(g)) {} GeneratorSource(Generator<Bytes> && g) : g(std::move(g)) {}
virtual size_t read(char * data, size_t len) virtual size_t read(char * data, size_t len) override
{ {
// we explicitly do not poll the generator multiple times to fill the // we explicitly do not poll the generator multiple times to fill the
// buffer, only to produce some output at all. this is allowed by the // buffer, only to produce some output at all. this is allowed by the