re PR c++/17554 (crashes in on kopete build (KDE's kdenetwork))
authorAndrew Pinski <pinskia@physics.uc.edu>
Mon, 11 Oct 2004 03:42:09 +0000 (03:42 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Mon, 11 Oct 2004 03:42:09 +0000 (20:42 -0700)
2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>

        PR c++/17554
        part of c++/17657
        middle-end/17703
        * semantics.c (maybe_cleanup_point_expr): Call
        fold_build_cleanup_point_expr.
        (maybe_cleanup_point_expr_void): New function.
        (add_decl_expr): Call maybe_cleanup_point_expr_void.
        (finish_expr_stmt): Likewise.
        (finish_return_stmt): Likewise.
        (finish_for_expr): Likewise.
        (finish_asm_stmt): Likewise.
        * typeck.c (condition_conversion): Call
        fold_build_cleanup_point_expr.

2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/17703
        part of PR c++/17657
        * fold-const.c (fold_build_cleanup_point_expr): New function.
        * tree.h (fold_build_cleanup_point_expr): Prototype.

2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>

        PR c++/17554
        * g++.dg/init/for3.C: New test.

        PR c++/17657
        * g++.dg/opt/switch2.C: New test.

        PR middle-end/17703
        * g++.dg/warn/Wreturn-2.C: New test.

From-SVN: r88869

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/for3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/opt/switch2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wreturn-2.C [new file with mode: 0644]
gcc/tree.h

index 92e09b793d7b39a69d0aa76877798002b9d11634..f816b48b58b945452f6bd4ef7ff1d4d448ac5566 100644 (file)
@@ -1,3 +1,10 @@
+2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/17703
+       part of PR c++/17657
+       * fold-const.c (fold_build_cleanup_point_expr): New function.
+       * tree.h (fold_build_cleanup_point_expr): Prototype.
+
 2004-10-10  Eric Christopher  <echristo@redhat.com>
 
        * dwarf2out.c: Move attribute to subprogram declaration
 2004-10-10  Eric Christopher  <echristo@redhat.com>
 
        * dwarf2out.c: Move attribute to subprogram declaration
index d6aca574f7c5e37b49ad3ee27356b72fdca1251c..08f73ab6e15be7ca6d908712564f8a4314aacd01 100644 (file)
@@ -1,3 +1,19 @@
+2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR c++/17554
+       part of c++/17657
+       middle-end/17703
+       * semantics.c (maybe_cleanup_point_expr): Call
+       fold_build_cleanup_point_expr.
+       (maybe_cleanup_point_expr_void): New function.
+       (add_decl_expr): Call maybe_cleanup_point_expr_void.
+       (finish_expr_stmt): Likewise.
+       (finish_return_stmt): Likewise.
+       (finish_for_expr): Likewise.
+       (finish_asm_stmt): Likewise.
+       * typeck.c (condition_conversion): Call
+       fold_build_cleanup_point_expr.
+
 2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR c++/17907
 2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR c++/17907
index 45912c1707b9c42c20a180248cd44460581aabf6..0fb5c684a8ff966a3aad8f47774b9d71c00bad91 100644 (file)
@@ -358,10 +358,25 @@ static tree
 maybe_cleanup_point_expr (tree expr)
 {
   if (!processing_template_decl && stmts_are_full_exprs_p ())
 maybe_cleanup_point_expr (tree expr)
 {
   if (!processing_template_decl && stmts_are_full_exprs_p ())
-    expr = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (expr), expr);
+    expr = fold_build_cleanup_point_expr (TREE_TYPE (expr), expr);
   return expr;
 }
 
   return expr;
 }
 
+/* Like maybe_cleanup_point_expr except have the type of the new expression be
+   void so we don't need to create a temprary variable to hold the inner
+   expression.  The reason why we do this is because the orginal type might be
+   an aggregate and we cannot create a temprary variable for that type.  */
+
+static tree
+maybe_cleanup_point_expr_void (tree expr)
+{
+  if (!processing_template_decl && stmts_are_full_exprs_p ())
+    expr = fold_build_cleanup_point_expr (void_type_node, expr);
+  return expr;
+}
+
+
+
 /* Create a declaration statement for the declaration given by the DECL.  */
 
 void
 /* Create a declaration statement for the declaration given by the DECL.  */
 
 void
@@ -370,7 +385,7 @@ add_decl_expr (tree decl)
   tree r = build_stmt (DECL_EXPR, decl);
   if (DECL_INITIAL (decl)
       || (DECL_SIZE (decl) && TREE_SIDE_EFFECTS (DECL_SIZE (decl))))
   tree r = build_stmt (DECL_EXPR, decl);
   if (DECL_INITIAL (decl)
       || (DECL_SIZE (decl) && TREE_SIDE_EFFECTS (DECL_SIZE (decl))))
-    r = maybe_cleanup_point_expr (r);
+    r = maybe_cleanup_point_expr_void (r);
   add_stmt (r);
 }
 
   add_stmt (r);
 }
 
@@ -556,7 +571,7 @@ finish_expr_stmt (tree expr)
        {
          if (TREE_CODE (expr) != EXPR_STMT)
            expr = build_stmt (EXPR_STMT, expr);
        {
          if (TREE_CODE (expr) != EXPR_STMT)
            expr = build_stmt (EXPR_STMT, expr);
-         expr = maybe_cleanup_point_expr (expr);
+         expr = maybe_cleanup_point_expr_void (expr);
        }
 
       r = add_stmt (expr);
        }
 
       r = add_stmt (expr);
@@ -719,7 +734,7 @@ finish_return_stmt (tree expr)
     }
 
   r = build_stmt (RETURN_EXPR, expr);
     }
 
   r = build_stmt (RETURN_EXPR, expr);
