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

Reply via email to