Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions tests/unit/tt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,32 @@ TEST_CASE("TemplateTask", "[core]") {
static_assert(std::is_const_v<std::remove_reference_t<decltype(datum)>>, "Const datum expected");
},
ttg::edges(in), ttg::edges()));
{
auto tt = ttg::make_tt(
[](const int &key, const auto &datum, auto &outs) {
static_assert(std::is_lvalue_reference_v<decltype(datum)>, "Lvalue datum expected");
static_assert(std::is_const_v<std::remove_reference_t<decltype(datum)>>, "Const datum expected");
},
ttg::edges(in), ttg::edges());
using tt_t = typename std::remove_reference_t<decltype(*tt)>;
static_assert(std::is_const_v<std::tuple_element_t<0, tt_t::input_args_type>>);
}
CHECK_NOTHROW(ttg::make_tt(
[](const int &key, auto &&datum, auto &outs) {
static_assert(std::is_rvalue_reference_v<decltype(datum)>, "Rvalue datum expected");
static_assert(!std::is_const_v<std::remove_reference_t<decltype(datum)>>, "Nonconst datum expected");
},
ttg::edges(in), ttg::edges()));
{
auto tt = ttg::make_tt(
[](const int &key, auto &&datum, auto &outs) {
static_assert(std::is_rvalue_reference_v<decltype(datum)>, "Rvalue datum expected");
static_assert(!std::is_const_v<std::remove_reference_t<decltype(datum)>>, "Nonconst datum expected");
},
ttg::edges(in), ttg::edges());
using tt_t = typename std::remove_reference_t<decltype(*tt)>;
static_assert(!std::is_const_v<std::tuple_element_t<0, tt_t::input_args_type>>);
}

// and without an output terminal
CHECK_NOTHROW(ttg::make_tt(
Expand All @@ -312,6 +338,18 @@ TEST_CASE("TemplateTask", "[core]") {
ttg::send(0, std::decay_t<decltype(key)>{}, std::decay_t<decltype(datum)>{});
},
ttg::edges(in), ttg::edges()));
{
auto tt = ttg::make_tt(
[](const int &key, auto &datum) {
static_assert(std::is_lvalue_reference_v<decltype(datum)>, "Lvalue datum expected");
static_assert(std::is_const_v<std::remove_reference_t<decltype(datum)>>, "Const datum expected");
ttg::send(0, std::decay_t<decltype(key)>{}, std::decay_t<decltype(datum)>{});
},
ttg::edges(in), ttg::edges());
using tt_t = typename std::remove_reference_t<decltype(*tt)>;
static_assert(std::is_const_v<std::tuple_element_t<0, tt_t::input_args_type>>);
}

}
}

Expand Down
2 changes: 2 additions & 0 deletions ttg/ttg/madness/ttg.h
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@ namespace ttg_madness {
using input_refs_full_tuple_type =
ttg::meta::add_glvalue_reference_tuple_t<ttg::meta::void_to_Void_tuple_t<actual_input_tuple_type>>;

using input_args_type = actual_input_tuple_type;

using input_values_tuple_type = ttg::meta::drop_void_t<ttg::meta::decayed_typelist_t<input_tuple_type>>;
using input_refs_tuple_type = ttg::meta::drop_void_t<ttg::meta::add_glvalue_reference_tuple_t<input_tuple_type>>;
static_assert(!ttg::meta::is_any_void_v<input_values_tuple_type>);
Expand Down
2 changes: 1 addition & 1 deletion ttg/ttg/util/meta/callable.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ namespace ttg::meta {
template <typename T>
struct candidate_argument_bindings<T, std::enable_if_t<!std::is_reference_v<T> && !std::is_void_v<T>>> {
using type = std::conditional_t<std::is_const_v<T>, typelist<const T&>,
typelist<const T&, T&&,
typelist<T&&, const T&,
// check for T& to be able to detect (erroneous) passing non-const lvalue&
T&>>;
};
Expand Down