[gcc/devel/ranger] c++: Handle COMPOUND_EXPRs in ocp_convert [PR94339]

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 19:58:58 GMT 2020


https://gcc.gnu.org/g:72809d6fe8e085440403ce125c51d01d6e7512b0

commit 72809d6fe8e085440403ce125c51d01d6e7512b0
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Mar 27 10:00:47 2020 +0100

    c++: Handle COMPOUND_EXPRs in ocp_convert [PR94339]
    
    My recent change to get_narrower/warnings_for_convert_and_check broke
    the following testcase, warnings_for_convert_and_check is upset that
    expr is a COMPOUND_EXPR with INTEGER_CST at the rightmost operand, while
    result is a COMPOUND_EXPR with a NOP_EXPR of INTEGER_CST at the rightmost
    operand, it expects such conversions to be simplified.
    
    The easiest fix seems to be to handle COMPOUND_EXPRs in ocp_convert too,
    by converting the rightmost operand and recreating COMPOUND_EXPR(s) if that
    changed.
    
    The attr-copy-2.C change is a workaround for PR94346, where we now ICE on
    the testcase, while previously we'd ICE only if it contained a comma
    expression at the outer level rather than cast of a COMPOUND_EXPR to
    something.  I'll defer that to Martin.
    
    2020-03-27  Jakub Jelinek  <jakub@redhat.com>
    
            PR c++/94339
            * cvt.c (ocp_convert): Handle COMPOUND_EXPR by recursion on the second
            operand and creating a new COMPOUND_EXPR if anything changed.
    
            * g++.dg/other/pr94339.C: New test.
            * g++.dg/ext/attr-copy-2.C: Comment out failing tests due to PR94346.

Diff:
---
 gcc/cp/ChangeLog                       |  6 ++++++
 gcc/cp/cvt.c                           | 11 +++++++++++
 gcc/testsuite/ChangeLog                |  6 ++++++
 gcc/testsuite/g++.dg/ext/attr-copy-2.C |  8 ++++----
 gcc/testsuite/g++.dg/other/pr94339.C   | 11 +++++++++++
 5 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6ac6a67933a..46208b2d756 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-27  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/94339
+	* cvt.c (ocp_convert): Handle COMPOUND_EXPR by recursion on the second
+	operand and creating a new COMPOUND_EXPR if anything changed.
+
 2020-03-26  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/94336 - template keyword accepted before destructor names.
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 22a72c08c45..a3b80968b33 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -697,6 +697,17 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
   if (error_operand_p (e) || type == error_mark_node)
     return error_mark_node;
 
+  if (TREE_CODE (e) == COMPOUND_EXPR)
+    {
+      e = ocp_convert (type, TREE_OPERAND (e, 1), convtype, flags, complain);
+      if (e == error_mark_node)
+	return error_mark_node;
+      if (e == TREE_OPERAND (expr, 1))
+	return expr;
+      return build2_loc (EXPR_LOCATION (expr), COMPOUND_EXPR, TREE_TYPE (e),
+			 TREE_OPERAND (expr, 0), e);
+    }
+
   complete_type (type);
   complete_type (TREE_TYPE (expr));
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 98f090721d1..f0b1b5f006b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-27  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/94339
+	* g++.dg/other/pr94339.C: New test.
+	* g++.dg/ext/attr-copy-2.C: Comment out failing tests due to PR94346.
+
 2020-03-27  Roman Zhuykov  <zhroma@ispras.ru>
 
 	* gcc.c-torture/execute/pr70127-debug-sms.c: New test.
diff --git a/gcc/testsuite/g++.dg/ext/attr-copy-2.C b/gcc/testsuite/g++.dg/ext/attr-copy-2.C
index 7776959d9f6..7c47a1554c4 100644
--- a/gcc/testsuite/g++.dg/ext/attr-copy-2.C
+++ b/gcc/testsuite/g++.dg/ext/attr-copy-2.C
@@ -36,8 +36,8 @@ typedef struct C
   ATTR (copy (*(struct A *)(0, 1))) long m_xpa_0_1;
 
   ATTR (copy (((struct A *)0)[0])) short m_arpa_0;
-  ATTR (copy (((struct A *)(1, 0))[0])) int m_arpa_1_0;
-  ATTR (copy (((struct A *)(0, 1))[0])) long m_arpa_0_1;
+//  ATTR (copy (((struct A *)(1, 0))[0])) int m_arpa_1_0;
+//  ATTR (copy (((struct A *)(0, 1))[0])) long m_arpa_0_1;
 
   ATTR (copy (a)) short m_a;
   ATTR (copy (b.a)) int m_b_a;
@@ -86,8 +86,8 @@ static_assert (__builtin_has_attribute (((C*)0)->m_xpa_0_1, packed));
 static_assert (__builtin_has_attribute (((C*)0)->m_ra, packed));
 
 static_assert (__builtin_has_attribute (((C*)0)->m_arpa_0, packed));
-static_assert (__builtin_has_attribute (((C*)0)->m_arpa_1_0, packed));
-static_assert (__builtin_has_attribute (((C*)0)->m_arpa_0_1, packed));
+//static_assert (__builtin_has_attribute (((C*)0)->m_arpa_1_0, packed));
+//static_assert (__builtin_has_attribute (((C*)0)->m_arpa_0_1, packed));
 
 static_assert (__builtin_has_attribute (((C*)0)->m_a, packed));
 static_assert (__builtin_has_attribute (((C*)0)->m_b_a, packed));
diff --git a/gcc/testsuite/g++.dg/other/pr94339.C b/gcc/testsuite/g++.dg/other/pr94339.C
new file mode 100644
index 00000000000..3892d780d9e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/pr94339.C
@@ -0,0 +1,11 @@
+// PR c++/94339
+// { dg-do compile }
+
+unsigned a;
+void bar ();
+
+unsigned
+foo (bool x)
+{
+  return x ? bar (), -1 : a;
+}


More information about the Gcc-cvs mailing list