microsoft / STL

MSVC's implementation of the C++ Standard Library.
Other
10.01k stars 1.47k forks source link

`<memory>` etc.: ADL should be avoided when calling `_Construct_in_place` and its friends #3100

Open frederick-vs-ja opened 1 year ago

frederick-vs-ja commented 1 year ago

This well-formed program fails to compile with MSVC STL due to unqualified calls to internal functions (which trigger ADL and overly require completeness of related types).

#include <any>
#include <concepts>
#include <functional>
#include <memory>
#include <optional>
#include <variant>

struct Incomplete;

template<class T>
struct Holder {
    T t;
};

using Ptr = Holder<Incomplete>*;

int main()
{
    std::make_shared<Ptr>();
    std::make_shared<Ptr[]>(42);
    std::function<void(Ptr)>{std::identity{}};
    std::any{Ptr{}};
    std::optional<Ptr>{}.emplace();
    std::variant<Ptr>{}.emplace<Ptr>();
}

Godbolt link. (libc++ accepts it correctly)

This is similar to #1596 but touches different library mechanisms, and should be considered as a sub-issue of #140. Previously, 3 libc++ tests were blocked by this issue:

Perhaps we should _STD-qualify internal function calls used for in-place construction/destruction by default, especially for _Construct_in_place, _Destroy_in_place, ~and _Voidify_iter~ (_Voidify_iter was killed when implementing LWG-3870).

frederick-vs-ja commented 5 months ago

Remaining unqualified _Construct_in_place and _Destroy_in_place calls after #4430 are all in containers and valarray.