]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/53166 (static_assert produces bogus warning)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 4 May 2012 15:02:05 +0000 (15:02 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 4 May 2012 15:02:05 +0000 (15:02 +0000)
/cp
2012-05-04  Paolo Carlini  <paolo.carlini@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.carlini@oracle.com>

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

From-SVN: r187165

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/static_assert7.C [new file with mode: 0644]

index 46d8b89a0ed05c9e986f6043e42d0b6c2ad6a607..560722c7f1cb5a2bf17a30416960744f6d7a0777 100644 (file)
@@ -1,3 +1,13 @@
+2012-05-04  Paolo Carlini  <paolo.carlini@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.
+
 2012-05-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/53186
index b720d4a3161f46639194602c0ea8daa90969b1f0..f14e040204f04cb77ed5542fad7509b42cb11b4f 100644 (file)
@@ -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 complain, tree in_decl,
 
     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),
index b59741c6471023a4b31b7aa7980a245e0fd02bb6..4510d51faf8b04e98f8e5fbc0d3c7e066734d61f 100644 (file)
@@ -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 e456366e0e14f6facaaa36437b29c4b1b73574bc..4468854c4647f933bf7bc8cfebdd6b6e24749f30 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/53166
+       * g++.dg/cpp0x/static_assert7.C: New.
+
 2012-05-04  Ulrich Weigand  <ulrich.weigand@linaro.org>
 
        PR tree-optimization/52633
diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert7.C b/gcc/testsuite/g++.dg/cpp0x/static_assert7.C
new file mode 100644 (file)
index 0000000..28793e4
--- /dev/null
@@ -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();