aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2019-12-05 08:59:24 +0000
committerPaolo Carlini <paolo.carlini@oracle.com>2019-12-05 08:59:24 +0000
commitccc433b125b0401eab1916588357e665b1ac2a54 (patch)
treebd8237a0ca5be9e56071dbd6e347fe6349b1358e
parentaecd236a0ea08dab41091136eaf531a57a395a4f (diff)
/gcc/cp
2019-12-05 Paolo Carlini <paolo.carlini@oracle.com> * 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 <paolo.carlini@oracle.com> * libcp1plugin.cc (plugin_build_expression_list_expr): Adjust build_functional_cast call. /testsuite 2019-12-05 Paolo Carlini <paolo.carlini@oracle.com> * 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@278987 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/call.c6
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/parser.c18
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/cp/semantics.c3
-rw-r--r--gcc/cp/typeck2.c13
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/auto25.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/auto28.C2
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/functional-cast-to-array-type-1.C2
-rw-r--r--gcc/testsuite/g++.dg/init/reference2.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/template2.C3
-rw-r--r--gcc/testsuite/g++.dg/template/error8.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ns/crash3.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ns/template7.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash8.C6
-rw-r--r--libcc1/ChangeLog5
-rw-r--r--libcc1/libcp1plugin.cc2
20 files changed, 76 insertions, 31 deletions
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 <paolo.carlini@oracle.com>
+
+ * 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 <dje.gcc@gmail.com>
* 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<tree, va_gc> **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<tree, va_gc> **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 <paolo.carlini@oracle.com>
+
+ * 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 <msebor@redhat.com>
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<int> struct A
{
- int a[auto(1)]; // { dg-error "invalid use of" }
+ int a[auto(1)]; // { dg-error "9:invalid use of" }
};
template<int> 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 <int a1>
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 <typename T> 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<T>();
TestClass1<T> 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<T> 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 <paolo.carlini@oracle.com>
+
+ * libcp1plugin.cc (plugin_build_expression_list_expr): Adjust
+ build_functional_cast call.
+
2019-11-25 Paolo Carlini <paolo.carlini@oracle.com>
* 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