Quantcast
Channel: Intel® Software - Intel® C++ Compiler
Viewing all articles
Browse latest Browse all 1175

Type Deduction Failure - Possible Bug

$
0
0

Hello,

I have found a possible type-deduction bug, reproducible in Intel 18.0.1, 18.0.2, and 19.0.0.046. Here is a small code snippet demonstrating the issue:

https://gist.github.com/abrooks98/020b3a499e2dbedd0c7cc81e50982152

#include <vector>
#include <utility>
#include <stdio.h>

template<typename T>
class myvector : public std::vector<T> {};

template<typename T>
struct check_for
{
  template<typename U>
  static constexpr bool _data(U*, decltype(std::declval<U>().data())* = nullptr) { return true; }
  template<typename U>
  static constexpr bool _data(...) { return false; }

  template<typename U>
  static constexpr bool _get_allocator(U*, decltype(std::declval<U>().get_allocator())* = nullptr) { return true; }
  template<typename U>
  static constexpr bool _get_allocator(...) { return false; }

  static constexpr bool data = _data<T>(nullptr);
  static constexpr bool get_allocator = _get_allocator<T>(nullptr);
};

int main(int argc, char** argv)
{
  printf("Check type 'bool'             for function 'data': %d\n", check_for<bool>::data);
  printf("Check type 'std::vector<int>' for function 'data': %d\n", check_for<std::vector<int>>::data);
  printf("Check type 'myvector<int>'    for function 'data': %d\n", check_for<myvector<int>>::data);

  printf("Check type 'bool'             for function 'get_allocator': %d\n", check_for<bool>::get_allocator);
  printf("Check type 'std::vector<int>' for function 'get_allocator': %d\n", check_for<std::vector<int>>::get_allocator);
  printf("Check type 'myvector<int>'    for function 'get_allocator': %d\n", check_for<myvector<int>>::get_allocator);

  decltype(std::declval<std::vector<int>>().get_allocator()) a;

  int* b = a.allocate(10);
  printf("%p\n", b);
  a.deallocate(b, 10);

  return 0;
}

The issue is that check_for<std::vector<int>>::get_allocator should return true, but it does not. The type-deduction does work for some functions, however. For example, check_for<std::vector<int>>::data returns true. This issue is not present in GCC (tested with 4.9.3 and 7.1.0) or Clang (tested with 3.9.0 and 4.0.0)


Viewing all articles
Browse latest Browse all 1175

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>