This PR complains that we issue a -Wconversion warning in template <int N> struct X {}; template <class T> X<sizeof(T)> foo();
saying "conversion from 'long unsigned int' to 'int' may change value". While it's not technically wrong, I suspect -Wconversion warnings aren't all that useful for value-dependent expressions. So this patch disables them, though I'm open to other ideas. This is a regression that started with r241425: @@ -7278,7 +7306,7 @@ convert_template_argument (tree parm, val = error_mark_node; } } - else if (!dependent_template_arg_p (orig_arg) + else if (!type_dependent_expression_p (orig_arg) && !uses_template_parms (t)) /* We used to call digest_init here. However, digest_init will report errors, which we don't want when complain Here orig_arg is SIZEOF_EXPR<T>, dependent_template_arg_p (orig_arg) was true, but type_dependent_expression_p (orig_arg) is false so we warn in convert_nontype_argument. Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10? gcc/cp/ChangeLog: PR c++/99331 * cvt.c (cp_convert_and_check): Don't emit -Wconversion warnings when the expression is value-dependent. gcc/testsuite/ChangeLog: PR c++/99331 * g++.dg/warn/Wconversion5.C: New test. --- gcc/cp/cvt.c | 7 ++++++- gcc/testsuite/g++.dg/warn/Wconversion5.C | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wconversion5.C diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 2ea32101f07..55024b2b966 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -663,7 +663,12 @@ cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain) result = cp_convert (type, expr, complain); if ((complain & tf_warning) - && c_inhibit_evaluation_warnings == 0) + && c_inhibit_evaluation_warnings == 0 + /* Issuing conversion warnings for value-dependent expressions is + likely too noisy. */ + && !(processing_template_decl + && potential_constant_expression (expr) + && value_dependent_expression_p (expr))) { tree folded = cp_fully_fold (expr); tree folded_result; diff --git a/gcc/testsuite/g++.dg/warn/Wconversion5.C b/gcc/testsuite/g++.dg/warn/Wconversion5.C new file mode 100644 index 00000000000..47106a7c2fa --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion5.C @@ -0,0 +1,14 @@ +// PR c++/99331 +// { dg-do compile { target c++11 } } +// { dg-options "-Wconversion" } +// Don't issue -Wconversion warnings for value-dependent expressions. + +template <int N> struct X {}; +template <class T> X<sizeof(T)> foo(); +template <class T> X<alignof(T)> foo2(); + +template <typename T> +struct S { + using t = X<sizeof(T)>; + using u = X<alignof(T)>; +}; base-commit: 0d737ed2171165ba39ab5647f8a94c588fc9a898 -- 2.29.2