https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96835
--- Comment #2 from Tobias Weinzierl <tobias.weinzierl at durham dot ac.uk> --- #include <stdio.h> #pragma omp declare target template<int sz> struct vector { int values_[sz]; vector(); vector(int const& init_val); int dot(vector o) { int res = 0; for (int i = 0; i < sz; ++ i) res += values_[i] * o.values_[i]; return res; } }; template<int sz> vector<sz>::vector(int const& init_val) { for (int i = 0; i < sz; ++ i) values_[i] = init_val; } template<int sz> vector<sz>::vector() : vector(0) { } #pragma omp end declare target int main() { int res; #pragma omp target map(from:res) { vector<4> v1(1); vector<4> v2(2); res = v1.dot(v2); } printf("%d\n", res); return 0; }