designated-initializers.c revision 53d3d8e0662197f7245d8f5ff697a72a2b4b3f54
1// RUN: clang -fsyntax-only -verify %s 2 3int complete_array_from_init[] = { 1, 2, [10] = 5, 1, 2, [5] = 2, 6 }; 4 5int complete_array_from_init_check[((sizeof(complete_array_from_init) / sizeof(int)) == 13)? 1 : -1]; 6 7int iarray[10] = { 8 [0] = 1, 9 [1 ... 5] = 2, 10 [ 6 ... 6 ] = 3, 11 [ 8 ... 7 ] = 4, // expected-error{{array designator range [8, 7] is empty}} 12 [10] = 5, 13 [-1] = 6 // expected-error{{array designator value '-1' is negative}} 14}; 15 16int iarray2[10] = { 17 [10] = 1, // expected-error{{array designator index (10) exceeds array bounds (10)}} 18}; 19 20int iarray3[10] = { 21 [5 ... 12] = 2 // expected-error{{array designator index (12) exceeds array bounds (10)}} 22}; 23 24struct point { 25 double x; 26 double y; 27}; 28 29struct point p1 = { 30 .y = 1.0, 31 x: 2.0, 32 .a = 4.0, // expected-error{{field designator 'a' does not refer to any field in type 'struct point'}} 33}; 34 35struct point p2 = { 36 [1] = 1.0 // expected-error{{array designator cannot initialize non-array type}} 37}; 38 39struct point array[10] = { 40 [0].x = 1.0, 41 [1].y = 2.0, 42 [2].z = 3.0, // expected-error{{field designator 'z' does not refer to any field in type 'struct point'}} 43}; 44 45struct point array2[10] = { 46 [10].x = 2.0, // expected-error{{array designator index (10) exceeds array bounds (10)}} 47 [4 ... 5].y = 2.0, 48 [4 ... 6] = { .x = 3, .y = 4.0 } 49}; 50 51struct point array3[10] = { 52 .x = 5 // expected-error{{field designator cannot initialize a non-struct, non-union type}} 53}; 54 55struct rect { 56 struct point top_left; 57 struct point bottom_right; 58}; 59 60struct rect window = { .top_left.x = 1.0 }; 61 62struct rect windows[] = { 63 [2].top_left = { 1.0, 2.0 }, 64 [4].bottom_right = { .y = 1.0 }, 65 { { .y = 7.0, .x = 8.0 }, { .x = 5.0 } }, 66 [3] = { .top_left = { 1.1, 2.2 }, .bottom_right = { .y = 1.1 } } 67}; 68 69int windows_size[((sizeof(windows) / sizeof(struct rect)) == 6)? 1 : -1]; 70 71struct rect windows_bad[3] = { 72 [2].top_left = { { .x = 1.1 } }, // expected-error{{designator in initializer for scalar type}} 73 [1].top_left = { .x = 1.1 } 74}; 75 76struct gui { 77 struct rect windows[10]; 78}; 79 80struct gui gui[] = { 81 [5].windows[3].top_left.x = { 7.0 } // expected-warning{{braces around scalar initializer}} 82}; 83 84struct translator { 85 struct wonky { int * ptr; } wonky ; 86 struct rect window; 87 struct point offset; 88} tran = { 89 .window = { .top_left = { 1.0, 2.0 } }, 90 { .x = 5.0, .y = 6.0 }, 91 .wonky = { 0 } 92}; 93 94int anint; 95struct {int x,*y;} z[] = {[0].x = 2, &z[0].x}; 96 97struct outer { struct inner { int x, *y; } in, *inp; } zz[] = { 98 [0].in.x = 2, &zz[0].in.x, &zz[0].in, 99 0, &anint, &zz[1].in, 100 [3].in = { .y = &anint, .x = 17 }, 101 [7].in.y = &anint, &zz[0].in, 102 [4].in.y = &anint, [5].in.x = 12 103}; 104 105int zz_sizecheck[sizeof(zz) / sizeof(struct outer) == 8? 1 : -1 ]; 106 107struct disklabel_ops { 108 struct {} type; 109 int labelsize; 110}; 111 112struct disklabel_ops disklabel64_ops = { 113 .labelsize = sizeof(struct disklabel_ops) 114}; 115 116// PR clang/3378 117int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 }; 118int a[]= { [sizeof(int)] = 0 }; 119int a2[]= { [0 ... sizeof(int)] = 0 }; 120