gimple-parser.c (c_parser_gimple_statement): Parse conditional stmts.
authorRichard Biener <rguenther@suse.de>
Mon, 30 Oct 2017 12:43:45 +0000 (12:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 30 Oct 2017 12:43:45 +0000 (12:43 +0000)
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

gcc/c/ChangeLog
gcc/c/gimple-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gimplefe-27.c [new file with mode: 0644]

index fe450ec4331e4bc38d8c61d194458856151a54a3..8bb9d372a77829b04cff8e57d835845b2019174f 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-30  Richard Biener  <rguenther@suse.de>
+
+       * gimple-parser.c (c_parser_gimple_statement): Parse conditional
+       stmts.
+
 2017-10-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * c-decl.c (header_for_builtin_fn): Add support for copysign, fma,
index c2e31df218cc8526b07296500e7b74c79e34f874..8f624e3b9a28076953a4be69b4bc84982fea3757 100644 (file)
@@ -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);
index 6f98a1a7acc5e160fcc4351add9d03d5eb5054d9..598e4c082ab3d8223778002c27c5f5cef1973b9a 100644 (file)
@@ -1,3 +1,7 @@
+2017-10-30  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/gimplefe-27.c: New testcase.
+
 2017-10-30  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c17-version-1.c, gcc.dg/c17-version-2.c: New tests.
diff --git a/gcc/testsuite/gcc.dg/gimplefe-27.c b/gcc/testsuite/gcc.dg/gimplefe-27.c
new file mode 100644 (file)
index 0000000..604a2cc
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-options "-O -fgimple" } */
+
+int __GIMPLE ()
+p (int n)
+{
+  int _2;
+  _2 = n_1(D) != 0 ? 2 : 0;
+  return _2;
+}