// RUN: %clang_cc1 -fsyntax-only -analyze \
// RUN:   -analyzer-checker=core,debug.ExprInspection %s -verify

// These test cases demonstrate lack of Static Analyzer features.
// The FIXME: tags indicate where we expect different output.

// Handle constructors within new[].

// When an array of objects is allocated using the operator new[],
// constructors for all elements of the array are called.
// We should model (potentially some of) such evaluations,
// and the same applies for destructors called from operator delete[].

void clang_analyzer_eval(bool);

struct init_with_list {
  int a;
  init_with_list() : a(1) {}
};

struct init_in_body {
  int a;
  init_in_body() { a = 1; }
};

struct init_default_member {
  int a = 1;
};

void test_automatic() {

  init_with_list a1;
  init_in_body a2;
  init_default_member a3;

  clang_analyzer_eval(a1.a == 1); // expected-warning {{TRUE}}
  clang_analyzer_eval(a2.a == 1); // expected-warning {{TRUE}}
  clang_analyzer_eval(a3.a == 1); // expected-warning {{TRUE}}
}

void test_dynamic() {

  auto *a1 = new init_with_list;
  auto *a2 = new init_in_body;
  auto *a3 = new init_default_member;

  clang_analyzer_eval(a1->a == 1); // expected-warning {{TRUE}}
  clang_analyzer_eval(a2->a == 1); // expected-warning {{TRUE}}
  clang_analyzer_eval(a3->a == 1); // expected-warning {{TRUE}}

  delete a1;
  delete a2;
  delete a3;
}

void test_automatic_aggregate() {

  init_with_list a1[1];
  init_in_body a2[1];
  init_default_member a3[1];

  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}
  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}
  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}
}

void test_dynamic_aggregate() {

  auto *a1 = new init_with_list[1];
  auto *a2 = new init_in_body[1];
  auto *a3 = new init_default_member[1];

  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}
  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}
  // FIXME: Should be TRUE, not FALSE.
  clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}}

  delete[] a1;
  delete[] a2;
  delete[] a3;
}
