pybind11/tests/test_descr_src_loc.cpp

142 lines
4.9 KiB
C++

// 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<std::string>();
static constexpr auto c6 = const_name<true>("J", "K");
static constexpr auto c7 = const_name<false>("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<std::string>();
static constexpr auto c6 = const_name<true>("J", "K");
static constexpr auto c7 = const_name<false>("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