From: David Malcolm Date: Tue, 15 Jan 2019 23:29:15 +0000 (+0000) Subject: Fix ICE on class-template argument deduction (PR c++/88795) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1abb44f863d32ef738d28144d2c984603e27721a;p=gcc.git Fix ICE on class-template argument deduction (PR c++/88795) PR c++/88795 reports an ICE building a function_type for a deduction guide when the substitution into the function signature fails, due to an error_mark_node being returned from tsubst_arg_types but not being checked for. This error_mark_node gets used as the TYPE_ARG_TYPES, leading to ICEs in various places that assume this is a TREE_LIST. This patch checks the result of tsubst_arg_types and propagates the failure if it returns error_mark_node. It also adds an assertion to build_function_type, to fail faster if passed in error_mark_node. gcc/cp/ChangeLog: PR c++/88795 * pt.c (build_deduction_guide): Bail out if tsubst_arg_types fails. gcc/testsuite/ChangeLog: PR c++/88795 * g++.dg/template/pr88795.C: New test. gcc/ChangeLog: PR c++/88795 * tree.c (build_function_type): Assert that arg_types is not error_mark_node. From-SVN: r267957 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83d4fa4af0c..e1ae217c03c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-15 David Malcolm + + PR c++/88795 + * tree.c (build_function_type): Assert that arg_types is not + error_mark_node. + 2019-01-15 Richard Sandiford PR inline-asm/52813 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 35eec34fca5..7cf0ffba492 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-01-15 David Malcolm + + PR c++/88795 + * pt.c (build_deduction_guide): Bail out if tsubst_arg_types + fails. + 2019-01-15 Paolo Carlini * decl.c (start_decl): Improve error location. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f062a2b9707..c6fc1cfeffb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -26932,6 +26932,8 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) targs = template_parms_to_args (tparms); fparms = tsubst_arg_types (fparms, tsubst_args, NULL_TREE, complain, ctor); + if (fparms == error_mark_node) + ok = false; fargs = tsubst (fargs, tsubst_args, complain, ctor); if (ci) ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ec8a0c18c70..d226aa54af6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-15 David Malcolm + + PR c++/88795 + * g++.dg/template/pr88795.C: New test. + 2019-01-15 Thomas Koenig PR fortran/43136 diff --git a/gcc/testsuite/g++.dg/template/pr88795.C b/gcc/testsuite/g++.dg/template/pr88795.C new file mode 100644 index 00000000000..918aa6d0db8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr88795.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++17 } } + +template +struct Array {}; + +template +struct Foo { + static constexpr int size() { + return size_; + } + + template + Foo(U, Array) {} +}; + +template +Foo(U, Array) -> Foo; + +int main() { + Array arr{}; + + Foo foo{2.0, arr}; +} diff --git a/gcc/tree.c b/gcc/tree.c index 2e112ee17c6..9e554994556 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -8455,6 +8455,8 @@ build_function_type (tree value_type, tree arg_types) bool any_structural_p, any_noncanonical_p; tree canon_argtypes; + gcc_assert (arg_types != error_mark_node); + if (TREE_CODE (value_type) == FUNCTION_TYPE) { error ("function return type cannot be function");