[cfe-dev] Probe overload resolution from a tool

Kim Gräsman via cfe-dev cfe-dev at lists.llvm.org
Sun Feb 10 04:24:24 PST 2019


Hi all,

We had a bug report in IWYU recently, that `std::move` is not
recognized in a templated context:

    #include <ostream>

    template <typename> struct A {};

    struct B {
        template <typename T>
        B(A<T>&& a) {}
    };

    template <typename T>
    void f(A<T>&& a) {
        B(std::move(a));
    }

(full report: https://github.com/include-what-you-use/include-what-you-use/issues/636)

We currently handle this by RAV-visiting OverloadExprs and basically
picking the first decl in the candidate set.

To make this more rigorous, I guess we would have to use the arguments
from the originating CallExpr to find the best match. Is there library
support in e.g. Sema to do this? Since IWYU assumes working code, we
know there's exactly one candidate that will be selected, we just need
to be able to resolve which one. I'm looking for something like:

    Decl* bestMatch(const llvm::iterator_range<decls_iterator>& Decls,
ArrayRef<Expr *> Args);

Given that this is C++, I'm expecting this to be much more complicated
in practice :)

Ideas? Does any of the Clang tools already do something like this?
I've been grepping around the code base, but haven't found anything
obvious.

Thanks,
- Kim



More information about the cfe-dev mailing list