aboutsummaryrefslogtreecommitdiff
path: root/final/ABI-Testsuite/test/s2_7/test02.xpp
diff options
context:
space:
mode:
Diffstat (limited to 'final/ABI-Testsuite/test/s2_7/test02.xpp')
-rwxr-xr-xfinal/ABI-Testsuite/test/s2_7/test02.xpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/final/ABI-Testsuite/test/s2_7/test02.xpp b/final/ABI-Testsuite/test/s2_7/test02.xpp
new file mode 100755
index 00000000..819660db
--- /dev/null
+++ b/final/ABI-Testsuite/test/s2_7/test02.xpp
@@ -0,0 +1,97 @@
+// This file is distributed under the University of Illinois Open Source License.
+// See LICENSE.TXT for details.
+// 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;
+}