diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/c-typeck.c | 1 | ||||
-rw-r--r-- | gcc/doc/extend.texi | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sso-12.c | 27 | ||||
-rw-r--r-- | gcc/tree.h | 4 |
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index fdc7bb6..5bdc673 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -4866,6 +4866,7 @@ build_unary_op (location_t location, enum tree_code code, tree xarg, if (TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (TREE_OPERAND (arg, 0)))) { if (!AGGREGATE_TYPE_P (TREE_TYPE (arg)) + && !POINTER_TYPE_P (TREE_TYPE (arg)) && !VECTOR_TYPE_P (TREE_TYPE (arg))) { error_at (location, "cannot take address of scalar with " diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index c8caf36..fd9175d 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -8551,6 +8551,9 @@ or an array whose component is a @code{union} or a @code{struct}, and it is possible for these fields to have a different scalar storage order than the enclosing type. +Note that neither pointer nor vector fields are considered scalar fields in +this context, so the attribute has no effects on these fields. + This attribute is supported only for targets that use a uniform default scalar storage order (fortunately, most of them), i.e.@: targets that store the scalars either all in big-endian or all in little-endian. diff --git a/gcc/testsuite/gcc.dg/sso-12.c b/gcc/testsuite/gcc.dg/sso-12.c new file mode 100644 index 0000000..3bed280 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sso-12.c @@ -0,0 +1,27 @@ +/* Test scalar_storage_order attribute and pointer fields */ + +/* { dg-do run } */ +/* { dg-options "-Wno-pedantic" } */ + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +struct __attribute__((scalar_storage_order("big-endian"))) Rec +{ + int *p; +}; +#else +struct __attribute__((scalar_storage_order("little-endian"))) Rec +{ + int *p; +}; +#endif + +int main (int argc) +{ + struct Rec r = { &argc }; + int *p = &argc; + + if (__builtin_memcmp (&r.p, &p, sizeof (int *)) != 0) + __builtin_abort (); + + return 0; +} @@ -4989,7 +4989,9 @@ static inline bool reverse_storage_order_for_component_p (tree t) { /* The storage order only applies to scalar components. */ - if (AGGREGATE_TYPE_P (TREE_TYPE (t)) || VECTOR_TYPE_P (TREE_TYPE (t))) + if (AGGREGATE_TYPE_P (TREE_TYPE (t)) + || POINTER_TYPE_P (TREE_TYPE (t)) + || VECTOR_TYPE_P (TREE_TYPE (t))) return false; if (TREE_CODE (t) == REALPART_EXPR || TREE_CODE (t) == IMAGPART_EXPR) |