// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s

void a(int i);
int b();
int c();

#define MACRO_A 0

void test1(int x, int y) {
  while(true) {
    if (x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}

    // Check that we handle conditions that start or end with a macro
    // correctly.
    if (x == MACRO_A); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    if (MACRO_A == x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}

    int i;
    // PR11329
    for (i = 0; i < x; i++); { // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      a(i);
      b();
    }

    for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    {
      a(i);
    }

    for (i = 0;
         i < x;
         i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    {
      a(i);
    }

    int arr[3] = { 1, 2, 3 };
    for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      a(i);

    for (int j :
         arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      a(i);

    while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      a(i);

    while (b() == 0); { // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      a(i);
    }

    while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    {
      a(i);
    }

    while (b() == 0 ||
           c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    {
      a(i);
    }

    do;          // expected-note{{to match this 'do'}}
      b();       // expected-error{{expected 'while' in do/while loop}}
    while (b()); // no-warning
    c();

    do;          // expected-note{{to match this 'do'}}
      b();       // expected-error{{expected 'while' in do/while loop}}
    while (b()); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      c();

    switch(x) // no-warning
    {
      switch(y); // expected-warning{{switch statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
      {
        case 0:
          a(10);
          break;
        default:
          a(20);
          break;
      }
    }
  }
}

/// There should be no warning  when null statement is placed on its own line.
void test2(int x, int y) {
  if (x) // no-warning
    ; // no-warning

  int i;
  for (i = 0; i < x; i++) // no-warning
    ; // no-warning

  for (i = 0;
       i < x;
       i++) // no-warning
    ; // no-warning

  int arr[3] = { 1, 2, 3 };
  for (int j : arr) // no-warning
    ; // no-warning

  while (b() == 0) // no-warning
    ; // no-warning

  while (b() == 0 ||
         c() == 0) // no-warning
    ; // no-warning

  switch(x)
  {
    switch(y) // no-warning
      ; // no-warning
  }

  // Last `for' or `while' statement in compound statement shouldn't warn.
  while(b() == 0); // no-warning
}

/// There should be no warning for a null statement resulting from an empty macro.
#define EMPTY(a)
void test3(int x, int y) {
  if (x) EMPTY(x); // no-warning

  int i;
  for (i = 0; i < x; i++) EMPTY(i); // no-warning

  for (i = 0;
       i < x;
       i++) EMPTY(i); // no-warning

  int arr[3] = { 1, 2, 3 };
  for (int j : arr) EMPTY(j); // no-warning

  for (int j :
       arr) EMPTY(j); // no-warning

  while (b() == 0) EMPTY(i); // no-warning

  while (b() == 0 ||
         c() == 0) EMPTY(i); // no-warning

  switch (x) {
    switch (y)
      EMPTY(i); // no-warning
  }
}

void test4(int x)
{
  // Idiom used in some metaprogramming constructs.
  switch (x) default:; // no-warning

  // Frequent idiom used in macros.
  do {} while (false); // no-warning
}

/// There should be no warning for a common for/while idiom when it is obvious
/// from indentation that next statement wasn't meant to be a body.
void test5(int x, int y) {
  int i;
  for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    a(i);

  for (i = 0; i < x; i++); // no-warning
  a(i);

  for (i = 0;
       i < x;
       i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    a(i);

  for (i = 0;
       i < x;
       i++); // no-warning
  a(i);

  while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    a(i);

  while (b() == 0); // no-warning
  a(i);

  while (b() == 0 ||
         c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    a(i);

  while (b() == 0 ||
         c() == 0); // no-warning
  a(i);
}

/// There should be no warning for a statement with a non-null body.
void test6(int x, int y) {
  if (x) {} // no-warning

  if (x)
    a(x); // no-warning

  int i;
  for (i = 0; i < x; i++) // no-warning
    a(i); // no-warning

  for (i = 0; i < x; i++) { // no-warning
    a(i); // no-warning
  }

  for (i = 0;
       i < x;
       i++) // no-warning
    a(i); // no-warning

  int arr[3] = { 1, 2, 3 };
  for (int j : arr) // no-warning
    a(j);

  for (int j : arr) {} // no-warning

  while (b() == 0) // no-warning
    a(i); // no-warning

  while (b() == 0) {} // no-warning

  switch(x) // no-warning
  {
    switch(y) // no-warning
    {
      case 0:
        a(10);
        break;
      default:
        a(20);
        break;
    }
  }
}

void test_errors(int x) {
  if (1)
    aa; // expected-error{{use of undeclared identifier}}
        // no empty body warning.

  int i;
  for (i = 0; i < x; i++)
    bb; // expected-error{{use of undeclared identifier}}

  int arr[3] = { 1, 2, 3 };
  for (int j : arr)
    cc; // expected-error{{use of undeclared identifier}}

  while (b() == 0)
    dd; // expected-error{{use of undeclared identifier}}
}

// Warnings for statements in templates shouldn't be duplicated for all
// instantiations.
template <typename T>
void test_template(int x) {
  if (x); // expected-warning{{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}

  if (x)
    EMPTY(x); // no-warning

  int arr[3] = { 1, 2, 3 };
  for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}

  while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    a(x);
}

void test_template_inst(int x) {
  test_template<int>(x);
  test_template<double>(x);
}

#define IDENTITY(a) a
void test7(int x, int y) {
  if (x) IDENTITY(); // no-warning
}

