| // RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-unknown %s |
| |
| int complete_array_from_init[] = { 1, 2, [10] = 5, 1, 2, [5] = 2, 6 }; |
| |
| int complete_array_from_init_check[((sizeof(complete_array_from_init) / sizeof(int)) == 13)? 1 : -1]; |
| |
| int iarray[10] = { |
| [0] = 1, |
| [1 ... 5] = 2, |
| [ 6 ... 6 ] = 3, |
| [ 8 ... 7 ] = 4, // expected-error{{array designator range [8, 7] is empty}} |
| [10] = 5, |
| [-1] = 6 // expected-error{{array designator value '-1' is negative}} |
| }; |
| |
| int iarray2[10] = { |
| [10] = 1, // expected-error{{array designator index (10) exceeds array bounds (10)}} |
| }; |
| |
| int iarray3[10] = { |
| [3] 2, // expected-warning{{use of GNU 'missing =' extension in designator}} |
| [5 ... 12] = 2 // expected-error{{array designator index (12) exceeds array bounds (10)}} |
| }; |
| |
| struct point { |
| double x; |
| double y; |
| }; |
| |
| struct point p1 = { |
| .y = 1.0, |
| x: 2.0, // expected-warning{{}} |
| .a = 4.0, // expected-error{{field designator 'a' does not refer to any field in type 'struct point'}} |
| }; |
| |
| struct point p2 = { |
| [1] = 1.0 // expected-error{{array designator cannot initialize non-array type}} |
| }; |
| |
| struct point array[10] = { |
| [0].x = 1.0, |
| [1].y = 2.0, |
| [2].z = 3.0, // expected-error{{field designator 'z' does not refer to any field in type 'struct point'}} |
| }; |
| |
| struct point array2[10] = { |
| [10].x = 2.0, // expected-error{{array designator index (10) exceeds array bounds (10)}} |
| [4 ... 5].y = 2.0, // expected-note 2 {{previous initialization is here}} |
| [4 ... 6] = { .x = 3, .y = 4.0 } // expected-warning 2 {{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
| }; |
| |
| struct point array3[10] = { |
| .x = 5 // expected-error{{field designator cannot initialize a non-struct, non-union type}} |
| }; |
| |
| struct rect { |
| struct point top_left; |
| struct point bottom_right; |
| }; |
| |
| struct rect window = { .top_left.x = 1.0 }; |
| |
| struct rect windows[] = { |
| [2].top_left = { 1.0, 2.0 }, |
| [4].bottom_right = { .y = 1.0 }, |
| { { .y = 7.0, .x = 8.0 }, { .x = 5.0 } }, |
| [3] = { .top_left = { 1.1, 2.2 }, .bottom_right = { .y = 1.1 } } |
| }; |
| |
| int windows_size[((sizeof(windows) / sizeof(struct rect)) == 6)? 1 : -1]; |
| |
| struct rect windows_bad[3] = { |
| [2].top_left = { { .x = 1.1 } }, // expected-error{{designator in initializer for scalar type}} |
| [1].top_left = { .x = 1.1 } |
| }; |
| |
| struct gui { |
| struct rect windows[10]; |
| }; |
| |
| struct gui gui[] = { |
| [5].windows[3].top_left.x = { 7.0 } // expected-warning{{braces around scalar initializer}} |
| }; |
| |
| struct translator { |
| struct wonky { int * ptr; } wonky ; |
| struct rect window; |
| struct point offset; |
| } tran = { |
| .window = { .top_left = { 1.0, 2.0 } }, |
| { .x = 5.0, .y = 6.0 }, |
| .wonky = { 0 } |
| }; |
| |
| int anint; |
| struct {int x,*y;} z[] = {[0].x = 2, &z[0].x}; |
| |
| struct outer { struct inner { int x, *y; } in, *inp; } zz[] = { |
| [0].in.x = 2, &zz[0].in.x, &zz[0].in, |
| 0, &anint, &zz[1].in, |
| [3].in = { .y = &anint, .x = 17 }, |
| [7].in.y = &anint, &zz[0].in, |
| [4].in.y = &anint, [5].in.x = 12 |
| }; |
| |
| int zz_sizecheck[sizeof(zz) / sizeof(struct outer) == 8? 1 : -1 ]; |
| |
| struct disklabel_ops { |
| struct {} type; |
| int labelsize; |
| }; |
| |
| struct disklabel_ops disklabel64_ops = { |
| .labelsize = sizeof(struct disklabel_ops) |
| }; |
| |
| // PR clang/3378 |
| int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 }; |
| int a[]= { [sizeof(int)] = 0 }; |
| int a2[]= { [0 ... sizeof(int)] = 0 }; |
| |
| // Test warnings about initializers overriding previous initializers |
| struct X { |
| int a, b, c; |
| }; |
| |
| int counter = 0; |
| int get8() { ++counter; return 8; } |
| |
| void test() { |
| struct X xs[] = { |
| [0] = (struct X){1, 2}, // expected-note 2 {{previous initialization is here}} |
| [0].c = 3, // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
| (struct X) {4, 5, 6}, // expected-note{{previous initialization is here}} |
| [1].b = get8(), // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
| [0].b = 8 // expected-warning{{subobject initialization overrides initialization of other fields within its enclosing subobject}} |
| }; |
| } |
| |
| union { char c; long l; } u1 = { .l = 0xFFFF }; |
| |
| extern float global_float; |
| |
| struct XX { int a, *b; }; |
| struct XY { int before; struct XX xx, *xp; float* after; } xy[] = { |
| 0, 0, &xy[0].xx.a, &xy[0].xx, &global_float, |
| [1].xx = 0, &xy[1].xx.a, &xy[1].xx, &global_float, |
| 0, // expected-note{{previous initialization is here}} |
| 0, // expected-note{{previous initialization is here}} |
| [2].before = 0, // expected-warning{{initializer overrides prior initialization of this subobject}} |
| 0, // expected-warning{{initializer overrides prior initialization of this subobject}} |
| &xy[2].xx.a, &xy[2].xx, &global_float |
| }; |
| |
| // PR3519 |
| struct foo { |
| int arr[10]; |
| }; |
| |
| struct foo Y[10] = { |
| [1] .arr [1] = 2, |
| [4] .arr [2] = 4 |
| }; |
| |
| struct bar { |
| struct foo f; |
| float *arr[10]; |
| }; |
| |
| extern float f; |
| struct bar saloon = { |
| .f.arr[3] = 1, |
| .arr = { &f } |
| }; |
| |
| typedef unsigned char u_char; |
| typedef unsigned short u_short; |
| |
| union wibble { |
| u_char arr1[6]; |
| u_short arr2[3]; |
| }; |
| |
| const union wibble wobble = { .arr2[0] = 0xffff, |
| .arr2[1] = 0xffff, |
| .arr2[2] = 0xffff }; |
| |
| const union wibble wobble2 = { .arr2 = {4, 5, 6}, 7 }; // expected-warning{{excess elements in union initializer}} |
| |
| // PR3778 |
| struct s { |
| union { int i; }; |
| }; |
| struct s si = { |
| { .i = 1 } |
| }; |
| |
| double d0; |
| char c0; |
| float f0; |
| int i0; |
| |
| struct Enigma { |
| union { |
| struct { |
| struct { |
| double *double_ptr; |
| char *string; |
| }; |
| float *float_ptr; |
| }; |
| int *int_ptr; |
| }; |
| char *string2; |
| }; |
| |
| struct Enigma enigma = { |
| .double_ptr = &d0, &c0, |
| &f0, // expected-note{{previous}} |
| &c0, |
| .float_ptr = &f0 // expected-warning{{overrides}} |
| }; |
| |
| |
| /// PR16644 |
| typedef union { |
| struct { |
| int zero; |
| int one; |
| int two; |
| int three; |
| } a; |
| int b[4]; |
| } union_16644_t; |
| |
| union_16644_t union_16644_instance_0 = |
| { |
| .b[0] = 0, // expected-note{{previous}} |
| .a.one = 1, // expected-warning{{overrides}} expected-note{{previous}} |
| .b[2] = 2, // expected-warning{{overrides}} expected-note{{previous}} |
| .a.three = 3, // expected-warning{{overrides}} |
| }; |
| |
| union_16644_t union_16644_instance_1 = |
| { |
| .a.three = 13, // expected-note{{previous}} |
| .b[2] = 12, // expected-warning{{overrides}} expected-note{{previous}} |
| .a.one = 11, // expected-warning{{overrides}} expected-note{{previous}} |
| .b[0] = 10, // expected-warning{{overrides}} |
| }; |
| |
| union_16644_t union_16644_instance_2 = |
| { |
| .a.one = 21, // expected-note{{previous}} |
| .b[1] = 20, // expected-warning{{overrides}} |
| }; |
| |
| union_16644_t union_16644_instance_3 = |
| { |
| .b[1] = 30, // expected-note{{previous}} |
| .a = { // expected-warning{{overrides}} |
| .one = 31 |
| } |
| }; |
| |
| union_16644_t union_16644_instance_4[2] = |
| { |
| [0].a.one = 2, |
| [1].a.zero = 3,// expected-note{{previous}} |
| [0].a.zero = 5, |
| [1].b[1] = 4 // expected-warning{{overrides}} |
| }; |
| |
| /// PR4073 |
| /// Should use evaluate to fold aggressively and emit a warning if not an ice. |
| extern int crazy_x; |
| |
| int crazy_Y[] = { |
| [ 0 ? crazy_x : 4] = 1 |
| }; |
| |
| // PR5843 |
| struct expr { |
| int nargs; |
| union { |
| unsigned long int num; |
| struct expr *args[3]; |
| } val; |
| }; |
| |
| struct expr expr0 = { |
| .nargs = 2, |
| .val = { |
| .args = { |
| [0] = (struct expr *)0, |
| [1] = (struct expr *)0 |
| } |
| } |
| }; |
| |
| // PR6955 |
| |
| struct ds { |
| struct { |
| struct { |
| unsigned int a; |
| }; |
| unsigned int b; |
| struct { |
| unsigned int c; |
| }; |
| }; |
| }; |
| |
| // C1X lookup-based anonymous member init cases |
| struct ds ds0 = { |
| { { |
| .a = 1 // expected-note{{previous initialization is here}} |
| } }, |
| .a = 2, // expected-warning{{initializer overrides prior initialization of this subobject}} |
| .b = 3 |
| }; |
| struct ds ds1 = { .c = 0 }; |
| struct ds ds2 = { { { |
| .a = 0, |
| .b = 1 // expected-error{{field designator 'b' does not refer to any field}} |
| } } }; |
| |
| // Check initializer override warnings overriding a character in a string |
| struct overwrite_string_struct { |
| char L[6]; |
| int M; |
| } overwrite_string[] = { |
| { { "foo" }, 1 }, // expected-note {{previous initialization is here}} |
| [0].L[2] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
| }; |
| struct overwrite_string_struct2 { |
| char L[6]; |
| int M; |
| } overwrite_string2[] = { |
| { { "foo" }, 1 }, // expected-note{{previous initialization is here}} |
| [0].L[4] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
| }; |
| struct overwrite_string_struct |
| overwrite_string3[] = { |
| "foo", 1, // expected-note{{previous initialization is here}} |
| [0].L[4] = 'x' // expected-warning{{subobject initialization overrides initialization of other fields}} |
| }; |
| struct overwrite_string_struct |
| overwrite_string4[] = { |
| { { 'f', 'o', 'o' }, 1 }, |
| [0].L[4] = 'x' // no-warning |
| }; |