https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80038
--- Comment #5 from Florent Hivert <florent.hivert at lri dot fr> ---
(In reply to Richard Biener from comment #3)
> Don't know Cilk+ but yes, try
>
> for (int i=0; i<8; i++) {
> std::vector<int> vnew(v);
> vnew.push_back(i);
> cilk_spawn walk(vnew, size);
> cilk_sync;
> }
>
> with appropriate syntax.
Ok ! Putting the cilk_sync here works but completely destroy the purpose of
using Cilk (no parallelism). I had the feeling that passing vnew as a value to
the function makes a copy so there is no possibility for the caller to destroy
vnew before it gets copied by the function call.
However using manual allocation seems to fix the problem
#include <vector>
#include <cilk/cilk.h>
void walk(std::vector<int> *v, unsigned size) {
if (v->size() < size)
for (int i=0; i<8; i++) {
auto *vnew = new std::vector<int>(*v);
vnew->push_back(i);
cilk_spawn walk(vnew, size);
}
cilk_sync;
delete v;
}
int main(int argc, char **argv) {
auto *v = new std::vector<int>{};
walk(v, 5);
}