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

            Bug ID: 84532
           Summary: [7/8 Regression] std::thread::__make_invoker
                    prematurely unwraps reference_wrappers
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rs2740 at gmail dot com
  Target Milestone: ---

std::thread::__make_invoker uses make_tuple, which unwraps reference_wrappers,
so instead of passing a DECAY_COPY'd reference_wrapper<T> rvalue to __invoke,
it (incorrectly) passes a T lvalue instead.

This means that we accept invalid code like

int i = 0;
std::thread t([](auto&){}, std::ref(i));

It's not too hard to come up with code that changes meaning and valid code that
gets rejected either.

This is a 7/8 regression: previously the now-removed __bind_simple was used,
which correctly just does a simple decay.

Reply via email to