Commit fb4bcc8d by Paolo Carlini Committed by Paolo Carlini

re PR c++/53166 (static_assert produces bogus warning)

/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
parent 33e337e3
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> 2012-05-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53186 PR c++/53186
......
...@@ -8950,10 +8950,15 @@ instantiate_class_template_1 (tree type) ...@@ -8950,10 +8950,15 @@ instantiate_class_template_1 (tree type)
/* Build new TYPE_FIELDS. */ /* Build new TYPE_FIELDS. */
if (TREE_CODE (t) == STATIC_ASSERT) if (TREE_CODE (t) == STATIC_ASSERT)
{ {
tree condition = tree condition;
tsubst_expr (STATIC_ASSERT_CONDITION (t), args,
tf_warning_or_error, NULL_TREE, ++c_inhibit_evaluation_warnings;
/*integral_constant_expression_p=*/true); 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, finish_static_assert (condition,
STATIC_ASSERT_MESSAGE (t), STATIC_ASSERT_MESSAGE (t),
STATIC_ASSERT_SOURCE_LOCATION (t), STATIC_ASSERT_SOURCE_LOCATION (t),
...@@ -13110,11 +13115,16 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, ...@@ -13110,11 +13115,16 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
case STATIC_ASSERT: case STATIC_ASSERT:
{ {
tree condition = tree condition;
++c_inhibit_evaluation_warnings;
condition =
tsubst_expr (STATIC_ASSERT_CONDITION (t), tsubst_expr (STATIC_ASSERT_CONDITION (t),
args, args,
complain, in_decl, complain, in_decl,
/*integral_constant_expression_p=*/true); /*integral_constant_expression_p=*/true);
--c_inhibit_evaluation_warnings;
finish_static_assert (condition, finish_static_assert (condition,
STATIC_ASSERT_MESSAGE (t), STATIC_ASSERT_MESSAGE (t),
STATIC_ASSERT_SOURCE_LOCATION (t), STATIC_ASSERT_SOURCE_LOCATION (t),
......
...@@ -4081,7 +4081,8 @@ cp_build_binary_op (location_t location, ...@@ -4081,7 +4081,8 @@ cp_build_binary_op (location_t location,
if (TREE_CODE (op0) == ADDR_EXPR if (TREE_CODE (op0) == ADDR_EXPR
&& decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0))) && 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", warning (OPT_Waddress, "the address of %qD will never be NULL",
TREE_OPERAND (op0, 0)); TREE_OPERAND (op0, 0));
} }
...@@ -4093,7 +4094,8 @@ cp_build_binary_op (location_t location, ...@@ -4093,7 +4094,8 @@ cp_build_binary_op (location_t location,
if (TREE_CODE (op1) == ADDR_EXPR if (TREE_CODE (op1) == ADDR_EXPR
&& decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0))) && 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", warning (OPT_Waddress, "the address of %qD will never be NULL",
TREE_OPERAND (op1, 0)); TREE_OPERAND (op1, 0));
} }
......
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> 2012-05-04 Ulrich Weigand <ulrich.weigand@linaro.org>
PR tree-optimization/52633 PR tree-optimization/52633
......
// 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();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment