From: Naveen H S <nave...@marvell.com> This patch adds support scalar_storage_order attribute to C++ front-end. It treats the opposite order fields similar as the packed fields are treated such that they will not bind to references. For arrays, the attributes applies to the inner type rather than the array type similar. The code is similar to how it is handled in the C front-end.
2021-04-03 Andrew Pinski <apin...@marvell.com> gcc/ChangeLog: * c-family/c-attribs.cc (handle_scalar_storage_order_attribute): Do not reject the C++ cases. * cp/class.cc (layout_nonempty_base_or_field): Fix the type of arrays in C++. * cp/call.cc (reference_binding): Treat reversed field similar as packed fields. (build_temp): Likewise. (convert_like_internal): Emit error code for non binding reversed endian field. * cp/cp-tree.h (clk_implicit_rval) : Add clk_reversed. * cp/cp-tree.c (lvalue_kind) : Handle reverse storage ordered operands. gcc/testsuite/ChangeLog: * c-c++-common/sso/dump.h: Move from gcc.dg/sso to c-c++-common/sso. * c-c++-common/sso/init1.h: Likewise. * c-c++-common/sso/init13.h: Likewise. * c-c++-common/sso/init2.h: Likewise. * c-c++-common/sso/init3.h: Likewise. * c-c++-common/sso/init4.h: Likewise. * c-c++-common/sso/init5.h: Likewise. * c-c++-common/sso/init6.h: Likewise. * c-c++-common/sso/init7.h: Likewise. * c-c++-common/sso/init8.h: Likewise. * c-c++-common/sso/init9.h: Likewise. * c-c++-common/sso/p1.c: Likewise. * c-c++-common/sso/p13.c: Likewise. * c-c++-common/sso/p2.c: Likewise. * c-c++-common/sso/p3.c: Likewise. * c-c++-common/sso/p4.c: Likewise. * c-c++-common/sso/p5.c: Likewise. * c-c++-common/sso/p6.c: Likewise. * c-c++-common/sso/p7.c: Likewise. * c-c++-common/sso/p8.c: Likewise. * c-c++-common/sso/p9.c: Likewise. * c-c++-common/sso/q1.c: Likewise. * c-c++-common/sso/q13.c: Likewise. * c-c++-common/sso/q2.c: Likewise. * c-c++-common/sso/q3.c: Likewise. * c-c++-common/sso/q4.c: Likewise. * c-c++-common/sso/q5.c: Likewise. * c-c++-common/sso/q6.c: Likewise. * c-c++-common/sso/q7.c: Likewise. * c-c++-common/sso/q8.c: Likewise. * c-c++-common/sso/q9.c: Likewise. * c-c++-common/sso/r3.c: Likewise. * c-c++-common/sso/r5.c: Likewise. * c-c++-common/sso/r6.c: Likewise. * c-c++-common/sso/r7.c: Likewise. * c-c++-common/sso/r8.c: Likewise. * c-c++-common/sso/s3.c: Likewise. * c-c++-common/sso/s5.c: Likewise. * c-c++-common/sso/s6.c: Likewise. * c-c++-common/sso/s7.c: Likewise. * c-c++-common/sso/s8.c: Likewise. * c-c++-common/sso/t1.c: Likewise. * c-c++-common/sso/t13.c: Likewise. * c-c++-common/sso/t2.c: Likewise. * c-c++-common/sso/t3.c: Likewise. * c-c++-common/sso/t4.c: Likewise. * c-c++-common/sso/t5.c: Likewise. * c-c++-common/sso/t6.c: Likewise. * c-c++-common/sso/t7.c: Likewise. * c-c++-common/sso/t8.c: Likewise. * c-c++-common/sso/t9.c: Likewise. * c-c++-common/sso/u5.c: Likewise. * c-c++-common/sso/t6.c: Likewise. * g++.dg/sso/sso.exp: New file. * g++.dg/sso/auto-1.C: New file. * g++.dg/sso/auto-2.C: New file. * g++.dg/sso/auto-3.C: New file. * g++.dg/sso/template-reference-1.C: New file. * g++.dg/sso/template-reference-2.C: New file. * g++.dg/sso/template-reference-3.C: New file. * g++.dg/sso/template-reference-4.C: New file. * g++.dg/sso-1.C: Modified. Co-authored-by: Naveen H S <nave...@marvell.com> --- gcc/c-family/c-attribs.cc | 2 +- gcc/cp/call.cc | 17 ++++++- gcc/cp/class.cc | 22 ++++++++++ gcc/cp/cp-tree.h | 3 +- gcc/cp/tree.cc | 5 ++- .../{gcc.dg => c-c++-common}/sso/dump.h | 0 .../{gcc.dg => c-c++-common}/sso/init1.h | 0 .../{gcc.dg => c-c++-common}/sso/init13.h | 0 .../{gcc.dg => c-c++-common}/sso/init2.h | 0 .../{gcc.dg => c-c++-common}/sso/init3.h | 0 .../{gcc.dg => c-c++-common}/sso/init4.h | 0 .../{gcc.dg => c-c++-common}/sso/init5.h | 0 .../{gcc.dg => c-c++-common}/sso/init6.h | 0 .../{gcc.dg => c-c++-common}/sso/init7.h | 0 .../{gcc.dg => c-c++-common}/sso/init8.h | 0 .../{gcc.dg => c-c++-common}/sso/init9.h | 0 .../{gcc.dg => c-c++-common}/sso/p1.c | 0 .../{gcc.dg => c-c++-common}/sso/p13.c | 1 + .../{gcc.dg => c-c++-common}/sso/p2.c | 0 .../{gcc.dg => c-c++-common}/sso/p3.c | 0 .../{gcc.dg => c-c++-common}/sso/p4.c | 0 .../{gcc.dg => c-c++-common}/sso/p5.c | 0 .../{gcc.dg => c-c++-common}/sso/p6.c | 0 .../{gcc.dg => c-c++-common}/sso/p7.c | 0 .../{gcc.dg => c-c++-common}/sso/p8.c | 0 .../{gcc.dg => c-c++-common}/sso/p9.c | 0 .../{gcc.dg => c-c++-common}/sso/q1.c | 0 .../{gcc.dg => c-c++-common}/sso/q13.c | 1 + .../{gcc.dg => c-c++-common}/sso/q2.c | 0 .../{gcc.dg => c-c++-common}/sso/q3.c | 0 .../{gcc.dg => c-c++-common}/sso/q4.c | 0 .../{gcc.dg => c-c++-common}/sso/q5.c | 0 .../{gcc.dg => c-c++-common}/sso/q6.c | 0 .../{gcc.dg => c-c++-common}/sso/q7.c | 0 .../{gcc.dg => c-c++-common}/sso/q8.c | 0 .../{gcc.dg => c-c++-common}/sso/q9.c | 0 .../{gcc.dg => c-c++-common}/sso/r3.c | 0 .../{gcc.dg => c-c++-common}/sso/r5.c | 0 .../{gcc.dg => c-c++-common}/sso/r6.c | 0 .../{gcc.dg => c-c++-common}/sso/r7.c | 0 .../{gcc.dg => c-c++-common}/sso/r8.c | 0 .../{gcc.dg => c-c++-common}/sso/s3.c | 0 .../{gcc.dg => c-c++-common}/sso/s5.c | 0 .../{gcc.dg => c-c++-common}/sso/s6.c | 0 .../{gcc.dg => c-c++-common}/sso/s7.c | 0 .../{gcc.dg => c-c++-common}/sso/s8.c | 0 .../{gcc.dg => c-c++-common}/sso/t1.c | 0 .../{gcc.dg => c-c++-common}/sso/t13.c | 1 + .../{gcc.dg => c-c++-common}/sso/t2.c | 0 .../{gcc.dg => c-c++-common}/sso/t3.c | 0 .../{gcc.dg => c-c++-common}/sso/t4.c | 0 .../{gcc.dg => c-c++-common}/sso/t5.c | 0 .../{gcc.dg => c-c++-common}/sso/t6.c | 0 .../{gcc.dg => c-c++-common}/sso/t7.c | 0 .../{gcc.dg => c-c++-common}/sso/t8.c | 0 .../{gcc.dg => c-c++-common}/sso/t9.c | 0 .../{gcc.dg => c-c++-common}/sso/u5.c | 0 .../{gcc.dg => c-c++-common}/sso/u6.c | 0 gcc/testsuite/g++.dg/sso-1.C | 2 +- gcc/testsuite/g++.dg/sso/auto-1.C | 17 +++++++ gcc/testsuite/g++.dg/sso/auto-2.C | 17 +++++++ gcc/testsuite/g++.dg/sso/auto-3.C | 17 +++++++ gcc/testsuite/g++.dg/sso/sso.exp | 44 +++++++++++++++++++ .../g++.dg/sso/template-reference-1.C | 19 ++++++++ .../g++.dg/sso/template-reference-2.C | 19 ++++++++ .../g++.dg/sso/template-reference-3.C | 19 ++++++++ .../g++.dg/sso/template-reference-4.C | 19 ++++++++ gcc/testsuite/gcc.dg/sso/sso.exp | 2 +- 68 files changed, 220 insertions(+), 7 deletions(-) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/dump.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init1.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init13.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init2.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init3.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init4.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init5.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init6.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init7.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init8.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/init9.h (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p1.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p13.c (95%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p2.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p3.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p4.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p6.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p7.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p8.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/p9.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q1.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q13.c (92%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q2.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q3.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q4.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q6.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q7.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q8.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/q9.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/r3.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/r5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/r6.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/r7.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/r8.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/s3.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/s5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/s6.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/s7.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/s8.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t1.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t13.c (94%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t2.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t3.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t4.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t6.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t7.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t8.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/t9.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/u5.c (100%) rename gcc/testsuite/{gcc.dg => c-c++-common}/sso/u6.c (100%) create mode 100644 gcc/testsuite/g++.dg/sso/auto-1.C create mode 100644 gcc/testsuite/g++.dg/sso/auto-2.C create mode 100644 gcc/testsuite/g++.dg/sso/auto-3.C create mode 100644 gcc/testsuite/g++.dg/sso/sso.exp create mode 100644 gcc/testsuite/g++.dg/sso/template-reference-1.C create mode 100644 gcc/testsuite/g++.dg/sso/template-reference-2.C create mode 100644 gcc/testsuite/g++.dg/sso/template-reference-3.C create mode 100644 gcc/testsuite/g++.dg/sso/template-reference-4.C diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index 072cfb69147..8ae48166f62 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -1794,7 +1794,7 @@ handle_scalar_storage_order_attribute (tree *node, tree name, tree args, return NULL_TREE; } - if (RECORD_OR_UNION_TYPE_P (type) && !c_dialect_cxx ()) + if (RECORD_OR_UNION_TYPE_P (type)) { bool reverse = false; diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index 2736f55f229..c3804bc48c4 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -1862,7 +1862,8 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags, = (TYPE_REF_IS_RVALUE (rto) == !is_lvalue); if ((gl_kind & clk_bitfield) != 0 - || ((gl_kind & clk_packed) != 0 && !TYPE_PACKED (to))) + || ((gl_kind & clk_packed) != 0 && !TYPE_PACKED (to)) + || (gl_kind & clk_reversed) != 0) /* For the purposes of overload resolution, we ignore the fact this expression is a bitfield or packed field. (In particular, [over.ics.ref] says specifically that a function with a @@ -8084,7 +8085,8 @@ build_temp (tree expr, tree type, int flags, binding the field to the reference parameter to the copy constructor, and we'll end up with an infinite loop. If we can use a bitwise copy, then do that now. */ - if ((lvalue_kind (expr) & clk_packed) + if (((lvalue_kind (expr) & clk_packed) + || (lvalue_kind (expr) & clk_reversed)) && CLASS_TYPE_P (TREE_TYPE (expr)) && !type_has_nontrivial_copy_init (TREE_TYPE (expr))) return get_target_expr (expr, complain); @@ -8781,6 +8783,9 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum, else if (lvalue & clk_packed) error_at (loc, "cannot bind packed field %qE to %qT", expr, ref_type); + else if (lvalue & clk_reversed) + error_at (loc, "cannot bind reversed endian field %qE to %qT", + expr, ref_type); else error_at (loc, "cannot bind rvalue %qE to %qT", expr, ref_type); @@ -8801,6 +8806,14 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum, expr, ref_type); return error_mark_node; } + if ((lvalue & clk_reversed) + && CLASS_TYPE_P (type) + && type_has_nontrivial_copy_init (type)) + { + error_at (loc, "cannot bind reversed endian field %qE to %qT", + expr, ref_type); + return error_mark_node; + } if (lvalue & clk_bitfield) { expr = convert_bitfield_to_declared_type (expr); diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc index bc84f4f731a..7537bf640f3 100644 --- a/gcc/cp/class.cc +++ b/gcc/cp/class.cc @@ -4387,6 +4387,28 @@ layout_nonempty_base_or_field (record_layout_info rli, field_p = true; } + /* Rewrite the type of array fields with scalar component + if the enclosing type has reverse storage order */ + if (TYPE_REVERSE_STORAGE_ORDER (rli->t) + && TREE_CODE (decl) == FIELD_DECL + && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) + { + tree ftype = TREE_TYPE (decl); + tree ctype = strip_array_types (ftype); + if (!RECORD_OR_UNION_TYPE_P (ctype) && TYPE_MODE (ctype) != QImode) + { + tree fmain_type = TYPE_MAIN_VARIANT (ftype); + tree *typep = &fmain_type; + do { + *typep = build_distinct_type_copy (*typep); + TYPE_REVERSE_STORAGE_ORDER (*typep) = 1; + typep = &TREE_TYPE (*typep); + } while (TREE_CODE (*typep) == ARRAY_TYPE); + TREE_TYPE (decl) + = cp_build_qualified_type (fmain_type, TYPE_QUALS (ftype)); + } + } + /* Try to place the field. It may take more than one try if we have a hard time placing the field without putting two objects of the same type at the same address. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index a1b882f11fe..ae5d0bf7ebe 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5464,7 +5464,8 @@ enum cp_lvalue_kind_flags { clk_class = 4, /* A prvalue of class or array type. */ clk_bitfield = 8, /* An lvalue for a bit-field. */ clk_packed = 16, /* An lvalue for a packed field. */ - clk_implicit_rval = 1<<5 /* An lvalue being treated as an xvalue. */ + clk_implicit_rval = 1<<5, /* An lvalue being treated as an xvalue. */ + clk_reversed = 1<<6 /* An lvalue for a reversed field. */ }; /* This type is used for parameters and variables which hold diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc index 19dfb3ed782..5384bc9ef07 100644 --- a/gcc/cp/tree.cc +++ b/gcc/cp/tree.cc @@ -186,6 +186,9 @@ lvalue_kind (const_tree ref) } else if (DECL_PACKED (TREE_OPERAND (ref, 1))) op1_lvalue_kind |= clk_packed; + else if (AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (ref, 0))) + && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (TREE_OPERAND (ref, 0)))) + op1_lvalue_kind |= clk_reversed; return op1_lvalue_kind; @@ -342,7 +345,7 @@ lvalue_kind (const_tree ref) /* It can't be both a pseudo-lvalue and a non-addressable lvalue. A COND_EXPR of those should be wrapped in a TARGET_EXPR. */ if ((op1_lvalue_kind & (clk_rvalueref|clk_class)) - && (op1_lvalue_kind & (clk_bitfield|clk_packed))) + && (op1_lvalue_kind & (clk_bitfield|clk_packed|clk_reversed))) op1_lvalue_kind = clk_none; return op1_lvalue_kind; } diff --git a/gcc/testsuite/gcc.dg/sso/dump.h b/gcc/testsuite/c-c++-common/sso/dump.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/dump.h rename to gcc/testsuite/c-c++-common/sso/dump.h diff --git a/gcc/testsuite/gcc.dg/sso/init1.h b/gcc/testsuite/c-c++-common/sso/init1.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init1.h rename to gcc/testsuite/c-c++-common/sso/init1.h diff --git a/gcc/testsuite/gcc.dg/sso/init13.h b/gcc/testsuite/c-c++-common/sso/init13.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init13.h rename to gcc/testsuite/c-c++-common/sso/init13.h diff --git a/gcc/testsuite/gcc.dg/sso/init2.h b/gcc/testsuite/c-c++-common/sso/init2.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init2.h rename to gcc/testsuite/c-c++-common/sso/init2.h diff --git a/gcc/testsuite/gcc.dg/sso/init3.h b/gcc/testsuite/c-c++-common/sso/init3.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init3.h rename to gcc/testsuite/c-c++-common/sso/init3.h diff --git a/gcc/testsuite/gcc.dg/sso/init4.h b/gcc/testsuite/c-c++-common/sso/init4.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init4.h rename to gcc/testsuite/c-c++-common/sso/init4.h diff --git a/gcc/testsuite/gcc.dg/sso/init5.h b/gcc/testsuite/c-c++-common/sso/init5.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init5.h rename to gcc/testsuite/c-c++-common/sso/init5.h diff --git a/gcc/testsuite/gcc.dg/sso/init6.h b/gcc/testsuite/c-c++-common/sso/init6.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init6.h rename to gcc/testsuite/c-c++-common/sso/init6.h diff --git a/gcc/testsuite/gcc.dg/sso/init7.h b/gcc/testsuite/c-c++-common/sso/init7.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init7.h rename to gcc/testsuite/c-c++-common/sso/init7.h diff --git a/gcc/testsuite/gcc.dg/sso/init8.h b/gcc/testsuite/c-c++-common/sso/init8.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init8.h rename to gcc/testsuite/c-c++-common/sso/init8.h diff --git a/gcc/testsuite/gcc.dg/sso/init9.h b/gcc/testsuite/c-c++-common/sso/init9.h similarity index 100% rename from gcc/testsuite/gcc.dg/sso/init9.h rename to gcc/testsuite/c-c++-common/sso/init9.h diff --git a/gcc/testsuite/gcc.dg/sso/p1.c b/gcc/testsuite/c-c++-common/sso/p1.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p1.c rename to gcc/testsuite/c-c++-common/sso/p1.c diff --git a/gcc/testsuite/gcc.dg/sso/p13.c b/gcc/testsuite/c-c++-common/sso/p13.c similarity index 95% rename from gcc/testsuite/gcc.dg/sso/p13.c rename to gcc/testsuite/c-c++-common/sso/p13.c index 33af5027bd6..b7ec935e69f 100644 --- a/gcc/testsuite/gcc.dg/sso/p13.c +++ b/gcc/testsuite/c-c++-common/sso/p13.c @@ -1,4 +1,5 @@ /* { dg-do run } */ +/* { dg-additional-options "-fext-numeric-literals" { target c++ } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.dg/sso/p2.c b/gcc/testsuite/c-c++-common/sso/p2.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p2.c rename to gcc/testsuite/c-c++-common/sso/p2.c diff --git a/gcc/testsuite/gcc.dg/sso/p3.c b/gcc/testsuite/c-c++-common/sso/p3.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p3.c rename to gcc/testsuite/c-c++-common/sso/p3.c diff --git a/gcc/testsuite/gcc.dg/sso/p4.c b/gcc/testsuite/c-c++-common/sso/p4.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p4.c rename to gcc/testsuite/c-c++-common/sso/p4.c diff --git a/gcc/testsuite/gcc.dg/sso/p5.c b/gcc/testsuite/c-c++-common/sso/p5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p5.c rename to gcc/testsuite/c-c++-common/sso/p5.c diff --git a/gcc/testsuite/gcc.dg/sso/p6.c b/gcc/testsuite/c-c++-common/sso/p6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p6.c rename to gcc/testsuite/c-c++-common/sso/p6.c diff --git a/gcc/testsuite/gcc.dg/sso/p7.c b/gcc/testsuite/c-c++-common/sso/p7.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p7.c rename to gcc/testsuite/c-c++-common/sso/p7.c diff --git a/gcc/testsuite/gcc.dg/sso/p8.c b/gcc/testsuite/c-c++-common/sso/p8.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p8.c rename to gcc/testsuite/c-c++-common/sso/p8.c diff --git a/gcc/testsuite/gcc.dg/sso/p9.c b/gcc/testsuite/c-c++-common/sso/p9.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/p9.c rename to gcc/testsuite/c-c++-common/sso/p9.c diff --git a/gcc/testsuite/gcc.dg/sso/q1.c b/gcc/testsuite/c-c++-common/sso/q1.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q1.c rename to gcc/testsuite/c-c++-common/sso/q1.c diff --git a/gcc/testsuite/gcc.dg/sso/q13.c b/gcc/testsuite/c-c++-common/sso/q13.c similarity index 92% rename from gcc/testsuite/gcc.dg/sso/q13.c rename to gcc/testsuite/c-c++-common/sso/q13.c index cacc2a9860b..0cbf268d503 100644 --- a/gcc/testsuite/gcc.dg/sso/q13.c +++ b/gcc/testsuite/c-c++-common/sso/q13.c @@ -1,4 +1,5 @@ /* { dg-do run } */ +/* { dg-additional-options "-fext-numeric-literals" { target c++ } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.dg/sso/q2.c b/gcc/testsuite/c-c++-common/sso/q2.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q2.c rename to gcc/testsuite/c-c++-common/sso/q2.c diff --git a/gcc/testsuite/gcc.dg/sso/q3.c b/gcc/testsuite/c-c++-common/sso/q3.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q3.c rename to gcc/testsuite/c-c++-common/sso/q3.c diff --git a/gcc/testsuite/gcc.dg/sso/q4.c b/gcc/testsuite/c-c++-common/sso/q4.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q4.c rename to gcc/testsuite/c-c++-common/sso/q4.c diff --git a/gcc/testsuite/gcc.dg/sso/q5.c b/gcc/testsuite/c-c++-common/sso/q5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q5.c rename to gcc/testsuite/c-c++-common/sso/q5.c diff --git a/gcc/testsuite/gcc.dg/sso/q6.c b/gcc/testsuite/c-c++-common/sso/q6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q6.c rename to gcc/testsuite/c-c++-common/sso/q6.c diff --git a/gcc/testsuite/gcc.dg/sso/q7.c b/gcc/testsuite/c-c++-common/sso/q7.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q7.c rename to gcc/testsuite/c-c++-common/sso/q7.c diff --git a/gcc/testsuite/gcc.dg/sso/q8.c b/gcc/testsuite/c-c++-common/sso/q8.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q8.c rename to gcc/testsuite/c-c++-common/sso/q8.c diff --git a/gcc/testsuite/gcc.dg/sso/q9.c b/gcc/testsuite/c-c++-common/sso/q9.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/q9.c rename to gcc/testsuite/c-c++-common/sso/q9.c diff --git a/gcc/testsuite/gcc.dg/sso/r3.c b/gcc/testsuite/c-c++-common/sso/r3.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/r3.c rename to gcc/testsuite/c-c++-common/sso/r3.c diff --git a/gcc/testsuite/gcc.dg/sso/r5.c b/gcc/testsuite/c-c++-common/sso/r5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/r5.c rename to gcc/testsuite/c-c++-common/sso/r5.c diff --git a/gcc/testsuite/gcc.dg/sso/r6.c b/gcc/testsuite/c-c++-common/sso/r6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/r6.c rename to gcc/testsuite/c-c++-common/sso/r6.c diff --git a/gcc/testsuite/gcc.dg/sso/r7.c b/gcc/testsuite/c-c++-common/sso/r7.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/r7.c rename to gcc/testsuite/c-c++-common/sso/r7.c diff --git a/gcc/testsuite/gcc.dg/sso/r8.c b/gcc/testsuite/c-c++-common/sso/r8.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/r8.c rename to gcc/testsuite/c-c++-common/sso/r8.c diff --git a/gcc/testsuite/gcc.dg/sso/s3.c b/gcc/testsuite/c-c++-common/sso/s3.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/s3.c rename to gcc/testsuite/c-c++-common/sso/s3.c diff --git a/gcc/testsuite/gcc.dg/sso/s5.c b/gcc/testsuite/c-c++-common/sso/s5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/s5.c rename to gcc/testsuite/c-c++-common/sso/s5.c diff --git a/gcc/testsuite/gcc.dg/sso/s6.c b/gcc/testsuite/c-c++-common/sso/s6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/s6.c rename to gcc/testsuite/c-c++-common/sso/s6.c diff --git a/gcc/testsuite/gcc.dg/sso/s7.c b/gcc/testsuite/c-c++-common/sso/s7.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/s7.c rename to gcc/testsuite/c-c++-common/sso/s7.c diff --git a/gcc/testsuite/gcc.dg/sso/s8.c b/gcc/testsuite/c-c++-common/sso/s8.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/s8.c rename to gcc/testsuite/c-c++-common/sso/s8.c diff --git a/gcc/testsuite/gcc.dg/sso/t1.c b/gcc/testsuite/c-c++-common/sso/t1.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t1.c rename to gcc/testsuite/c-c++-common/sso/t1.c diff --git a/gcc/testsuite/gcc.dg/sso/t13.c b/gcc/testsuite/c-c++-common/sso/t13.c similarity index 94% rename from gcc/testsuite/gcc.dg/sso/t13.c rename to gcc/testsuite/c-c++-common/sso/t13.c index 223b42dc952..313e79cc0b7 100644 --- a/gcc/testsuite/gcc.dg/sso/t13.c +++ b/gcc/testsuite/c-c++-common/sso/t13.c @@ -1,4 +1,5 @@ /* { dg-do run } */ +/* { dg-additional-options "-fext-numeric-literals" { target c++ } } */ #include <stdio.h> diff --git a/gcc/testsuite/gcc.dg/sso/t2.c b/gcc/testsuite/c-c++-common/sso/t2.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t2.c rename to gcc/testsuite/c-c++-common/sso/t2.c diff --git a/gcc/testsuite/gcc.dg/sso/t3.c b/gcc/testsuite/c-c++-common/sso/t3.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t3.c rename to gcc/testsuite/c-c++-common/sso/t3.c diff --git a/gcc/testsuite/gcc.dg/sso/t4.c b/gcc/testsuite/c-c++-common/sso/t4.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t4.c rename to gcc/testsuite/c-c++-common/sso/t4.c diff --git a/gcc/testsuite/gcc.dg/sso/t5.c b/gcc/testsuite/c-c++-common/sso/t5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t5.c rename to gcc/testsuite/c-c++-common/sso/t5.c diff --git a/gcc/testsuite/gcc.dg/sso/t6.c b/gcc/testsuite/c-c++-common/sso/t6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t6.c rename to gcc/testsuite/c-c++-common/sso/t6.c diff --git a/gcc/testsuite/gcc.dg/sso/t7.c b/gcc/testsuite/c-c++-common/sso/t7.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t7.c rename to gcc/testsuite/c-c++-common/sso/t7.c diff --git a/gcc/testsuite/gcc.dg/sso/t8.c b/gcc/testsuite/c-c++-common/sso/t8.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t8.c rename to gcc/testsuite/c-c++-common/sso/t8.c diff --git a/gcc/testsuite/gcc.dg/sso/t9.c b/gcc/testsuite/c-c++-common/sso/t9.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/t9.c rename to gcc/testsuite/c-c++-common/sso/t9.c diff --git a/gcc/testsuite/gcc.dg/sso/u5.c b/gcc/testsuite/c-c++-common/sso/u5.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/u5.c rename to gcc/testsuite/c-c++-common/sso/u5.c diff --git a/gcc/testsuite/gcc.dg/sso/u6.c b/gcc/testsuite/c-c++-common/sso/u6.c similarity index 100% rename from gcc/testsuite/gcc.dg/sso/u6.c rename to gcc/testsuite/c-c++-common/sso/u6.c diff --git a/gcc/testsuite/g++.dg/sso-1.C b/gcc/testsuite/g++.dg/sso-1.C index 0f59d0c4069..e4777da8036 100644 --- a/gcc/testsuite/g++.dg/sso-1.C +++ b/gcc/testsuite/g++.dg/sso-1.C @@ -2,7 +2,7 @@ /* { dg-do compile } */ -struct __attribute__((scalar_storage_order("little-endian"))) Rec /* { dg-warning "attribute ignored" } */ +struct __attribute__((scalar_storage_order("little-endian"))) Rec /* { dg-bogus "attribute ignored" } */ { int i; }; diff --git a/gcc/testsuite/g++.dg/sso/auto-1.C b/gcc/testsuite/g++.dg/sso/auto-1.C new file mode 100644 index 00000000000..12ebcc1707b --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/auto-1.C @@ -0,0 +1,17 @@ +/* { dg-do compile { target c++11 } } */ +#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 + +void f(Rec *a) +{ + auto t = a->p; +} diff --git a/gcc/testsuite/g++.dg/sso/auto-2.C b/gcc/testsuite/g++.dg/sso/auto-2.C new file mode 100644 index 00000000000..d69ca8d0c66 --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/auto-2.C @@ -0,0 +1,17 @@ +/* { dg-do compile { target c++14 } } */ +#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 + +decltype(auto) f(Rec *a) +{ + return a->p; +} diff --git a/gcc/testsuite/g++.dg/sso/auto-3.C b/gcc/testsuite/g++.dg/sso/auto-3.C new file mode 100644 index 00000000000..80eab2389d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/auto-3.C @@ -0,0 +1,17 @@ +/* { dg-do compile { target c++14 } } */ +#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 + +decltype(auto) f(Rec *a) +{ + return (a->p); /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/sso/sso.exp b/gcc/testsuite/g++.dg/sso/sso.exp new file mode 100644 index 00000000000..0684596e10f --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/sso.exp @@ -0,0 +1,44 @@ +# Copyright (C) 2013-2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Load support procs. +load_lib g++-dg.exp +load_lib torture-options.exp + +if { ![check_effective_target_int32] } { + return +} + +# Initialize `dg'. +torture-init +dg-init + +set SSO_TORTURE_OPTIONS [list \ + { -O0 } \ + { -O1 -fno-inline } \ + { -O2 } \ + { -O3 -finline-functions } \ + { -Os } \ + { -Og -g } ] + +set-torture-options $SSO_TORTURE_OPTIONS + +# Main loop. +g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/sso/*.c ]] "" "" + +# All done. +dg-finish +torture-finish diff --git a/gcc/testsuite/g++.dg/sso/template-reference-1.C b/gcc/testsuite/g++.dg/sso/template-reference-1.C new file mode 100644 index 00000000000..8925dff9930 --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/template-reference-1.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +#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 +template <typename T> void g(const T &); + + +void f(Rec *a) +{ + g(a->p); +} diff --git a/gcc/testsuite/g++.dg/sso/template-reference-2.C b/gcc/testsuite/g++.dg/sso/template-reference-2.C new file mode 100644 index 00000000000..f871833991e --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/template-reference-2.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +#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 +template <typename T> void g(T &); + + +void f(Rec *a) +{ + g(a->p); /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/sso/template-reference-3.C b/gcc/testsuite/g++.dg/sso/template-reference-3.C new file mode 100644 index 00000000000..5c2ebd37832 --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/template-reference-3.C @@ -0,0 +1,19 @@ +/* { dg-do compile { target c++11 } } */ +#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 +template <typename T> void g(T &&); + + +void f(Rec *a) +{ + g(a->p); /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/sso/template-reference-4.C b/gcc/testsuite/g++.dg/sso/template-reference-4.C new file mode 100644 index 00000000000..acc56e2e819 --- /dev/null +++ b/gcc/testsuite/g++.dg/sso/template-reference-4.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +#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 +template <typename T> void g(T &); + + +void f(Rec *a) +{ + g( (a->p)); /* { dg-error "" } */ +} diff --git a/gcc/testsuite/gcc.dg/sso/sso.exp b/gcc/testsuite/gcc.dg/sso/sso.exp index a18f7011cea..59e756565a4 100644 --- a/gcc/testsuite/gcc.dg/sso/sso.exp +++ b/gcc/testsuite/gcc.dg/sso/sso.exp @@ -37,7 +37,7 @@ set SSO_TORTURE_OPTIONS [list \ set-torture-options $SSO_TORTURE_OPTIONS # Main loop. -gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] "" "" +gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c $srcdir/c-c++-common/sso/*.c ]] "" "" # All done. dg-finish -- 2.30.2