-  r = maybe_cleanup_point_expr (r);
+  r = maybe_cleanup_point_expr_void (r);
   r = add_stmt (r);
   finish_stmt ();
 
   r = add_stmt (r);
   finish_stmt ();
 
@@ -783,7 +798,7 @@ finish_for_expr (tree expr, tree for_stmt)
       cxx_incomplete_type_error (expr, TREE_TYPE (expr));
       expr = error_mark_node;
     }
       cxx_incomplete_type_error (expr, TREE_TYPE (expr));
       expr = error_mark_node;
     }
-  expr = maybe_cleanup_point_expr (expr);
+  expr = maybe_cleanup_point_expr_void (expr);
   FOR_EXPR (for_stmt) = expr;
 }
 
   FOR_EXPR (for_stmt) = expr;
 }
 
@@ -1179,7 +1194,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
                  output_operands, input_operands,
                  clobbers);
   ASM_VOLATILE_P (r) = volatile_p;
                  output_operands, input_operands,
                  clobbers);
   ASM_VOLATILE_P (r) = volatile_p;
-  r = maybe_cleanup_point_expr (r);
+  r = maybe_cleanup_point_expr_void (r);
   return add_stmt (r);
 }
 
   return add_stmt (r);
 }
 
index e59755416ab65d310ccac968ae4d117f764ba27c..dc0b7cd52c59aed70f14eeafd6e9b962a75a8411 100644 (file)
@@ -3681,7 +3681,7 @@ condition_conversion (tree expr)
   if (processing_template_decl)
     return expr;
   t = perform_implicit_conversion (boolean_type_node, expr);
   if (processing_template_decl)
     return expr;
   t = perform_implicit_conversion (boolean_type_node, expr);
-  t = build1 (CLEANUP_POINT_EXPR, boolean_type_node, t);
+  t = fold_build_cleanup_point_expr (boolean_type_node, t);
   return t;
 }
                
   return t;
 }
                
index 41feda3ef1eb9a1c44043f51749c959dd54d90c5..1dba1fb6c12c5130b14f766d29524ccccab57ffd 100644 (file)
@@ -10465,6 +10465,21 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
   return constant_boolean_node (result, type);
 }
 
   return constant_boolean_node (result, type);
 }
 
+/* Build an expression for the a clean point containing EXPR with type TYPE.
+   Don't build a cleanup point expression for EXPR which don't have side
+   effects.  */
+
+tree
+fold_build_cleanup_point_expr (tree type, tree expr)
+{
+  /* If the expression does not have side effects then we don't have to wrap
+     it with a cleanup point expression.  */
+  if (!TREE_SIDE_EFFECTS (expr))
+    return expr;
+  
+  return build1 (CLEANUP_POINT_EXPR, type, expr);
+}
+
 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
    avoid confusing the gimplify process.  */
 
 /* Build an expression for the address of T.  Folds away INDIRECT_REF to
    avoid confusing the gimplify process.  */
 
index ac9574dff53b515334ea799d7b45b49cfe28fc3b..632dc18d59470b877d701503d1b4030b50804d39 100644 (file)
@@ -1,3 +1,14 @@
+2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR c++/17554
+       * g++.dg/init/for3.C: New test.
+
+       PR c++/17657
+       * g++.dg/opt/switch2.C: New test.
+
+       PR middle-end/17703
+       * g++.dg/warn/Wreturn-2.C: New test.
+
 2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR c++/17907
 2004-10-10  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR c++/17907
diff --git a/gcc/testsuite/g++.dg/init/for3.C b/gcc/testsuite/g++.dg/init/for3.C
new file mode 100644 (file)
index 0000000..c8ef3cc
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+struct A { int i;  A();  A(const A&); };
+
+void bar()
+{
+    A a;
+    for ( ;; a=A() ) ;
+}
diff --git a/gcc/testsuite/g++.dg/opt/switch2.C b/gcc/testsuite/g++.dg/opt/switch2.C
new file mode 100644 (file)
index 0000000..2590273
--- /dev/null
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern int foo (int);
+
+void
+bar (void)
+{
+  char tmp = foo (0);
+  switch (tmp)
+    {
+    case 1: foo (1); break;
+    case 2: foo (2); break;
+    case 3: foo (3); break;
+    case 4: foo (4); break;
+    case 5: foo (5); break;
+    case 6: foo (6); break;
+    case 7: foo (7); break;
+    case 255: foo (8); break;
+    default: break;
+    }
+}
+
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-2.C b/gcc/testsuite/g++.dg/warn/Wreturn-2.C
new file mode 100644 (file)
index 0000000..460afd5
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do compile }
+int foo(int first) {
+  while (true) {
+    return first;
+  }
+} // { dg-bogus "control reaches" }
+
index 89771afa7d2eb5d8a52fc13c4366e85c6c7837d2..ec2ce118df26d824ff3a25e31849034cf8c5af3f 100644 (file)
@@ -3538,6 +3538,7 @@ extern tree nondestructive_fold_binary_to_constant (enum tree_code, tree, tree,
 extern tree fold_read_from_constant_string (tree);
 extern tree int_const_binop (enum tree_code, tree, tree, int);
 extern tree build_fold_addr_expr (tree);
 extern tree fold_read_from_constant_string (tree);
 extern tree int_const_binop (enum tree_code, tree, tree, int);
 extern tree build_fold_addr_expr (tree);
+tree fold_build_cleanup_point_expr (tree type, tree expr);
 extern tree build_fold_addr_expr_with_type (tree, tree);
 extern tree build_fold_indirect_ref (tree);
 extern tree constant_boolean_node (int, tree);
 extern tree build_fold_addr_expr_with_type (tree, tree);
 extern tree build_fold_indirect_ref (tree);
 extern tree constant_boolean_node (int, tree);