/* 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" }
}
