init.c (build_new): Add location_t parameter and use it throughout.
authorPaolo Carlini <paolo@gcc.gnu.org>
Tue, 7 Jan 2020 17:58:18 +0000 (17:58 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 7 Jan 2020 17:58:18 +0000 (17:58 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/init.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.bugs/900208_03.C
gcc/testsuite/g++.old-deja/g++.bugs/900519_06.C
libcc1/ChangeLog
libcc1/libcp1plugin.cc

index a7234b89467c17bf59fbb7965f86be268b005d02..1655cafb9ab000bfac8e46bb5a90599a9452157c 100644 (file)
@@ -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.
index 495ed6b9f56e7c6ee7555055b0d327094c9aaa3d..98572bdbad161cb0361628e4c2ef3c53e510b74f 100644 (file)
@@ -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);
index aa4bab56828b0f759406b3287bf2527de9e81684..ba80474e6ac6f5d500cf050bf0c17bbcdc6fabc2 100644 (file)
@@ -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;
index 1ea05ddd497c1fd8bd99c27f787acf16584aed49..595c185f2f8473bc003a8849341227db001d74ed 100644 (file)
@@ -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)
index cd48f533d5d921fb484a95f264fabda0155bdef8..29c3aecd8315d8b54501e083e7fc420086059e84 100644 (file)
@@ -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;
 }
 
index 29f1bce33eda9ceb32a62940f6a3eb5265eee644..ec35056910bd5575034ca030be925d1c14341bc1 100644 (file)
@@ -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>
 
index 7b7c247d1843e93da3bf5e8dc039631ad5fc82f1..2b63e087eae03d19be95480bad1ba63f7c1eac0e 100644 (file)
@@ -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; }
index 601e4aab3ddf7e3ec23dc1c82a01d47047491383..a37033aad9897f4bc5b044cff51ca2da8395131a 100644 (file)
@@ -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; }
index dea6e6a09a1f8b67d375ddd56be1d3f277067eaa..ff994596200f5e33804804e4efe11ee22bd8b18c 100644 (file)
@@ -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.
index 452f4ce83d9fba9b0e89fcf35efb57a2910c18f9..b466b34bee35cd5f4231dbc4734e149fd2ab5c61 100644 (file)
@@ -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--;