exprs.c revision f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// RUN: clang-cc %s -emit-llvm -o -
2efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner
3efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner// PR1895
4efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner// sizeof function
5efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint zxcv(void);
6efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint x=sizeof(zxcv);
7efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint y=__alignof__(zxcv);
8efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner
98f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
108f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattnervoid *test(int *i) {
118f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner short a = 1;
128f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner i += a;
138f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner i + a;
148f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner a + i;
158f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner}
168f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
1701e3c9e06db9ba5729272879c2c9c4659354e707Chris Lattner_Bool test2b;
1801e3c9e06db9ba5729272879c2c9c4659354e707Chris Lattnerint test2() {if (test2b);}
1901e3c9e06db9ba5729272879c2c9c4659354e707Chris Lattner
206860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner// PR1921
216860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattnerint test3() {
226860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner  const unsigned char *bp;
236860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner  bp -= (short)1;
246860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner}
256860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner
26a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner// PR2080 - sizeof void
27a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnerint t1 = sizeof(void);
28a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnerint t2 = __alignof__(void);
29a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnervoid test4() {
30a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t1 = sizeof(void);
31a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t2 = __alignof__(void);
32a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner
33a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t1 = sizeof(test4());
34a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t2 = __alignof__(test4());
35a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner}
36a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner
373cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner// 'const float' promotes to double in varargs.
383cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattnerint test5(const float x, float float_number) {
393cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner  return __builtin_isless(x, float_number);
403cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner}
413cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner
42f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes// this one shouldn't fold
43f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopesint ola() {
44f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  int a=2;
45f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  if ((0, (int)a) & 2) { return 1; }
46f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  return 2;
47f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes}
48a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
49a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes// this one shouldn't fold as well
50a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopesvoid eMaisUma() {
51a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes	double t[1];
52a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes	if (*t)
53a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes		return;
54a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes}
55e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
56e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner// rdar://6520707
57e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattnervoid f0(void (*fp)(void), void (*fp2)(void)) {
58e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner  int x = fp - fp2;
59e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner}
60e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
61c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner// noop casts as lvalues.
62c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerstruct X {
63c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner  int Y;
64c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner};
65c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerstruct X foo();
66c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerint bar() {
67c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner  return ((struct X)foo()).Y + 1;
68c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner}
69e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
708cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner// PR3809: INC/DEC of function pointers.
718cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattnervoid f2(void);
728cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattnerunsigned f1(void) {
738cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  void (*fp)(void) = f2;
748cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner
758cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  ++fp;
768cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  fp++;
778cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  --fp;
788cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  fp--;
798cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  return (unsigned) fp;
808cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner}
818cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner
8275dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattnerunion f3_x {int x; float y;};
8375dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattnerint f3() {return ((union f3_x)2).x;}
8475dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattner
8540f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerunion f4_y {int x; _Complex float y;};
8640f929242a58103f7883e7dbe2415787895b5cbeChris Lattner_Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;}
8740f929242a58103f7883e7dbe2415787895b5cbeChris Lattner
8840f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerstruct f5_a { int a; } f5_a;
8940f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerunion f5_z {int x; struct f5_a y;};
9040f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerstruct f5_a f5() {return ((union f5_z)f5_a).y;}
919034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar
929034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar// ?: in "lvalue"
939034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbarstruct s6 { int f0; };
949034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbarint f6(int a0, struct s6 a1, struct s6 a2) {
959034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar  return (a0 ? a1 : a2).f0;
969034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar}
97f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner
98f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner// PR4026
99f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattnervoid f7() {
100f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner  __func__;
101f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner}
102