mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-14 13:01:23 +08:00
Set and test no-warning bit to avoid -Wnonnull for synthesized expressions.
Resolves: PR c++/96003 spurious -Wnonnull calling a member on the result of static_cast gcc/c-family/ChangeLog: PR c++/96003 * c-common.c (check_function_arguments_recurse): Return early when no-warning bit is set. gcc/cp/ChangeLog: PR c++/96003 * class.c (build_base_path): Set no-warning bit on the synthesized conditional expression in static_cast. gcc/testsuite/ChangeLog: PR c++/96003 * g++.dg/warn/Wnonnull7.C: New test.
This commit is contained in:
parent
4143efc1ee
commit
df5cf47a97
@ -5822,6 +5822,9 @@ check_function_arguments_recurse (void (*callback)
|
||||
void *ctx, tree param,
|
||||
unsigned HOST_WIDE_INT param_num)
|
||||
{
|
||||
if (TREE_NO_WARNING (param))
|
||||
return;
|
||||
|
||||
if (CONVERT_EXPR_P (param)
|
||||
&& (TYPE_PRECISION (TREE_TYPE (param))
|
||||
== TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (param, 0)))))
|
||||
|
@ -516,8 +516,14 @@ build_base_path (enum tree_code code,
|
||||
|
||||
out:
|
||||
if (null_test)
|
||||
expr = fold_build3_loc (input_location, COND_EXPR, target_type, null_test, expr,
|
||||
build_zero_cst (target_type));
|
||||
{
|
||||
expr = fold_build3_loc (input_location, COND_EXPR, target_type, null_test,
|
||||
expr, build_zero_cst (target_type));
|
||||
/* Avoid warning for the whole conditional expression (in addition
|
||||
to NULL_TEST itself -- see above) in case the result is used in
|
||||
a nonnull context that the front end -Wnonnull checks. */
|
||||
TREE_NO_WARNING (expr) = 1;
|
||||
}
|
||||
|
||||
return expr;
|
||||
}
|
||||
|
36
gcc/testsuite/g++.dg/warn/Wnonnull7.C
Normal file
36
gcc/testsuite/g++.dg/warn/Wnonnull7.C
Normal file
@ -0,0 +1,36 @@
|
||||
/* PR c++/96003 - spurious -Wnonnull calling a member on the result
|
||||
of static_cast
|
||||
{ dg-do compile }
|
||||
{ dg-options "-Wall" } */
|
||||
|
||||
struct D;
|
||||
struct B
|
||||
{
|
||||
B* next;
|
||||
D* Next ();
|
||||
};
|
||||
|
||||
struct D: B
|
||||
{
|
||||
virtual ~D ();
|
||||
};
|
||||
|
||||
struct Iterator
|
||||
{
|
||||
D* p;
|
||||
void advance ()
|
||||
{
|
||||
p = static_cast<B*>(p)->Next (); // { dg-bogus "\\\[-Wnonnull" }
|
||||
}
|
||||
};
|
||||
|
||||
// Test case from comment #11.
|
||||
|
||||
struct S1 { virtual ~S1 (); };
|
||||
struct S2 { virtual ~S2 (); };
|
||||
struct S3: S1, S2 { void f (); };
|
||||
|
||||
void f (S2 *p)
|
||||
{
|
||||
static_cast<S3 *>(p)->f (); // { dg-bogus "\\\[-Wnonnull" }
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user