On Fri, Dec 27, 2013 at 10:54 PM, Trevor Saunders <tsaund...@mozilla.com> wrote: > 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. In some callers (eg: iterative_hash_expr()), the local variable is used multiple times. Getting rid of it, when it's only used once is better.
> > 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