OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Aug 2003 12:55:04 +0000 (12:55 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Aug 2003 12:55:04 +0000 (12:55 +0000)
PR c++/11957
* cp-tree.h (finish_stmt_expr): Add bool parameter.
* init.c (finish_init_stmts): Pass true to finish_stmt_expr. Don't
adjust the stmt_expr here.
(build_vec_init): Use finish_stmt_expr_expr, convert result to
array type.
* parser.c (cp_parser_primar_expression): Adjust finish_stmt_expr
call.
* pt.c (tsubst_copy): Likewise.
* semantics.c (finish_stmt_expr): Add parameter.
testsuite:
PR c++/11957
* g++.dg/warn/noeffect1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70541 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/init.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c

index 19562e6..732540e 100644 (file)
@@ -1,5 +1,16 @@
 2003-08-18  Nathan Sidwell  <nathan@codesourcery.com>
 
+       PR c++/11957
+       * cp-tree.h (finish_stmt_expr): Add bool parameter.
+       * init.c (finish_init_stmts): Pass true to finish_stmt_expr. Don't
+       adjust the stmt_expr here.
+       (build_vec_init): Use finish_stmt_expr_expr, convert result to
+       array type.
+       * parser.c (cp_parser_primar_expression): Adjust finish_stmt_expr
+       call.
+       * pt.c (tsubst_copy): Likewise.
+       * semantics.c (finish_stmt_expr): Add parameter.
+
        * pt.c (instantiate_class_template): Push to class's scope before
        tsubsting base.
 
index eae862a..43655b5 100644 (file)
@@ -4102,7 +4102,7 @@ extern tree finish_parenthesized_expr           (tree);
 extern tree finish_non_static_data_member       (tree, tree, tree);
 extern tree begin_stmt_expr                     (void);
 extern tree finish_stmt_expr_expr              (tree);
-extern tree finish_stmt_expr                    (tree);
+extern tree finish_stmt_expr                    (tree, bool);
 extern tree perform_koenig_lookup               (tree, tree);
 extern tree finish_call_expr                    (tree, tree, bool);
 extern tree finish_increment_expr               (tree, enum tree_code);
index c2b3711..0cd7270 100644 (file)
@@ -85,9 +85,7 @@ finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
 {  
   finish_compound_stmt (compound_stmt);
   
-  stmt_expr = finish_stmt_expr (stmt_expr);
-  STMT_EXPR_NO_SCOPE (stmt_expr) = true;
-  TREE_USED (stmt_expr) = 1;
+  stmt_expr = finish_stmt_expr (stmt_expr, true);
 
   my_friendly_assert (!building_stmt_tree () == is_global, 20030726);
   
@@ -2478,7 +2476,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
     base = cp_convert (ptype, decay_conversion (base));
 
   /* The code we are generating looks like:
-
+     ({
        T* t1 = (T*) base;
        T* rval = t1;
        ptrdiff_t iterator = maxindex;
@@ -2490,7 +2488,8 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
        } catch (...) {
          ... destroy elements that were constructed ...
        }
-       return rval;
+       rval;
+     })
        
      We can omit the try and catch blocks if we know that the
      initialization will never throw an exception, or if the array
@@ -2662,18 +2661,22 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
 
       finish_compound_stmt (try_body);
       finish_cleanup_try_block (try_block);
-      e = build_vec_delete_1 (rval, m,
-                             type,
-                             sfk_base_destructor,
+      e = build_vec_delete_1 (rval, m, type, sfk_base_destructor,
                              /*use_global_delete=*/0);
       finish_cleanup (e, try_block);
     }
 
-  /* The value of the array initialization is the address of the
-     first element in the array.  */
-  finish_expr_stmt (rval);
+  /* The value of the array initialization is the array itself, RVAL
+     is a pointer to the first element.  */
+  finish_stmt_expr_expr (rval);
 
   stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
+
+  /* Now convert make the result have the correct type. */
+  atype = build_pointer_type (atype);
+  stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
+  stmt_expr = build_indirect_ref (stmt_expr, NULL);
+  
   current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
   return stmt_expr;
 }
index b485fb5..2e5e4dd 100644 (file)
@@ -2270,7 +2270,7 @@ cp_parser_primary_expression (cp_parser *parser,
            /* Parse the compound-statement.  */
            cp_parser_compound_statement (parser, true);
            /* Finish up.  */
-           expr = finish_stmt_expr (expr);
+           expr = finish_stmt_expr (expr, false);
          }
        else
          {
index e0dfcb7..0830603 100644 (file)
@@ -7343,7 +7343,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          
          tsubst_expr (STMT_EXPR_STMT (t), args,
                       complain | tf_stmt_expr_cmpd, in_decl);
-         return finish_stmt_expr (stmt_expr);
+         return finish_stmt_expr (stmt_expr, false);
        }
       
       return t;
index 2316392..2997237 100644 (file)
@@ -1405,7 +1405,7 @@ begin_stmt_expr (void)
   last_expr_type = NULL_TREE;
   
   keep_next_level (1);
-  
+
   return last_tree; 
 }
 
@@ -1469,13 +1469,12 @@ finish_stmt_expr_expr (tree expr)
   return result;
 }
 
-/* Finish a statement-expression.  RTL_EXPR should be the value
-   returned by the previous begin_stmt_expr; EXPR is the
-   statement-expression.  Returns an expression representing the
-   statement-expression.  */
+/* Finish a statement-expression.  EXPR should be the value returned
+   by the previous begin_stmt_expr.  Returns an expression
+   representing the statement-expression.  */
 
 tree 
-finish_stmt_expr (tree rtl_expr)
+finish_stmt_expr (tree rtl_expr, bool has_no_scope)
 {
   tree result;
   tree result_stmt = last_expr_type;
@@ -1496,6 +1495,7 @@ finish_stmt_expr (tree rtl_expr)
   
   result = build_min (STMT_EXPR, type, last_tree);
   TREE_SIDE_EFFECTS (result) = 1;
+  STMT_EXPR_NO_SCOPE (result) = has_no_scope;
   
   last_expr_type = NULL_TREE;