mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-05 08:00:26 +08:00
c++: -Wconversion vs value-dependent expressions [PR99331]
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. 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. gcc/cp/ChangeLog: PR c++/99331 * call.c (build_converted_constant_expr_internal): Don't emit -Wconversion warnings. gcc/testsuite/ChangeLog: PR c++/99331 * g++.dg/warn/Wconversion5.C: New test.
This commit is contained in:
parent
15d649f79d
commit
9efd72d289
@ -4484,6 +4484,9 @@ build_converted_constant_expr_internal (tree type, tree expr,
|
||||
&& processing_template_decl)
|
||||
conv = next_conversion (conv);
|
||||
|
||||
/* Issuing conversion warnings for value-dependent expressions is
|
||||
likely too noisy. */
|
||||
warning_sentinel w (warn_conversion);
|
||||
conv->check_narrowing = true;
|
||||
conv->check_narrowing_const_only = true;
|
||||
expr = convert_like (conv, expr, complain);
|
||||
|
19
gcc/testsuite/g++.dg/warn/Wconversion5.C
Normal file
19
gcc/testsuite/g++.dg/warn/Wconversion5.C
Normal file
@ -0,0 +1,19 @@
|
||||
// PR c++/99331
|
||||
// { dg-do compile { target c++11 } }
|
||||
// { dg-options "-Wconversion" }
|
||||
// Don't issue -Wconversion warnings for value-dependent expressions.
|
||||
|
||||
template <int> struct X {};
|
||||
template <signed char> struct Y {};
|
||||
template <typename T> X<sizeof(T)> foo();
|
||||
template <typename T> X<alignof(T)> foo2();
|
||||
template<int I> Y<I> foo3();
|
||||
template<int> Y<1024> foo4(); // { dg-error "narrowing conversion" }
|
||||
template<int> Y<1u> foo5();
|
||||
template<int> X<__INT_MAX__ + 1U> foo6(); // { dg-error "narrowing conversion" }
|
||||
|
||||
template <typename T>
|
||||
struct S {
|
||||
using t = X<sizeof(T)>;
|
||||
using u = X<alignof(T)>;
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user