This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/68995] New: Including both <tr1/functional> and <functional> can cause ADL problems in std::function SFINAE


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68995

            Bug ID: 68995
           Summary: Including both <tr1/functional> and <functional> can
                    cause ADL problems in std::function SFINAE
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rs2740 at gmail dot com
  Target Milestone: ---

Repro adapted from http://stackoverflow.com/q/34334735/2756719:

#include <tr1/memory>
#include <functional>
#include <tr1/functional> 

std::tr1::shared_ptr<int> test() { return {}; }

std::function<std::tr1::shared_ptr<int>()> func = test;

This compiles iff the #include <tr1/functional> is commented out. When both
<functional> and <tr1/functional> are included, however, we get an error,
apparently because

template<typename _Functor>
using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
                         (std::declval<_ArgTypes>()...) );

in std::function does an unqualified call to __callable_functor, and picks up
both std::__callable_functor in <functional> from normal unqualified lookup,
and std::tr1::__callable_functor in <tr1/functional> from ADL, resulting in an
ambiguity, which in turn causes substitution failure in the converting
constructor template.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]