/* Check if the @defs() construct preserves the correct
|
/* Check if the @defs() construct preserves the correct
|
layout of bitfields. */
|
layout of bitfields. */
|
/* Contributed by Ziemowit Laski . */
|
/* Contributed by Ziemowit Laski . */
|
/* { dg-options "-lobjc -Wpadded" } */
|
/* { dg-options "-lobjc -Wpadded" } */
|
/* { dg-do run } */
|
/* { dg-do run } */
|
|
|
#include
|
#include
|
|
|
#include
|
#include
|
#include
|
#include
|
|
|
#define CHECK_IF(expr) if(!(expr)) abort()
|
#define CHECK_IF(expr) if(!(expr)) abort()
|
|
|
enum Enum { one, two, three, four };
|
enum Enum { one, two, three, four };
|
|
|
@interface Base: Object {
|
@interface Base: Object {
|
unsigned a: 2;
|
unsigned a: 2;
|
int b: 3;
|
int b: 3;
|
enum Enum c: 4;
|
enum Enum c: 4;
|
unsigned d: 5;
|
unsigned d: 5;
|
} /* { dg-warning "padding struct size to alignment boundary" } */
|
} /* { dg-warning "padding struct size to alignment boundary" } */
|
@end
|
@end
|
|
|
@interface Derived: Base {
|
@interface Derived: Base {
|
signed e: 5;
|
signed e: 5;
|
int f: 4;
|
int f: 4;
|
enum Enum g: 3;
|
enum Enum g: 3;
|
}
|
}
|
@end
|
@end
|
|
|
/* Note that the semicolon after @defs(...) is optional. */
|
/* Note that the semicolon after @defs(...) is optional. */
|
|
|
typedef struct { @defs(Base) } Base_t; /* { dg-warning "padding struct size to alignment boundary" } */
|
typedef struct { @defs(Base) } Base_t; /* { dg-warning "padding struct size to alignment boundary" } */
|
typedef struct { @defs(Derived); } Derived_t;
|
typedef struct { @defs(Derived); } Derived_t;
|
|
|
int main(void)
|
int main(void)
|
{
|
{
|
CHECK_IF(sizeof(Base_t) == sizeof(Base));
|
CHECK_IF(sizeof(Base_t) == sizeof(Base));
|
CHECK_IF(sizeof(Derived_t) == sizeof(Derived));
|
CHECK_IF(sizeof(Derived_t) == sizeof(Derived));
|
|
|
#ifdef __NEXT_RUNTIME__
|
#ifdef __NEXT_RUNTIME__
|
CHECK_IF(!strcmp(@encode(Base), "{Base=#b2b3b4b5}"));
|
CHECK_IF(!strcmp(@encode(Base), "{Base=#b2b3b4b5}"));
|
CHECK_IF(!strcmp(@encode(Derived), "{Derived=#b2b3b4b5b5b4b3}"));
|
CHECK_IF(!strcmp(@encode(Derived), "{Derived=#b2b3b4b5b5b4b3}"));
|
|
|
CHECK_IF(!strcmp(@encode(Base_t), "{?=#b2b3b4b5}"));
|
CHECK_IF(!strcmp(@encode(Base_t), "{?=#b2b3b4b5}"));
|
CHECK_IF(!strcmp(@encode(Derived_t), "{?=#b2b3b4b5b5b4b3}"));
|
CHECK_IF(!strcmp(@encode(Derived_t), "{?=#b2b3b4b5b5b4b3}"));
|
#endif /* __NEXT_RUNTIME__ */
|
#endif /* __NEXT_RUNTIME__ */
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|