aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/c-typeck.c1
-rw-r--r--gcc/doc/extend.texi3
-rw-r--r--gcc/testsuite/gcc.dg/sso-12.c27
-rw-r--r--gcc/tree.h4
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;
+}
diff --git a/gcc/tree.h b/gcc/tree.h
index 6d3cfc4..784452c 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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)