blob: 81a665dc6297d589c7e7f8e1d3a50a071424dc94 [file] [log] [blame]
Daniel Dunbarc79f7672010-09-07 22:54:28 +00001// RUN: %clang_cc1 %s -verify -fsyntax-only -ffreestanding
Chris Lattner4ef8dd62007-11-01 02:45:17 +00002
Eli Friedmanbb6415c2009-05-31 10:54:53 +00003#include <stddef.h>
Sebastian Redl392cf912009-02-07 00:23:52 +00004#include <stdint.h>
5
Chris Lattner4ef8dd62007-11-01 02:45:17 +00006typedef void (* fp)(void);
7void foo(void);
Douglas Gregorf6c717c2009-01-23 16:54:12 +00008
9// PR clang/3377
10fp a[(short int)1] = { foo };
Chris Lattner4ef8dd62007-11-01 02:45:17 +000011
Chris Lattner4cc62712007-11-27 21:35:27 +000012int myArray[5] = {1, 2, 3, 4, 5};
13int *myPointer2 = myArray;
14int *myPointer = &(myArray[2]);
15
Chris Lattnerd411e042007-12-02 07:47:49 +000016
17extern int x;
18void *g = &x;
19int *h = &x;
20
Aaron Ballman3e78b192012-02-09 22:16:56 +000021struct union_crash
22{
23 union
24 {
25 };
26};
Aaron Ballman0ca7e8b2012-02-09 03:29:06 +000027
Eli Friedmana312ce22008-02-08 00:48:24 +000028int test() {
Aaron Ballman0ca7e8b2012-02-09 03:29:06 +000029 int a[10];
30 int b[10] = a; // expected-error {{array initializer must be an initializer list}}
31 int +; // expected-error {{expected identifier or '('}}
32
33 struct union_crash u = { .d = 1 }; // expected-error {{field designator 'd' does not refer to any field in type 'struct union_crash'}}
Eli Friedmana312ce22008-02-08 00:48:24 +000034}
Chris Lattnerbe34ac62008-05-04 01:13:36 +000035
36
37// PR2050
38struct cdiff_cmd {
39 const char *name;
40 unsigned short argc;
41 int (*handler)();
42};
43int cdiff_cmd_open();
44struct cdiff_cmd commands[] = {
45 {"OPEN", 1, &cdiff_cmd_open }
46};
47
Eli Friedman97c0a392008-05-21 03:39:11 +000048// PR2348
49static struct { int z; } s[2];
50int *t = &(*s).z;
51
52// PR2349
53short *a2(void)
54{
55 short int b;
Chris Lattnerd8803632008-08-10 01:58:45 +000056 static short *bp = &b; // expected-error {{initializer element is not a compile-time constant}}
Eli Friedman97c0a392008-05-21 03:39:11 +000057
58 return bp;
59}
Eli Friedmanf8f873d2008-05-30 18:07:22 +000060
61int pbool(void) {
62 typedef const _Bool cbool;
63 _Bool pbool1 = (void *) 0;
64 cbool pbool2 = &pbool;
65 return pbool2;
66}
67
Chris Lattnerd5bac572008-08-19 00:58:40 +000068
69// rdar://5870981
70union { float f; unsigned u; } u = { 1.0f };
71
Daniel Dunbar1e465df2008-08-25 20:08:27 +000072// rdar://6156694
73int f3(int x) { return x; }
74typedef void (*vfunc)(void);
75void *bar = (vfunc) f3;
Eli Friedmanb529d832008-09-02 09:37:00 +000076
77// PR2747
78struct sym_reg {
79 char nc_gpreg;
80};
81int sym_fw1a_scr[] = {
Nuno Lopes67c86012008-09-02 10:10:14 +000082 ((int)(&((struct sym_reg *)0)->nc_gpreg)) & 0,
83 8 * ((int)(&((struct sym_reg *)0)->nc_gpreg))
Eli Friedmanb529d832008-09-02 09:37:00 +000084};
Chris Lattnere2f56192008-11-03 09:28:22 +000085
86// PR3001
John McCall7727acf2010-03-31 02:13:20 +000087struct s1 s2 = { // expected-error {{variable has incomplete type 'struct s1'}} \
88 // expected-note {{forward declaration of 'struct s1'}}
Douglas Gregor4ec339f2009-01-19 19:26:10 +000089 .a = sizeof(struct s3), // expected-error {{invalid application of 'sizeof'}} \
90 // expected-note{{forward declaration of 'struct s3'}}
Chris Lattnere2f56192008-11-03 09:28:22 +000091 .b = bogus // expected-error {{use of undeclared identifier 'bogus'}}
92}
93
Anders Carlsson91b9f202009-01-24 17:47:50 +000094// PR3382
95char t[] = ("Hello");
Douglas Gregord079b2d2009-01-30 17:42:28 +000096
97// <rdar://problem/6094855>
98typedef struct { } empty;
99
100typedef struct {
101 empty e;
102 int i2;
103} st;
104
105st st1 = { .i2 = 1 };
106
107// <rdar://problem/6096826>
108struct {
109 int a;
110 int z[2];
111} y = { .z = {} };
Douglas Gregord8635172009-02-02 21:35:47 +0000112
113int bbb[10];
114
115struct foo2 {
Eli Friedmanc91b7d92009-02-22 07:40:57 +0000116 uintptr_t a;
Douglas Gregord8635172009-02-02 21:35:47 +0000117};
118
119struct foo2 bar2[] = {
Sebastian Redl392cf912009-02-07 00:23:52 +0000120 { (intptr_t)bbb }
Douglas Gregord8635172009-02-02 21:35:47 +0000121};
Douglas Gregor7c53ca62009-02-18 22:23:55 +0000122
123struct foo2 bar3 = { 1, 2 }; // expected-warning{{excess elements in struct initializer}}
Eli Friedman91110ee2009-02-23 04:23:56 +0000124
125int* ptest1 = __builtin_choose_expr(1, (int*)0, (int*)0);
126
127typedef int32_t ivector4 __attribute((vector_size(16)));
128ivector4 vtest1 = 1 ? (ivector4){1} : (ivector4){1};
129ivector4 vtest2 = __builtin_choose_expr(1, (ivector4){1}, (ivector4){1});
Eli Friedman91110ee2009-02-23 04:23:56 +0000130
Eli Friedman42edd0d2009-03-24 01:14:50 +0000131uintptr_t ptrasintadd1 = (uintptr_t)&a - 4;
132uintptr_t ptrasintadd2 = (uintptr_t)&a + 4;
133uintptr_t ptrasintadd3 = 4 + (uintptr_t)&a;
Eli Friedmanbb6415c2009-05-31 10:54:53 +0000134
135// PR4285
136const wchar_t widestr[] = L"asdf";
Eli Friedman67f85fc2009-12-04 02:12:53 +0000137
138// PR5447
139const double pr5447 = (0.05 < -1.0) ? -1.0 : 0.0499878;
140
Rafael Espindolaa7d3c042010-05-07 15:18:43 +0000141// PR4386
142
143// None of these are constant initializers, but we implement GCC's old
144// behaviour of accepting bar and zed but not foo. GCC's behaviour was
145// changed in 2007 (rev 122551), so we should be able to change too one
146// day.
147int PR4386_bar();
148int PR4386_foo() __attribute((weak));
149int PR4386_zed();
150
151int PR4386_a = ((void *) PR4386_bar) != 0;
152int PR4386_b = ((void *) PR4386_foo) != 0; // expected-error{{initializer element is not a compile-time constant}}
153int PR4386_c = ((void *) PR4386_zed) != 0;
154int PR4386_zed() __attribute((weak));
Chris Lattner16c5dea2010-10-10 18:16:20 +0000155
Eli Friedman8a5d9292011-09-26 19:09:09 +0000156// <rdar://problem/10185490> (derived from SPEC vortex benchmark)
157typedef char strty[10];
158struct vortexstruct { strty s; };
159struct vortexstruct vortexvar = { "asdf" };