Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/pure' into patch-11
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrii Verbytskyi committed Apr 8, 2024
2 parents 3e4cdff + b4a2962 commit 02a89cd
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions source/class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,11 @@ bool is_callback_structure_needed(CXXRecordDecl const *C)
// check if all pure-virtual methods could be overridden in Python
if( C->isAbstract() ) {
for( auto m = C->method_begin(); m != C->method_end(); ++m ) {
#if( LLVM_VERSION_MAJOR >= 18 )
if( m->isPureVirtual() and is_const_overload(*m) ) return false; // it is not clear how to deal with this case since we can't overrdie const versions in Python, - so disabling for now
#else
if( m->isPure() and is_const_overload(*m) ) return false; // it is not clear how to deal with this case since we can't overrdie const versions in Python, - so disabling for now
#endif
}
}

Expand Down Expand Up @@ -644,7 +648,11 @@ bool is_callback_structure_constructible(CXXRecordDecl const *C)
{
if( C->isAbstract() ) {
for( auto m = C->method_begin(); m != C->method_end(); ++m ) {
#if( LLVM_VERSION_MAJOR >= 18 )
if( m->isPureVirtual() and !isa<CXXConstructorDecl>(*m) and (m->getAccess() == AS_private or !is_bindable(*m) or is_skipping_requested(*m, Config::get())) ) return false;
#else
if( m->isPure() and !isa<CXXConstructorDecl>(*m) and (m->getAccess() == AS_private or !is_bindable(*m) or is_skipping_requested(*m, Config::get())) ) return false;
#endif
}

for( auto b = C->bases_begin(); b != C->bases_end(); ++b ) {
Expand Down Expand Up @@ -766,7 +774,11 @@ string bind_member_functions_for_call_back(CXXRecordDecl const *C, string const
string custom_function_info = Config::get().is_custom_trampoline_function_requested(member_function_name);
if( custom_function_info == "" ) {
c += indent(fmt::format(call_back_function_body_template, class_name, /*class_qualified_name(C), */ python_name, std::get<1>(args), return_type), "\t\t");
#if( LLVM_VERSION_MAJOR >= 18 )
if( m->isPureVirtual() ) c += "\t\tpybind11::pybind11_fail(\"Tried to call pure virtual function \\\"{}::{}\\\"\");\n"_format(C->getNameAsString(), python_name);
#else
if( m->isPure() ) c += "\t\tpybind11::pybind11_fail(\"Tried to call pure virtual function \\\"{}::{}\\\"\");\n"_format(C->getNameAsString(), python_name);
#endif
else c += "\t\treturn {}::{}({});\n"_format(C->getNameAsString(), m->getNameAsString(), std::get<1>(args));
}
else {
Expand Down

0 comments on commit 02a89cd

Please sign in to comment.