Skip to content
Snippets Groups Projects
Commit aa36e317 authored by Vasileios Karakasis's avatar Vasileios Karakasis Committed by Sam Yates
Browse files

Fixes for the Intel compiler version 16 and 17 (#223)

Proposed patch to master branch:
* Qualify template in `indirect_view` to accommodate incorrect function template specialization determination (icpc ignores §14.8.2.4/9 rule on lvalue versus rvalue template arguments).
* Use parenthesis constructors for type parameter in `pointer_proxy`, as icpc has not adopted the corrected behaviour for DR#1467 [http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1467].
parent 4c5bf302
No related branches found
No related tags found
No related merge requests found
...@@ -38,7 +38,9 @@ template <typename RASeq, typename Seq> ...@@ -38,7 +38,9 @@ template <typename RASeq, typename Seq>
auto indirect_view(RASeq& data, const Seq& index_map) auto indirect_view(RASeq& data, const Seq& index_map)
DEDUCED_RETURN_TYPE(transform_view(index_map, impl::indirect_accessor<RASeq&>(data))); DEDUCED_RETURN_TYPE(transform_view(index_map, impl::indirect_accessor<RASeq&>(data)));
template <typename RASeq, typename Seq> // icpc 17 fails to disambiguate without further qualification, so
// we replace `template <typename RASeq, typename Seq>` with the following:
template <typename RASeq, typename Seq, typename = util::enable_if_t<!std::is_reference<RASeq>::value>>
auto indirect_view(RASeq&& data, const Seq& index_map) auto indirect_view(RASeq&& data, const Seq& index_map)
DEDUCED_RETURN_TYPE(transform_view(index_map, impl::indirect_accessor<RASeq>(std::move(data)))); DEDUCED_RETURN_TYPE(transform_view(index_map, impl::indirect_accessor<RASeq>(std::move(data))));
......
...@@ -89,8 +89,8 @@ auto back(Seq& seq) -> decltype(*std::begin(seq)) { ...@@ -89,8 +89,8 @@ auto back(Seq& seq) -> decltype(*std::begin(seq)) {
*/ */
template <typename V> template <typename V>
struct pointer_proxy: public V { struct pointer_proxy: public V {
pointer_proxy(const V& v): V{v} {} pointer_proxy(const V& v): V(v) {}
pointer_proxy(V&& v): V{std::move(v)} {} pointer_proxy(V&& v): V(std::move(v)) {}
const V* operator->() const { return this; } const V* operator->() const { return this; }
}; };
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment