diff options
author | Jason Merrill <jason@redhat.com> | 2021-08-30 09:44:28 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-08-30 17:23:28 -0400 |
commit | a8de832470f78a40a0e2c8de866a471bf74bf0ab (patch) | |
tree | b4c322aa99ae5649ec56af1b228c1304f2a2c68d /gcc/cp/constexpr.c | |
parent | a7083b83e45852540a4a09ee11b74dc28d777399 (diff) | |
download | gcc-a8de832470f78a40a0e2c8de866a471bf74bf0ab.zip gcc-a8de832470f78a40a0e2c8de866a471bf74bf0ab.tar.gz gcc-a8de832470f78a40a0e2c8de866a471bf74bf0ab.tar.bz2 |
c++: fold function template args sooner [PR101460]
As discussed in the PR, we were giving a lot of unnecessary errors for this
testcase because we didn't try to do constant evaluation until
convert_nontype_argument, which happens for each of the candidates. But
when looking at a template-id as the function operand of a call, we can try
to fold arguments before we get into overload resolution.
PR c++/101460
gcc/cp/ChangeLog:
* cp-tree.h (cxx_constant_value_sfinae): Declare.
* constexpr.c (cxx_constant_value_sfinae): New.
* pt.c (fold_targs_r, maybe_fold_fn_template_args): New.
(tsubst_copy_and_build) [CALL_EXPR]: Call
maybe_fold_fn_template_args.
gcc/testsuite/ChangeLog:
* g++.dg/template/explicit-args6.C: New test.
Diffstat (limited to 'gcc/cp/constexpr.c')
-rw-r--r-- | gcc/cp/constexpr.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index b9c0062..9606719 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -7458,6 +7458,18 @@ cxx_constant_value (tree t, tree decl) return cxx_eval_outermost_constant_expr (t, false, true, true, false, decl); } +/* As above, but respect SFINAE. */ + +tree +cxx_constant_value_sfinae (tree t, tsubst_flags_t complain) +{ + bool sfinae = !(complain & tf_error); + tree r = cxx_eval_outermost_constant_expr (t, sfinae, true, true); + if (sfinae && !TREE_CONSTANT (r)) + r = error_mark_node; + return r; +} + /* Like cxx_constant_value, but used for evaluation of constexpr destructors of constexpr variables. The actual initializer of DECL is not modified. */ |