From ad774d0d6351789e9e412291cf280c8e3f72bf81 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 5 Dec 2019 08:59:24 +0000 Subject: [PATCH] typeck2.c (build_functional_cast): Add location_t parameter and use it. /gcc/cp 2019-12-05 Paolo Carlini * typeck2.c (build_functional_cast): Add location_t parameter and use it. * cp-tree.h: Update declaration. * parser.c (cp_parser_functional_cast): Adjust call. * call.c (build_op_delete_call): Likewise. (build_new_method_call_1): Likewise. * decl.c (check_initializer): Likewise. * pt.c (tsubst_copy_and_build): Likewise. * semantics.c (finish_compound_literal): Likewise. /libcc1 2019-12-05 Paolo Carlini * libcp1plugin.cc (plugin_build_expression_list_expr): Adjust build_functional_cast call. /testsuite 2019-12-05 Paolo Carlini * g++.dg/diagnostic/functional-cast-to-array-type-1.C: New. * g++.dg/cpp0x/auto25.C: Check location(s) too. * g++.dg/cpp0x/auto28.C: Likewise. * g++.dg/init/reference2.C: Likewise. * g++.dg/parse/template2.C: Likewise. * g++.dg/template/error8.C: Likewise. * g++.old-deja/g++.ns/crash3.C: Likewise. * g++.old-deja/g++.ns/template7.C: Likewise. * g++.old-deja/g++.pt/crash8.C: Likewise. From-SVN: r278987 --- gcc/cp/ChangeLog | 12 ++++++++++++ gcc/cp/call.c | 6 ++++-- gcc/cp/cp-tree.h | 3 ++- gcc/cp/decl.c | 3 ++- gcc/cp/parser.c | 18 ++++++++++-------- gcc/cp/pt.c | 2 +- gcc/cp/semantics.c | 3 ++- gcc/cp/typeck2.c | 13 +++++++------ gcc/testsuite/ChangeLog | 12 ++++++++++++ gcc/testsuite/g++.dg/cpp0x/auto25.C | 4 ++-- gcc/testsuite/g++.dg/cpp0x/auto28.C | 2 +- .../functional-cast-to-array-type-1.C | 2 ++ gcc/testsuite/g++.dg/init/reference2.C | 2 +- gcc/testsuite/g++.dg/parse/template2.C | 3 ++- gcc/testsuite/g++.dg/template/error8.C | 3 ++- gcc/testsuite/g++.old-deja/g++.ns/crash3.C | 3 ++- gcc/testsuite/g++.old-deja/g++.ns/template7.C | 3 ++- gcc/testsuite/g++.old-deja/g++.pt/crash8.C | 6 ++++-- libcc1/ChangeLog | 5 +++++ libcc1/libcp1plugin.cc | 2 +- 20 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/functional-cast-to-array-type-1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bde12e50ad9..6cda4e72d52 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2019-12-05 Paolo Carlini + + * typeck2.c (build_functional_cast): Add location_t parameter + and use it. + * cp-tree.h: Update declaration. + * parser.c (cp_parser_functional_cast): Adjust call. + * call.c (build_op_delete_call): Likewise. + (build_new_method_call_1): Likewise. + * decl.c (check_initializer): Likewise. + * pt.c (tsubst_copy_and_build): Likewise. + * semantics.c (finish_compound_literal): Likewise. + 2019-12-04 David Edelsohn * cp-gimplify.c: Include tm_p.h. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5e9523e97b5..92d3d688f0c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6933,7 +6933,8 @@ build_op_delete_call (enum tree_code code, tree addr, tree size, rtype = cv_unqualified (rtype); rtype = TYPE_POINTER_TO (rtype); addr = cp_convert (rtype, oaddr, complain); - destroying = build_functional_cast (destroying, NULL_TREE, + destroying = build_functional_cast (input_location, + destroying, NULL_TREE, complain); } @@ -9997,7 +9998,8 @@ build_new_method_call_1 (tree instance, tree fns, vec **args, basetype, name)) inform (input_location, "for a function-style cast, remove the " "redundant %<::%D%>", name); - call = build_functional_cast (basetype, build_tree_list_vec (user_args), + call = build_functional_cast (input_location, basetype, + build_tree_list_vec (user_args), complain); return call; } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 89828d904d5..a392be6b24f 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7681,7 +7681,8 @@ extern tree build_scoped_ref (tree, tree, tree *); extern tree build_x_arrow (location_t, tree, tsubst_flags_t); extern tree build_m_component_ref (tree, tree, tsubst_flags_t); -extern tree build_functional_cast (tree, tree, tsubst_flags_t); +extern tree build_functional_cast (location_t, tree, tree, + tsubst_flags_t); extern tree add_exception_specifier (tree, tree, tsubst_flags_t); extern tree merge_exception_specifiers (tree, tree); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 481c798a2cf..7897327ad9a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6764,7 +6764,8 @@ check_initializer (tree decl, tree init, int flags, vec **cleanups) if (CLASS_TYPE_P (type) && (!init || TREE_CODE (init) == TREE_LIST)) { - init = build_functional_cast (type, init, tf_none); + init = build_functional_cast (input_location, type, + init, tf_none); if (TREE_CODE (init) == TARGET_EXPR) TARGET_EXPR_DIRECT_INIT_P (init) = true; } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 10ff01666b9..05be440cb9b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -29268,8 +29268,17 @@ cp_parser_functional_cast (cp_parser* parser, tree type) release_tree_vector (vec); } - cast = build_functional_cast (type, expression_list, + /* Create a location of the form: + float(i) + ^~~~~~~~ + with caret == start at the start of the type name, + finishing at the closing paren. */ + location_t combined_loc = make_location (start_loc, start_loc, + parser->lexer); + cast = build_functional_cast (combined_loc, type, expression_list, tf_warning_or_error); + cast.set_location (combined_loc); + /* [expr.const]/1: In an integral constant expression "only type conversions to integral or enumeration type can be used". */ if (TREE_CODE (type) == TYPE_DECL) @@ -29280,13 +29289,6 @@ cp_parser_functional_cast (cp_parser* parser, tree type) NIC_CONSTRUCTOR)) return error_mark_node; - /* Create a location of the form: - float(i) - ^~~~~~~~ - with caret == start at the start of the type name, - finishing at the closing paren. */ - location_t combined_loc = make_location (start_loc, start_loc, parser->lexer); - cast.set_location (combined_loc); return cast; } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5088dc125ce..0990297892e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19017,7 +19017,7 @@ tsubst_copy_and_build (tree t, switch (TREE_CODE (t)) { case CAST_EXPR: - r = build_functional_cast (type, op, complain); + r = build_functional_cast (input_location, type, op, complain); break; case REINTERPRET_CAST_EXPR: r = build_reinterpret_cast (type, op, complain); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 17de39eea54..83a7891e57b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2929,7 +2929,8 @@ finish_compound_literal (tree type, tree compound_literal, that it came from T{} rather than T({}). */ CONSTRUCTOR_IS_DIRECT_INIT (compound_literal) = 1; compound_literal = build_tree_list (NULL_TREE, compound_literal); - return build_functional_cast (type, compound_literal, complain); + return build_functional_cast (input_location, type, + compound_literal, complain); } if (TREE_CODE (type) == ARRAY_TYPE diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 7fda6266a35..ca321f3e35e 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -2228,7 +2228,8 @@ build_m_component_ref (tree datum, tree component, tsubst_flags_t complain) /* Return a tree node for the expression TYPENAME '(' PARMS ')'. */ tree -build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) +build_functional_cast (location_t loc, tree exp, tree parms, + tsubst_flags_t complain) { /* This is either a call to a constructor, or a C cast in C++'s `functional' notation. */ @@ -2254,7 +2255,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) if (TREE_CODE (type) == ARRAY_TYPE) { if (complain & tf_error) - error ("functional cast to array type %qT", type); + error_at (loc, "functional cast to array type %qT", type); return error_mark_node; } @@ -2263,7 +2264,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) if (!CLASS_PLACEHOLDER_TEMPLATE (anode)) { if (complain & tf_error) - error ("invalid use of %qT", anode); + error_at (loc, "invalid use of %qT", anode); return error_mark_node; } else if (!parms) @@ -2276,8 +2277,8 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) if (type == error_mark_node) { if (complain & tf_error) - error ("cannot deduce template arguments for %qT from %<()%>", - anode); + error_at (loc, "cannot deduce template arguments " + "for %qT from %<()%>", anode); return error_mark_node; } } @@ -2296,7 +2297,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) if (TYPE_REF_P (type) && !parms) { if (complain & tf_error) - error ("invalid value-initialization of reference type"); + error_at (loc, "invalid value-initialization of reference type"); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 03a97b5f53c..75050022f0e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2019-12-05 Paolo Carlini + + * g++.dg/diagnostic/functional-cast-to-array-type-1.C: New. + * g++.dg/cpp0x/auto25.C: Check location(s) too. + * g++.dg/cpp0x/auto28.C: Likewise. + * g++.dg/init/reference2.C: Likewise. + * g++.dg/parse/template2.C: Likewise. + * g++.dg/template/error8.C: Likewise. + * g++.old-deja/g++.ns/crash3.C: Likewise. + * g++.old-deja/g++.ns/template7.C: Likewise. + * g++.old-deja/g++.pt/crash8.C: Likewise. + 2019-12-03 Martin Sebor PR middle-end/91582 diff --git a/gcc/testsuite/g++.dg/cpp0x/auto25.C b/gcc/testsuite/g++.dg/cpp0x/auto25.C index 9e08a5bf381..19d51bc8590 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto25.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto25.C @@ -3,10 +3,10 @@ template struct A { - int a[auto(1)]; // { dg-error "invalid use of" } + int a[auto(1)]; // { dg-error "9:invalid use of" } }; template void foo() { - int a[auto(1)]; // { dg-error "invalid use of" } + int a[auto(1)]; // { dg-error "9:invalid use of" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto28.C b/gcc/testsuite/g++.dg/cpp0x/auto28.C index 441d8843a6e..1ffd9b76255 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto28.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto28.C @@ -1,4 +1,4 @@ // PR c++/51404 // { dg-do compile { target c++11 } } -int i = auto().x; // { dg-error "invalid use of" } +int i = auto().x; // { dg-error "9:invalid use of" } diff --git a/gcc/testsuite/g++.dg/diagnostic/functional-cast-to-array-type-1.C b/gcc/testsuite/g++.dg/diagnostic/functional-cast-to-array-type-1.C new file mode 100644 index 00000000000..e9bdb643f43 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/functional-cast-to-array-type-1.C @@ -0,0 +1,2 @@ +typedef int A [1]; +A a = A(1); // { dg-error "7:functional cast to array type" } diff --git a/gcc/testsuite/g++.dg/init/reference2.C b/gcc/testsuite/g++.dg/init/reference2.C index 903c06496d5..08d3d97c998 100644 --- a/gcc/testsuite/g++.dg/init/reference2.C +++ b/gcc/testsuite/g++.dg/init/reference2.C @@ -8,6 +8,6 @@ template void f() { typedef int& T; - T a = T(); // { dg-error "value-initialization of reference" } + T a = T(); // { dg-error "9:invalid value-initialization of reference" } } diff --git a/gcc/testsuite/g++.dg/parse/template2.C b/gcc/testsuite/g++.dg/parse/template2.C index 93c7defb165..3cb27a85c00 100644 --- a/gcc/testsuite/g++.dg/parse/template2.C +++ b/gcc/testsuite/g++.dg/parse/template2.C @@ -3,5 +3,6 @@ namespace N { } int main() { - N::C(); // { dg-error "template|deduction" } + N::C(); // { dg-error "6:cannot deduce template arguments" "" { target c++17 } } + // { dg-error "7:missing template arguments" "" { target c++14_down } .-1 } } diff --git a/gcc/testsuite/g++.dg/template/error8.C b/gcc/testsuite/g++.dg/template/error8.C index 30872a2e953..6cae360aa16 100644 --- a/gcc/testsuite/g++.dg/template/error8.C +++ b/gcc/testsuite/g++.dg/template/error8.C @@ -3,5 +3,6 @@ template struct S {}; void f() { - throw S (); // { dg-error "template" } + throw S (); // { dg-error "9:cannot deduce template arguments" "" { target c++17 } } + // { dg-error "11:missing template arguments" "" { target c++14_down } .-1 } } diff --git a/gcc/testsuite/g++.old-deja/g++.ns/crash3.C b/gcc/testsuite/g++.old-deja/g++.ns/crash3.C index 37211d0db3f..189298de6c5 100644 --- a/gcc/testsuite/g++.old-deja/g++.ns/crash3.C +++ b/gcc/testsuite/g++.old-deja/g++.ns/crash3.C @@ -6,5 +6,6 @@ namespace N { void f() { - N::S(); // { dg-error "" } invalid use of template + N::S(); // { dg-error "6:cannot deduce template arguments" "" { target c++17 } } invalid use of template + // { dg-error "7:missing template arguments" "" { target c++14_down } .-1 } } diff --git a/gcc/testsuite/g++.old-deja/g++.ns/template7.C b/gcc/testsuite/g++.old-deja/g++.ns/template7.C index 876096b7490..71366b79d02 100644 --- a/gcc/testsuite/g++.old-deja/g++.ns/template7.C +++ b/gcc/testsuite/g++.old-deja/g++.ns/template7.C @@ -8,5 +8,6 @@ namespace foo { } void baz() { - foo::bar(); // { dg-error "" } template used as expression + foo::bar(); // { dg-error "8:cannot deduce template arguments" "" { target c++17 } } template used as expression + // { dg-error "11:missing template arguments" "" { target c++14_down } .-1 } } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash8.C b/gcc/testsuite/g++.old-deja/g++.pt/crash8.C index de2dd9dc7de..7b4eff595bf 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/crash8.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash8.C @@ -21,10 +21,12 @@ void doit(T x) { q2 = TestClass2(); TestClass1 p1; - p1 = TestClass1(); // { dg-error "" } template used as expression + p1 = TestClass1(); // { dg-error "8:cannot deduce template arguments" "" { target c++17 } } template used as expression + // { dg-error "18:missing template arguments" "" { target c++14_down } .-1 } TestClass2 p2; - p2 = TestClass2(); // { dg-error "" } template used as expression + p2 = TestClass2(); // { dg-error "8:cannot deduce template arguments" "" { target c++17 } } template used as expression + // { dg-error "18:missing template arguments" "" { target c++14_down } .-1 } } int main() { diff --git a/libcc1/ChangeLog b/libcc1/ChangeLog index 92b5cb735e8..169a0a9eeeb 100644 --- a/libcc1/ChangeLog +++ b/libcc1/ChangeLog @@ -1,3 +1,8 @@ +2019-12-05 Paolo Carlini + + * libcp1plugin.cc (plugin_build_expression_list_expr): Adjust + build_functional_cast call. + 2019-11-25 Paolo Carlini * libcp1plugin.cc (plugin_pragma_push_user_expression): Update diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc index 232ab976ab5..c728310618f 100644 --- a/libcc1/libcp1plugin.cc +++ b/libcc1/libcp1plugin.cc @@ -3155,7 +3155,7 @@ plugin_build_expression_list_expr (cc1_plugin::connection *self, case CHARS2 ('c', 'v'): // conversion with parenthesized expression list gcc_assert (TYPE_P (type)); args = args_to_tree_list (values_in); - result = build_functional_cast (type, args, tf_error); + result = build_functional_cast (input_location, type, args, tf_error); break; case CHARS2 ('t', 'l'): // conversion with braced expression list -- 2.30.2