1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -triple i386-pc-linux-gnu -verify -fsyntax-only 204728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson 3eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattnervoid f() { 404728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson int i; 504728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson 604728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : : "a" (i + 2)); 704728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : : "a" (f())); // expected-error {{invalid type 'void' in asm input}} 878b929121f44f7c983fce8c871aa913dce087561Eric Christopher 904728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : "=a" (f())); // expected-error {{invalid lvalue in asm output}} 1004728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : "=a" (i + 2)); // expected-error {{invalid lvalue in asm output}} 1142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 1242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : [symbolic_name] "=a" (i) : "[symbolic_name]" (i)); 1342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[" (i)); // expected-error {{invalid input constraint '[' in asm}} 1442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[foo" (i)); // expected-error {{invalid input constraint '[foo' in asm}} 1542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[symbolic_name]" (i)); // expected-error {{invalid input constraint '[symbolic_name]' in asm}} 1604728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson} 176fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson 18eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattnervoid clobbers() { 196fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "ax", "#ax", "%ax"); 206fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "eax", "rax", "ah", "al"); 216fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "0", "%0", "#0"); 226fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "foo"); // expected-error {{unknown register name 'foo' in asm}} 236fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "52"); 2478b929121f44f7c983fce8c871aa913dce087561Eric Christopher asm ("nop" : : : "54"); // expected-error {{unknown register name '54' in asm}} 256fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "-1"); // expected-error {{unknown register name '-1' in asm}} 266fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "+1"); // expected-error {{unknown register name '+1' in asm}} 276fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson} 286bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner 296bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner// rdar://6094010 306bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattnervoid test3() { 316bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner int x; 326bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner asm(L"foo" : "=r"(x)); // expected-error {{wide string}} 336bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner asm("foo" : L"=r"(x)); // expected-error {{wide string}} 346bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner} 356bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner 36d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson// <rdar://problem/6156893> 37d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlssonvoid test4(const volatile void *addr) 38d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson{ 3958f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner asm ("nop" : : "r"(*addr)); // expected-error {{invalid type 'const volatile void' in asm input for constraint 'r'}} 40d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "m"(*addr)); 41d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson 42d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "r"(test4(addr))); // expected-error {{invalid type 'void' in asm input for constraint 'r'}} 43d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "m"(test4(addr))); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 44d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson 45e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson asm ("nop" : : "m"(f())); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 46e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson} 47e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson 48e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson// <rdar://problem/6512595> 493182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattnervoid test5() { 5078b929121f44f7c983fce8c871aa913dce087561Eric Christopher asm("nop" : : "X" (8)); 51d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson} 5279bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson 5379bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson// PR3385 543182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattnervoid test6(long i) { 5579bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson asm("nop" : : "er"(i)); 5603eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson} 573182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner 5885759278332404e96d4bb89d0e976e46158cd026Chris Lattnervoid asm_string_tests(int i) { 5978b929121f44f7c983fce8c871aa913dce087561Eric Christopher asm("%!"); // simple asm string, %! is not an error. 603182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner asm("%!" : ); // expected-error {{invalid % escape in inline assembly string}} 61eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm("xyz %" : ); // expected-error {{invalid % escape in inline assembly string}} 62eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner 63eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename]" :: [somename] "i"(4)); // ok 64eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename]" :: "i"(4)); // expected-error {{unknown symbolic operand name in inline assembly string}} 65eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename" :: "i"(4)); // expected-error {{unterminated symbolic operand name in inline assembly string}} 66eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[]" :: "i"(4)); // expected-error {{empty symbolic operand name in inline assembly string}} 6778b929121f44f7c983fce8c871aa913dce087561Eric Christopher 6885759278332404e96d4bb89d0e976e46158cd026Chris Lattner // PR3258 6985759278332404e96d4bb89d0e976e46158cd026Chris Lattner asm("%9" :: "i"(4)); // expected-error {{invalid operand number in inline asm string}} 7085759278332404e96d4bb89d0e976e46158cd026Chris Lattner asm("%1" : "+r"(i)); // ok, referring to input. 713182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner} 7249ac88166d36f8c436780694f2ce955acde87c6aChris Lattner 7349ac88166d36f8c436780694f2ce955acde87c6aChris Lattner// PR4077 7449ac88166d36f8c436780694f2ce955acde87c6aChris Lattnerint test7(unsigned long long b) { 7549ac88166d36f8c436780694f2ce955acde87c6aChris Lattner int a; 76f69fcaeb3843297757251a19f0a6f5bbffed7f32Chris Lattner asm volatile("foo %0 %1" : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}} 7749ac88166d36f8c436780694f2ce955acde87c6aChris Lattner return a; 7849ac88166d36f8c436780694f2ce955acde87c6aChris Lattner} 797a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCall 807a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCall// <rdar://problem/7574870> 817a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCallasm volatile (""); // expected-warning {{meaningless 'volatile' on asm outside function}} 8286eda39c8af47280273758debf0432933bdeee3cAnders Carlsson 8386eda39c8af47280273758debf0432933bdeee3cAnders Carlsson// PR3904 8479ca1ee4b637c01458584bb571f1b309180c780dAnders Carlssonvoid test8(int i) { 8586eda39c8af47280273758debf0432933bdeee3cAnders Carlsson // A number in an input constraint can't point to a read-write constraint. 8679ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : "+r" (i), "=r"(i) : "0" (i)); // expected-error{{invalid input constraint '0' in asm}} 8779ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson} 8879ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 8979ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson// PR3905 9079ca1ee4b637c01458584bb571f1b309180c780dAnders Carlssonvoid test9(int i) { 9179ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : [foo] "=r" (i), "=r"(i) : "1[foo]"(i)); // expected-error{{invalid input constraint '1[foo]' in asm}} 9279ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : [foo] "=r" (i), "=r"(i) : "[foo]1"(i)); // expected-error{{invalid input constraint '[foo]1' in asm}} 9386eda39c8af47280273758debf0432933bdeee3cAnders Carlsson} 94baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindola 952b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnararegister int g asm("dx"); // expected-error{{global register variables are not supported}} 962b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara 97baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindolavoid test10(void){ 982b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara static int g asm ("g_asm") = 0; 992b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara extern int gg asm ("gg_asm"); 1002b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara __private_extern__ int ggg asm ("ggg_asm"); 1012b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara 1022b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara int a asm ("a_asm"); // expected-warning{{ignored asm label 'a_asm' on automatic variable}} 1032b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara auto int aa asm ("aa_asm"); // expected-warning{{ignored asm label 'aa_asm' on automatic variable}} 1042b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara 1052b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara register int r asm ("cx"); 1062b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara register int rr asm ("rr_asm"); // expected-error{{unknown register name 'rr_asm' in asm}} 107baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindola} 1084da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall 1094da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// This is just an assert because of the boolean conversion. 1104da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// Feel free to change the assembly to something sensible if it causes a problem. 1114da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// rdar://problem/9414925 1124da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCallvoid test11(void) { 1134da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall _Bool b; 1144da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall asm volatile ("movb %%gs:%P2,%b0" : "=q"(b) : "0"(0), "i"(5L)); 1154da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall} 116de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher 117de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christophervoid test12(void) { 118de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher register int cc __asm ("cc"); // expected-error{{unknown register name 'cc' in asm}} 119de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher} 120935a70c1e76d78985f20d422940280161b941299Hans Wennborg 121935a70c1e76d78985f20d422940280161b941299Hans Wennborg// PR10223 122935a70c1e76d78985f20d422940280161b941299Hans Wennborgvoid test13(void) { 123935a70c1e76d78985f20d422940280161b941299Hans Wennborg void *esp; 124935a70c1e76d78985f20d422940280161b941299Hans Wennborg __asm__ volatile ("mov %%esp, %o" : "=r"(esp) : : ); // expected-error {{invalid % escape in inline assembly string}} 125935a70c1e76d78985f20d422940280161b941299Hans Wennborg} 126