[gcc/devel/c++-coroutines] init.c (build_new): Add location_t parameter and use it throughout.

Iain D Sandoe iains@gcc.gnu.org
Fri Jan 17 11:05:00 GMT 2020


https://gcc.gnu.org/g:87d3f828de27930f88ce5b76c9ae222c89064cca

commit 87d3f828de27930f88ce5b76c9ae222c89064cca
Author: Paolo Carlini <paolo@gcc.gnu.org>
Date:   Tue Jan 7 17:58:18 2020 +0000

    init.c (build_new): Add location_t parameter and use it throughout.
    
    /gcc/cp
    2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
    
    	* init.c (build_new): Add location_t parameter and use it throughout.
    	(build_raw_new_expr): Likewise.
    	* parser.c (cp_parser_new_expression): Pass the combined_loc.
    	* pt.c (tsubst_copy_and_build): Adjust call.
    	* cp-tree.h: Update declarations.
    
    /libcc1
    2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
    
    	* libcp1plugin.cc (plugin_build_new_expr): Update build_new call.
    
    /gcc/testsuite
    2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
    
    	* g++.old-deja/g++.bugs/900208_03.C: Check locations too.
    	* g++.old-deja/g++.bugs/900519_06.C: Likewise.
    
    From-SVN: r279963

Diff:
---
 gcc/cp/ChangeLog                                |  8 +++++++
 gcc/cp/cp-tree.h                                |  7 +++---
 gcc/cp/init.c                                   | 31 +++++++++++++------------
 gcc/cp/parser.c                                 |  6 ++---
 gcc/cp/pt.c                                     | 11 +++++----
 gcc/testsuite/ChangeLog                         |  7 +++++-
 gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C |  2 +-
 gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C |  8 +++----
 libcc1/ChangeLog                                |  4 ++++
 libcc1/libcp1plugin.cc                          |  4 ++--
 10 files changed, 53 insertions(+), 35 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a7234b8..1655caf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* init.c (build_new): Add location_t parameter and use it throughout.
+	(build_raw_new_expr): Likewise.
+	* parser.c (cp_parser_new_expression): Pass the combined_loc.
+	* pt.c (tsubst_copy_and_build): Adjust call.
+	* cp-tree.h: Update declarations.
+
 2020-01-07  Jason Merrill  <jason@redhat.com>
 
 	PR c++/47877 - -fvisibility-inlines-hidden and member templates.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 495ed6b..98572bd 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -6720,9 +6720,10 @@ extern tree throw_bad_array_new_length		(void);
 extern bool type_has_new_extended_alignment	(tree);
 extern unsigned malloc_alignment		(void);
 extern tree build_new_constexpr_heap_type	(tree, tree, tree);
-extern tree build_new				(vec<tree, va_gc> **, tree, tree,
-						 vec<tree, va_gc> **, int,
-                                                 tsubst_flags_t);
+extern tree build_new				(location_t,
+						 vec<tree, va_gc> **, tree,
+						 tree, vec<tree, va_gc> **,
+						 int, tsubst_flags_t);
 extern tree get_temp_regvar			(tree, tree);
 extern tree build_vec_init			(tree, tree, tree, bool, int,
                                                  tsubst_flags_t);
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index aa4bab5..ba80474 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2396,8 +2396,8 @@ decl_constant_value (tree decl)
    creates and returns a NEW_EXPR.  */
 
 static tree
