@@ -3075,6 +3075,53 @@ BOOST_FIXTURE_TEST_CASE_TEMPLATE(empty_trange1, F, Fixtures, F) {
30753075 }
30763076}
30773077
3078+ // corner case: expressions involving empty blocks
3079+ BOOST_FIXTURE_TEST_CASE_TEMPLATE (empty_block_expressions, F, Fixtures, F) {
3080+ auto & a = F::a;
3081+ auto & c = F::c;
3082+
3083+ // one of the dimensions has zero extent
3084+ const auto lb1 = std::array{3 , 2 , 0 };
3085+ const auto ub1 = std::array{4 , 2 , 2 };
3086+
3087+ const int ntiles = F::ntiles;
3088+ const auto lb2 = std::array{ntiles, 0 , 0 };
3089+ const auto ub2 = std::array{ntiles, ntiles, ntiles};
3090+
3091+ // preserve_lobound should go through without issues
3092+ {
3093+ std::decay_t <decltype (c)> result;
3094+ BOOST_CHECK_NO_THROW (result (" a,b,c" ) =
3095+ a (" a,b,c" ).block (lb1, ub1, preserve_lobound));
3096+
3097+ BOOST_CHECK_EQUAL (result.trange ().tiles_range ().volume (), 0 );
3098+ }
3099+ {
3100+ std::decay_t <decltype (c)> result;
3101+ BOOST_CHECK_NO_THROW (result (" a,b,c" ) =
3102+ a (" a,b,c" ).block (lb2, ub2, preserve_lobound));
3103+ BOOST_CHECK_EQUAL (result.trange ().tiles_range ().volume (), 0 );
3104+ }
3105+
3106+ // assignment of empty (zero volume) block
3107+ {
3108+ BOOST_CHECK_NO_THROW (c (" a,b,c" ).block (lb1, ub1) =
3109+ a (" a,b,c" ).block (lb1, ub1));
3110+ }
3111+ {
3112+ BOOST_CHECK_NO_THROW (c (" a,b,c" ).block (lb2, ub2) =
3113+ a (" a,b,c" ).block (lb2, ub2));
3114+ }
3115+
3116+ // assignment from empty array
3117+ {
3118+ std::decay_t <decltype (c)> z;
3119+ z (" a,b,c" ) = a (" a,b,c" ).block (lb2, ub2); // z is a full empty array
3120+ BOOST_CHECK_NO_THROW (c (" a,b,c" ).block (lb2, ub2, preserve_lobound) =
3121+ z (" a,b,c" ));
3122+ }
3123+ }
3124+
30783125BOOST_AUTO_TEST_SUITE_END ()
30793126
30803127#endif // TILEDARRAY_TEST_EXPRESSIONS_IMPL_H
0 commit comments