#include #include template using term = boost::yap::terminal; namespace yap = boost::yap; namespace bh = boost::hana; void compile_term_plus_term () { using namespace std::literals; // char const * string { term unity{1.0}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + term{"3"}; (void)unevaluated_expr; } // std::string temporary { term unity{1.0}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + term{"3"s}; (void)unevaluated_expr; } // pointers { term unity{1.0}; int ints_[] = {1, 2}; term ints = {ints_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + ints; (void)unevaluated_expr; } { term unity{1.0}; int const ints_[] = {1, 2}; term ints = {ints_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + ints; (void)unevaluated_expr; } { term unity{1.0}; int ints_[] = {1, 2}; term ints = {ints_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(ints); (void)unevaluated_expr; } // const pointers { term unity{1.0}; int ints[] = {1, 2}; term int_ptr = {ints}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + int_ptr; (void)unevaluated_expr; } { term unity{1.0}; int const ints[] = {1, 2}; term int_ptr = {ints}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + int_ptr; (void)unevaluated_expr; } { term unity{1.0}; int ints[] = {1, 2}; term int_ptr = {ints}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(int_ptr); (void)unevaluated_expr; } // values { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(i); (void)unevaluated_expr; } // const value terminals { term unity{1.0}; term const i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref const &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } { term unity{1.0}; term const i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref const &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } // lvalue refs { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, yap::expression_ref &> > > unevaluated_expr = unity + i; (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(i); (void)unevaluated_expr; } // rvalue refs { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(i); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple< yap::expression_ref &>, term > > unevaluated_expr = unity + std::move(i); (void)unevaluated_expr; } }