summaryrefslogtreecommitdiffstats
path: root/src/VBox/Runtime/testcase/tstRTAssertCompile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Runtime/testcase/tstRTAssertCompile.cpp')
-rw-r--r--src/VBox/Runtime/testcase/tstRTAssertCompile.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/VBox/Runtime/testcase/tstRTAssertCompile.cpp b/src/VBox/Runtime/testcase/tstRTAssertCompile.cpp
new file mode 100644
index 00000000..f7e2fd63
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTAssertCompile.cpp
@@ -0,0 +1,179 @@
+/* $Id: tstRTAssertCompile.cpp $ */
+/** @file
+ * IPRT Testcase - AssertCompile* - A Compile Time Testcase.
+ */
+
+/*
+ * Copyright (C) 2010-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+
+/*********************************************************************************************************************************
+* Header Files *
+*********************************************************************************************************************************/
+#include <iprt/assert.h>
+
+
+int main(int argc, char **argv)
+{
+ /* Only positive tests here. */
+ NOREF(argc); NOREF(argv);
+
+ AssertCompile(true);
+ AssertCompile(1);
+ AssertCompile(2);
+ AssertCompile(99);
+
+ uint8_t u8; NOREF( u8);
+ uint16_t u16; NOREF(u16);
+ uint32_t u32; NOREF(u32);
+ uint64_t u64; NOREF(u64);
+ AssertCompileSize( u8, 1);
+ AssertCompileSize(u16, 2);
+ AssertCompileSize(u32, 4);
+ AssertCompileSize(u64, 8);
+
+ AssertCompileSizeAlignment( u8, 1);
+ AssertCompileSizeAlignment(u16, 1);
+ AssertCompileSizeAlignment(u16, 2);
+ AssertCompileSizeAlignment(u32, 1);
+ AssertCompileSizeAlignment(u32, 2);
+ AssertCompileSizeAlignment(u32, 4);
+ AssertCompileSizeAlignment(u64, 1);
+ AssertCompileSizeAlignment(u64, 2);
+ AssertCompileSizeAlignment(u64, 4);
+ AssertCompileSizeAlignment(u64, 8);
+
+ typedef struct STRUCT12S
+ {
+ uint8_t u8;
+ uint8_t au8[8];
+ uint64_t u64;
+ uint8_t u8UnalignmentFiller1;
+ uint32_t u32;
+ uint8_t u8UnalignmentFiller2;
+ uint16_t u16;
+ const char *psz;
+ uint32_t u32A;
+ uint32_t u32B;
+ } STRUCT1, STRUCT2;
+
+ AssertCompileMemberSize(STRUCT1, u8, 1);
+ AssertCompileMemberSize(STRUCT1, u16, 2);
+ AssertCompileMemberSize(STRUCT1, u32, 4);
+ AssertCompileMemberSize(STRUCT1, u64, 8);
+
+ AssertCompileMemberSizeAlignment(STRUCT1, u8, 1);
+ AssertCompileMemberSizeAlignment(STRUCT1, u16, 1);
+ AssertCompileMemberSizeAlignment(STRUCT1, u16, 2);
+ AssertCompileMemberSizeAlignment(STRUCT1, u32, 1);
+ AssertCompileMemberSizeAlignment(STRUCT1, u32, 2);
+ AssertCompileMemberSizeAlignment(STRUCT1, u32, 4);
+ AssertCompileMemberSizeAlignment(STRUCT1, u64, 1);
+ AssertCompileMemberSizeAlignment(STRUCT1, u64, 2);
+ AssertCompileMemberSizeAlignment(STRUCT1, u64, 4);
+ AssertCompileMemberSizeAlignment(STRUCT1, u64, 8);
+ AssertCompileMemberSizeAlignment(STRUCT1, psz, sizeof(void *));
+
+ AssertCompileMemberAlignment(STRUCT1, u8, 1);
+ AssertCompileMemberAlignment(STRUCT1, u16, 1);
+ AssertCompileMemberAlignment(STRUCT1, u16, 2);
+ AssertCompileMemberAlignment(STRUCT1, u32, 1);
+ AssertCompileMemberAlignment(STRUCT1, u32, 2);
+ AssertCompileMemberAlignment(STRUCT1, u32, 4);
+ AssertCompileMemberAlignment(STRUCT1, u64, 1);
+ AssertCompileMemberAlignment(STRUCT1, u64, 2);
+ AssertCompileMemberAlignment(STRUCT1, u64, 4);
+#if defined(__GNUC__) && ARCH_BITS >= 64
+ AssertCompileMemberAlignment(STRUCT1, u64, 8);
+#endif
+ AssertCompileMemberAlignment(STRUCT1, psz, sizeof(void *));
+
+ AssertCompileMemberOffset(STRUCT1, u8, 0);
+ AssertCompileMemberOffset(STRUCT1, au8, 1);
+#ifndef _MSC_VER /** @todo figure out why MSC has trouble with these expressions */
+ AssertCompileMemberOffset(STRUCT1, au8[0], 1);
+ AssertCompileMemberOffset(STRUCT1, au8[8], 9);
+#endif
+
+ typedef union UNION1U
+ {
+ STRUCT1 s1;
+ STRUCT2 s2;
+ } UNION1;
+
+ AssertCompile2MemberOffsets(UNION1, s1.u8, s2.u8);
+ AssertCompile2MemberOffsets(UNION1, s1.u16, s2.u16);
+ AssertCompile2MemberOffsets(UNION1, s1.u32, s2.u32);
+ AssertCompile2MemberOffsets(UNION1, s1.u64, s2.u64);
+ AssertCompile2MemberOffsets(UNION1, s1.psz, s2.psz);
+
+ AssertCompileAdjacentMembers(STRUCT1, u32A, u32B);
+ AssertCompileAdjacentMembers(STRUCT1, u8, au8);
+#ifndef _MSC_VER /** @todo figure out why MSC has trouble with these expressions */
+ AssertCompileAdjacentMembers(STRUCT1, u8, au8[0]);
+ AssertCompileAdjacentMembers(STRUCT1, au8[0], au8[1]);
+#endif
+
+ AssertCompileMembersAtSameOffset(STRUCT1, u8, STRUCT2, u8);
+ AssertCompileMembersAtSameOffset(STRUCT1, au8, STRUCT2, au8);
+ AssertCompileMembersAtSameOffset(STRUCT1, u16, STRUCT2, u16);
+ AssertCompileMembersAtSameOffset(STRUCT1, u32, STRUCT2, u32);
+ AssertCompileMembersAtSameOffset(STRUCT1, u64, STRUCT2, u64);
+
+ AssertCompileMembersSameSize(STRUCT1, u8, STRUCT2, u8);
+ AssertCompileMembersSameSize(STRUCT1, au8, STRUCT2, au8);
+ AssertCompileMembersSameSize(STRUCT1, u16, STRUCT2, u16);
+ AssertCompileMembersSameSize(STRUCT1, u32, STRUCT2, u32);
+ AssertCompileMembersSameSize(STRUCT1, u64, STRUCT2, u64);
+
+ AssertCompileMembersSameSizeAndOffset(STRUCT1, u8, STRUCT2, u8);
+ AssertCompileMembersSameSizeAndOffset(STRUCT1, au8, STRUCT2, au8);
+ AssertCompileMembersSameSizeAndOffset(STRUCT1, u16, STRUCT2, u16);
+ AssertCompileMembersSameSizeAndOffset(STRUCT1, u32, STRUCT2, u32);
+ AssertCompileMembersSameSizeAndOffset(STRUCT1, u64, STRUCT2, u64);
+
+ /*
+ * Check some cdefs.h macros while where here, we'll be using
+ * AssertCompile so it's kind of related.
+ */
+#ifdef RT_COMPILER_SUPPORTS_VA_ARGS
+# if 0
+ AssertCompile(RT_COUNT_VA_ARGS() == 0);
+ AssertCompile(RT_COUNT_VA_ARGS(RT_NOTHING) == 1);
+# endif
+ AssertCompile(RT_COUNT_VA_ARGS(asdf) == 1);
+ AssertCompile(RT_COUNT_VA_ARGS(yyyy) == 1);
+ AssertCompile(RT_COUNT_VA_ARGS(_) == 1);
+ AssertCompile(RT_COUNT_VA_ARGS(1, 2, 3, 4, 5, 6, 7, 8, 9, 0) == 10);
+#endif
+ return 0;
+}
+