diff --git a/src/stan/lang/generator/generate_catch_throw_located.hpp b/src/stan/lang/generator/generate_catch_throw_located.hpp index b5ad023f5f3..4841e6ceb4c 100644 --- a/src/stan/lang/generator/generate_catch_throw_located.hpp +++ b/src/stan/lang/generator/generate_catch_throw_located.hpp @@ -21,7 +21,7 @@ void generate_catch_throw_located(int indent, std::ostream& o) { generate_indent(indent, o); o << "} catch (const std::exception& e) {" << EOL; generate_indent(indent + 1, o); - o << "stan::lang::rethrow_located(e, current_statement_begin__" + o << "stan::model::rethrow_located(e, current_statement_begin__" << ", prog_reader__());" << EOL; generate_comment("Next line prevents compiler griping about no return", indent + 1, o); diff --git a/src/stan/lang/generator/generate_transform_inits_method.hpp b/src/stan/lang/generator/generate_transform_inits_method.hpp index 401af8cba13..404ee7db8e1 100644 --- a/src/stan/lang/generator/generate_transform_inits_method.hpp +++ b/src/stan/lang/generator/generate_transform_inits_method.hpp @@ -110,7 +110,7 @@ void generate_transform_inits_method(const std::vector& vs, generate_indent(indent, o); o << "if (!(context__.contains_r(\"" << var_name << "\")))" << EOL; generate_indent(indent + 1, o); - o << "stan::lang::rethrow_located(" + o << "stan::model::rethrow_located(" << "std::runtime_error(std::string(\"Variable " << var_name << " missing\")), current_statement_begin__, prog_reader__());" << EOL; // init context position @@ -157,7 +157,7 @@ void generate_transform_inits_method(const std::vector& vs, generate_indent(indent + vtype.array_dims(), o); o << "} catch (const std::exception& e) {" << EOL; generate_indent(indent + vtype.array_dims() + 1, o); - o << "stan::lang::rethrow_located(" + o << "stan::model::rethrow_located(" << "std::runtime_error(std::string(\"Error transforming variable " << var_name << ": \") + e.what()), current_statement_begin__, prog_reader__());" diff --git a/src/stan/lang/generator/generate_validate_tparam_inits.hpp b/src/stan/lang/generator/generate_validate_tparam_inits.hpp index 2186d98e7ae..e2a103544f8 100644 --- a/src/stan/lang/generator/generate_validate_tparam_inits.hpp +++ b/src/stan/lang/generator/generate_validate_tparam_inits.hpp @@ -47,7 +47,7 @@ void generate_validate_tparam_inits(const block_var_decl decl, int indent, o << ";" << EOL; generate_indent(indent + decl.bare_type().num_dims() + 1, o); - o << "stan::lang::rethrow_located(" + o << "stan::model::rethrow_located(" << "std::runtime_error(std::string(\"Error initializing variable " << decl.name() << ": \") + msg__.str()), current_statement_begin__, prog_reader__());" diff --git a/src/stan/model/model_header.hpp b/src/stan/model/model_header.hpp index f99f38cfb0e..b8afa0162ea 100644 --- a/src/stan/model/model_header.hpp +++ b/src/stan/model/model_header.hpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/stan/lang/rethrow_located.hpp b/src/stan/model/rethrow_located.hpp similarity index 81% rename from src/stan/lang/rethrow_located.hpp rename to src/stan/model/rethrow_located.hpp index 9f63f5cb224..9f68993d689 100644 --- a/src/stan/lang/rethrow_located.hpp +++ b/src/stan/model/rethrow_located.hpp @@ -1,5 +1,5 @@ -#ifndef STAN_LANG_RETHROW_LOCATED_HPP -#define STAN_LANG_RETHROW_LOCATED_HPP +#ifndef STAN_MODEL_RETHROW_LOCATED_HPP +#define STAN_MODEL_RETHROW_LOCATED_HPP #include #include @@ -12,7 +12,7 @@ namespace stan { -namespace lang { +namespace model { /** * Returns true if the specified exception can be dynamically @@ -161,8 +161,37 @@ inline void rethrow_located(const std::exception& e, int line, rethrow_located(e, s); } -} // namespace lang +} // namespace model +namespace lang { +/** + * Rethrow an exception of type specified by the dynamic type of + * the specified exception, adding the specified source file location to + * the specified exception's message. + * + * @param[in] e original exception + * @param[in] location string representing the source file location + */ +inline void rethrow_located(const std::exception& e, std::string location) { + stan::model::rethrow_located(e, location); +} + +/** + * Rethrow an exception of type specified by the dynamic type of + * the specified exception, adding the specified line number to + * the specified exception's message. + * + * @param[in] e original exception + * @param[in] line line number in Stan source program where + * exception originated + * @param[in] reader trace of how program was included from files + */ +inline void rethrow_located(const std::exception& e, int line, + const io::program_reader& reader + = stan::io::program_reader()) { + stan::model::rethrow_located(e, line, reader); +} +} // namespace lang } // namespace stan #endif diff --git a/src/stan/model/standalone_functions_header.hpp b/src/stan/model/standalone_functions_header.hpp index 296cee2afce..025fe255e17 100644 --- a/src/stan/model/standalone_functions_header.hpp +++ b/src/stan/model/standalone_functions_header.hpp @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include diff --git a/src/test/unit/lang/generator/cholesky_factor_cov_var_test.cpp b/src/test/unit/lang/generator/cholesky_factor_cov_var_test.cpp index 49bc84dcae1..4027c3708d8 100644 --- a/src/test/unit/lang/generator/cholesky_factor_cov_var_test.cpp +++ b/src/test/unit/lang/generator/cholesky_factor_cov_var_test.cpp @@ -227,7 +227,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 2;\n" " if (!(context__.contains_r(\"cfcov_54\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "cfcov_54 missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"cfcov_54\");\n" " pos__ = 0U;\n" @@ -249,7 +249,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " writer__.cholesky_factor_cov_unconstrain(cfcov_54);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable cfcov_54: \") + e.what()), " "current_statement_begin__, prog_reader__());\n" " }\n"); @@ -259,7 +259,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 3;\n" " if (!(context__.contains_r(\"cfcov_33\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "cfcov_33 missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"cfcov_33\");\n" " pos__ = 0U;\n" @@ -281,7 +281,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " writer__.cholesky_factor_cov_unconstrain(cfcov_33);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable cfcov_33: \") + e.what()), " "current_statement_begin__, prog_reader__());\n" " }\n"); @@ -503,7 +503,7 @@ TEST(lang, transformed_params_block_var_hpp_log_prob) { " msg__ << \"Undefined transformed parameter: " "cfcov_54\" << \"(\" << j_1__ << \", \" << j_2__ << \")\";\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "initializing variable cfcov_54: \") + msg__.str()), " "current_statement_begin__, prog_reader__());\n" " }\n" @@ -525,7 +525,7 @@ TEST(lang, transformed_params_block_var_hpp_log_prob) { " msg__ << \"Undefined transformed parameter: " "cfcov_33\" << \"(\" << j_1__ << \", \" << j_2__ << \")\";\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "initializing variable cfcov_33: \") + msg__.str()), " "current_statement_begin__, prog_reader__());\n" " }\n" diff --git a/src/test/unit/lang/generator/function_var_test.cpp b/src/test/unit/lang/generator/function_var_test.cpp index 345eca536bb..653b663833d 100644 --- a/src/test/unit/lang/generator/function_var_test.cpp +++ b/src/test/unit/lang/generator/function_var_test.cpp @@ -216,7 +216,7 @@ TEST(lang, local_function_args_hpp) { " *pstream__ << std::endl;\n" " }\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -288,7 +288,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 7;\n" " return stan::math::promote_scalar(a1);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -360,7 +360,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 11;\n" " return stan::math::promote_scalar(a2);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -432,7 +432,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 15;\n" " return stan::math::promote_scalar(a3);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -506,7 +506,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 19;\n" " return stan::math::promote_scalar(a4);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -584,7 +584,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 23;\n" " return stan::math::promote_scalar(a5);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -662,7 +662,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 27;\n" " return stan::math::promote_scalar(a6);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -741,7 +741,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 31;\n" " return stan::math::promote_scalar(a7);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -821,7 +821,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 35;\n" " return stan::math::promote_scalar(a8);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -901,7 +901,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 39;\n" " return stan::math::promote_scalar(a9);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -983,7 +983,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 43;\n" " return stan::math::promote_scalar(a10);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -1067,7 +1067,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 47;\n" " return stan::math::promote_scalar(a11);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " @@ -1151,7 +1151,7 @@ TEST(lang, local_function_args_hpp) { " current_statement_begin__ = 51;\n" " return stan::math::promote_scalar(a12);\n" " } catch (const std::exception& e) {\n" - " stan::lang::rethrow_located(e, current_statement_begin__, " + " stan::model::rethrow_located(e, current_statement_begin__, " "prog_reader__());\n" " // Next line prevents compiler griping about no return\n" " throw std::runtime_error(\"*** IF YOU SEE THIS, PLEASE REPORT A " diff --git a/src/test/unit/lang/generator/multi_dim_var_test.cpp b/src/test/unit/lang/generator/multi_dim_var_test.cpp index 8c11395e17d..e8a5e6b4174 100644 --- a/src/test/unit/lang/generator/multi_dim_var_test.cpp +++ b/src/test/unit/lang/generator/multi_dim_var_test.cpp @@ -168,7 +168,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 2;\n" " if (!(context__.contains_r(\"ar_mat\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "ar_mat missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"ar_mat\");\n" " pos__ = 0U;\n" @@ -209,7 +209,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { "ar_mat[i_0__][i_1__]);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable ar_mat: \") + e.what()), " "current_statement_begin__, prog_reader__());\n" " }\n" @@ -413,7 +413,7 @@ TEST(lang, transformed_params_block_var_hpp_log_prob) { "parameter: ar_mat\" << \"[\" << k_0__ << \"]\" << \"[\" << k_1__ << " "\"]\" << \"(\" << j_1__ << \", \" << j_2__ << \")\";\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "initializing variable ar_mat: \") + msg__.str()), " "current_statement_begin__, prog_reader__());\n" " }\n" diff --git a/src/test/unit/lang/generator/prim_var_test.cpp b/src/test/unit/lang/generator/prim_var_test.cpp index 51be76053ec..2927c0b5434 100644 --- a/src/test/unit/lang/generator/prim_var_test.cpp +++ b/src/test/unit/lang/generator/prim_var_test.cpp @@ -269,7 +269,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 2;\n" " if (!(context__.contains_r(\"p2\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "p2 missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"p2\");\n" " pos__ = 0U;\n" @@ -281,7 +281,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " writer__.scalar_unconstrain(p2);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable p2: \") + e.what()), current_statement_begin__, " "prog_reader__());\n" " }\n" @@ -289,7 +289,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 3;\n" " if (!(context__.contains_r(\"ar_p2\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "ar_p2 missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"ar_p2\");\n" " pos__ = 0U;\n" @@ -307,7 +307,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " writer__.scalar_lub_unconstrain(0, 1, ar_p2[i_0__]);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable ar_p2: \") + e.what()), " "current_statement_begin__, prog_reader__());\n" " }\n" @@ -316,7 +316,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { " current_statement_begin__ = 4;\n" " if (!(context__.contains_r(\"ar_p3\")))\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Variable " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Variable " "ar_p3 missing\")), current_statement_begin__, prog_reader__());\n" " vals_r__ = context__.vals_r(\"ar_p3\");\n" " pos__ = 0U;\n" @@ -335,7 +335,7 @@ TEST(lang, params_block_var_hpp_xform_inits) { "ar_p3[i_0__]);\n" " } catch (const std::exception& e) {\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "transforming variable ar_p3: \") + e.what()), " "current_statement_begin__, prog_reader__());\n" " }\n" @@ -512,7 +512,7 @@ TEST(lang, transformed_params_block_var_hpp_log_prob) { " std::stringstream msg__;\n" " msg__ << \"Undefined transformed parameter: p2\";\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "initializing variable p2: \") + msg__.str()), " "current_statement_begin__, prog_reader__());\n" " }\n" @@ -524,7 +524,7 @@ TEST(lang, transformed_params_block_var_hpp_log_prob) { " msg__ << \"Undefined transformed parameter: ar_p2\" " "<< \"[\" << k_0__ << \"]\";\n" " " - "stan::lang::rethrow_located(std::runtime_error(std::string(\"Error " + "stan::model::rethrow_located(std::runtime_error(std::string(\"Error " "initializing variable ar_p2: \") + msg__.str()), " "current_statement_begin__, prog_reader__());\n" " }\n" diff --git a/src/test/unit/lang/rethrow_located_test.cpp b/src/test/unit/model/rethrow_located_test.cpp similarity index 93% rename from src/test/unit/lang/rethrow_located_test.cpp rename to src/test/unit/model/rethrow_located_test.cpp index f1332246b56..1cb1ebdc196 100644 --- a/src/test/unit/lang/rethrow_located_test.cpp +++ b/src/test/unit/model/rethrow_located_test.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include stan::io::program_reader stub_reader() { @@ -20,7 +20,7 @@ void test_rethrow_located_2() { throw E("foo"); } catch (const std::exception& e) { stan::io::program_reader reader = stub_reader(); - stan::lang::rethrow_located(e, 5, reader); + stan::model::rethrow_located(e, 5, reader); } } catch (const E2& e) { EXPECT_TRUE(std::string(e.what()).find_first_of("5") != std::string::npos); @@ -45,7 +45,7 @@ void test_rethrow_located_nullary(const std::string& original_type) { throw E(); } catch (const std::exception& e) { stan::io::program_reader reader = stub_reader(); - stan::lang::rethrow_located(e, 5, reader); + stan::model::rethrow_located(e, 5, reader); } } catch (const E& e) { EXPECT_TRUE(std::string(e.what()).find_first_of("5") != std::string::npos); @@ -86,13 +86,13 @@ TEST(langRethrowLocated, allExpected) { } TEST(langRethrowLocated, locatedException) { // tests nested case - using stan::lang::located_exception; + using stan::model::located_exception; try { try { throw located_exception >("foo", "bar"); } catch (const std::exception& e) { stan::io::program_reader reader = stub_reader(); - stan::lang::rethrow_located(e, 5, reader); + stan::model::rethrow_located(e, 5, reader); } } catch (const std::exception& e) { EXPECT_TRUE(std::string(e.what()).find_first_of("foo")