brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · dd5e806 Raw
189 lines · c
1// RUN: %clang_cc1 %s -verify=stock,c -fsyntax-only2// RUN: %clang_cc1 %s -verify=stock,cpp -fsyntax-only -x c++3// RUN: %clang_cc1 %s -verify=stock,cpp -fsyntax-only -fms-compatibility -x c++4// RUN: %clang_cc1 %s -verify=stock,c,gnu -fsyntax-only -Wgnu-flexible-array-union-member -Wgnu-empty-struct5// RUN: %clang_cc1 %s -verify=stock,c,microsoft -fsyntax-only -fms-compatibility -Wmicrosoft6 7// The test checks that an attempt to initialize union with flexible array8// member with an initializer list doesn't crash clang.9 10 11union { char x[]; } r = {0}; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}12                                microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}13                              */14struct _name1 {15  int a;16  union {17    int b;18    char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}19                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}20               */21  };22} name1 = {23  10,24  42,        /* initializes "b" */25};26 27struct _name1i {28  int a;29  union {30    int b;31    char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}32                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}33               */34  };35} name1i = {36  .a = 10,37  .b = 42,38};39 40/* Initialization of flexible array in a union is never allowed. */41struct _name2 {42  int a;43  union {44    int b;45    char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}46                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}47               */48  };49} name2 = {50  12,51  13,52  { 'c' },   /* c-warning {{excess elements in struct initializer}}53                cpp-error {{excess elements in struct initializer}}54              */55};56 57/* Initialization of flexible array in a union is never allowed. */58struct _name2i {59  int a;60  union {61    int b;62    char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}63                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}64                 stock-note {{initialized flexible array member 'x' is here}}65               */66  };67} name2i = {68  .a = 12,69  .b = 13,      /* stock-note {{previous initialization is here}} */70  .x = { 'c' }, /* stock-error {{initialization of flexible array member is not allowed}}71                   c-warning {{initializer overrides prior initialization of this subobject}}72                   cpp-error {{initializer partially overrides prior initialization of this subobject}}73                 */74};75 76/* Flexible array initialization always allowed when not in a union,77   and when struct has another member.78 */79struct _okay {80  int a;81  char x[];82} okay = {83  22,84  { 'x', 'y', 'z' },85};86 87struct _okayi {88  int a;89  char x[];90} okayi = {91  .a = 22,92  .x = { 'x', 'y', 'z' },93};94 95struct _okay0 {96  int a;97  char x[];98} okay0 = { };99 100struct _flex_extension {101  char x[]; /* gnu-warning {{flexible array member 'x' in otherwise empty struct is a GNU extension}}102               microsoft-warning {{flexible array member 'x' in otherwise empty struct is a Microsoft extension}}103             */104} flex_extension = {105  { 'x', 'y', 'z' },106};107 108struct _flex_extensioni {109  char x[]; /* gnu-warning {{flexible array member 'x' in otherwise empty struct is a GNU extension}}110               microsoft-warning {{flexible array member 'x' in otherwise empty struct is a Microsoft extension}}111             */112} flex_extensioni = {113  .x = { 'x', 'y', 'z' },114};115 116struct already_hidden {117  int a;118  union {119    int b;120    struct {121      struct { } __empty;  // gnu-warning {{empty struct is a GNU extension}}122      char x[];123    };124  };125};126 127struct still_zero_sized {128  struct { } __unused;  // gnu-warning {{empty struct is a GNU extension}}129  int x[];130};131 132struct warn1 {133  int a;134  union {135    int b;136    char x[]; /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}137                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}138               */139  };140};141 142struct warn2 {143  int x[];  /* gnu-warning {{flexible array member 'x' in otherwise empty struct is a GNU extension}}144               microsoft-warning {{flexible array member 'x' in otherwise empty struct is a Microsoft extension}}145             */146};147 148union warn3 {149  short x[];  /* gnu-warning {{flexible array member 'x' in a union is a GNU extension}}150                 microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}151               */152};153 154struct quiet1 {155  int a;156  short x[];157};158 159struct _not_at_end {160  union { short x[]; }; /* stock-warning-re {{field '' with variable sized type '{{.*}}' not at the end of a struct or class is a GNU extension}}161                           gnu-warning {{flexible array member 'x' in a union is a GNU extension}}162                           microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}163                         */164  int y;165} not_at_end = {{}, 3};166 167struct _not_at_end_s {168  struct { int a; short x[]; }; /* stock-warning-re {{field '' with variable sized type '{{.*}}' not at the end of a struct or class is a GNU extension}} */169  int y;170} not_at_end_s = {{}, 3};171 172struct {173  int a;174  union {      /* stock-warning-re {{field '' with variable sized type '{{.*}}' not at the end of a struct or class is a GNU extension}} */175    short x[]; /* stock-note {{initialized flexible array member 'x' is here}}176                  gnu-warning {{flexible array member 'x' in a union is a GNU extension}}177                  microsoft-warning {{flexible array member 'x' in a union is a Microsoft extension}}178                */179    int b;180  };181  int c;182  int d;183} i_f = { 4,184         {5},  /* stock-error {{initialization of flexible array member is not allowed}} */185         {},186          6};187 188// expected-no-diagnostics189