title: warning: passing 'int *[10]' to parameter of type 'const int *const *' discards qualifiers in nested pointer types
body: <p>I have the following file <code>aaa.c</code>:</p>
  
  <pre><code>int Test(const int * const * int_array, int count) {
    int min = int_array[0][0];
    for (int i = 1; i &lt; count; ++i) {
      if (min &gt; int_array[i][0])
        min = int_array[i][0];
    }
    return min;
  }
  
  void test_Test(void) {
    int i[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int *pi[10] = { &amp;i[0], &amp;i[1], &amp;i[2], &amp;i[3], &amp;i[4], &amp;i[5],
      &amp;i[6], &amp;i[7], &amp;i[8], &amp;i[9] };
    Test(pi, 10);
  }
  </code></pre>
  
  <p>When I compile it with <code>gcc -c aaa.c</code>, the following warning is produced:</p>
  
  <pre><code>% gcc -c aaa.c 
  aaa.c: In function ‘test_Test’:
  aaa.c:14:8: warning: passing argument 1 of ‘Test’ from incompatible pointer type 
          [-Wincompatible-pointer-types]
     Test(pi, 10);
          ^~
  aaa.c:1:5: note: expected ‘const int * const*’ but argument is of type ‘int **’
   int Test(const int * const * int_array, int count) {
       ^~~~
  </code></pre>
  
  <p>Why? What qualifier was discarded? <code>const int * const * int_array</code> certainly doesn't discard any qualifiers that <code>int **</code> would have.</p>