From 41a45ce8b5085dc34b01741f045a5abafddc8319 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Wed, 14 Jan 2015 21:07:40 -0700 Subject: [PATCH 1/6] Enable warnings (and fix up some things) --- CMakeLists.txt | 8 +++++- include/chaiscript/dispatchkit/any.hpp | 4 ++- .../chaiscript/dispatchkit/boxed_number.hpp | 9 +++++- .../chaiscript/dispatchkit/dispatchkit.hpp | 9 ++++++ .../dispatchkit/proxy_functions.hpp | 4 ++- .../dispatchkit/proxy_functions_detail.hpp | 6 ++-- .../chaiscript/language/chaiscript_common.hpp | 2 ++ .../chaiscript/language/chaiscript_eval.hpp | 28 +++++++++---------- 8 files changed, 49 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 034fb5e..03494a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,7 +152,13 @@ if(MSVC) # how to workaround or fix the error. So I'm disabling it globally. add_definitions(/wd4503) else() - add_definitions(-Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -pedantic ${CPP11_FLAG}) + add_definitions(-Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Woverloaded-virtual -pedantic ${CPP11_FLAG}) + + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_definitions(-Weverything -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables) + else() + add_definitions(-Wnoexcept) + endif() if(APPLE) add_definitions(-Wno-sign-compare) diff --git a/include/chaiscript/dispatchkit/any.hpp b/include/chaiscript/dispatchkit/any.hpp index 7c403b7..8a624b1 100644 --- a/include/chaiscript/dispatchkit/any.hpp +++ b/include/chaiscript/dispatchkit/any.hpp @@ -26,6 +26,8 @@ namespace chaiscript { { } + bad_any_cast(const bad_any_cast &) = default; + virtual ~bad_any_cast() CHAISCRIPT_NOEXCEPT {} /// \brief Description of what error occurred @@ -105,7 +107,7 @@ namespace chaiscript { } } -#if _MSC_VER != 1800 +#if !defined(_MSC_VER) || _MSC_VER != 1800 Any(Any &&) = default; Any &operator=(Any &&t_any) = default; #endif diff --git a/include/chaiscript/dispatchkit/boxed_number.hpp b/include/chaiscript/dispatchkit/boxed_number.hpp index 557a20a..dafe181 100644 --- a/include/chaiscript/dispatchkit/boxed_number.hpp +++ b/include/chaiscript/dispatchkit/boxed_number.hpp @@ -327,7 +327,7 @@ namespace chaiscript return oss.str(); } - + public: Boxed_Number() : bv(Boxed_Value(0)) @@ -340,6 +340,13 @@ namespace chaiscript validate_boxed_number(bv); } + Boxed_Number(const Boxed_Number &) = default; + +#if !defined(_MSC_VER) || _MSC_VER != 1800 + Boxed_Number(Boxed_Number &&) = default; + Boxed_Number& operator=(Boxed_Number &&) = default; +#endif + template explicit Boxed_Number(T t) : bv(Boxed_Value(t)) { diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index dfa167d..99ade8c 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -62,6 +62,8 @@ namespace chaiscript { } + reserved_word_error(const reserved_word_error &) = default; + virtual ~reserved_word_error() CHAISCRIPT_NOEXCEPT {} std::string word() const @@ -82,6 +84,8 @@ namespace chaiscript { } + illegal_name_error(const illegal_name_error &) = default; + virtual ~illegal_name_error() CHAISCRIPT_NOEXCEPT {} std::string name() const @@ -103,6 +107,8 @@ namespace chaiscript { } + name_conflict_error(const name_conflict_error &) = default; + virtual ~name_conflict_error() CHAISCRIPT_NOEXCEPT {} std::string name() const @@ -125,6 +131,7 @@ namespace chaiscript { } + global_non_const(const global_non_const &) = default; virtual ~global_non_const() CHAISCRIPT_NOEXCEPT {} }; } @@ -389,6 +396,8 @@ namespace chaiscript std::set m_reserved_words; State &operator=(const State &) = default; + State() = default; + State(const State &) = default; }; Dispatch_Engine() diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index fba9b4f..350f65b 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -197,6 +197,8 @@ namespace chaiscript : std::runtime_error("Guard evaluation failed") { } + guard_error(const guard_error &) = default; + virtual ~guard_error() CHAISCRIPT_NOEXCEPT { } }; @@ -560,7 +562,7 @@ namespace chaiscript } } else { throw exception::arity_error(static_cast(params.size()), 1); - } + } } private: diff --git a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp index 744d40b..e5c6f3f 100644 --- a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp @@ -42,6 +42,8 @@ namespace chaiscript { } + arity_error(const arity_error &) = default; + virtual ~arity_error() CHAISCRIPT_NOEXCEPT {} int got; @@ -72,7 +74,7 @@ namespace chaiscript template struct Try_Cast { - static void do_try(const std::vector ¶ms, int generation, const Type_Conversions &t_conversions) + static void do_try(const std::vector ¶ms, size_t generation, const Type_Conversions &t_conversions) { boxed_cast(params[generation], &t_conversions); Try_Cast::do_try(params, generation+1, t_conversions); @@ -83,7 +85,7 @@ namespace chaiscript template<> struct Try_Cast<> { - static void do_try(const std::vector &, int, const Type_Conversions &) + static void do_try(const std::vector &, size_t, const Type_Conversions &) { } }; diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 288b0cc..0cd25c2 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -112,6 +112,8 @@ namespace chaiscript reason(t_why) {} + eval_error(const eval_error &) = default; + std::string pretty_print() const { std::ostringstream ss; diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index be9aabc..aec1e91 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -1333,29 +1333,28 @@ namespace chaiscript AST_NodePtr guardnode; - auto d = t_ss.get_parent_locals(); - auto itr = d.find("_current_class_name"); - int class_offset = 0; - if (itr != d.end()) class_offset = -1; + const auto d = t_ss.get_parent_locals(); + const auto itr = d.find("_current_class_name"); + const auto class_offset = (itr != d.end())?-1:0; const std::string & class_name = (itr != d.end())?std::string(boxed_cast(itr->second)):this->children[0]->text; //The first param of a method is always the implied this ptr. std::vector t_param_names{"this"}; - if ((this->children.size() > static_cast(3 + class_offset)) && (this->children[(2 + class_offset)]->identifier == AST_Node_Type::Arg_List)) { - for (const auto &child : this->children[(2 + class_offset)]->children) { + if ((this->children.size() > static_cast(3 + class_offset)) && (this->children[static_cast(2 + class_offset)]->identifier == AST_Node_Type::Arg_List)) { + for (const auto &child : this->children[static_cast(2 + class_offset)]->children) { t_param_names.push_back(child->text); } if (this->children.size() > static_cast(4 + class_offset)) { - guardnode = this->children[(3 + class_offset)]; + guardnode = this->children[static_cast(3 + class_offset)]; } } else { //no parameters if (this->children.size() > static_cast(3 + class_offset)) { - guardnode = this->children[(2 + class_offset)]; + guardnode = this->children[static_cast(2 + class_offset)]; } } @@ -1372,7 +1371,7 @@ namespace chaiscript try { const std::string & l_annotation = this->annotation?this->annotation->text:""; - const std::string & function_name = this->children[(1 + class_offset)]->text; + const std::string & function_name = this->children[static_cast(1 + class_offset)]->text; if (function_name == class_name) { t_ss.add(std::make_shared(class_name, std::make_shared(std::bind(chaiscript::eval::detail::eval_function, @@ -1420,24 +1419,23 @@ namespace chaiscript { const auto &d = t_ss.get_parent_locals(); const auto itr = d.find("_current_class_name"); - int class_offset = 0; - if (itr != d.end()) class_offset = -1; + const auto class_offset = (itr != d.end())?-1:0; std::string class_name = (itr != d.end())?std::string(boxed_cast(itr->second)):this->children[0]->text; try { t_ss.add( std::make_shared( - class_name, + std::move(class_name), fun(std::function(std::bind(&dispatch::Dynamic_Object::get_attr, std::placeholders::_1, - this->children[(1 + class_offset)]->text + this->children[static_cast(1 + class_offset)]->text )) ) - ), this->children[(1 + class_offset)]->text); + ), this->children[static_cast(1 + class_offset)]->text); } catch (const exception::reserved_word_error &) { - throw exception::eval_error("Reserved word used as attribute '" + this->children[(1 + class_offset)]->text + "'"); + throw exception::eval_error("Reserved word used as attribute '" + this->children[static_cast(1 + class_offset)]->text + "'"); } catch (const exception::name_conflict_error &e) { throw exception::eval_error("Attribute redefined '" + e.name() + "'"); } From f95ca75acaaeceaa505ddb48bba0f1ccec9feaac Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 15 Jan 2015 14:24:39 -0700 Subject: [PATCH 2/6] Clean up more warnings with stricter warning levels --- CMakeLists.txt | 2 +- .../chaiscript/dispatchkit/bad_boxed_cast.hpp | 3 +- include/chaiscript/dispatchkit/bootstrap.hpp | 2 +- .../chaiscript/dispatchkit/boxed_number.hpp | 20 +++++++++---- .../chaiscript/dispatchkit/boxed_value.hpp | 2 +- .../dispatchkit/proxy_functions.hpp | 16 +++++------ .../dispatchkit/type_conversions.hpp | 8 ++++-- .../chaiscript/language/chaiscript_common.hpp | 3 +- .../chaiscript/language/chaiscript_engine.hpp | 5 ++-- .../chaiscript/language/chaiscript_parser.hpp | 5 ++-- src/main.cpp | 28 ++++++++++--------- src/test_module.cpp | 5 ++++ unittests/functor_cast_test.cpp | 14 +++++----- unittests/object_lifetime_test2.cpp | 6 ++-- 14 files changed, 71 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03494a1..90d6f84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,7 +155,7 @@ else() add_definitions(-Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Woverloaded-virtual -pedantic ${CPP11_FLAG}) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - add_definitions(-Weverything -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables) + add_definitions(-Weverything -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables -Wno-sign-conversion -Wno-missing-prototypes -Wno-padded) else() add_definitions(-Wnoexcept) endif() diff --git a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp index 648eb41..ca2071b 100644 --- a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp @@ -45,7 +45,8 @@ namespace chaiscript { } - virtual ~bad_boxed_cast() CHAISCRIPT_NOEXCEPT {} + bad_boxed_cast(const bad_boxed_cast &) = default; + virtual ~bad_boxed_cast() CHAISCRIPT_NOEXCEPT = default; /// \brief Description of what error occurred virtual const char * what() const CHAISCRIPT_NOEXCEPT CHAISCRIPT_OVERRIDE diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 3e88daf..c43820f 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -298,7 +298,7 @@ namespace chaiscript } } - static void throw_exception(const Boxed_Value &bv) { + static void throw_exception [[ noreturn ]] (const Boxed_Value &bv) { throw bv; } diff --git a/include/chaiscript/dispatchkit/boxed_number.hpp b/include/chaiscript/dispatchkit/boxed_number.hpp index dafe181..f4264cd 100644 --- a/include/chaiscript/dispatchkit/boxed_number.hpp +++ b/include/chaiscript/dispatchkit/boxed_number.hpp @@ -33,6 +33,15 @@ namespace chaiscript #pragma warning(disable : 4244 4018 4389 4146 4365) #endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wfloat-equal" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#endif + /// \brief Represents any numeric type, generically. Used internally for generic operations between POD values class Boxed_Number { @@ -40,9 +49,6 @@ namespace chaiscript struct boolean { -#ifdef __GNUC__ -#pragma GCC diagnostic ignored "-Wsign-compare" -#endif template static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &) { @@ -850,14 +856,18 @@ namespace chaiscript struct Cast_Helper : Cast_Helper { }; - + /// Cast_Helper for converting from Boxed_Value to Boxed_Number template<> struct Cast_Helper : Cast_Helper { - }; + }; } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + #ifdef CHAISCRIPT_MSVC #pragma warning(pop) #endif diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index c73358c..65ed7a6 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -72,8 +72,8 @@ namespace chaiscript chaiscript::detail::Any m_obj; void *m_data_ptr; const void *m_const_data_ptr; - bool m_is_ref; std::unique_ptr> m_attrs; + bool m_is_ref; }; struct Object_Data diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index 350f65b..61d9d47 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -129,7 +129,7 @@ namespace chaiscript virtual Boxed_Value do_call(const std::vector ¶ms, const Type_Conversions &t_conversions) const = 0; Proxy_Function_Base(std::vector t_types, int t_arity) - : m_types(std::move(t_types)), m_has_arithmetic_param(false), m_arity(t_arity) + : m_types(std::move(t_types)), m_arity(t_arity), m_has_arithmetic_param(false) { for (size_t i = 1; i < m_types.size(); ++i) { @@ -175,8 +175,8 @@ namespace chaiscript } std::vector m_types; - bool m_has_arithmetic_param; int m_arity; + bool m_has_arithmetic_param; }; } @@ -220,11 +220,11 @@ namespace chaiscript std::string t_description = "", Proxy_Function t_guard = Proxy_Function()) : Proxy_Function_Base(build_param_type_list(t_arity), t_arity), - m_f(std::move(t_f)), m_arity(t_arity), m_description(std::move(t_description)), m_guard(std::move(t_guard)), m_parsenode(std::move(t_parsenode)) + m_guard(std::move(t_guard)), m_parsenode(std::move(t_parsenode)), m_description(std::move(t_description)), m_f(std::move(t_f)) { } - virtual ~Dynamic_Proxy_Function() {} + virtual ~Dynamic_Proxy_Function() = default; virtual bool operator==(const Proxy_Function_Base &rhs) const CHAISCRIPT_OVERRIDE { @@ -311,11 +311,10 @@ namespace chaiscript return types; } - std::function &)> m_f; - int m_arity; - std::string m_description; Proxy_Function m_guard; AST_NodePtr m_parsenode; + std::string m_description; + std::function &)> m_f; }; /** @@ -591,7 +590,8 @@ namespace chaiscript { } - virtual ~dispatch_error() CHAISCRIPT_NOEXCEPT {} + dispatch_error(const dispatch_error &) = default; + virtual ~dispatch_error() CHAISCRIPT_NOEXCEPT = default; std::vector parameters; std::vector functions; diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index 59ad5e3..6fd9a17 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -44,7 +44,9 @@ namespace chaiscript { } - virtual ~bad_boxed_dynamic_cast() CHAISCRIPT_NOEXCEPT {} + bad_boxed_dynamic_cast(const bad_boxed_dynamic_cast &) = default; + + virtual ~bad_boxed_dynamic_cast() CHAISCRIPT_NOEXCEPT = default; }; class bad_boxed_type_cast : public bad_boxed_cast @@ -66,7 +68,9 @@ namespace chaiscript { } - virtual ~bad_boxed_type_cast() CHAISCRIPT_NOEXCEPT {} + bad_boxed_type_cast(const bad_boxed_type_cast &) = default; + + virtual ~bad_boxed_type_cast() CHAISCRIPT_NOEXCEPT = default; }; } diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 0cd25c2..fb1d213 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -397,7 +397,8 @@ namespace chaiscript : std::runtime_error("File Not Found: " + t_filename) { } - virtual ~file_not_found_error() CHAISCRIPT_NOEXCEPT {} + file_not_found_error(const file_not_found_error &) = default; + virtual ~file_not_found_error() CHAISCRIPT_NOEXCEPT = default; }; } diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 7fa4dd6..6478c59 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -61,9 +61,8 @@ namespace chaiscript { } - virtual ~load_module_error() CHAISCRIPT_NOEXCEPT - { - } + load_module_error(const load_module_error &) = default; + virtual ~load_module_error() CHAISCRIPT_NOEXCEPT = default; }; } diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index f090ba6..8dda17c 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -223,8 +223,8 @@ namespace chaiscript t_t->end.column = pos_col_stop; if (is_deep) { - t_t->children.assign(m_match_stack.begin() + t_match_start, m_match_stack.end()); - m_match_stack.erase(m_match_stack.begin() + t_match_start, m_match_stack.end()); + t_t->children.assign(m_match_stack.begin() + static_cast(t_match_start), m_match_stack.end()); + m_match_stack.erase(m_match_stack.begin() + static_cast(t_match_start), m_match_stack.end()); } /// \todo fix the fact that a successful match that captured no ast_nodes doesn't have any real start position @@ -1910,6 +1910,7 @@ namespace chaiscript case(AST_Node_Type::Bitwise_Xor) : case(AST_Node_Type::Bitwise_Or) : case(AST_Node_Type::Comparison) : + assert(m_match_stack.size() > 1); m_match_stack.erase(m_match_stack.begin() + m_match_stack.size() - 2, m_match_stack.begin() + m_match_stack.size() - 1); build_match(std::make_shared(oper->text), prev_stack_top); break; diff --git a/src/main.cpp b/src/main.cpp index dead221..5c3be99 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,10 @@ #include #include +#ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS +#endif + #include #ifdef READLINE_AVAILABLE @@ -18,7 +21,7 @@ char *mystrdup (const char *s) { size_t len = strlen(s); // Space for length plus nul - char *d = static_cast(malloc (len+1)); + char *d = static_cast(malloc (len+1)); if (d == nullptr) return nullptr; // No memory #ifdef CHAISCRIPT_MSVC strcpy_s(d, len, s); // Copy the characters @@ -152,10 +155,6 @@ void help(int n) { } } -void version(int){ - std::cout << "chai: compiled " << __TIME__ << " " << __DATE__ << '\n'; -} - bool throws_exception(const std::function &f) { try { @@ -214,11 +213,11 @@ std::string get_next_command() { // We have to wrap exit with our own because Clang has a hard time with // function pointers to functions with special attributes (system exit being marked NORETURN) -void myexit(int return_val) { +void myexit [[ noreturn ]] (int return_val) { exit(return_val); } -void interactive(chaiscript::ChaiScript& chai) +void interactive [[ noreturn ]] (chaiscript::ChaiScript& chai) { using_history(); @@ -287,7 +286,6 @@ int main(int argc, char *argv[]) chai.add(chaiscript::fun(&myexit), "exit"); chai.add(chaiscript::fun(&myexit), "quit"); chai.add(chaiscript::fun(&help), "help"); - chai.add(chaiscript::fun(&version), "version"); chai.add(chaiscript::fun(&throws_exception), "throws_exception"); chai.add(chaiscript::fun(&get_eval_error), "get_eval_error"); @@ -317,7 +315,7 @@ int main(int argc, char *argv[]) arg += line + '\n' ; } } else if ( arg == "-v" || arg == "--version" ) { - arg = "version(0)" ; + arg = "version()" ; } else if ( arg == "-h" || arg == "--help" ) { arg = "help(-1)"; } else if ( arg == "-i" || arg == "--interactive" ) { @@ -332,10 +330,14 @@ int main(int argc, char *argv[]) chaiscript::Boxed_Value val ; try { switch ( mode ) { - case eInteractive : interactive(chai); break; - case eCommand : val = chai.eval(arg); break; - case eFile : val = chai.eval_file(arg); break; - default : std::cout << "Unrecognized execution mode\n"; return EXIT_FAILURE; + case eInteractive: + // interactive never returns, no need for break; + interactive(chai); + case eCommand: + val = chai.eval(arg); + break; + case eFile: + val = chai.eval_file(arg); } } catch (const chaiscript::exception::eval_error &ee) { diff --git a/src/test_module.cpp b/src/test_module.cpp index cb95326..aeb1159 100644 --- a/src/test_module.cpp +++ b/src/test_module.cpp @@ -10,6 +10,7 @@ class TestBaseType TestBaseType() : val(10), const_val(15) { } TestBaseType(int) : val(10), const_val(15) {} TestBaseType(int *) : val(10), const_val(15) {} + TestBaseType(const TestBaseType &) = default; virtual ~TestBaseType() {} virtual int func() { return 0; } @@ -62,6 +63,8 @@ class TestDerivedType : public TestBaseType { public: virtual ~TestDerivedType() {} + TestDerivedType(const TestDerivedType &) = default; + TestDerivedType() = default; virtual int func() CHAISCRIPT_OVERRIDE { return 1; } int derived_only_func() { return 19; } @@ -72,6 +75,8 @@ class TestDerivedType : public TestBaseType class TestMoreDerivedType : public TestDerivedType { public: + TestMoreDerivedType(const TestMoreDerivedType &) = default; + TestMoreDerivedType() = default; virtual ~TestMoreDerivedType() {} }; diff --git a/unittests/functor_cast_test.cpp b/unittests/functor_cast_test.cpp index 7c76ca2..5fa388f 100644 --- a/unittests/functor_cast_test.cpp +++ b/unittests/functor_cast_test.cpp @@ -1,6 +1,6 @@ #include -double test_call(const std::function &f, int val) +int test_call(const std::function &f, int val) { return f(val); } @@ -9,15 +9,15 @@ int main() { chaiscript::ChaiScript chai; - + chai.add(chaiscript::fun(&test_call), "test_call"); - chai.eval("def func(i) { return i * 3.5; };"); - double d = chai.eval("test_call(func, 3)"); - - if (d == 3 * 3.5) + chai.eval("def func(i) { return i * 6; };"); + int d = chai.eval("test_call(func, 3)"); + + if (d == 3 * 6) { - return EXIT_SUCCESS; + return EXIT_SUCCESS; } else { return EXIT_FAILURE; } diff --git a/unittests/object_lifetime_test2.cpp b/unittests/object_lifetime_test2.cpp index c99b191..31c5858 100644 --- a/unittests/object_lifetime_test2.cpp +++ b/unittests/object_lifetime_test2.cpp @@ -4,9 +4,9 @@ template struct Vector2 { - Vector2() : x(0), y(0) {}; - Vector2(T px, T py) : x(px), y(py) {}; - Vector2(const Vector2& cp) : x(cp.x), y(cp.y) {}; + Vector2() : x(0), y(0) {} + Vector2(T px, T py) : x(px), y(py) {} + Vector2(const Vector2& cp) : x(cp.x), y(cp.y) {} Vector2& operator+=(const Vector2& vec_r) { From 759d6fc42f2e51a3804df949f6bd24359616f391 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 15 Jan 2015 15:15:02 -0700 Subject: [PATCH 3/6] Remove [[ noreturn ]], MSVC14 doesn't yet support attributes? --- CMakeLists.txt | 2 +- include/chaiscript/dispatchkit/bootstrap.hpp | 2 +- samples/fun_call_performance.cpp | 12 +++++------- samples/inheritance.cpp | 2 ++ src/main.cpp | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 90d6f84..4811852 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,7 +155,7 @@ else() add_definitions(-Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Woverloaded-virtual -pedantic ${CPP11_FLAG}) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - add_definitions(-Weverything -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables -Wno-sign-conversion -Wno-missing-prototypes -Wno-padded) + add_definitions(-Weverything -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables -Wno-sign-conversion -Wno-missing-prototypes -Wno-padded -Wno-missing-noreturn) else() add_definitions(-Wnoexcept) endif() diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index c43820f..3e88daf 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -298,7 +298,7 @@ namespace chaiscript } } - static void throw_exception [[ noreturn ]] (const Boxed_Value &bv) { + static void throw_exception(const Boxed_Value &bv) { throw bv; } diff --git a/samples/fun_call_performance.cpp b/samples/fun_call_performance.cpp index a689b5a..e16efaa 100644 --- a/samples/fun_call_performance.cpp +++ b/samples/fun_call_performance.cpp @@ -8,7 +8,10 @@ #include #include +#ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS +#endif + #include #include @@ -154,10 +157,6 @@ void help(int n) { } } -void version(int){ - std::cout << "chai: compiled " << __TIME__ << " " << __DATE__ << std::endl; -} - std::string helloWorld(const std::string &t_name) { return "Hello " + t_name + "!"; @@ -297,7 +296,6 @@ int main(int argc, char *argv[]) chai.add(chaiscript::fun(&myexit), "exit"); chai.add(chaiscript::fun(&myexit), "quit"); chai.add(chaiscript::fun(&help), "help"); - chai.add(chaiscript::fun(&version), "version"); chai.add(chaiscript::fun(&throws_exception), "throws_exception"); chai.add(chaiscript::fun(&get_eval_error), "get_eval_error"); @@ -356,7 +354,7 @@ int main(int argc, char *argv[]) } } else if (arg == "-v" || arg == "--version") { - arg = "version(0)"; + arg = "version()"; } else if (arg == "-h" || arg == "--help") { arg = "help(-1)"; @@ -388,7 +386,7 @@ int main(int argc, char *argv[]) printf("**ChaiScript::time= %.10f\n", elapsed_secs1); break; } - default: std::cout << "Unrecognized execution mode" << std::endl; return EXIT_FAILURE; + } } catch (const chaiscript::exception::eval_error &ee) { diff --git a/samples/inheritance.cpp b/samples/inheritance.cpp index 5bd8c86..e8ef192 100644 --- a/samples/inheritance.cpp +++ b/samples/inheritance.cpp @@ -8,6 +8,8 @@ class BaseClass { } + BaseClass(const BaseClass &) = default; + virtual ~BaseClass() {} virtual std::string doSomething(float, double) const = 0; diff --git a/src/main.cpp b/src/main.cpp index 5c3be99..59e96e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -213,11 +213,11 @@ std::string get_next_command() { // We have to wrap exit with our own because Clang has a hard time with // function pointers to functions with special attributes (system exit being marked NORETURN) -void myexit [[ noreturn ]] (int return_val) { +void myexit(int return_val) { exit(return_val); } -void interactive [[ noreturn ]] (chaiscript::ChaiScript& chai) +void interactive(chaiscript::ChaiScript& chai) { using_history(); @@ -331,8 +331,8 @@ int main(int argc, char *argv[]) try { switch ( mode ) { case eInteractive: - // interactive never returns, no need for break; interactive(chai); + break; case eCommand: val = chai.eval(arg); break; From 9449fca22f52e78fd2b9e18cb75ff200ae4bd66f Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 15 Jan 2015 15:42:35 -0700 Subject: [PATCH 4/6] Memory leak error fixes. Various compiler fixes. --- include/chaiscript/dispatchkit/bad_boxed_cast.hpp | 2 +- include/chaiscript/dispatchkit/proxy_functions.hpp | 4 ++-- include/chaiscript/dispatchkit/type_conversions.hpp | 4 ++-- include/chaiscript/language/chaiscript_common.hpp | 2 +- include/chaiscript/language/chaiscript_engine.hpp | 2 +- src/test_module.cpp | 6 ++++-- unittests/boxed_cast_test.cpp | 5 +++++ 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp index ca2071b..7afc6dc 100644 --- a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp @@ -46,7 +46,7 @@ namespace chaiscript } bad_boxed_cast(const bad_boxed_cast &) = default; - virtual ~bad_boxed_cast() CHAISCRIPT_NOEXCEPT = default; + virtual ~bad_boxed_cast() CHAISCRIPT_NOEXCEPT {} /// \brief Description of what error occurred virtual const char * what() const CHAISCRIPT_NOEXCEPT CHAISCRIPT_OVERRIDE diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index 61d9d47..78b4dee 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -224,7 +224,7 @@ namespace chaiscript { } - virtual ~Dynamic_Proxy_Function() = default; + virtual ~Dynamic_Proxy_Function() {} virtual bool operator==(const Proxy_Function_Base &rhs) const CHAISCRIPT_OVERRIDE { @@ -591,7 +591,7 @@ namespace chaiscript } dispatch_error(const dispatch_error &) = default; - virtual ~dispatch_error() CHAISCRIPT_NOEXCEPT = default; + virtual ~dispatch_error() CHAISCRIPT_NOEXCEPT {} std::vector parameters; std::vector functions; diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index 6fd9a17..d4cf429 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -46,7 +46,7 @@ namespace chaiscript bad_boxed_dynamic_cast(const bad_boxed_dynamic_cast &) = default; - virtual ~bad_boxed_dynamic_cast() CHAISCRIPT_NOEXCEPT = default; + virtual ~bad_boxed_dynamic_cast() CHAISCRIPT_NOEXCEPT {} }; class bad_boxed_type_cast : public bad_boxed_cast @@ -70,7 +70,7 @@ namespace chaiscript bad_boxed_type_cast(const bad_boxed_type_cast &) = default; - virtual ~bad_boxed_type_cast() CHAISCRIPT_NOEXCEPT = default; + virtual ~bad_boxed_type_cast() CHAISCRIPT_NOEXCEPT {} }; } diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index fb1d213..7a6d010 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -398,7 +398,7 @@ namespace chaiscript { } file_not_found_error(const file_not_found_error &) = default; - virtual ~file_not_found_error() CHAISCRIPT_NOEXCEPT = default; + virtual ~file_not_found_error() CHAISCRIPT_NOEXCEPT {} }; } diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 6478c59..a4d354e 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -62,7 +62,7 @@ namespace chaiscript } load_module_error(const load_module_error &) = default; - virtual ~load_module_error() CHAISCRIPT_NOEXCEPT = default; + virtual ~load_module_error() CHAISCRIPT_NOEXCEPT {} }; } diff --git a/src/test_module.cpp b/src/test_module.cpp index aeb1159..2544d53 100644 --- a/src/test_module.cpp +++ b/src/test_module.cpp @@ -9,7 +9,7 @@ class TestBaseType public: TestBaseType() : val(10), const_val(15) { } TestBaseType(int) : val(10), const_val(15) {} - TestBaseType(int *) : val(10), const_val(15) {} + TestBaseType(int *i) : val(10), const_val(15) { } TestBaseType(const TestBaseType &) = default; virtual ~TestBaseType() {} virtual int func() { return 0; } @@ -100,9 +100,11 @@ std::string hello_world() return "Hello World"; } +int global_i = 1; + int *get_new_int() { - return new int(1); + return &global_i; } // MSVC doesn't like that we are using C++ return types from our C declared module diff --git a/unittests/boxed_cast_test.cpp b/unittests/boxed_cast_test.cpp index 4e94471..4635841 100644 --- a/unittests/boxed_cast_test.cpp +++ b/unittests/boxed_cast_test.cpp @@ -265,20 +265,25 @@ bool pointer_test(const T& default_value, const T& new_value) if (p != (*result) ) { std::cerr << "Pointer passed in different than one returned\n"; + delete p; return false; } if (*p != *(*result) ) { std::cerr << "Somehow dereferenced pointer values are not the same?\n"; + delete p; return false; } + delete p; return true; } catch (const exception::bad_boxed_cast &) { std::cerr << "Bad boxed cast performing ** to ** test\n"; + delete p; return false; } catch (...) { std::cerr << "Unknown exception performing ** to ** test\n"; + delete p; return false; } From adfc56db8b752adc07e152b223080541c8d93685 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 15 Jan 2015 17:49:26 -0700 Subject: [PATCH 5/6] Warning cleanups --- src/test_module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test_module.cpp b/src/test_module.cpp index 2544d53..b161817 100644 --- a/src/test_module.cpp +++ b/src/test_module.cpp @@ -9,7 +9,7 @@ class TestBaseType public: TestBaseType() : val(10), const_val(15) { } TestBaseType(int) : val(10), const_val(15) {} - TestBaseType(int *i) : val(10), const_val(15) { } + TestBaseType(int *) : val(10), const_val(15) { } TestBaseType(const TestBaseType &) = default; virtual ~TestBaseType() {} virtual int func() { return 0; } @@ -100,7 +100,7 @@ std::string hello_world() return "Hello World"; } -int global_i = 1; +static int global_i = 1; int *get_new_int() { From c3f343450d9adbe37ba6c735b817bfb4448f6363 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Fri, 16 Jan 2015 10:10:14 -0700 Subject: [PATCH 6/6] Fix issues found with cppcheck inconclusive --- .decent_ci-Linux.yaml | 2 +- include/chaiscript/chaiscript_threading.hpp | 29 ++++++++++++++++--- .../chaiscript/dispatchkit/bootstrap_stl.hpp | 1 + .../chaiscript/dispatchkit/boxed_number.hpp | 4 ++- .../chaiscript/dispatchkit/dispatchkit.hpp | 13 ++++++--- .../dispatchkit/type_conversions.hpp | 14 ++++++--- .../chaiscript/language/chaiscript_engine.hpp | 18 ++++++------ unittests/object_lifetime_test2.cpp | 3 +- 8 files changed, 60 insertions(+), 24 deletions(-) diff --git a/.decent_ci-Linux.yaml b/.decent_ci-Linux.yaml index 45fdd6f..31c7b52 100644 --- a/.decent_ci-Linux.yaml +++ b/.decent_ci-Linux.yaml @@ -21,5 +21,5 @@ compilers: skip_packaging: true cmake_extra_flags: -DBUILD_SAMPLES:BOOL=ON -DBUILD_PACKAGE:BOOL=ON -DBUILD_TESTING:BOOL=ON - name: cppcheck - compiler_extra_flags: --enable=all -I include --inline-suppr + compiler_extra_flags: --enable=all -I include --inline-suppr -Umax --suppress="*:cmake*" diff --git a/include/chaiscript/chaiscript_threading.hpp b/include/chaiscript/chaiscript_threading.hpp index 485f7ee..cf7aa47 100644 --- a/include/chaiscript/chaiscript_threading.hpp +++ b/include/chaiscript/chaiscript_threading.hpp @@ -82,16 +82,27 @@ namespace chaiscript t().erase(m_key); } - inline T *operator->() const + inline const T *operator->() const { return &(t()[m_key]); } - inline T &operator*() const + inline const T &operator*() const { return t()[m_key]; } + inline T *operator->() + { + return &(t()[m_key]); + } + + inline T &operator*() + { + return t()[m_key]; + } + + void *m_key; private: @@ -117,12 +128,22 @@ namespace chaiscript { } - inline T *operator->() const + inline const T *operator->() const { return get_tls().get(); } - inline T &operator*() const + inline const T &operator*() const + { + return *get_tls(); + } + + inline T *operator->() + { + return get_tls().get(); + } + + inline T &operator*() { return *get_tls(); } diff --git a/include/chaiscript/dispatchkit/bootstrap_stl.hpp b/include/chaiscript/dispatchkit/bootstrap_stl.hpp index dc27fe1..4e787c0 100644 --- a/include/chaiscript/dispatchkit/bootstrap_stl.hpp +++ b/include/chaiscript/dispatchkit/bootstrap_stl.hpp @@ -246,6 +246,7 @@ namespace chaiscript template ModulePtr random_access_container_type(const std::string &/*type*/, ModulePtr m = ModulePtr(new Module())) { + // cppcheck-suppress syntaxError typedef typename ContainerType::reference(ContainerType::*indexoper)(size_t); typedef typename ContainerType::const_reference(ContainerType::*constindexoper)(size_t) const; diff --git a/include/chaiscript/dispatchkit/boxed_number.hpp b/include/chaiscript/dispatchkit/boxed_number.hpp index f4264cd..12cd374 100644 --- a/include/chaiscript/dispatchkit/boxed_number.hpp +++ b/include/chaiscript/dispatchkit/boxed_number.hpp @@ -67,7 +67,7 @@ namespace chaiscript case Operators::not_equal: return const_var(t != u); default: - throw chaiscript::detail::exception::bad_any_cast(); + throw chaiscript::detail::exception::bad_any_cast(); } } }; @@ -560,6 +560,7 @@ namespace chaiscript } } + // cppcheck-suppress operatorEq Boxed_Number operator=(const Boxed_Value &v) { validate_boxed_number(v); @@ -567,6 +568,7 @@ namespace chaiscript return *this; } + // cppcheck-suppress operatorEq Boxed_Number operator=(const Boxed_Number &t_rhs) const { return oper(Operators::assign, this->bv, t_rhs.bv); diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 99ade8c..16d1f2c 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -454,7 +454,7 @@ namespace chaiscript /// Adds a named object to the current scope /// \warning This version does not check the validity of the name /// it is meant for internal use only - void add_object(const std::string &name, const Boxed_Value &obj) const + void add_object(const std::string &name, const Boxed_Value &obj) { if (!get_stack_data().back().insert(std::make_pair(name, obj)).second) { @@ -704,10 +704,10 @@ namespace chaiscript /// std::map get_scripting_objects() const { - Stack_Holder &s = *m_stack_holder; + const Stack_Holder &s = *m_stack_holder; // We don't want the current context, but one up if it exists - StackData &stack = (s.stacks.size()==1)?(s.stacks.back()):(s.stacks[s.stacks.size()-2]); + const StackData &stack = (s.stacks.size()==1)?(s.stacks.back()):(s.stacks[s.stacks.size()-2]); std::map retval; @@ -974,7 +974,12 @@ namespace chaiscript private: /// Returns the current stack /// make const/non const versions - StackData &get_stack_data() const + const StackData &get_stack_data() const + { + return m_stack_holder->stacks.back(); + } + + StackData &get_stack_data() { return m_stack_holder->stacks.back(); } diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index d4cf429..7f396a9 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -217,14 +217,20 @@ namespace chaiscript }; Type_Conversions() - : m_num_types(0), + : m_mutex(), + m_conversions(), + m_convertableTypes(), + m_num_types(0), m_thread_cache(this), m_conversion_saves(this) { } Type_Conversions(const Type_Conversions &t_other) - : m_conversions(t_other.get_conversions()), m_num_types(m_conversions.size()), + : m_mutex(), + m_conversions(t_other.get_conversions()), + m_convertableTypes(), + m_num_types(m_conversions.size()), m_thread_cache(this), m_conversion_saves(this) @@ -370,8 +376,8 @@ namespace chaiscript std::set> m_conversions; std::set m_convertableTypes; std::atomic_size_t m_num_types; - chaiscript::detail::threading::Thread_Storage> m_thread_cache; - chaiscript::detail::threading::Thread_Storage m_conversion_saves; + mutable chaiscript::detail::threading::Thread_Storage> m_thread_cache; + mutable chaiscript::detail::threading::Thread_Storage m_conversion_saves; }; typedef std::shared_ptr Type_Conversion; diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index a4d354e..3c92911 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -370,10 +370,10 @@ namespace chaiscript m_engine.add(fun(&ChaiScript::internal_eval, this), "eval"); m_engine.add(fun(&ChaiScript::internal_eval_ast, this), "eval"); - m_engine.add(fun(&ChaiScript::version_major, this), "version_major"); - m_engine.add(fun(&ChaiScript::version_minor, this), "version_minor"); - m_engine.add(fun(&ChaiScript::version_patch, this), "version_patch"); - m_engine.add(fun(&ChaiScript::version, this), "version"); + m_engine.add(fun(&ChaiScript::version_major), "version_major"); + m_engine.add(fun(&ChaiScript::version_minor), "version_minor"); + m_engine.add(fun(&ChaiScript::version_patch), "version_patch"); + m_engine.add(fun(&ChaiScript::version), "version"); m_engine.add(fun(&ChaiScript::add_global_const, this), "add_global_const"); m_engine.add(fun(&ChaiScript::add_global, this), "add_global"); @@ -490,22 +490,22 @@ namespace chaiscript build_eval_system(ModulePtr()); } - int version_major() const + static int version_major() { return chaiscript::version_major; } - int version_minor() const + static int version_minor() { return chaiscript::version_minor; } - int version_patch() const + static int version_patch() { return chaiscript::version_patch; } - std::string version() const + static std::string version() { std::stringstream ss; ss << version_major() << "." << version_minor() << "." << version_patch(); @@ -604,7 +604,7 @@ namespace chaiscript /// chaiscript::ChaiScript chai; /// chaiscript::ChaiScript::State s = chai.get_state(); // represents bootstrapped initial state /// \endcode - State get_state() + State get_state() const { chaiscript::detail::threading::lock_guard l(m_use_mutex); chaiscript::detail::threading::shared_lock l2(m_mutex); diff --git a/unittests/object_lifetime_test2.cpp b/unittests/object_lifetime_test2.cpp index 31c5858..9716fef 100644 --- a/unittests/object_lifetime_test2.cpp +++ b/unittests/object_lifetime_test2.cpp @@ -20,10 +20,11 @@ struct Vector2 return Vector2(*this += vec_r); } - void operator=(const Vector2& ver_r) + Vector2 &operator=(const Vector2& ver_r) { x = ver_r.x; y = ver_r.y; + return *this; }