]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/56961 (stack overflow in gimplifier with volatile field)
authorRichard Biener <rguenther@suse.de>
Thu, 5 Jun 2014 17:34:48 +0000 (17:34 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 5 Jun 2014 17:34:48 +0000 (17:34 +0000)
/cp
2014-06-05  Richard Biener  <rguenther@suse.de>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/56961
* cp-gimplify.c (cp_gimplify_expr, [MODIFY_EXPR]): Rework
handling of empty classes.

/testsuite
2014-06-05  Richard Biener  <rguenther@suse.de>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/56961
* g++.dg/parse/pr56961.C: New.

Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r211286

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/pr56961.C [new file with mode: 0644]

index 1248ea12fbe4e6f1e7e3eeeb4a6e26fd6315f98a..45e10129a98645a0582f8e809a317f7fd6acea51 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-05  Richard Biener  <rguenther@suse.de>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/56961
+       * cp-gimplify.c (cp_gimplify_expr, [MODIFY_EXPR]): Rework
+       handling of empty classes.
+
 2014-06-04  Jason Merrill  <jason@redhat.com>
 
        * parser.c (cp_parser_diagnose_invalid_type_name): Give helpful note
index 18142bf396ef618d7ee91603dc880c6aab96808b..2798358be6b1bc29105c036d514ba81cf3a7f112 100644 (file)
@@ -629,19 +629,12 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
 
               Also drop volatile variables on the RHS to avoid infinite
               recursion from gimplify_expr trying to load the value.  */
-           if (!TREE_SIDE_EFFECTS (op1)
-               || (DECL_P (op1) && TREE_THIS_VOLATILE (op1)))
+           if (!TREE_SIDE_EFFECTS (op1))
              *expr_p = op0;
-           else if (TREE_CODE (op1) == MEM_REF
-                    && TREE_THIS_VOLATILE (op1))
-             {
-               /* Similarly for volatile MEM_REFs on the RHS.  */
-               if (!TREE_SIDE_EFFECTS (TREE_OPERAND (op1, 0)))
-                 *expr_p = op0;
-               else
-                 *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
-                                   TREE_OPERAND (op1, 0), op0);
-             }
+           else if (TREE_THIS_VOLATILE (op1)
+                    && (REFERENCE_CLASS_P (op1) || DECL_P (op1)))
+             *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
+                               build_fold_addr_expr (op1), op0);
            else
              *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
                                op0, op1);
index f5e251718c9ea1b3f830eda93bb7d369c666b813..54a4026d39ee319e4c8a59e2875f8fabdac3c171 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-05  Richard Biener  <rguenther@suse.de>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/56961
+       * g++.dg/parse/pr56961.C: New.
+
 2014-06-05  Kai Tietz  <ktietz@redhat.com>
 
        PR target/46219
diff --git a/gcc/testsuite/g++.dg/parse/pr56961.C b/gcc/testsuite/g++.dg/parse/pr56961.C
new file mode 100644 (file)
index 0000000..c60cfdb
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/56961
+
+struct foo { };
+
+typedef struct
+{
+  volatile foo fields;
+} CSPHandleState;
+CSPHandleState a;
+
+void fn1 ()
+{
+  CSPHandleState b;
+  b.fields = foo();  // { dg-error "discards qualifiers" }
+}