On Fri, Jan 22, 2016 at 12:06 AM, Andrew MacLeod <amacl...@redhat.com> wrote: > I was trying the ttype prototype for static type checking on fold-const.c to > see how long it would take me to convert such a large file, and it choked on > this snippet of code in fold_unary_loc, around lines 7690-7711: > > suspect code tagged with (*) > > if ((CONVERT_EXPR_CODE_P (code) > || code == NON_LVALUE_EXPR) > && TREE_CODE (tem) == COND_EXPR > && TREE_CODE (TREE_OPERAND (tem, 1)) == code > && TREE_CODE (TREE_OPERAND (tem, 2)) == code > (*) && ! VOID_TYPE_P (TREE_OPERAND (tem, 1)) > (*) && ! VOID_TYPE_P (TREE_OPERAND (tem, 2)) > && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0)) > == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0))) > && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem)) > && (INTEGRAL_TYPE_P > (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), > 0)))) > && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD) > || flag_syntax_only)) > tem = build1_loc (loc, code, type, > build3 (COND_EXPR, > TREE_TYPE (TREE_OPERAND > (TREE_OPERAND (tem, 1), > 0)), > TREE_OPERAND (tem, 0), > TREE_OPERAND (TREE_OPERAND (tem, 1), > 0), > TREE_OPERAND (TREE_OPERAND (tem, 2), > 0))); > > and with: > #define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE) > > I don't think this is what was intended. it would expand into: > > && TREE_CODE (TREE_OPERAND (tem, 1)) == code > && TREE_CODE (TREE_OPERAND (tem, 2)) == code > && ! (TREE_CODE (TREE_OPERAND (tem, 1)) == VOID_TYPE) > && ! (TREE_CODE (TREE_OPERAND (tem, 2)) == VOID_TYPE) > > the latter two would be obviously true if the first 2 were true. > > My guess is this is probably suppose to be > && ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 1))) > && ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 2))) > > but I'm not sure. Any guesses whats intended here?
Not sure, it might be to detect some of the x ? : throw () constructs but not sure how those would survive the previous == code check. Maybe a ? (void) ... : (void) ... is supposed to be detected. The type check below would catch that as well (huh? a flag_syntax_only check in fold-const.c!?) I'd say change to ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 1)) to match what the VOID_TYPE_P check does above this block. Richard. > Andrew > >