WindowsのVSCodeで__m256d型のインデックスアクセスにenumを使うと怒られる

TL;DR

  • WindowsのC/C++拡張が入ったVSCodeで_m256d型の変数にenumでインデックスアクセスすると、「これらのオペランドと一致する演算子 “[]” はありません – オペランドの型: __m256d [ enum ]」というエラーが表示される
  • 解決するには、.vscode/c_cpp_properties.jsoncompilerPathをデフォルトの/usr/bin/g++から適切なもの、例えばc:/MingW/bin/g++に変える。

現象

こんなコードを書く。

#include <iostream>
#include <x86intrin.h>
enum { X, Y, Z };

int main() {
  int a[] = {0.0, 1.0, 2.0, 3.0};
  std::cout << a[X] << std::endl;
  std::cout << a[Y] << std::endl;

  __m256d v = _mm256_set_pd(0.0, 1.0, 2.0, 3.0);
  std::cout << v[X] << std::endl;
  std::cout << v[Y] << std::endl;
}

enumで座標軸を表現し、それでint a[]や、__m256d vにインデックスアクセスをしている。

このうち、int a[]のインデックスにenumを使っても文句は言われないのだが、__m256d vのインデックスアクセスのところで「これらのオペランドと一致する演算子 “[]” はありません – オペランドの型: __m256d [ enum ]」と文句を言われてしまう。

image0.png

しかし、WSLやMinGWのg++でコンパイルしてもそんなことは言われず、いったい誰がこのエラーを吐いているのかよくわからない。enumに明示的にint型を指定したり、X=0などと値を代入してもダメだった。

回避方法

VSCodeの右下にあるWin32をクリックして現れるメニューの「構成の編集 (JSON)」を選ぶ。

image1.png

すると、.vscode/c_cpp_properties.jsonが編集できるので、そのcompilerPathを、別のコンパイラ、例えばc:/MingW/bin/g++に変える。

image2.png

すると、エラーが消える。

image3.png

まとめ

__m256dにenumでインデックスアクセスするという、極めてニッチなコードにVSCodeが怒る件について対応した。結局VSCodeがデフォルトで参照する/usr/bin/gccusr/bin/g++の実体が何かよくわからなかったのだが(cpptools?)、いずれにせよ別のコンパイラを指定することでエラーが消えた。何しろSIMD化とかするとこの手のコードが大量に発生するのだが、VSCodeが大量のエラーで真っ赤になるのが鬱陶しかったのでなおってよかった。