| // DEFINE: %{analyzer} = %clang_analyze_cc1 -Wno-array-bounds %s \ |
| // DEFINE: -analyzer-checker=core,cplusplus,unix,debug.ExprInspection |
| |
| // RUN: %{analyzer} -verify=default |
| // RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=10 -verify=limit10 |
| // RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=0 -verify=unlimited |
| |
| template <class T> void clang_analyzer_dump(T); |
| void clang_analyzer_eval(bool); |
| |
| template <class... Ts> void escape(Ts...); |
| bool coin(); |
| |
| class Loc { |
| int x; |
| }; |
| class P1 { |
| public: |
| Loc l; |
| void setLoc(Loc L) { |
| l = L; |
| } |
| |
| }; |
| class P2 { |
| public: |
| int m; |
| int accessBase() { |
| return m; |
| } |
| }; |
| class Derived: public P1, public P2 { |
| }; |
| int radar13445834(Derived *Builder, Loc l) { |
| Builder->setLoc(l); |
| return Builder->accessBase(); |
| |
| } |
| |
| void boundedNumberOfBindings() { |
| 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}; |
| clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}} |
| clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}} |
| clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}} |
| clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}} |
| clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}} |
| clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}} |
| clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}} |
| clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}} |
| clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}} |
| clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}} |
| clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[13]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[14]); // default-warning {{14 S32b}} unlimited-warning {{14 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[15]); // default-warning {{15 S32b}} unlimited-warning {{15 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[16]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[17]); // default-warning {{17 S32b}} unlimited-warning {{17 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[18]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[19]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[20]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[21]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[22]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[23]); // see below see below limit10-warning {{Unknown}} |
| // default-warning@-1 {{1st function call argument is an uninitialized value}} |
| // unlimited-warning@-2 {{1st function call argument is an uninitialized value}} |
| // FIXME: The last dump at index 23 should be Undefined due to out of bounds access. |
| } |
| |
| void incompleteInitList() { |
| int array[23] {0,1,2,3,4,5,6,7,8,9,10,11 /*rest are zeroes*/ }; |
| clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}} |
| clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}} |
| clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}} |
| clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}} |
| clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}} |
| clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}} |
| clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}} |
| clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}} |
| clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}} |
| clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}} |
| clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[12]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[13]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[14]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[15]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[16]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[17]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[18]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[19]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[20]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[21]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[22]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(array[23]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}} |
| // FIXME: The last dump at index 23 should be Undefined due to out of bounds access. |
| } |
| |
| struct Inner { |
| int first; |
| int second; |
| }; |
| struct Outer { |
| Inner upper; |
| Inner lower; |
| }; |
| |
| void nestedStructInitLists() { |
| Outer array[]{ // 7*4: 28 values |
| {{00, 01}, {02, 03}}, |
| {{10, 11}, {12, 13}}, |
| {{20, 21}, {22, 23}}, |
| {{30, 31}, {32, 33}}, |
| {{40, 41}, {42, 43}}, |
| {{50, 51}, {52, 53}}, |
| {{60, 61}, {62, 63}}, |
| }; |
| |
| int *p = (int*)array; |
| clang_analyzer_dump(p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}} |
| clang_analyzer_dump(p[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}} |
| clang_analyzer_dump(p[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}} |
| clang_analyzer_dump(p[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}} |
| clang_analyzer_dump(p[4]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}} |
| clang_analyzer_dump(p[5]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{11 S32b}} |
| clang_analyzer_dump(p[6]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{12 S32b}} |
| clang_analyzer_dump(p[7]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{13 S32b}} |
| clang_analyzer_dump(p[8]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{20 S32b}} |
| clang_analyzer_dump(p[9]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{21 S32b}} |
| clang_analyzer_dump(p[10]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[11]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[12]); // default-warning {{30 S32b}} unlimited-warning {{30 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[13]); // default-warning {{31 S32b}} unlimited-warning {{31 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[14]); // default-warning {{32 S32b}} unlimited-warning {{32 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[15]); // default-warning {{33 S32b}} unlimited-warning {{33 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[16]); // default-warning {{40 S32b}} unlimited-warning {{40 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[17]); // default-warning {{41 S32b}} unlimited-warning {{41 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[18]); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[19]); // default-warning {{43 S32b}} unlimited-warning {{43 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[20]); // default-warning {{50 S32b}} unlimited-warning {{50 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[21]); // default-warning {{51 S32b}} unlimited-warning {{51 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[22]); // default-warning {{52 S32b}} unlimited-warning {{52 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[23]); // default-warning {{53 S32b}} unlimited-warning {{53 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[24]); // default-warning {{60 S32b}} unlimited-warning {{60 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[25]); // default-warning {{61 S32b}} unlimited-warning {{61 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[26]); // default-warning {{62 S32b}} unlimited-warning {{62 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[27]); // default-warning {{63 S32b}} unlimited-warning {{63 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(p[28]); // see below see below limit10-warning {{Unknown}} |
| // default-warning@-1 {{1st function call argument is an uninitialized value}} |
| // unlimited-warning@-2 {{1st function call argument is an uninitialized value}} |
| // FIXME: The last dump at index 28 should be Undefined due to out of bounds access. |
| } |
| |
| void expectNoLeaksInWidenedInitLists() { |
| int *p[] { |
| new int(0), |
| new int(1), |
| new int(2), |
| new int(3), |
| new int(4), |
| new int(5), |
| new int(6), |
| new int(7), |
| new int(8), |
| new int(9), |
| new int(10), |
| new int(11), |
| new int(12), |
| new int(13), |
| new int(14), |
| new int(15), |
| new int(16), |
| new int(17), |
| new int(18), |
| new int(19), |
| new int(20), |
| new int(21), |
| new int(22), |
| new int(23), |
| new int(24), |
| }; |
| clang_analyzer_dump(*p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}} |
| clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}} |
| escape(p); // no-leaks |
| } |
| |
| void rawArrayWithSelfReference() { |
| // If a pointer to some object escapes, that pointed object should escape too. |
| // Consequently, if the 22th initializer would escape, then the p[6] should also escape - clobbering any loads from that location later. |
| int *p[25] = { |
| new int(0), |
| new int(1), |
| new int(2), |
| new int(3), |
| new int(4), |
| new int(5), |
| new int(6), |
| new int(7), |
| 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. |
| new int(9), |
| new int(10), |
| new int(11), |
| new int(12), |
| new int(13), |
| new int(14), |
| new int(15), |
| new int(16), |
| new int(17), |
| new int(18), |
| new int(19), |
| new int(20), |
| new int(21), |
| 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. |
| new int(23), |
| new int(24), |
| }; |
| clang_analyzer_dump(*p[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}} |
| clang_analyzer_dump(*p[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}} |
| |
| if (coin()) { |
| clang_analyzer_dump(*p[8]); |
| // default-warning@-1 {{Dereference of undefined pointer value}} |
| // unlimited-warning@-2 {{Dereference of undefined pointer value}} |
| // limit10-warning@-3 {{Dereference of undefined pointer value}} |
| } |
| |
| clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}} |
| |
| if (coin()) { |
| clang_analyzer_dump(*p[22]); |
| // default-warning@-1 {{Dereference of undefined pointer value}} |
| // unlimited-warning@-2 {{Dereference of undefined pointer value}} |
| // limit10-warning@-3 {{Unknown}} |
| } |
| |
| clang_analyzer_dump(*p[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}} |
| |
| escape(p); // no-leaks |
| } |
| |
| template <class T, unsigned Size> struct BigArray { |
| T array[Size]; |
| }; |
| |
| void fieldArrayWithSelfReference() { |
| // Similar to "rawArrayWithSelfReference", but using an aggregate object and assignment operator to achieve the element-wise binds. |
| BigArray<int *, 25> p; |
| p = { |
| new int(0), |
| new int(1), |
| new int(2), |
| new int(3), |
| new int(4), |
| new int(5), |
| new int(6), |
| new int(7), |
| p.array[5], // Pointer to the 6th array element. |
| new int(9), |
| new int(10), |
| new int(11), |
| new int(12), |
| new int(13), |
| new int(14), |
| new int(15), |
| new int(16), |
| new int(17), |
| new int(18), |
| new int(19), |
| new int(20), |
| new int(21), |
| p.array[6], // Pointer to the 7th array element. |
| new int(23), |
| new int(24), |
| }; |
| clang_analyzer_dump(*p.array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}} |
| clang_analyzer_dump(*p.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}} |
| |
| if (coin()) { |
| clang_analyzer_dump(*p.array[8]); |
| // default-warning@-1 {{Unknown}} |
| // unlimited-warning@-2 {{Unknown}} |
| // limit10-warning@-3 {{Unknown}} |
| } |
| |
| clang_analyzer_dump(*p.array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}} |
| |
| if (coin()) { |
| clang_analyzer_dump(*p.array[22]); |
| // default-warning@-1 {{Unknown}} |
| // unlimited-warning@-2 {{Unknown}} |
| // limit10-warning@-3 {{Unknown}} |
| } |
| |
| clang_analyzer_dump(*p.array[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}} |
| |
| escape(p); // no-leaks |
| } |
| |
| struct PtrHolderBase { |
| int *ptr; |
| }; |
| struct BigStruct : BigArray<int, 1000>, PtrHolderBase {}; |
| void largeBaseClasses() { |
| 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)}}; |
| (void)D; // no-leak here, the PtrHolderBase subobject is properly escaped. |
| |
| clang_analyzer_dump(*D.ptr); // default-warning {{25 S32b}} unlimited-warning {{25 S32b}} limit10-warning {{Unknown}} |
| escape(D); |
| } |
| |
| struct List { |
| int* ptr; |
| BigArray<int, 30> head; |
| List *tail; |
| }; |
| void tempObjectMayEscapeArgumentsInAssignment() { |
| // This will be leaked after the assignment. However, we should not diagnose |
| // this because in the RHS of the assignment the temporary couldn't be really |
| // materialized due to the number of bindings, thus the address of `l` will |
| // escape there. |
| List l{new int(404)}; |
| |
| // ExprWithCleanups wraps the assignment operator call, which assigns a MaterializeTemporaryExpr. |
| 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}; |
| (void)l; |
| // default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings. |
| // unlimited-warning@-2 {{Potential memory leak}} We detect the leak with the default settings. |
| // limit10 is missing! It's because in that case we escape `&l`, thus we assume freed. This is good. |
| |
| clang_analyzer_dump(*l.ptr); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{42 S32b}} |
| escape(l); |
| } |
| |
| void tempObjNotMaterializedThusDoesntEscapeAnything() { |
| List l{new int(404)}; |
| // We have no ExprWithCleanups or MaterializeTemporaryExpr here, so `&l` is never escaped. This is good. |
| (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}; |
| (void)l; |
| // default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings. |
| // limit10-warning@-2 {{Potential memory leak}} We detect the leak with the default settings. |
| // unlimited-warning@-3 {{Potential memory leak}} We detect the leak with the default settings. |
| |
| clang_analyzer_dump(*l.ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{404 S32b}} |
| escape(l); |
| } |
| |
| void theValueOfTheEscapedRegionRemainsTheSame() { |
| int *p = new int(404); |
| List l{p}; |
| 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}; |
| |
| // The value of l.ptr shouldn't be clobbered after a failing to copy `&l`. |
| clang_analyzer_eval(p == l.ptr); // default-warning {{TRUE}} unlimited-warning {{TRUE}} limit10-warning {{TRUE}} |
| |
| // If the bindings fit, we will know that it aliases with `p`. Otherwise, it's unknown. This is good. |
| clang_analyzer_dump(*l2.tail->ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{Unknown}} |
| |
| escape(l, l2); |
| } |
| |
| void calleeWithManyParms(BigArray<int, 7> arr7, BigArray<int, 100> arr100) { |
| clang_analyzer_dump(arr7.array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}} |
| clang_analyzer_dump(arr7.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}} |
| |
| clang_analyzer_dump(arr100.array[0]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}} |
| clang_analyzer_dump(arr100.array[6]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{16 S32b}} |
| |
| clang_analyzer_dump(arr100.array[8]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{18 S32b}} |
| clang_analyzer_dump(arr100.array[9]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{19 S32b}} |
| clang_analyzer_dump(arr100.array[10]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}} |
| clang_analyzer_dump(arr100.array[99]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}} |
| } |
| |
| void tooManyFnArgumentsWhenInlining() { |
| calleeWithManyParms({0,1,2,3,4,5,6}, { |
| 10,11,12,13,14,15,16,17,18,19, |
| 20,21,22,23,24,25,26,27,28,29, |
| 30,31,32,33,34,35,36,37,38,39, |
| 40,41,42,43,44,45,46,47,48,49, |
| 50,51,52,53,54,55,56,57,58,59, |
| 60,61,62,63,64,65,66,67,68,69, |
| 70,71,72,73,74,75,76,77,78,79, |
| 80,81,82,83,84,85,86,87,88,89, |
| 90,91,92,93,94,95,96,97,98,99, |
| 10,11,12,13,14,15,16,17,18,19, |
| }); |
| } |
| |
| void gh129211_assertion() { |
| struct Clazz { |
| int b; |
| int : 0; |
| }; |
| |
| Clazz d[][5][5] = { |
| { |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}} |
| }, |
| { |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| }, |
| { |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}, {}}, |
| {{}, {}, {}, {}}, |
| } |
| }; // no-crash |
| } |