On Tue, 28 Jul 2020, Martin Sebor via Gcc-patches wrote: > + /* A list of VLA variable bounds or null if not specified. */ > + tree vbchain = NULL_TREE; > + if (parm->declarator->kind == cdk_array)
> + if (pd->kind != cdk_array) > + break; > + /* Skip all constant bounds except the most significant > + one. The interior ones are included in the array type. */ > + if (next && next->kind == cdk_array) > + continue; Anything working with declarators should typically have logic to skip cdk_attrs declarators. For example, a parameter is declared as an array using [] in that declarator if the innermost c_declarator that is not cdk_id or cdk_attrs is of kind cdk_array. (It's the innermost not the outermost because of C declarator syntax.) The array bounds for the parameter array itself (as opposed to any other bounds if the parameter is e.g. an array of pointers to arrays) are then those in all the cdk_array declarators after the last declarator (if any) that's not cdk_array, cdk_attrs or cdk_id (cdk_id only comes in the last place). If e.g. the parameter has the nested cdk_declarator sequence cdk_function cdk_pointer cdk_array cdk_attrs cdk_array cdk_pointer cdk_array cdk_attrs cdk_array cdk_array cdk_id then it's a three-dimensional array of pointers to two-dimensional arrays of pointers to functions. I don't see anything in the tests in this patch to cover this sort of case (arrays of pointers, including arrays of pointers to arrays etc.). -- Joseph S. Myers jos...@codesourcery.com