diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a7234b89467c..1655cafb9ab0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2020-01-07 Paolo Carlini + + * 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 PR c++/47877 - -fvisibility-inlines-hidden and member templates. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 495ed6b9f56e..98572bdbad16 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, tree, - vec **, int, - tsubst_flags_t); +extern tree build_new (location_t, + vec **, tree, + tree, vec **, + 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 aa4bab56828b..ba80474e6ac6 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 *placement, tree type, tree nelts, - vec *init, int use_global_new) +build_raw_new_expr (location_t loc, vec *placement, tree type, + tree nelts, vec *init, int use_global_new) { tree init_list; tree new_expr; @@ -2413,9 +2413,9 @@ build_raw_new_expr (vec *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 **placement, tree type, tree nelts, rather than just "new". This may change PLACEMENT and INIT. */ tree -build_new (vec **placement, tree type, tree nelts, - vec **init, int use_global_new, tsubst_flags_t complain) +build_new (location_t loc, vec **placement, tree type, + tree nelts, vec **init, int use_global_new, + tsubst_flags_t complain) { tree rval; vec *orig_placement = NULL; @@ -3826,7 +3827,7 @@ build_new (vec **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 **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 **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 **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 **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 **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 **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 1ea05ddd497c..595c185f2f84 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 cd48f533d5d9..29c3aecd8315 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 *placement_vec; vec *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 29f1bce33eda..ec35056910bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-07 Paolo Carlini + + * 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 * gcc.dg/vect/vect-epilogues.c: XFAIL for arm big endian. @@ -29,7 +34,7 @@ 2020-01-07 Martin Liska PR tree-optimization/92860 - * gcc.dg/pr92860.c: New test. + * gcc.dg/pr92860.c: New test. 2020-01-07 Jakub Jelinek 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 7b7c247d1843..2b63e087eae0 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 601e4aab3ddf..a37033aad989 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 dea6e6a09a1f..ff994596200f 100644 --- a/libcc1/ChangeLog +++ b/libcc1/ChangeLog @@ -1,3 +1,7 @@ +2020-01-07 Paolo Carlini + + * libcp1plugin.cc (plugin_build_new_expr): Update build_new call. + 2020-01-01 Jakub Jelinek Update copyright years. diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc index 452f4ce83d9f..b466b34bee35 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--;