| /* PR c++/86568 - -Wnonnull warnings should highlight the relevant argument |
| not the closing parenthesis. |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| #define NONNULL __attribute__ ((nonnull)) |
| |
| #if __cplusplus < 201103L |
| # define nullptr __null |
| #endif |
| |
| struct S |
| { |
| void |
| f0 (const void*) const; // { dg-message "in a call to non-static member function 'void S::f0\\(const void\\*\\) const'" } |
| |
| void |
| f1 (const void*) const; // { dg-message "in a call to non-static member function 'void S::f1\\(const void\\*\\) const'" } |
| |
| void |
| f2 (const void*) const; // { dg-message "in a call to non-static member function 'void S::f2\\(const void\\*\\) const'" } |
| |
| NONNULL void |
| f3 (const void*, const void*); // { dg-message "in a call to function 'void S::f3\\(const void\\*, const void\\*\\)' declared 'nonnull'" } |
| |
| NONNULL void |
| f4 (const void*, const void*); // { dg-message "in a call to function 'void S::f4\\(const void\\*, const void\\*\\)' declared 'nonnull'" } |
| |
| NONNULL void |
| f5 (const void*, const void*); // { dg-message "in a call to function 'void S::f5\\\(const void\\*, const void\\*\\)' declared 'nonnull'" } |
| |
| NONNULL void |
| f6 (const void*, const void*); // { dg-message "in a call to function 'void S::f6\\\(const void\\*, const void\\*\\)' declared 'nonnull'" } |
| }; |
| |
| void warn_nullptr_this () |
| { |
| ((S*)nullptr)->f0 (""); // { dg-warning "3:'this' pointer is null" "pr86568" { xfail *-*-* } } |
| // { dg-warning "this' pointer is null" "pr86568 second variant" { target *-*-* } .-1 } |
| } |
| |
| void warn_null_this_cst () |
| { |
| S* const null = 0; |
| null->f1 (""); // { dg-warning "3:'this' pointer is null" } |
| } |
| |
| void warn_null_this_var () |
| { |
| S* null = 0; |
| null->f2 (&null); // { dg-warning "3:'this' pointer is null" "pr86568" { xfail *-*-* } } |
| // { dg-warning "'this' pointer is null" "pr86568 second variant" { target *-*-* } .-1 } |
| } |
| |
| void warn_nullptr (S s) |
| { |
| s.f3 (nullptr, &s); // { dg-warning "9:argument 1 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 1 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| s.f3 (&s, nullptr); // { dg-warning "13:argument 2 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 2 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| } |
| |
| |
| void warn_null_cst (S s) |
| { |
| void* const null = 0; |
| s.f4 (null, &s); // { dg-warning "9:argument 1 null where non-null expected" } |
| s.f4 (&s, null); // { dg-warning "13:argument 2 null where non-null expected" } |
| } |
| |
| void warn_null_var (S s) |
| { |
| void* null = 0; |
| s.f5 (null, &s); // { dg-warning "9:argument 1 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 1 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| s.f5 (&s, null); // { dg-warning "16:argument 2 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 2 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| } |
| |
| void warn_null_cond (S s, void *null) |
| { |
| if (null) |
| return; |
| |
| s.f6 (null, &s); // { dg-warning "9:argument 1 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 1 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| s.f6 (&s, null); // { dg-warning "13:argument 2 null where non-null expected" "pr86568" { xfail *-*-* } } |
| // { dg-warning "argument 2 null where non-null expected" "pr86568 second variant" { target *-*-* } .-1 } |
| } |
| |
| |
| typedef NONNULL void Fvp (const void*, const void*); |
| |
| void warn_fptr_null_cst (Fvp *p) |
| { |
| void* const null = 0; |
| p (null, ""); // { dg-warning "6:argument 1 null where non-null expected" } |
| p ("", null); // { dg-warning "10:argument 2 null where non-null expected" } |
| } |
| |
| typedef NONNULL void (S::*SMemFvp) (const void*, const void*); |
| |
| void warn_memfptr_null_cst (S *p, SMemFvp pmf) |
| { |
| void* const null = 0; |
| (p->*pmf) (null, ""); // { dg-warning "14:argument 1 null where non-null expected" } |
| (p->*pmf) ("", null); // { dg-warning "18:argument 2 null where non-null expected" } |
| } |