|  | /* { dg-additional-options "-O0 -fdump-tree-omplower" } */ | 
|  | /* { dg-xfail-if "PR 97106/PR 97102 - .alias not (yet) supported for nvptx" { offload_target_nvptx } } */ | 
|  |  | 
|  | #include <cstdlib> | 
|  | #include <type_traits> | 
|  |  | 
|  | template<int Dim> struct V { | 
|  | int version_called; | 
|  |  | 
|  | template<bool B = (Dim == 0), | 
|  | typename = typename std::enable_if<B>::type> | 
|  | V () | 
|  | { | 
|  | version_called = 1; | 
|  | } | 
|  |  | 
|  | template<typename TArg0, | 
|  | typename = typename std::enable_if<(std::is_same<unsigned long, | 
|  | typename std::decay<TArg0>::type>::value)>::type> | 
|  | V (TArg0) | 
|  | { | 
|  | version_called = 2; | 
|  | } | 
|  | }; | 
|  |  | 
|  | template<int Dim> struct S { | 
|  | V<Dim> v; | 
|  | }; | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | int version_set[2] = {-1, -1}; | 
|  |  | 
|  | #pragma omp target map(from: version_set[0:2]) | 
|  | { | 
|  | S<0> s; | 
|  | version_set[0] = s.v.version_called; | 
|  | V<1> v2((unsigned long) 1); | 
|  | version_set[1] = v2.version_called; | 
|  | } | 
|  |  | 
|  | if (version_set[0] != 1 || version_set[1] != 2) | 
|  | abort (); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /* "3" for S<0>::S, V<0>::V<>, and V<1>::V<long unsigned int>:  */ | 
|  | /* { dg-final { scan-tree-dump-times "__attribute__..omp declare target" 3 "omplower" } } */ |