-build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
-		    vec<tree, va_gc> *init, int use_global_new)
+build_raw_new_expr (location_t loc, vec<tree, va_gc> *placement, tree type,
+		    tree nelts, vec<tree, va_gc> *init, int use_global_new)
 {
   tree init_list;
   tree new_expr;
@@ -2413,9 +2413,9 @@ build_raw_new_expr (vec<tree, va_gc> *placement, tree type, tree nelts,
   else
     init_list = build_tree_list_vec (init);
 
-  new_expr = build4 (NEW_EXPR, build_pointer_type (type),
-		     build_tree_list_vec (placement), type, nelts,
-		     init_list);
+  new_expr = build4_loc (loc, NEW_EXPR, build_pointer_type (type),
+			 build_tree_list_vec (placement), type, nelts,
+			 init_list);
   NEW_EXPR_USE_GLOBAL (new_expr) = use_global_new;
   TREE_SIDE_EFFECTS (new_expr) = 1;
 
@@ -3775,8 +3775,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
    rather than just "new".  This may change PLACEMENT and INIT.  */
 
 tree
-build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
-	   vec<tree, va_gc> **init, int use_global_new, tsubst_flags_t complain)
+build_new (location_t loc, vec<tree, va_gc> **placement, tree type,
+	   tree nelts, vec<tree, va_gc> **init, int use_global_new,
+	   tsubst_flags_t complain)
 {
   tree rval;
   vec<tree, va_gc> *orig_placement = NULL;
@@ -3826,7 +3827,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
 	  || (nelts && type_dependent_expression_p (nelts))
 	  || (nelts && *init)
 	  || any_type_dependent_arguments_p (*init))
-	return build_raw_new_expr (*placement, type, nelts, *init,
+	return build_raw_new_expr (loc, *placement, type, nelts, *init,
 				   use_global_new);
 
       orig_placement = make_tree_vector_copy (*placement);
@@ -3852,10 +3853,11 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
 
   if (nelts)
     {
+      location_t nelts_loc = cp_expr_loc_or_loc (nelts, loc);
       if (!build_expr_type_conversion (WANT_INT | WANT_ENUM, nelts, false))
         {
           if (complain & tf_error)
-	    permerror (cp_expr_loc_or_input_loc (nelts),
+	    permerror (nelts_loc,
 		       "size in array new must have integral type");
           else
             return error_mark_node;
@@ -3871,8 +3873,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
 	 less than zero. ... If the expression is a constant expression,
 	 the program is ill-fomed.  */
       if (TREE_CODE (cst_nelts) == INTEGER_CST
-	  && !valid_array_size_p (cp_expr_loc_or_input_loc (nelts),
-				  cst_nelts, NULL_TREE,
+	  && !valid_array_size_p (nelts_loc, cst_nelts, NULL_TREE,
 				  complain & tf_error))
 	return error_mark_node;
 
@@ -3886,7 +3887,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
   if (TYPE_REF_P (type))
     {
       if (complain & tf_error)
-        error ("new cannot be applied to a reference type");
+        error_at (loc, "new cannot be applied to a reference type");
       else
         return error_mark_node;
       type = TREE_TYPE (type);
@@ -3895,7 +3896,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
   if (TREE_CODE (type) == FUNCTION_TYPE)
     {
       if (complain & tf_error)
-        error ("new cannot be applied to a function type");
+        error_at (loc, "new cannot be applied to a function type");
       return error_mark_node;
     }
 
@@ -3911,7 +3912,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
 
   if (processing_template_decl)
     {
-      tree ret = build_raw_new_expr (orig_placement, type, orig_nelts,
+      tree ret = build_raw_new_expr (loc, orig_placement, type, orig_nelts,
 				     orig_init, use_global_new);
       release_tree_vector (orig_placement);
       release_tree_vector (orig_init);
@@ -3919,7 +3920,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
     }
 
   /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain.  */
-  rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval);
+  rval = build1_loc (loc, NOP_EXPR, TREE_TYPE (rval), rval);
   TREE_NO_WARNING (rval) = 1;
 
   return rval;
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 1ea05dd..595c185 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8750,11 +8750,9 @@ cp_parser_new_expression (cp_parser* parser)
          at the end of the final token we consumed.  */
       location_t combined_loc = make_location (start_loc, start_loc,
 					       parser->lexer);
-
       /* Create a representation of the new-expression.  */
-      ret = build_new (&placement, type, nelts, &initializer, global_scope_p,
-		       tf_warning_or_error);
-      protected_set_expr_location (ret, combined_loc);
+      ret = build_new (combined_loc, &placement, type, nelts, &initializer,
+		       global_scope_p, tf_warning_or_error);
     }
 
   if (placement != NULL)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index cd48f53..29c3aec 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -18821,12 +18821,12 @@ tsubst_copy_and_build (tree t,
 			 integral_constant_expression_p)
 
   tree retval, op1;
-  location_t loc;
+  location_t save_loc;
 
   if (t == NULL_TREE || t == error_mark_node)
     return t;
 
-  loc = input_location;
+  save_loc = input_location;
   if (location_t eloc = cp_expr_location (t))
     input_location = eloc;
 
@@ -19286,6 +19286,7 @@ tsubst_copy_and_build (tree t,
 	vec<tree, va_gc> *placement_vec;
 	vec<tree, va_gc> *init_vec;
 	tree ret;
+	location_t loc = EXPR_LOCATION (t);
 
 	if (placement == NULL_TREE)
 	  placement_vec = NULL;
@@ -19321,8 +19322,8 @@ tsubst_copy_and_build (tree t,
 
 	tree op1 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
 	tree op2 = RECUR (TREE_OPERAND (t, 2));
-	ret = build_new (&placement_vec, op1, op2, &init_vec,
-			 NEW_EXPR_USE_GLOBAL (t),
+	ret = build_new (loc, &placement_vec, op1, op2,
+			 &init_vec, NEW_EXPR_USE_GLOBAL (t),
 			 complain);
 
 	if (placement_vec != NULL)
@@ -20232,7 +20233,7 @@ tsubst_copy_and_build (tree t,
 #undef RECUR
 #undef RETURN
  out:
-  input_location = loc;
+  input_location = save_loc;
   return retval;
 }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 29f1bce..ec35056 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* g++.old-deja/g++.bugs/900208_03.C: Check locations too.
+	* g++.old-deja/g++.bugs/900519_06.C: Likewise.
+
 2020-01-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
 	* gcc.dg/vect/vect-epilogues.c: XFAIL for arm big endian.
@@ -29,7 +34,7 @@
 2020-01-07  Martin Liska  <mliska@suse.cz>
 
 	PR tree-optimization/92860
-	* gcc.dg/pr92860.c: New test. 
+	* gcc.dg/pr92860.c: New test.
 
 2020-01-07  Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C b/gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C
index 7b7c247..2b63e08 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C
@@ -13,7 +13,7 @@ typedef void (func_type) ();
 
 void global_function_0 ()
 {
-  new func_type;	// { dg-error "" } missed by both cfront 2.0 and g++ 1.36.1
+  new func_type;	// { dg-error "3:new cannot be applied to a function type" } missed by both cfront 2.0 and g++ 1.36.1
 }
 
 int main () { return 0; }
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C b/gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C
index 601e4aa..a37033a 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C
@@ -12,12 +12,12 @@ typedef int& int_ref;
 
 void test (int n)
 {
-  new int&;		// { dg-error "" } missed
-  new int_ref;		// { dg-error "" } missed
+  new int&;		// { dg-error "3:new cannot be applied to a reference type" } missed
+  new int_ref;		// { dg-error "3:new cannot be applied to a reference type" } missed
   new int&[n];		// { dg-error "" } missed
-  new int_ref[n];	// { dg-error "" } missed
+  new int_ref[n];	// { dg-error "3:new cannot be applied to a reference type" } missed
   new int&[3];		// { dg-error "" } missed
-  new int_ref[3];	// { dg-error "" } missed
+  new int_ref[3];	// { dg-error "3:new cannot be applied to a reference type" } missed
 }
 
 int main () { return 0; }
diff --git a/libcc1/ChangeLog b/libcc1/ChangeLog
index dea6e6a..ff99459 100644
--- a/libcc1/ChangeLog
+++ b/libcc1/ChangeLog
@@ -1,3 +1,7 @@
+2020-01-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* libcp1plugin.cc (plugin_build_new_expr): Update build_new call.
+
 2020-01-01  Jakub Jelinek  <jakub@redhat.com>
 
 	Update copyright years.
diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc
index 452f4ce..b466b34 100644
--- a/libcc1/libcp1plugin.cc
+++ b/libcc1/libcp1plugin.cc
@@ -3258,8 +3258,8 @@ plugin_build_new_expr (cc1_plugin::connection *self,
   if (!template_dependent_p)
     processing_template_decl--;
 
-  tree result = build_new (&placement, type, nelts, &initializer,
-			   global_scope_p, tf_error);
+  tree result = build_new (input_location, &placement, type, nelts,
+			   &initializer, global_scope_p, tf_error);
 
   if (template_dependent_p)
     processing_template_decl--;



More information about the Gcc-cvs mailing list