[cfe-dev] Distinguish between array parameters and pointer parameters in the AST.

Roberto Bagnara bagnara at cs.unipr.it
Fri Feb 20 09:22:14 PST 2009


steve naroff wrote:
> 
> On Feb 20, 2009, at 11:26 AM, Paolo Bolzoni wrote:
> 
>> dear cfe list,
>>
>> According to the clang AST the two parameters' type of this function
>> declaration are the same:
>>
>> int f(int a[], int* b);
>>
>> while it makes sense, I'd like to distinguish.
>> Is it not possible?
>>
> 
> Not currently. Here is a comment from Sema::Sema::ActOnParamDeclarator():
> 
>   // Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
>   // Doing the promotion here has a win and a loss. The win is the type for
>   // both Decl's and DeclRefExpr's will match (a convenient invariant 
> for the
>   // code generator). The loss is the orginal type isn't preserved. For 
> example:
>   //
>   // void func(int parmvardecl[5]) { // convert "int [5]" to "int *"
>   //    int blockvardecl[5];
>   //    sizeof(parmvardecl);  // size == 4
>   //    sizeof(blockvardecl); // size == 20
>   // }
>   //
>   // For expressions, all implicit conversions are captured using the
>   // ImplicitCastExpr AST node (we have no such mechanism for Decl's).
>   //
>   // FIXME: If a source translation tool needs to see the original type, 
> then
>   // we need to consider storing both types (in ParmVarDecl)...
>   // 
> 
> HTH,

Thanks Steve.  In our case we need to see the original type: there are
coding rules that we need to check where the distincion is crucial.
For instance:

int f(int a[], int* b) {
    a[0] = 0;     /* Compliant. */
    b[5] = 0;     /* Not Compliant: as b was not declared as an array,
                                    MISRA rule 17.4 is violated.  */
}

How difficult would be to address the FIXME above?
Best,

    Roberto

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it



More information about the cfe-dev mailing list