#253 closed defect (fixed)
Plan-9 with dynamic layout gives wrong field offsets
| Reported by: | mlbrooks | Owned by: | |
|---|---|---|---|
| Priority: | minor | Component: | cfa-cc |
| Version: | 1.0 | Keywords: | |
| Cc: |
Description
Subsequent plan9-inlined fields (which make the owning struct have multiple inheritance) are unusable when the owning struct has dynamic layout (a layout that varies according to the size of a sized-T parameter), because uses of such fields get the wrong offset.
forall( T )
struct thing {
T q; // variable-sized padding
inline double;
inline float;
};
#define SHOW_OFFSETS \
double & x_inner_double = x; \
float & x_inner_float = x; \
printf(" offset of inner double: %ld\n", ((char *) & x_inner_double) - ((char *) & x) ); \
printf(" offset of inner float: %ld\n", ((char *) & x_inner_float ) - ((char *) & x) );
void showStatic( thing(int) & x ) {
printf("static:\n");
SHOW_OFFSETS
}
forall( T )
void showDynamic( thing(T) & x ) {
printf("dynamic:\n");
SHOW_OFFSETS
}
int main() {
thing(int) x;
showStatic(x);
showDynamic(x);
}
Actual: Runs with output showing inconsitent offset of second inlined field (float)
static: offset of inner double: 8 offset of inner float: 16 dynamic: offset of inner double: 8 offset of inner float: 8
Expected: Runs with output showing consitent offset of second inlined field (float)
static: offset of inner double: 8 offset of inner float: 16 dynamic: offset of inner double: 8 offset of inner float: 16
Change History (2)
comment:1 by , 4 years ago
| Owner: | set to |
|---|---|
| Resolution: | → fixed |
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
In 801978b: