cosmopolitan/test/libcxx/cexception_test.cc
Justine Tunney c4c812c154
Introduce ctl::set and ctl::map
We now have a C++ red-black tree implementation that implements standard
template library compatible APIs while compiling 10x faster than libcxx.
It's not as beautiful as the red-black tree implementation in Plinko but
this will get the job done and the test proves it upholds all invariants

This change also restores CheckForMemoryLeaks() support and fixes a real
actual bug I discovered with Doug Lea's dlmalloc_inspect_all() function.
2024-06-23 22:27:11 -07:00

81 lines
3 KiB
C++

/*-*-mode:c++;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8-*-│
│ vi: set et ft=cpp ts=2 sts=2 sw=2 fenc=utf-8 :vi │
╞══════════════════════════════════════════════════════════════════════════════╡
│ Copyright 2024 Justine Alexandra Roberts Tunney │
│ │
│ Permission to use, copy, modify, and/or distribute this software for │
│ any purpose with or without fee is hereby granted, provided that the │
│ above copyright notice and this permission notice appear in all copies. │
│ │
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
│ PERFORMANCE OF THIS SOFTWARE. │
╚─────────────────────────────────────────────────────────────────────────────*/
#include "libc/mem/alg.h"
#include "libc/mem/leaks.h"
#include "libc/mem/mem.h"
#include "libc/runtime/runtime.h"
// this dontthrow keyword SHOULD break this test. it's probably passing
// because we're currently using SjLj exceptions. the day we can change
// things, remove `dontthrow` and this test will still be a useful help
extern "C" dontthrow void qsort_(void *, size_t, size_t,
int (*)(const void *,
const void *)) asm("qsort");
struct Resource {
char *p;
Resource() {
p = new char;
}
~Resource() {
delete p;
}
};
void Poke(char *p) {
*p = 1;
}
void (*pPoke)(char *) = Poke;
void Throw(void) {
throw 42;
}
void (*pThrow)(void) = Throw;
int cmp(const void *x, const void *y) {
Resource r;
pPoke(r.p);
if (*r.p)
pThrow();
exit(5);
}
int A[3] = {3, 2, 1};
int Work(void) {
Resource r;
pPoke(r.p);
qsort_(A, 3, sizeof(int), cmp);
return A[0];
}
int (*pWork)(void) = Work;
int main(int argc, char *argv[]) {
try {
Resource r;
if (pWork() != 1)
return 1;
pPoke(r.p);
if (r.p)
return 2;
} catch (int e) {
if (e != 42)
return 3;
}
CheckForMemoryLeaks();
}