exprs.c revision f70d857cbd79b24cb69f4990e31175e95e679a31
19269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s 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; 18c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpint test2() { if (test2b); return 0; } 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() { 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump double t[1]; 521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (*t) 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 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} 102654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner 103654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner// PR4067 104654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattnerint f8() { 105654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner return ({ foo(); }).Y; 106654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner} 1077a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner 1087a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner// rdar://6880558 1097a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct S; 1107a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct C { 1117a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner int i; 1127a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner struct S *tab[]; 1137a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner}; 1147a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct S { struct C c; }; 1157a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnervoid f9(struct S *x) { 1167a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner foo(((void)1, x->c).tab[0]); 1177a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner} 1187a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner 119c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattnervoid f10() { 120c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattner __builtin_sin(0); 121c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattner} 1229269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner 1239269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// rdar://7530813 1249269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK: define i32 @f11 1259269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattnerint f11(long X) { 1269269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner int A[100]; 1279269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner return A[X]; 1289269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner 1299269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK: load {{.*}}* %X.addr 1309269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK-NEXT: getelementptr inbounds [100 x i32]* %A, i32 0, 1319269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK-NEXT: load i32* 1329269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner} 1339269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner 134f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattnerint f12() { 135f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner // PR3150 136f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner // CHECK: define i32 @f12 137f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner // CHECK: ret i32 1 138f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner return 1||1; 139f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner} 140