[cfe-dev] AST representation for parentheses inside types.

Douglas Gregor dgregor at apple.com
Thu Dec 9 07:08:44 PST 2010


On Dec 8, 2010, at 12:02 PM, Enea Zaffanella wrote:

> Il 07/12/2010 18:36, Douglas Gregor ha scritto:
>> 
>> On Dec 7, 2010, at 6:39 AM, Enea Zaffanella wrote:
>> 
>>> Hello.
>>> 
>>> We noticed some time ago that the AST representation used in clang does
>>> not allow for the representation of those pairs of parentheses that can
>>> occur inside a syntactic type. For instance, the following C code:
>>> 
>>> void ((((*fun_ptr))))(void);
>>> int (*(int_arr_ptr))[15];
>>> void (((*((*fun_ptr_arr_ptr)[10]))))(int, int);
>>> int ((a));
>>> 
>>> is printed (using -ast-print) as follows
>>> 
>>> void (*fun_ptr)(void);
>>> int (*int_arr_ptr)[15];
>>> void (*(*fun_ptr_arr_ptr)[10])(int, int);
>>> int a;
>>> 
>>> The printed parentheses are not directly represented in the AST: they
>>> are inserted by the pretty printer (to respect precedence).
>>> 
>>> Are there plans to extend the AST in order to faithfully represent the
>>> code above?
>> 
>> Not that I know of.
>> 
>>> To our eyes, it seems that the Type hierarchy should be enriched by
>>> adding a ParenType derived class (similar to the ParenExpr class for the
>>> Expr hierarchy). A ParenType would always be a non-canonical type and
>>> the corresponding ParenTypeLoc would provide locations for the two
>>> parentheses. At the parser level, we would have another kind of
>>> DeclaratorChunk.
>>> 
>>> Would this approach make sense?
>> 
>> Yes, this approach makes sense to me.
>> 
>> 	- Doug
> 
> OK, here is attached a patch along the sketch mentioned above.
> It passes all clang tests but a single one.

Looks great, with one comment below about the failing test.

> The failing test is something related to ObjC, on which I have very
> little confidence. Apparently, it seems that we should adjust the
> expected output, which currently is as follows:
> 
> FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder
> ^int(int x, int y)block}{RightParen )} (50)
> 
> whereas we now obtain an extra pair of parentheses:
> 
> FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder int
> (^)(int, int)}{RightParen )} (50)

This probably just means that we need to look through ParenTypeLocs within the FormatFunctionParameter routine in SemaCodeComplete.cpp.

> We look forward for suggestions/corrections/etc.

How many parenthesized types do you see in a typical .c or .cpp file?

	- Doug





More information about the cfe-dev mailing list