On Mon, Dec 23, 2013 at 09:26:41AM -0500, Prathamesh Kulkarni wrote:
> IS_EXPR_CODE_CLASS() is called at 18 places within gcc subdirectory,
> and except for expr_check(), tree_block(), tree_set_block() all the
> other callers pass argument of type enum tree_code_class to
> IS_EXPR_CODE_CLASS().
> 
> These four callers (expr_check is overloaded) assign value of
> TREE_CODE_CLASS() to variable of type char const, and then pass it as
> argument to IS_EXPR_CODE_CLASS()

that sounds like a bug, or at least a aimed and loaded foot gun

> For example: tree_block():
> tree
> tree_block (tree t)
> {
>   char const c = TREE_CODE_CLASS (TREE_CODE (t));
> 
>   if (IS_EXPR_CODE_CLASS (c))
>     return LOCATION_BLOCK (t->exp.locus);
>   gcc_unreachable ();
>   return NULL;
> }
> 
> Should type of "c" be changed to const enum tree_code_class instead
> (similarly in other callers) ? Also, TREE_CODE_CLASS()'s value is of
> type enum tree_code_class.

Well, in that case using a local variable seems pretty useless, why not
just get rid of it?  However switching the type certainly seems
reasonable.

Trev

> 
> This gave a compile-error: invalid conversion from ‘char’ to ‘tree_code_class’
> when i changed the macro IS_EXPR_CODE_CLASS() to the following function:
> 
> static inline bool
> IS_EXPR_CODE_CLASS(enum tree_code_class code_class)
> {
>   return (code_class >= tcc_reference) && (code_class <= tcc_expression);
> }
> 
> Thanks and Regards,
> Prathamesh

Reply via email to