DARMA-tasking-internal / darma-frontend

Header library providing the frontend programming model for the DARMA asynchronous many-task model
Other
7 stars 0 forks source link

Weird behavior for functor with 3 arguments #28

Closed jjwilke closed 7 years ago

jjwilke commented 7 years ago

Compiler spew for functor: '''' struct Broken { void operator()( AccessHandle myInt, AccessHandle<std::vector> parts, AccessHandle<std::vector> myList ){} }; '''' when instantiated in '''' void darma_main_task(std::vector args) { auto a = initial_access(); auto b = initial_access<std::vector>(); auto c = initial_access<std::vector>(); create_work(a,b,c); create_work(a,b); create_work(b,c); } ''''

Other cases do work: '''' struct Works { void operator()( AccessHandle myInt, AccessHandle<std::vector> parts ){} }; '''' and '''' struct AlsoWorks { void operator()( AccessHandle<std::vector> parts, AccessHandle<std::vector> myList ){} }; ''''

jjwilke commented 7 years ago

Not a problem with clang3.9. Path got messed up to use Apple clang. Still really bizarre, though.

dhollman commented 7 years ago

Looks like this is the same problem Francesco was having when his paths were messed up. I think it's related to an issue in some very old implementations (pre-C++11) of libc++ that ship with MacOS X, where std::tuple of one or two elements falls through to std::pair (and thus works for one or two elements, since std::pair predates C++11), but has broken behavior for three or more elements. Totally just a guess, but it's something to watch out for in the future.