| // PR c++/69277 - [6 Regression] ICE mangling a flexible array member |
| // { dg-do compile { target c++11 } } |
| // { dg-additional-options "-Wno-error=pedantic" } |
| |
| struct A { |
| int n; |
| char a[]; // { dg-warning "8:ISO C\\+\\+ forbids flexible array member" } |
| }; |
| |
| // Declare but do not define function templates. |
| template <class T> |
| void foo (); |
| |
| template <typename T> |
| void fooref (T&); |
| |
| // Rvalue references are a C++ 11 feature. |
| template <typename T> |
| void foorefref (T&&); |
| |
| void bar (A a) |
| { |
| // Decltype is also a C++ 11 feature. |
| // Verify that decltype gets the right type and that foo is |
| // mangled correctly. |
| foo<decltype (a.a)>(); |
| |
| // Verify that function templates taking a reference and an rvalue |
| // references (as in PR c++/69277) are also mangled correctly. |
| fooref (a.a); |
| foorefref (a.a); |
| } |
| |
| // In G++ versions prior to 6, flexible array members were incorrectly |
| // mangled as arrays of zero elements. Verify that flexible array |
| // members are mangled correctly as arrays of an unspecified number |
| // of elements. |
| |
| // void foo<char []>(): |
| // { dg-final { scan-assembler _Z3fooIA_cEvv } } |
| |
| // The following is derived from PR c++/69277: |
| // void fooref<char []>(char (&) []) |
| // { dg-final { scan-assembler _Z6foorefIA_cEvRT_ } } |
| |
| // void foorefref<char (&) []>(char (&) []) |
| // { dg-final { scan-assembler _Z9foorefrefIRA_cEvOT_ } } |