brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.4 KiB · cb3313c Raw
418 lines · cpp
1// DEFINE: %{analyzer} = %clang_analyze_cc1 -Wno-array-bounds %s \2// DEFINE:   -analyzer-checker=core,cplusplus,unix,debug.ExprInspection3 4// RUN: %{analyzer} -verify=default5// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=10 -verify=limit106// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=0  -verify=unlimited7 8template <class T> void clang_analyzer_dump(T);9void clang_analyzer_eval(bool);10 11template <class... Ts> void escape(Ts...);12bool coin();13 14class Loc {15  int x;16};17class P1 {18public:19  Loc l;20  void setLoc(Loc L) {21    l = L;22  }23  24};25class P2 {26public:27  int m;28  int accessBase() {29    return m;30  }31};32class Derived: public P1, public P2 {33};34int radar13445834(Derived *Builder, Loc l) {35  Builder->setLoc(l);36  return Builder->accessBase();37  38}39 40void boundedNumberOfBindings() {41  int array[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};42  clang_analyzer_dump(array[0]);  // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{0 S32b}}43  clang_analyzer_dump(array[1]);  // default-warning  {{1 S32b}}  unlimited-warning  {{1 S32b}}  limit10-warning  {{1 S32b}}44  clang_analyzer_dump(array[2]);  // default-warning  {{2 S32b}}  unlimited-warning  {{2 S32b}}  limit10-warning  {{2 S32b}}45  clang_analyzer_dump(array[3]);  // default-warning  {{3 S32b}}  unlimited-warning  {{3 S32b}}  limit10-warning  {{3 S32b}}46  clang_analyzer_dump(array[4]);  // default-warning  {{4 S32b}}  unlimited-warning  {{4 S32b}}  limit10-warning  {{4 S32b}}47  clang_analyzer_dump(array[5]);  // default-warning  {{5 S32b}}  unlimited-warning  {{5 S32b}}  limit10-warning  {{5 S32b}}48  clang_analyzer_dump(array[6]);  // default-warning  {{6 S32b}}  unlimited-warning  {{6 S32b}}  limit10-warning  {{6 S32b}}49  clang_analyzer_dump(array[7]);  // default-warning  {{7 S32b}}  unlimited-warning  {{7 S32b}}  limit10-warning  {{7 S32b}}50  clang_analyzer_dump(array[8]);  // default-warning  {{8 S32b}}  unlimited-warning  {{8 S32b}}  limit10-warning  {{8 S32b}}51  clang_analyzer_dump(array[9]);  // default-warning  {{9 S32b}}  unlimited-warning  {{9 S32b}}  limit10-warning  {{9 S32b}}52  clang_analyzer_dump(array[10]); // default-warning {{10 S32b}}  unlimited-warning {{10 S32b}}  limit10-warning {{Unknown}}53  clang_analyzer_dump(array[11]); // default-warning {{11 S32b}}  unlimited-warning {{11 S32b}}  limit10-warning {{Unknown}}54  clang_analyzer_dump(array[12]); // default-warning {{12 S32b}}  unlimited-warning {{12 S32b}}  limit10-warning {{Unknown}}55  clang_analyzer_dump(array[13]); // default-warning {{13 S32b}}  unlimited-warning {{13 S32b}}  limit10-warning {{Unknown}}56  clang_analyzer_dump(array[14]); // default-warning {{14 S32b}}  unlimited-warning {{14 S32b}}  limit10-warning {{Unknown}}57  clang_analyzer_dump(array[15]); // default-warning {{15 S32b}}  unlimited-warning {{15 S32b}}  limit10-warning {{Unknown}}58  clang_analyzer_dump(array[16]); // default-warning {{16 S32b}}  unlimited-warning {{16 S32b}}  limit10-warning {{Unknown}}59  clang_analyzer_dump(array[17]); // default-warning {{17 S32b}}  unlimited-warning {{17 S32b}}  limit10-warning {{Unknown}}60  clang_analyzer_dump(array[18]); // default-warning {{18 S32b}}  unlimited-warning {{18 S32b}}  limit10-warning {{Unknown}}61  clang_analyzer_dump(array[19]); // default-warning {{19 S32b}}  unlimited-warning {{19 S32b}}  limit10-warning {{Unknown}}62  clang_analyzer_dump(array[20]); // default-warning {{20 S32b}}  unlimited-warning {{20 S32b}}  limit10-warning {{Unknown}}63  clang_analyzer_dump(array[21]); // default-warning {{21 S32b}}  unlimited-warning {{21 S32b}}  limit10-warning {{Unknown}}64  clang_analyzer_dump(array[22]); // default-warning {{22 S32b}}  unlimited-warning {{22 S32b}}  limit10-warning {{Unknown}}65  clang_analyzer_dump(array[23]); //          see below                     see below            limit10-warning {{Unknown}}66  // default-warning@-1   {{1st function call argument is an uninitialized value}}67  // unlimited-warning@-2 {{1st function call argument is an uninitialized value}}68  // FIXME: The last dump at index 23 should be Undefined due to out of bounds access.69}70 71void incompleteInitList() {72  int array[23] {0,1,2,3,4,5,6,7,8,9,10,11 /*rest are zeroes*/ };73  clang_analyzer_dump(array[0]);  // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{0 S32b}}74  clang_analyzer_dump(array[1]);  // default-warning  {{1 S32b}}  unlimited-warning  {{1 S32b}}  limit10-warning  {{1 S32b}}75  clang_analyzer_dump(array[2]);  // default-warning  {{2 S32b}}  unlimited-warning  {{2 S32b}}  limit10-warning  {{2 S32b}}76  clang_analyzer_dump(array[3]);  // default-warning  {{3 S32b}}  unlimited-warning  {{3 S32b}}  limit10-warning  {{3 S32b}}77  clang_analyzer_dump(array[4]);  // default-warning  {{4 S32b}}  unlimited-warning  {{4 S32b}}  limit10-warning  {{4 S32b}}78  clang_analyzer_dump(array[5]);  // default-warning  {{5 S32b}}  unlimited-warning  {{5 S32b}}  limit10-warning  {{5 S32b}}79  clang_analyzer_dump(array[6]);  // default-warning  {{6 S32b}}  unlimited-warning  {{6 S32b}}  limit10-warning  {{6 S32b}}80  clang_analyzer_dump(array[7]);  // default-warning  {{7 S32b}}  unlimited-warning  {{7 S32b}}  limit10-warning  {{7 S32b}}81  clang_analyzer_dump(array[8]);  // default-warning  {{8 S32b}}  unlimited-warning  {{8 S32b}}  limit10-warning  {{8 S32b}}82  clang_analyzer_dump(array[9]);  // default-warning  {{9 S32b}}  unlimited-warning  {{9 S32b}}  limit10-warning  {{9 S32b}}83  clang_analyzer_dump(array[10]); // default-warning {{10 S32b}}  unlimited-warning {{10 S32b}}  limit10-warning  {{Unknown}}84  clang_analyzer_dump(array[11]); // default-warning {{11 S32b}}  unlimited-warning {{11 S32b}}  limit10-warning  {{Unknown}}85  clang_analyzer_dump(array[12]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}86  clang_analyzer_dump(array[13]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}87  clang_analyzer_dump(array[14]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}88  clang_analyzer_dump(array[15]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}89  clang_analyzer_dump(array[16]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}90  clang_analyzer_dump(array[17]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}91  clang_analyzer_dump(array[18]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}92  clang_analyzer_dump(array[19]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}93  clang_analyzer_dump(array[20]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}94  clang_analyzer_dump(array[21]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}95  clang_analyzer_dump(array[22]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}96  clang_analyzer_dump(array[23]); // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{Unknown}}97  // FIXME: The last dump at index 23 should be Undefined due to out of bounds access.98}99 100struct Inner {101  int first;102  int second;103};104struct Outer {105  Inner upper;106  Inner lower;107};108 109void nestedStructInitLists() {110  Outer array[]{ // 7*4: 28 values111    {{00, 01}, {02, 03}},112    {{10, 11}, {12, 13}},113    {{20, 21}, {22, 23}},114    {{30, 31}, {32, 33}},115    {{40, 41}, {42, 43}},116    {{50, 51}, {52, 53}},117    {{60, 61}, {62, 63}},118  };119 120  int *p = (int*)array;121  clang_analyzer_dump(p[0]);  // default-warning  {{0 S32b}}  unlimited-warning  {{0 S32b}}  limit10-warning  {{0 S32b}}122  clang_analyzer_dump(p[1]);  // default-warning  {{1 S32b}}  unlimited-warning  {{1 S32b}}  limit10-warning  {{1 S32b}}123  clang_analyzer_dump(p[2]);  // default-warning  {{2 S32b}}  unlimited-warning  {{2 S32b}}  limit10-warning  {{2 S32b}}124  clang_analyzer_dump(p[3]);  // default-warning  {{3 S32b}}  unlimited-warning  {{3 S32b}}  limit10-warning  {{3 S32b}}125  clang_analyzer_dump(p[4]);  // default-warning {{10 S32b}}  unlimited-warning {{10 S32b}}  limit10-warning {{10 S32b}}126  clang_analyzer_dump(p[5]);  // default-warning {{11 S32b}}  unlimited-warning {{11 S32b}}  limit10-warning {{11 S32b}}127  clang_analyzer_dump(p[6]);  // default-warning {{12 S32b}}  unlimited-warning {{12 S32b}}  limit10-warning {{12 S32b}}128  clang_analyzer_dump(p[7]);  // default-warning {{13 S32b}}  unlimited-warning {{13 S32b}}  limit10-warning {{13 S32b}}129  clang_analyzer_dump(p[8]);  // default-warning {{20 S32b}}  unlimited-warning {{20 S32b}}  limit10-warning {{20 S32b}}130  clang_analyzer_dump(p[9]);  // default-warning {{21 S32b}}  unlimited-warning {{21 S32b}}  limit10-warning {{21 S32b}}131  clang_analyzer_dump(p[10]); // default-warning {{22 S32b}}  unlimited-warning {{22 S32b}}  limit10-warning {{Unknown}}132  clang_analyzer_dump(p[11]); // default-warning {{23 S32b}}  unlimited-warning {{23 S32b}}  limit10-warning {{Unknown}}133  clang_analyzer_dump(p[12]); // default-warning {{30 S32b}}  unlimited-warning {{30 S32b}}  limit10-warning {{Unknown}}134  clang_analyzer_dump(p[13]); // default-warning {{31 S32b}}  unlimited-warning {{31 S32b}}  limit10-warning {{Unknown}}135  clang_analyzer_dump(p[14]); // default-warning {{32 S32b}}  unlimited-warning {{32 S32b}}  limit10-warning {{Unknown}}136  clang_analyzer_dump(p[15]); // default-warning {{33 S32b}}  unlimited-warning {{33 S32b}}  limit10-warning {{Unknown}}137  clang_analyzer_dump(p[16]); // default-warning {{40 S32b}}  unlimited-warning {{40 S32b}}  limit10-warning {{Unknown}}138  clang_analyzer_dump(p[17]); // default-warning {{41 S32b}}  unlimited-warning {{41 S32b}}  limit10-warning {{Unknown}}139  clang_analyzer_dump(p[18]); // default-warning {{42 S32b}}  unlimited-warning {{42 S32b}}  limit10-warning {{Unknown}}140  clang_analyzer_dump(p[19]); // default-warning {{43 S32b}}  unlimited-warning {{43 S32b}}  limit10-warning {{Unknown}}141  clang_analyzer_dump(p[20]); // default-warning {{50 S32b}}  unlimited-warning {{50 S32b}}  limit10-warning {{Unknown}}142  clang_analyzer_dump(p[21]); // default-warning {{51 S32b}}  unlimited-warning {{51 S32b}}  limit10-warning {{Unknown}}143  clang_analyzer_dump(p[22]); // default-warning {{52 S32b}}  unlimited-warning {{52 S32b}}  limit10-warning {{Unknown}}144  clang_analyzer_dump(p[23]); // default-warning {{53 S32b}}  unlimited-warning {{53 S32b}}  limit10-warning {{Unknown}}145  clang_analyzer_dump(p[24]); // default-warning {{60 S32b}}  unlimited-warning {{60 S32b}}  limit10-warning {{Unknown}}146  clang_analyzer_dump(p[25]); // default-warning {{61 S32b}}  unlimited-warning {{61 S32b}}  limit10-warning {{Unknown}}147  clang_analyzer_dump(p[26]); // default-warning {{62 S32b}}  unlimited-warning {{62 S32b}}  limit10-warning {{Unknown}}148  clang_analyzer_dump(p[27]); // default-warning {{63 S32b}}  unlimited-warning {{63 S32b}}  limit10-warning {{Unknown}}149  clang_analyzer_dump(p[28]); //          see below                     see below            limit10-warning {{Unknown}}150  // default-warning@-1   {{1st function call argument is an uninitialized value}}151  // unlimited-warning@-2 {{1st function call argument is an uninitialized value}}152  // FIXME: The last dump at index 28 should be Undefined due to out of bounds access.153}154 155void expectNoLeaksInWidenedInitLists() {156  int *p[] {157    new int(0),158    new int(1),159    new int(2),160    new int(3),161    new int(4),162    new int(5),163    new int(6),164    new int(7),165    new int(8),166    new int(9),167    new int(10),168    new int(11),169    new int(12),170    new int(13),171    new int(14),172    new int(15),173    new int(16),174    new int(17),175    new int(18),176    new int(19),177    new int(20),178    new int(21),179    new int(22),180    new int(23),181    new int(24),182  };183  clang_analyzer_dump(*p[0]);  // default-warning  {{0 S32b}} unlimited-warning  {{0 S32b}} limit10-warning {{0 S32b}}184  clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}185  escape(p); // no-leaks186}187 188void rawArrayWithSelfReference() {189  // If a pointer to some object escapes, that pointed object should escape too.190  // Consequently, if the 22th initializer would escape, then the p[6] should also escape - clobbering any loads from that location later.191  int *p[25] = {192    new int(0),193    new int(1),194    new int(2),195    new int(3),196    new int(4),197    new int(5),198    new int(6),199    new int(7),200    p[5], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.201    new int(9),202    new int(10),203    new int(11),204    new int(12),205    new int(13),206    new int(14),207    new int(15),208    new int(16),209    new int(17),210    new int(18),211    new int(19),212    new int(20),213    new int(21),214    p[6], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.215    new int(23),216    new int(24),217  };218  clang_analyzer_dump(*p[5]);  // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}219  clang_analyzer_dump(*p[6]);  // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}220 221  if (coin()) {222    clang_analyzer_dump(*p[8]);223    // default-warning@-1   {{Dereference of undefined pointer value}}224    // unlimited-warning@-2 {{Dereference of undefined pointer value}}225    // limit10-warning@-3   {{Dereference of undefined pointer value}}226  }227 228  clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}229 230  if (coin()) {231    clang_analyzer_dump(*p[22]);232    // default-warning@-1   {{Dereference of undefined pointer value}}233    // unlimited-warning@-2 {{Dereference of undefined pointer value}}234    // limit10-warning@-3   {{Unknown}}235  }236 237  clang_analyzer_dump(*p[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}238 239  escape(p); // no-leaks240}241 242template <class T, unsigned Size> struct BigArray {243  T array[Size];244};245 246void fieldArrayWithSelfReference() {247  // Similar to "rawArrayWithSelfReference", but using an aggregate object and assignment operator to achieve the element-wise binds.248  BigArray<int *, 25> p;249  p = {250    new int(0),251    new int(1),252    new int(2),253    new int(3),254    new int(4),255    new int(5),256    new int(6),257    new int(7),258    p.array[5], // Pointer to the 6th array element.259    new int(9),260    new int(10),261    new int(11),262    new int(12),263    new int(13),264    new int(14),265    new int(15),266    new int(16),267    new int(17),268    new int(18),269    new int(19),270    new int(20),271    new int(21),272    p.array[6], // Pointer to the 7th array element.273    new int(23),274    new int(24),275  };276  clang_analyzer_dump(*p.array[5]);  // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}277  clang_analyzer_dump(*p.array[6]);  // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}278 279  if (coin()) {280    clang_analyzer_dump(*p.array[8]);281    // default-warning@-1   {{Unknown}}282    // unlimited-warning@-2 {{Unknown}}283    // limit10-warning@-3   {{Unknown}}284  }285 286  clang_analyzer_dump(*p.array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}287 288  if (coin()) {289    clang_analyzer_dump(*p.array[22]);290    // default-warning@-1   {{Unknown}}291    // unlimited-warning@-2 {{Unknown}}292    // limit10-warning@-3   {{Unknown}}293  }294 295  clang_analyzer_dump(*p.array[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}296 297  escape(p); // no-leaks298}299 300struct PtrHolderBase {301  int *ptr;302};303struct BigStruct : BigArray<int, 1000>, PtrHolderBase {};304void largeBaseClasses() {305  BigStruct D{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, {new int(25)}};306  (void)D; // no-leak here, the PtrHolderBase subobject is properly escaped.307 308  clang_analyzer_dump(*D.ptr);  // default-warning {{25 S32b}} unlimited-warning {{25 S32b}} limit10-warning {{Unknown}}309  escape(D);310}311 312struct List {313  int* ptr;314  BigArray<int, 30> head;315  List *tail;316};317void tempObjectMayEscapeArgumentsInAssignment() {318  // This will be leaked after the assignment. However, we should not diagnose319  // this because in the RHS of the assignment the temporary couldn't be really320  // materialized due to the number of bindings, thus the address of `l` will321  // escape there.322  List l{new int(404)};323 324  // ExprWithCleanups wraps the assignment operator call, which assigns a MaterializeTemporaryExpr.325  l = List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};326  (void)l;327  // default-warning@-1   {{Potential memory leak}} We detect the leak with the default settings.328  // unlimited-warning@-2 {{Potential memory leak}} We detect the leak with the default settings.329  // limit10 is missing! It's because in that case we escape `&l`, thus we assume freed. This is good.330 331  clang_analyzer_dump(*l.ptr); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{42 S32b}}332  escape(l);333}334 335void tempObjNotMaterializedThusDoesntEscapeAnything() {336  List l{new int(404)};337  // We have no ExprWithCleanups or MaterializeTemporaryExpr here, so `&l` is never escaped. This is good.338  (void)List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};339  (void)l;340  // default-warning@-1   {{Potential memory leak}} We detect the leak with the default settings.341  // limit10-warning@-2   {{Potential memory leak}} We detect the leak with the default settings.342  // unlimited-warning@-3 {{Potential memory leak}} We detect the leak with the default settings.343 344  clang_analyzer_dump(*l.ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{404 S32b}}345  escape(l);346}347 348void theValueOfTheEscapedRegionRemainsTheSame() {349  int *p = new int(404);350  List l{p};351  List l2{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};352 353  // The value of l.ptr shouldn't be clobbered after a failing to copy `&l`.354  clang_analyzer_eval(p == l.ptr); // default-warning {{TRUE}} unlimited-warning {{TRUE}} limit10-warning {{TRUE}}355 356  // If the bindings fit, we will know that it aliases with `p`. Otherwise, it's unknown. This is good.357  clang_analyzer_dump(*l2.tail->ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{Unknown}}358 359  escape(l, l2);360}361 362void calleeWithManyParms(BigArray<int, 7> arr7, BigArray<int, 100> arr100) {363  clang_analyzer_dump(arr7.array[0]);    // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}364  clang_analyzer_dump(arr7.array[6]);    // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}365 366  clang_analyzer_dump(arr100.array[0]);  // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}}367  clang_analyzer_dump(arr100.array[6]);  // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{16 S32b}}368 369  clang_analyzer_dump(arr100.array[8]);  // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{18 S32b}}370  clang_analyzer_dump(arr100.array[9]);  // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{19 S32b}}371  clang_analyzer_dump(arr100.array[10]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}}372  clang_analyzer_dump(arr100.array[99]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}}373}374 375void tooManyFnArgumentsWhenInlining() {376  calleeWithManyParms({0,1,2,3,4,5,6}, {377    10,11,12,13,14,15,16,17,18,19,378    20,21,22,23,24,25,26,27,28,29,379    30,31,32,33,34,35,36,37,38,39,380    40,41,42,43,44,45,46,47,48,49,381    50,51,52,53,54,55,56,57,58,59,382    60,61,62,63,64,65,66,67,68,69,383    70,71,72,73,74,75,76,77,78,79,384    80,81,82,83,84,85,86,87,88,89,385    90,91,92,93,94,95,96,97,98,99,386    10,11,12,13,14,15,16,17,18,19,387  });388}389 390void gh129211_assertion() {391  struct Clazz {392    int b;393    int : 0;394  };395 396  Clazz d[][5][5] = {397    {398      {{}, {}, {}, {}, {}},399      {{}, {}, {}, {}, {}},400      {{}, {}, {}, {}, {}},401      {{}, {}, {}, {}, {}},402      {{}, {}, {}, {}, {}}403    },404    {405      {{}, {}, {}, {}, {}},406      {{}, {}, {}, {}, {}},407      {{}, {}, {}, {}, {}},408      {{}, {}, {}, {}, {}},409      {{}, {}, {}, {}, {}},410    },411    {412      {{}, {}, {}, {}, {}},413      {{}, {}, {}, {}, {}},414      {{}, {}, {}, {}},415    }416  }; // no-crash417}418