// RUN: %clang_analyze_cc1 -std=c++11 -fblocks %s \
// RUN:  -verify=newdelete \
// RUN:  -analyzer-checker=core \
// RUN:  -analyzer-checker=cplusplus.NewDelete

// RUN: %clang_analyze_cc1 -std=c++11 -DLEAKS -fblocks %s \
// RUN:   -verify=leak \
// RUN:   -analyzer-checker=core \
// RUN:   -analyzer-checker=cplusplus.NewDeleteLeaks

// leak-no-diagnostics

// RUN: %clang_analyze_cc1 -std=c++11 -DLEAKS -fblocks %s \
// RUN:   -verify=mismatch \
// RUN:   -analyzer-checker=core \
// RUN:   -analyzer-checker=unix.MismatchedDeallocator

#include "Inputs/system-header-simulator-cxx.h"
#include "Inputs/system-header-simulator-objc.h"

typedef __typeof__(sizeof(int)) size_t;
extern "C" void *malloc(size_t);
extern "C" void *alloca(size_t);
extern "C" void free(void *);

void testMallocFreeNoWarn() {
  int *p1 = (int *)malloc(sizeof(int));
  free(++p1); // no warn

  int *p2 = (int *)malloc(sizeof(int));
  free(p2);
  free(p2); // no warn

  int *p3 = (int *)malloc(sizeof(int)); // no warn

  int *p4 = (int *)malloc(sizeof(int));
  free(p4);
  int j = *p4; // no warn

  int *p5 = (int *)alloca(sizeof(int));
  free(p5); // no warn
}

void testDeleteMalloced() {
  int *p1 = (int *)malloc(sizeof(int));
  delete p1;
  // mismatch-warning@-1{{Memory allocated by malloc() should be deallocated by free(), not 'delete'}}

  int *p2 = (int *)__builtin_alloca(sizeof(int));
  delete p2; // no warn
}

void testUseZeroAllocatedMalloced() {
  int *p1 = (int *)malloc(0);
  *p1 = 1; // no warn
}

//----- Test free standard new
void testFreeOpNew() {
  void *p = operator new(0);
  free(p);
  // mismatch-warning@-1{{Memory allocated by operator new should be deallocated by 'delete', not free()}}
}

void testFreeNewExpr() {
  int *p = new int;
  free(p);
  // mismatch-warning@-1{{Memory allocated by 'new' should be deallocated by 'delete', not free()}}
  free(p);
}

void testObjcFreeNewed() {
  int *p = new int;
  NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1];
  // mismatch-warning@-1{{+dataWithBytesNoCopy:length:freeWhenDone: cannot take ownership of memory allocated by 'new'}}
}

void testFreeAfterDelete() {
  int *p = new int;
  delete p;
  free(p); // newdelete-warning{{Use of memory after it is freed}}
}

void testStandardPlacementNewAfterDelete() {
  int *p = new int;
  delete p;
  p = new (p) int; // newdelete-warning{{Use of memory after it is freed}}
}
