"vscode:/vscode.git/clone" did not exist on "b14aeb7cfae1a412f17ab3cb87350d5cd2ad788f"
  • Ryan Cahoon's avatar
    fix: the types for return_value_policy_override in optional_caster (#3376) · c2d3e220
    Ryan Cahoon authored
    
    
    * fix: the types for return_value_policy_override in optional_caster
    
    `return_value_policy_override` was not being applied correctly in
    `optional_caster` in two ways:
    - The `is_lvalue_reference` condition referenced `T`, which was the
    `optional<T>` type parameter from the class, when it should have used `T_`,
    which was the parameter to the `cast` function. `T_` can potentially be a
    reference type, but `T` will never be.
    - The type parameter passed to `return_value_policy_override` should be
    `T::value_type`, not `T`. This matches the way that the other STL container
    type casters work.
    
    The result of these issues was that a method/property definition which used a
    `reference` or `reference_internal` return value policy would create a Python
    value that's bound by reference to a temporary C++ object, resulting in
    undefined behavior. For reasons that I was not able to figure out fully, it
    seems like this causes problems when using old versions of `boost::optional`,
    but not with recent versions of `boost::optional` or the `libstdc++`
    implementation of `std::optional`. The issue (that the override to
    `return_value_policy::move` is never being applied) is present for all
    implementations, it just seems like that somehow doesn't result in problems for
    the some implementation of `optional`. This change includes a regression type
    with a custom optional-like type which was able to reproduce the issue.
    
    Part of the issue with using the wrong types may have stemmed from the type
    variables `T` and `T_` having very similar names. This also changes the type
    variables in `optional_caster` to use slightly more descriptive names, which
    also more closely follow the naming convention used by the other STL casters.
    
    Fixes #3330
    
    * Fix clang-tidy complaints
    
    * Add missing NOLINT
    
    * Apply a couple more fixes
    
    * fix: support GCC 4.8
    
    * tests: avoid warning about unknown compiler for compilers missing C++17
    
    * Remove unneeded test module attribute
    
    * Change test enum to have more unique int values
    Co-authored-by: default avatarAaron Gokaslan <skylion.aaron@gmail.com>
    Co-authored-by: default avatarHenry Schreiner <HenrySchreinerIII@gmail.com>
    c2d3e220
test_stl.py 11.4 KB