// Copyright (c) 2022 The Pybind Development Team. // All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "pybind11_tests.h" // This test actually works with almost all C++17 compilers, but is currently // only needed (and tested) for type_caster_odr_guard.h, for simplicity. #ifndef PYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD TEST_SUBMODULE(descr_src_loc, m) { m.attr("block_descr_offset") = py::none(); } #else namespace pybind11_tests { namespace descr_src_loc { using py::detail::const_name; using py::detail::src_loc; struct block_descr { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = py::detail::descr<0>(src_loc::here()); static constexpr auto c1 = py::detail::descr<3>("Abc"); static constexpr auto c2 = py::detail::descr<1>(src_loc::here(), 'D'); static constexpr auto c3 = py::detail::descr<2>(src_loc::here(), 'E', 'f'); }; struct block_const_name { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = const_name("G"); static constexpr auto c1 = const_name("Hi"); static constexpr auto c2 = const_name<0>(); static constexpr auto c3 = const_name<1>(); static constexpr auto c4 = const_name<23>(); static constexpr auto c5 = const_name(); static constexpr auto c6 = const_name("J", "K"); static constexpr auto c7 = const_name("L", "M"); }; # if defined(PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY) struct block_underscore { static constexpr unsigned offset = __LINE__; // Using a macro to avoid copying the block_const_name code garbles the src_loc.line numbers. static constexpr auto c0 = const_name("G"); static constexpr auto c1 = const_name("Hi"); static constexpr auto c2 = const_name<0>(); static constexpr auto c3 = const_name<1>(); static constexpr auto c4 = const_name<23>(); static constexpr auto c5 = const_name(); static constexpr auto c6 = const_name("J", "K"); static constexpr auto c7 = const_name("L", "M"); }; # endif struct block_plus { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = const_name("N") + // critical line break const_name("O"); static constexpr auto c1 = const_name("P", src_loc(nullptr, 0)) + // critical line break const_name("Q"); }; struct block_concat { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = py::detail::concat(const_name("R")); static constexpr auto c1 = py::detail::concat(const_name("S"), // critical line break const_name("T")); static constexpr auto c2 = py::detail::concat(const_name("U", src_loc(nullptr, 0)), // critical line break const_name("V")); }; struct block_type_descr { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = py::detail::type_descr(const_name("W")); }; struct block_int_to_str { static constexpr unsigned offset = __LINE__; static constexpr auto c0 = py::detail::int_to_str<0>::digits; static constexpr auto c1 = py::detail::int_to_str<4>::digits; static constexpr auto c2 = py::detail::int_to_str<56>::digits; }; } // namespace descr_src_loc } // namespace pybind11_tests TEST_SUBMODULE(descr_src_loc, m) { using namespace pybind11_tests::descr_src_loc; # define ATTR_OFFS(B) m.attr(# B "_offset") = B::offset; # define ATTR_BLKC(B, C) \ m.attr(#B "_" #C) = py::make_tuple(B::C.text, B::C.sloc.file, B::C.sloc.line); ATTR_OFFS(block_descr) ATTR_BLKC(block_descr, c0) ATTR_BLKC(block_descr, c1) ATTR_BLKC(block_descr, c2) ATTR_BLKC(block_descr, c3) ATTR_OFFS(block_const_name) ATTR_BLKC(block_const_name, c0) ATTR_BLKC(block_const_name, c1) ATTR_BLKC(block_const_name, c2) ATTR_BLKC(block_const_name, c3) ATTR_BLKC(block_const_name, c4) ATTR_BLKC(block_const_name, c5) ATTR_BLKC(block_const_name, c6) ATTR_BLKC(block_const_name, c7) ATTR_OFFS(block_underscore) ATTR_BLKC(block_underscore, c0) ATTR_BLKC(block_underscore, c1) ATTR_BLKC(block_underscore, c2) ATTR_BLKC(block_underscore, c3) ATTR_BLKC(block_underscore, c4) ATTR_BLKC(block_underscore, c5) ATTR_BLKC(block_underscore, c6) ATTR_BLKC(block_underscore, c7) ATTR_OFFS(block_plus) ATTR_BLKC(block_plus, c0) ATTR_BLKC(block_plus, c1) ATTR_OFFS(block_concat) ATTR_BLKC(block_concat, c0) ATTR_BLKC(block_concat, c1) ATTR_BLKC(block_concat, c2) ATTR_OFFS(block_type_descr) ATTR_BLKC(block_type_descr, c0) ATTR_OFFS(block_int_to_str) ATTR_BLKC(block_int_to_str, c0) ATTR_BLKC(block_int_to_str, c1) ATTR_BLKC(block_int_to_str, c2) } #endif // PYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD