blob: b56090303deb050752feb9ed257891c20c343684 [file] [log] [blame]
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler cxx_11 %s -c -o %t.o
// RUN: linker cxx_11 %t.o -o %t%exeext
// RUN: runtool %t%exeext | grep "TEST PASSED"
// RUN: cxx_compiler cxx_11 %s -c -o %t.o -DEXTRAF=char
// RUN: linker cxx_11 %t.o -o %t%exeext
// RUN: runtool %t%exeext | grep "TEST PASSED"
// RUN: cxx_compiler cxx_11 %s -c -o %t.o -DEXTRAF=short
// RUN: linker cxx_11 %t.o -o %t%exeext
// RUN: runtool %t%exeext | grep "TEST PASSED"
// RUN: cxx_compiler cxx_11 %s -c -o %t.o -DEXTRAF=int
// RUN: linker cxx_11 %t.o -o %t%exeext
// RUN: runtool %t%exeext | grep "TEST PASSED"
#include <stdio.h>
#include <new>
// No cookie required for placement new
#define BUFF_SIZE 1024
#define ARRAY_LENGTH 5
// Globals
unsigned char alloc_buff[BUFF_SIZE];
int new_calls = 0;
int delete_calls = 0;
void *operator new[](size_t size) { new_calls++; return alloc_buff; }
void operator delete[](void *p) { delete_calls++; }
struct non_trivial {
#ifdef EXTRAF
EXTRAF m1;
#endif
~non_trivial() { }
};
struct array_cookie {
size_t element_count;
};
int new_test() {
int errors = 0;
non_trivial *ptr = new non_trivial[ARRAY_LENGTH];
if((void *)ptr == (void *)alloc_buff) {
errors++;
printf("ERROR: new_test() pointers are equal!\n");
}
// Validate the cookie size
if(((unsigned char *)alloc_buff + sizeof(array_cookie)) != (unsigned char *)ptr) {
errors++;
printf("Cookie size incorrect (alloc_buff = 0x%p, ptr = 0x%p)\n", alloc_buff, ptr);
}
// Validate the cookie contents
array_cookie *cookie = (array_cookie *)alloc_buff;
if(cookie->element_count != (size_t)ARRAY_LENGTH) {
errors++;
printf("Cookie value element_count incorrect, expected (%ld), got (%ld)\n", (size_t)ARRAY_LENGTH, cookie->element_count);
}
delete [] ptr;
return errors;
}
int placement_new_test() {
int errors = 0;
non_trivial *ptr = new (alloc_buff) non_trivial[ARRAY_LENGTH];
if((void *)ptr != (void *)alloc_buff) {
errors++;
printf("ERROR: new_test() pointers differ!\n");
}
return errors;
}
int main(int argc, char *argv[]) {
int retval = 0;
retval += new_test();
retval += placement_new_test();
if(retval) {
printf("TEST FAILED\n");
retval = 1;
} else {
printf("TEST PASSED\n");
retval = 0;
}
return retval;
}