diff options
author | Richard Biener <rguenther@suse.de> | 2017-10-30 12:43:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-10-30 12:43:45 +0000 |
commit | c1136864438968b76d5063c1af99118c19b1cf83 (patch) | |
tree | 25d82b6d4b6010a49ada5f87299571edb1e6386b /gcc/c/gimple-parser.c | |
parent | c76dc9c32d616eff1e0ae162042f1c0f8ca65fbf (diff) | |
download | gcc-c1136864438968b76d5063c1af99118c19b1cf83.zip gcc-c1136864438968b76d5063c1af99118c19b1cf83.tar.gz gcc-c1136864438968b76d5063c1af99118c19b1cf83.tar.bz2 |
gimple-parser.c (c_parser_gimple_statement): Parse conditional stmts.
2017-10-30 Richard Biener <rguenther@suse.de>
c/
* gimple-parser.c (c_parser_gimple_statement): Parse conditional
stmts.
* gcc.dg/gimplefe-27.c: New testcase.
From-SVN: r254217
Diffstat (limited to 'gcc/c/gimple-parser.c')
-rw-r--r-- | gcc/c/gimple-parser.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index c2e31df..8f624e3 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -419,6 +419,23 @@ c_parser_gimple_statement (c_parser *parser, gimple_seq *seq) if (lhs.value != error_mark_node && rhs.value != error_mark_node) { + /* If we parsed a comparison and the next token is a '?' then + parse a conditional expression. */ + if (COMPARISON_CLASS_P (rhs.value) + && c_parser_next_token_is (parser, CPP_QUERY)) + { + struct c_expr trueval, falseval; + c_parser_consume_token (parser); + trueval = c_parser_gimple_postfix_expression (parser); + falseval.set_error (); + if (c_parser_require (parser, CPP_COLON, "expected %<:%>")) + falseval = c_parser_gimple_postfix_expression (parser); + if (trueval.value == error_mark_node + || falseval.value == error_mark_node) + return; + rhs.value = build3_loc (loc, COND_EXPR, TREE_TYPE (trueval.value), + rhs.value, trueval.value, falseval.value); + } assign = gimple_build_assign (lhs.value, rhs.value); gimple_seq_add_stmt (seq, assign); gimple_set_location (assign, loc); |