mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-14 17:43:53 +00:00
142 lines
4.9 KiB
C++
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
|