blob: 2afef471a9f4f904302b501afa44d287605b7e9c [file] [log] [blame]
//===-- cppfield.cpp - Test C++ Fields With Bit Accurate Types ------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// This is a test for conversion between different int types.
//
//===----------------------------------------------------------------------===//
#include <stdio.h>
typedef unsigned char __attribute__ ((bitwidth(7))) int7;
typedef unsigned int __attribute__ ((bitwidth(17))) int17;
typedef unsigned int __attribute__ ((bitwidth(32))) int32;
typedef unsigned int __attribute__ ((bitwidth(8))) int8;
class bitFieldStruct {
public:
int i;
unsigned char c:7;
int s:17;
char c2;
};
class bitAccurateStruct {
public:
int32 i;
int7 c;
int17 s;
int8 c2;
};
int main()
{
printf("sizeof(bitFieldStruct) == %d\n", sizeof(bitFieldStruct));
printf("sizeof(bitAccurateStruct) == %d\n", sizeof(bitAccurateStruct));
if (sizeof(bitAccurateStruct) != 4 * sizeof(int))
printf("bitAccurrateStruct should be %d but is %d \n",
4 * sizeof(int), sizeof(bitAccurateStruct));
if (sizeof(bitFieldStruct) != 2 * sizeof(int))
printf("bitFieldStruct should be %d but is %d \n",
2 * sizeof(int), sizeof(bitAccurateStruct));
bitFieldStruct x;
bitAccurateStruct y;
char* yip = (char*) &y.i;
char* ycp = (char*) &y.c;
char* ysp = (char*) &y.s;
char* yc2p = (char*) &y.c2;
printf("Offset bitAccurateStruct.i = %d\n", yip - yip);
printf("Offset bitAccurateStruct.c = %d\n", ycp - yip);
printf("Offset bitAccurateStruct.s = %d\n", ysp - yip);
printf("Offset bitAccurateStruct.c2 = %d\n", yc2p - yip);
char* xip = (char*) &x.i;
char* xc2p = (char*) &x.c2;
printf("Offset bitFieldStruct.i = %d\n", xip - xip);
printf("Offset bitFieldStruct.c2 = %d\n", xc2p - xip);
return 0;
}