brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · c6b4bab Raw
69 lines · plain
1/* A class that sets a boolean when an object of the class gets destroyed.2 */3struct S {4	S(bool *freed) : freed(freed) {}5	~S();6 7	bool *freed;8};9 10/* S destructor.11 *12 * Set the boolean, a pointer to which was passed to the constructor.13 */14S::~S()15{16	*freed = true;17}18 19/* Construct an isl::id with an S object attached that sets *freed20 * when it gets destroyed.21 */22static isl::id construct_id(isl::ctx ctx, bool *freed)23{24	auto s = std::make_shared<S>(freed);25	isl::id id(ctx, "S", s);26	return id;27}28 29/* Test id::try_user.30 *31 * In particular, check that the object attached to an identifier32 * can be retrieved again, that trying to retrieve an object of the wrong type33 * or trying to retrieve an object when no object was attached fails.34 * Furthermore, check that the object attached to an identifier35 * gets properly freed.36 */37static void test_try_user(isl::ctx ctx)38{39	isl::id id(ctx, "test", 5);40	isl::id id2(ctx, "test2");41 42	auto maybe_int = id.try_user<int>();43	auto maybe_s = id.try_user<std::shared_ptr<S>>();44	auto maybe_int2 = id2.try_user<int>();45 46	if (!maybe_int)47		die("integer cannot be retrieved from isl::id");48	if (maybe_int.value() != 5)49		die("wrong integer retrieved from isl::id");50	if (maybe_s)51		die("structure unexpectedly retrieved from isl::id");52	if (maybe_int2)53		die("integer unexpectedly retrieved from isl::id");54 55	bool freed = false;56	{57		isl::id id = construct_id(ctx, &freed);58		if (freed)59			die("data structure freed prematurely");60		auto maybe_s = id.try_user<std::shared_ptr<S>>();61		if (!maybe_s)62			die("structure cannot be retrieved from isl::id");63		if (maybe_s.value()->freed != &freed)64			die("invalid structure retrieved from isl::id");65	}66	if (!freed)67		die("data structure not freed");68}69