Browse Source

interrogate: Do not consider `make()` with explicit kwargs for coercion

Unless this parameter has a default value
rdb 3 years ago
parent
commit
e09f78b987
1 changed files with 7 additions and 2 deletions
  1. 7 2
      dtool/src/interrogate/functionRemap.cxx

+ 7 - 2
dtool/src/interrogate/functionRemap.cxx

@@ -872,8 +872,13 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak
     } else if (fname == "make") {
     } else if (fname == "make") {
       if (!_has_this && _parameters.size() >= 1 &&
       if (!_has_this && _parameters.size() >= 1 &&
           TypeManager::is_pointer(_return_type->get_new_type())) {
           TypeManager::is_pointer(_return_type->get_new_type())) {
-        // We can use this for coercion.
-        _flags |= F_coerce_constructor;
+        // We can use this for coercion, except if this is a kwargs param that
+        // does not have a default value.
+        if ((_flags & F_explicit_args) == 0 ||
+            _parameters.size() != first_param + 2 ||
+            _parameters[first_param + 1]._remap->has_default_value()) {
+          _flags |= F_coerce_constructor;
+        }
       }
       }
 
 
       if (_args_type == InterfaceMaker::AT_varargs) {
       if (_args_type == InterfaceMaker::AT_varargs) {