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

            Bug ID: 71095
           Summary: Problem with captureless generic lambda and calling
                    function object with arguments passed by reference
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: karol.wozniak at email dot com
  Target Milestone: ---

#include <utility>

struct do_some_stuff_by_ref {
  template <typename... T> int operator()(T &...) const { return 42; };
};

int main() {
  { // compiles both
    //   g++-5 prog.cc -std=c++14
    //   g++-6 prog.cc -std=c++14
    do_some_stuff_by_ref callable{};
    int a = 0;
    [callable](auto &&... x) {
      return callable(std::forward<decltype(x)>(x)...);
    }(a);
  }

  { // compiles both
    //    g++-5 prog.cc -std=c++14
    //    g++-6 prog.cc -std=c++14
    do_some_stuff_by_ref ignore_me{};
    int a = 0;
    [ignore_me](auto &&... x) {
      (void)ignore_me;
      do_some_stuff_by_ref callable{};
      return callable(std::forward<decltype(x)>(x)...);
    }(a);
  }

  { // compiles
    //    g++-5 prog.cc -std=c++14
    // fails to compile
    //    g++-6 prog.cc -std=c++14
    // prog.cc:40:22: error: no match for call to ‘(do_some_stuff_by_ref)
(int)’
    //        return callable(std::forward<decltype(x)>(x)...);
    //               ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int a = 0;
    [](auto &&... x) {
      do_some_stuff_by_ref callable{};
      return callable(std::forward<decltype(x)>(x)...);
    }(a);
  }

  return 0;
}

// $ g++-5 --version
// g++-5 (Debian 5.3.1-17) 5.3.1 20160429
//
// $ g++-6 --version
// g++-6 (Debian 6.1.1-1) 6.1.1 20160430

Reply via email to