Hi,

in tsubst_copy_and_build, particularly so after c++/11856, we are already wrapping the evaluation of most expressions in ++c_inhibit_evaluation_warnings/--c_inhibit_evaluation_warnings, but we are failing to do so in case MODOP_EXPR. Tested x86_64-linux.

Ok for mainline?

Thanks,
Paolo.

///////////////////////////
/cp
2013-05-01  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/57132
        * pt.c (tsubst_copy_and_build, MODOP_EXPR): Increase / decrease
        c_inhibit_evaluation_warnings around build_x_modify_expr call.

/testsuite
2013-05-01  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/57132
        * g++.dg/warn/Wdiv-by-zero-bogus-2.C: New.
Index: cp/pt.c
===================================================================
--- cp/pt.c     (revision 198488)
+++ cp/pt.c     (working copy)
@@ -13810,7 +13810,11 @@ tsubst_copy_and_build (tree t,
 
     case MODOP_EXPR:
       {
-       tree r = build_x_modify_expr
+       tree r;
+
+       ++c_inhibit_evaluation_warnings;
+
+       r = build_x_modify_expr
          (EXPR_LOCATION (t),
           RECUR (TREE_OPERAND (t, 0)),
           TREE_CODE (TREE_OPERAND (t, 1)),
@@ -13824,6 +13828,9 @@ tsubst_copy_and_build (tree t,
           here.  */
        if (TREE_NO_WARNING (t))
          TREE_NO_WARNING (r) = TREE_NO_WARNING (t);
+
+       --c_inhibit_evaluation_warnings;
+
        RETURN (r);
       }
 
Index: testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C
===================================================================
--- testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C        (revision 0)
+++ testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C        (working copy)
@@ -0,0 +1,18 @@
+// PR c++/57132
+
+template<unsigned m, unsigned a>
+struct mod 
+{
+  static unsigned calc(unsigned x) {
+    unsigned res = a * x;
+    if (m)
+      res %= m;
+    return res;
+  }
+};
+
+int main()
+{
+  mod<3,2>::calc(7);
+  mod<0,2>::calc(7);
+}

Reply via email to