diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index daf53846f..51ab1b1e8 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -340,6 +340,9 @@ struct InvalidPathError : EvalError { Path path; InvalidPathError(const Path & path); +#ifdef EXCEPTION_NEEDS_THROW_SPEC + ~InvalidPathError() throw () { }; +#endif }; /* Realise all paths in `context' */ diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 906a959e3..160884ee1 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -8,6 +8,15 @@ #include +/* Before 4.7, gcc's std::exception uses empty throw() specifiers for + * its (virtual) destructor and what() in c++11 mode, in violation of spec + */ +#ifdef __GNUC__ +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7) +#define EXCEPTION_NEEDS_THROW_SPEC +#endif +#endif + namespace nix { @@ -39,8 +48,12 @@ protected: public: unsigned int status; // exit status BaseError(const FormatOrString & fs, unsigned int status = 1); +#ifdef EXCEPTION_NEEDS_THROW_SPEC ~BaseError() throw () { }; const char * what() const throw () { return err.c_str(); } +#else + const char * what() const noexcept { return err.c_str(); } +#endif const string & msg() const { return err; } const string & prefix() const { return prefix_; } BaseError & addPrefix(const FormatOrString & fs);