// Test operation of -Wparentheses.  Warnings for assignments used as
// truth-values.  Essentially the same as gcc.dg/Wparentheses-3.c.
// Origin: Joseph Myers <jsm@polyomino.org.uk>

// { dg-do compile }
// { dg-options "-Wparentheses" }

int foo (int);

int a, b, c;
bool d;

void
bar (void)
{
  if (a = b) // { dg-warning "assignment" "correct warning" }
    foo (0);
  if ((a = b))
    foo (1);
  if (a = a) // { dg-warning "assignment" "correct warning" }
    foo (2);
  if ((a = a))
    foo (3);
  if (b = c) // { dg-warning "assignment" "correct warning" }
    foo (4);
  else
    foo (5);
  if ((b = c))
    foo (6);
  else
    foo (7);
  if (b = b) // { dg-warning "assignment" "correct warning" }
    foo (8);
  else
    foo (9);
  if ((b = b))
    foo (10);
  else
    foo (11);
  while (c = b) // { dg-warning "assignment" "correct warning" }
    foo (12);
  while ((c = b))
    foo (13);
  while (c = c) // { dg-warning "assignment" "correct warning" }
    foo (14);
  while ((c = c))
    foo (15);
  do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" }
  do foo (17); while ((a = b));
  do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" }
  do foo (19); while ((a = a));
  for (;c = b;) // { dg-warning "assignment" "correct warning" }
    foo (20);
  for (;(c = b);)
    foo (21);
  for (;c = c;) // { dg-warning "assignment" "correct warning" }
    foo (22);
  for (;(c = c);)
    foo (23);
  d = a = b; // { dg-warning "assignment" "correct warning" }
  foo (24);
  d = (a = b);
  foo (25);
  d = a = a; // { dg-warning "assignment" "correct warning" }
  foo (26);
  d = (a = a);
  foo (27);
}
