diff mbox

[C++] PR 53166

Message ID 4FA33FAE.9030202@oracle.com
State New
Headers show

Commit Message

Paolo Carlini May 4, 2012, 2:32 a.m. UTC
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.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.

Comments

Jason Merrill May 4, 2012, 2:57 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

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),