Hi,

the below handles spurious -Waddress warnings during the evaluation of the static_assert condition in the usual way, already used in many other places (in pt.c + typeck.c), that is by increasing and decreasing c_inhibit_evaluation_warnings around the tsubst_expr call.

Tested x86_64-linux.

Thanks,
Paolo.

////////////////////////
/cp
2012-05-04  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/53166
        * pt.c (instantiate_class_template_1): Increase / decrease
        c_inhibit_evaluation_warnings around the tsubst_expr call
        for STATIC_ASSERT_CONDITION.
        (tsubst_expr, case STATIC_ASSERT): Likewise.
        * typeck.c (cp_build_binary_op, case EQ_EXPR/NE_EXPR): Check
        c_inhibit_evaluation_warnings in the OPT_Waddress warnings.

/testsuite
2012-05-04  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/53166
        * g++.dg/cpp0x/static_assert7.C: New.


Index: testsuite/g++.dg/cpp0x/static_assert7.C
===================================================================
--- testsuite/g++.dg/cpp0x/static_assert7.C     (revision 0)
+++ testsuite/g++.dg/cpp0x/static_assert7.C     (revision 0)
@@ -0,0 +1,20 @@
+// PR c++/53166
+// { dg-options "-std=c++11 -Waddress" }
+
+template <typename X, X a>
+struct A
+{
+  static_assert (a != nullptr, "oops");
+  static_assert (nullptr != a, "oops");
+
+  int f()
+  {
+    static_assert (a != nullptr, "oops");
+    static_assert (nullptr != a, "oops");
+    return 1;
+  }
+};
+
+int i1;
+A<int*, &i1> a1;
+int i2 = a1.f();
Index: cp/typeck.c
===================================================================
--- cp/typeck.c (revision 187096)
+++ cp/typeck.c (working copy)
@@ -4081,7 +4081,8 @@ cp_build_binary_op (location_t location,
          if (TREE_CODE (op0) == ADDR_EXPR
              && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0)))
            {
-             if (complain & tf_warning)
+             if ((complain & tf_warning)
+                 && c_inhibit_evaluation_warnings == 0)
                warning (OPT_Waddress, "the address of %qD will never be NULL",
                         TREE_OPERAND (op0, 0));
            }
@@ -4093,7 +4094,8 @@ cp_build_binary_op (location_t location,
          if (TREE_CODE (op1) == ADDR_EXPR 
              && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0)))
            {
-             if (complain & tf_warning)
+             if ((complain & tf_warning)
+                 && c_inhibit_evaluation_warnings == 0)
                warning (OPT_Waddress, "the address of %qD will never be NULL",
                         TREE_OPERAND (op1, 0));
            }
Index: cp/pt.c
===================================================================
--- cp/pt.c     (revision 187096)
+++ cp/pt.c     (working copy)
@@ -8950,10 +8950,15 @@ instantiate_class_template_1 (tree type)
              /* Build new TYPE_FIELDS.  */
               if (TREE_CODE (t) == STATIC_ASSERT)
                 {
-                  tree condition = 
-                    tsubst_expr (STATIC_ASSERT_CONDITION (t), args, 
-                                 tf_warning_or_error, NULL_TREE,
-                                 /*integral_constant_expression_p=*/true);
+                  tree condition;
+ 
+                 ++c_inhibit_evaluation_warnings;
+                 condition =
+                   tsubst_expr (STATIC_ASSERT_CONDITION (t), args, 
+                                tf_warning_or_error, NULL_TREE,
+                                /*integral_constant_expression_p=*/true);
+                 --c_inhibit_evaluation_warnings;
+
                   finish_static_assert (condition,
                                         STATIC_ASSERT_MESSAGE (t), 
                                         STATIC_ASSERT_SOURCE_LOCATION (t),
@@ -13110,11 +13115,16 @@ tsubst_expr (tree t, tree args, tsubst_flags_t com
 
     case STATIC_ASSERT:
       {
-        tree condition = 
+       tree condition;
+
+       ++c_inhibit_evaluation_warnings;
+        condition = 
           tsubst_expr (STATIC_ASSERT_CONDITION (t), 
                        args,
                        complain, in_decl,
                        /*integral_constant_expression_p=*/true);
+       --c_inhibit_evaluation_warnings;
+
         finish_static_assert (condition,
                               STATIC_ASSERT_MESSAGE (t),
                               STATIC_ASSERT_SOURCE_LOCATION (t),

Reply via email to