<div dir="ltr"><div>Below C++ code does build with the appropriate offloading flags, but errors</div><div>at run time. I am wondering if the mapping is done correctly.</div><div>Tested with the trunk Clang on POWER8.</div><div><br></div>#include <iostream><br>#include <vector><br><br>class ConnectorBase {<br>public:<br>        virtual int f() = 0;<br>        //virtual void push_back() =0;<br>        //virtual void copy_to_array() = 0;<br>        //virtual void send() =0;<br>};<br><br>template<typename ConnectionT><br>class Connector : public ConnectorBase {<br>private:<br>        std::vector<ConnectionT> v_;<br>        ConnectionT connArray[100];<br><br>public:<br>        int f() { return 1; }<br>        Connector<ConnectionT>& push_back(ConnectionT conn) {<br>                v_.push_back(conn);<br>                return *this;<br>        }<br>        void copy_to_array() {<br>                std::copy(v_.begin(), v_.end(), connArray);<br>        }<br>        void send(int i, ConnectionT conn) {<br>                int tmp=0;<br>                while (true) {<br>                        ConnectionT conn_local = connArray[tmp];<br>                        //if (conn_local.is_disabled()) break;<br>                        if (tmp==10) break;<br>                        tmp++;<br>                }<br>        }<br>};<br><br>class SynIdDelay {<br>public:<br>        bool is_disabled() const { return true; };<br>};<br><br><br>template <typename TargetT><br>class Connection {<br>public:<br>        int get_w() { return 1; }<br>        bool is_disabled() const {<br>                return syn_id_delay_.is_disabled();<br>             }<br>protected:<br>        SynIdDelay syn_id_delay_;<br>};<br><br>class Target {<br>};<br>int main()<br>{<br> int sum=0;<br> Connection<Target> connection;<br><br> ConnectorBase *connector = new Connector<Connection<Target>>();<br> Connector<Connection<Target>> *vc = static_cast<Connector<Connection<Target>> *>(connector);<br> connector = &vc->push_back(connection);<br> vc->copy_to_array();<br> Connector<Connection<Target>> *c = static_cast<Connector<Connection<Target> > *>(connector);<br>#pragma omp target parallel for reduction(+: sum) map(to: connection) map(to: c)<br>    for(int i=0; i<100; i++) {<br>        c->send(i, connection); // works, accessing an element of an array.<br>    }<br><br>}<br></div>