Embedded Compiler Error in Visual Studio 2013

In one of my classes, fooI insert values ​​into some static member array,, static unsigned int index[9][9][9][9]with the following

for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      for (int k = 0; k < 9; k++) {
        for (int l = 0; l < 9; l++) {
          if (index[i][j][k][l] != 100) {
            setIndex(i, j, k, l, &index[j][i][k][l]);
            setIndex(i, j, k, l, &index[i][j][l][k]);
            setIndex(i, j, k, l, &index[j][i][l][k]);
            setIndex(i, j, k, l, &index[k][l][i][j]);
            setIndex(i, j, k, l, &index[k][l][j][i]);
            setIndex(i, j, k, l, &index[l][k][i][j]);
            setIndex(i, j, k, l, &index[l][k][j][i]);
          }
        }
      }
    }
  }

The function is as setIndexfollows:

void foo::setIndex(int i, int j, int k, int l, unsigned int *p) {
  *p = getIndex(i,j,k,l);
}

and he needs

unsigned int foo::getIndex(int i, int j, int k, int l) {
  return index[i][j][k][l];
}

When I try to compile this in Visual Studio 2013, I get a strange internal compiler error

error MSB6006: "CL.exe" exited with code -1073740940.

or, sometimes, also:

fatal error c1001 internal compiler error

Now, if I changed my code only a little, for example, in the first lines:

  int i;
  for (int a = 0; a < 9; a++) {
    i = a;
    [...]
  }

It compiles without problems.

Can anyone understand what is causing the problem?

Here is the minimal code I reproduce it with:

foo.h:

class foo{
 public:
  static void setIndexes();
  static unsigned int getIndex(int i, int j, int k, int l);

 private:
  static void setUniqueIndexes();
  static void setIndex(int i, int j, int k, int l, unsigned int *p);
  static unsigned int index[9][9][9][9];
};

foo.cpp:

#include "foo.h"

unsigned int foo::index[9][9][9][9];

void foo::setIndexes() {
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      for (int k = 0; k < 9; k++) {
        for (int l = 0; l < 9; l++) {
          index[i][j][k][l] = 100;
        }
      }
    }
  }

  setUniqueIndexes();

  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      for (int k = 0; k < 9; k++) {
        for (int l = 0; l < 9; l++) {
          if (index[i][j][k][l] != 100) {
            setIndex(i, j, k, l, &index[j][i][k][l]);
            setIndex(i, j, k, l, &index[i][j][l][k]);
            setIndex(i, j, k, l, &index[j][i][l][k]);
            setIndex(i, j, k, l, &index[k][l][i][j]);
            setIndex(i, j, k, l, &index[k][l][j][i]);
            setIndex(i, j, k, l, &index[l][k][i][j]);
            setIndex(i, j, k, l, &index[l][k][j][i]);
          }
        }
      }
    }
  }
}

void foo::setIndex(int i, int j, int k, int l, unsigned int *p) {
  *p = getIndex(i,j,k,l);
}

unsigned int foo::getIndex(int i, int j, int k, int l) {
  return index[i][j][k][l];
}

void foo::setUniqueIndexes() {
  index[0][0][0][0] = 0;
}

What is really strange is that it compiles if I comment on one of the previous parts of the function setIndexes()or if I delete the operator in setUniqueIndexes()!

NB: , ,

+4

Source: https://habr.com/ru/post/1616485/


All Articles