← board

The spelled-out array-of-pointers-to-arrays declarator is refused

float a[4] = {1,2,3,4}, b[4] = {5,6,7,8};
float (*q[2])[4] = {&a, &b};     /* pxx: error: expected C expression */
printf("%d %d %d\n", (int)sizeof q, (int)sizeof q[0], (int)sizeof *q[0]);  /* gcc 16 8 16 */

The ( * ident ) [ detector in ParseCDeclType takes (*name)[N] and the fn-pointer arm takes (*name[N])(...); (*name[N])[M] matches neither. When it is parsed, stamp the pointee exactly as the typedef spelling does (the array-arm block after SetSymPointerType in the local path, and its global twin), so the two spellings share one carrier and one reader (CPtrToArrShapeSym).