Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/g++.dg/ext/flexary5.C @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 1830386684a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/g++.dg/ext/flexary5.C Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,230 @@ +// { dg-do compile } +// { dg-options "-Wno-error=pedantic" } + +// Test to verify flexible array members handling in base and derived +// classes. + +#include "flexary.h" + +template <class T> +struct S_no_diag: T { + char a[]; // cannot be diagnosed unless/until T is known +}; + +template <class T> +struct STx_1: T { + char a[]; // { dg-error "flexible array member" } +}; + +template <class T, int I> +struct STI: T { + char a[I]; // cannot be diagnosed unless/until T and I are known +}; + +template <class T, int I> +struct STIx: T { + char a[I]; +}; + +template <int> struct E { }; + +STx_1<E<0> > stx_empty_1; +STIx<E<0>, 0> stix_empty_1; + +// Verify that a sole flexible array member in a class with all empty +// base classes is diagnosed. +struct E1: E<0>, E<1> { }; +struct E2: E<2>, E<3> { }; +struct D1: E1, E2 +{ + char a[]; // { dg-error "flexible array member" } +}; + +struct NE { size_t i; }; + +struct A1x { int n, a[]; }; +struct D2: A1x, E1, E2 { }; + +// Verify that the offset of the flexible array member is equal +// to the size of each of the valid structs. +ASSERT_AT_END (D2, a); + +struct D3: E1, A1x, E2 { }; + +ASSERT_AT_END (D3, a); + +struct D4: E1, E2, A1x { }; + +ASSERT_AT_END (D4, a); + +// Class with non-static data members and at least one base class +// with such a member is not a standard layout class. The warning +// below is benign since GCC computes the expected value. +struct D5: E1, E2, NE { char a[]; }; + +ASSERT_AT_END (D5, a); // { dg-warning "offsetof within non-standard-layout" } + +struct A2x_1 { + size_t n; + size_t a[]; // { dg-error "not at end of .struct D6." } +}; + +struct A2x_2 { + size_t n; + size_t a[]; // { dg-error "not at end of .struct D7." } +}; + +struct A2x_3 { + size_t n; + size_t a[]; // { dg-error "not at end of .struct D8." } +}; + +// Verify that the flexible array member in A2x above is diagnosed +// for each of the three struct defintions below which also derive +// from another struct with a flexible array member. +struct D6: A2x_1, E1, A1x { }; +struct D7: E1, A2x_2, E2, A1x { }; +struct D8: E1, E2, A2x_3, A1x { }; + +struct DA2x: A2x_1 { }; + +struct D9: DA2x, E1, E2 { }; + +ASSERT_AT_END (D9, a); + +struct D10: E1, DA2x, E2 { }; + +ASSERT_AT_END (D10, a); + +struct D11: E1, E2, DA2x { }; + +ASSERT_AT_END (D11, a); + +struct A3x { + size_t n; + size_t a[]; // { dg-error "not at end of .struct D12.| D13.| D14.| D15." } +}; + +// Verify that the flexible array member in A3x above is diagnosed +// for each of the three struct defintions below which also derive +// from another struct with a non-static member. +struct D12: A3x, E1, NE { }; +struct D13: E1, A3x, NE { }; +struct D14: E1, E2, A3x, NE { }; +struct D15: E1, E2, NE, A3x { }; + +struct A4x { + A4x (); + ~A4x (); + + size_t n; + struct AS { + AS (int); + ~AS (); + size_t i; + } a[]; +}; + +struct D16: A4x, E1, E2 { }; + +ASSERT_AT_END (D16, a); + +struct D17: E1, A4x, E2 { }; + +ASSERT_AT_END (D17, a); + +struct D18: E1, E2, A4x { }; + +ASSERT_AT_END (D18, a); + +struct DA4x: A4x { }; + +struct D19: DA4x, E1, E2 { }; + +ASSERT_AT_END (D19, a); + +struct D20: E1, DA4x, E2 { }; + +ASSERT_AT_END (D20, a); + +struct D21: E1, E2, DA4x { }; + +ASSERT_AT_END (D21, a); + + +struct A5x { + A5x (int); + virtual ~A5x (); + + size_t n; + struct AS { + AS (int); + ~AS (); + size_t i; + } a[]; +}; + +struct D22: A5x, E1, E2 { }; + +ASSERT_AT_END (D22, a); // { dg-warning "offsetof within non-standard-layout" } + +struct D23: E1, A5x, E2 { }; + +ASSERT_AT_END (D23, a); // { dg-warning "offsetof within non-standard-layout" } + +struct D24: E1, E2, A5x { }; + +ASSERT_AT_END (D24, a); // { dg-warning "offsetof within non-standard-layout" } + +struct DA5x: A5x { }; + +struct D25: DA5x, E1, E2 { }; + +ASSERT_AT_END (D25, a); // { dg-warning "offsetof within non-standard-layout" } + +struct D26: E1, DA5x, E2 { }; + +ASSERT_AT_END (D26, a); // { dg-warning "offsetof within non-standard-layout" } + +struct D27: E1, E2, DA5x { }; + +ASSERT_AT_END (D27, a); // { dg-warning "offsetof within non-standard-layout" } + +// Verfify that a flexible array member is diagnosed even when deep +// in the base class hierarchy. +struct A6x { + size_t n; + size_t a[]; // { dg-error "not at end of .struct D28.| D29." } +}; + +struct AA6x: A6x { }; +struct NE1: NE { }; +struct NE2: NE { }; + +struct D28: NE1, AA6x { }; +struct D29: AA6x, NE1 { }; + +struct A7x { + size_t n; + size_t a[]; // { dg-error "flexible array member .A7x::a. not at end of .struct D33." } +}; + +// Verify that a flexible array member in a virtual base class is not +// diagnosed. +struct DA7xV1: virtual A7x { }; +struct DA7xV2: virtual A7x { }; + +struct D30: DA7xV1, DA7xV2 { }; +struct D31: DA7xV1, DA7xV2 { }; +struct D32: D30, D31 { }; + +// Verify the diagnostic when the flexible array is in an anonymous struct. +struct A8x { + struct { // { dg-message "next member .A8x::<unnamed struct> A8x::<anonymous>. declared here" } + size_t n; + size_t a[]; + }; +}; + +struct D33: // { dg-message "in the definition of .struct D33." } + A7x, A8x { };