1767a1a2391e60e358ed7d793e091cc1731a5e186Fariborz Jahanian// RUN: %clang_cc1 %s -Wno-private-extern -triple i386-pc-linux-gnu -verify -fsyntax-only 204728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson 3ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 5eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattnervoid f() { 604728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson int i; 704728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson 804728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : : "a" (i + 2)); 904728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : : "a" (f())); // expected-error {{invalid type 'void' in asm input}} 1078b929121f44f7c983fce8c871aa913dce087561Eric Christopher 1104728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : "=a" (f())); // expected-error {{invalid lvalue in asm output}} 1204728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson asm ("foo\n" : "=a" (i + 2)); // expected-error {{invalid lvalue in asm output}} 1342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 1442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : [symbolic_name] "=a" (i) : "[symbolic_name]" (i)); 1542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[" (i)); // expected-error {{invalid input constraint '[' in asm}} 1642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[foo" (i)); // expected-error {{invalid input constraint '[foo' in asm}} 1742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson asm ("foo\n" : "=a" (i) : "[symbolic_name]" (i)); // expected-error {{invalid input constraint '[symbolic_name]' in asm}} 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines asm ("foo\n" : : "" (i)); // expected-error {{invalid input constraint '' in asm}} 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines asm ("foo\n" : "=a" (i) : "" (i)); // expected-error {{invalid input constraint '' in asm}} 2104728b7ea928b029f165fc67d32ced40e6868b31Anders Carlsson} 226fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson 23eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattnervoid clobbers() { 246fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "ax", "#ax", "%ax"); 256fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "eax", "rax", "ah", "al"); 266fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "0", "%0", "#0"); 276fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "foo"); // expected-error {{unknown register name 'foo' in asm}} 286fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "52"); 29c5f9a011a5c13361a3a56ed7fa3507b4b585063eEric Christopher asm ("nop" : : : "104"); // expected-error {{unknown register name '104' in asm}} 306fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "-1"); // expected-error {{unknown register name '-1' in asm}} 316fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson asm ("nop" : : : "+1"); // expected-error {{unknown register name '+1' in asm}} 326fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson} 336bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner 346bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner// rdar://6094010 356bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattnervoid test3() { 366bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner int x; 376bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner asm(L"foo" : "=r"(x)); // expected-error {{wide string}} 386bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner asm("foo" : L"=r"(x)); // expected-error {{wide string}} 396bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner} 406bc52112dbc54551bd8e215d95bba4791b2275f7Chris Lattner 41d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson// <rdar://problem/6156893> 42d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlssonvoid test4(const volatile void *addr) 43d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson{ 4458f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner asm ("nop" : : "r"(*addr)); // expected-error {{invalid type 'const volatile void' in asm input for constraint 'r'}} 45d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "m"(*addr)); 46d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson 47d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "r"(test4(addr))); // expected-error {{invalid type 'void' in asm input for constraint 'r'}} 48d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson asm ("nop" : : "m"(test4(addr))); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 49d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson 50e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson asm ("nop" : : "m"(f())); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 51e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson} 52e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson 53e6ea27995fb15add0de47588b4226049fa0753e5Anders Carlsson// <rdar://problem/6512595> 543182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattnervoid test5() { 5578b929121f44f7c983fce8c871aa913dce087561Eric Christopher asm("nop" : : "X" (8)); 56d9fca6e3950346ea503f92f27ed0f9d8edde9febAnders Carlsson} 5779bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson 5879bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson// PR3385 593182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattnervoid test6(long i) { 6079bc64ceb2586246c74b2584be56ecef00a0c9c1Anders Carlsson asm("nop" : : "er"(i)); 6103eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson} 623182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner 6385759278332404e96d4bb89d0e976e46158cd026Chris Lattnervoid asm_string_tests(int i) { 6478b929121f44f7c983fce8c871aa913dce087561Eric Christopher asm("%!"); // simple asm string, %! is not an error. 653182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner asm("%!" : ); // expected-error {{invalid % escape in inline assembly string}} 66eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm("xyz %" : ); // expected-error {{invalid % escape in inline assembly string}} 67eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner 68eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename]" :: [somename] "i"(4)); // ok 69eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename]" :: "i"(4)); // expected-error {{unknown symbolic operand name in inline assembly string}} 70eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[somename" :: "i"(4)); // expected-error {{unterminated symbolic operand name in inline assembly string}} 71eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722Chris Lattner asm ("%[]" :: "i"(4)); // expected-error {{empty symbolic operand name in inline assembly string}} 7278b929121f44f7c983fce8c871aa913dce087561Eric Christopher 7385759278332404e96d4bb89d0e976e46158cd026Chris Lattner // PR3258 7485759278332404e96d4bb89d0e976e46158cd026Chris Lattner asm("%9" :: "i"(4)); // expected-error {{invalid operand number in inline asm string}} 7585759278332404e96d4bb89d0e976e46158cd026Chris Lattner asm("%1" : "+r"(i)); // ok, referring to input. 763182db1c8e456c4cd2180fac9d77d331b2c0621fChris Lattner} 7749ac88166d36f8c436780694f2ce955acde87c6aChris Lattner 7849ac88166d36f8c436780694f2ce955acde87c6aChris Lattner// PR4077 7949ac88166d36f8c436780694f2ce955acde87c6aChris Lattnerint test7(unsigned long long b) { 8049ac88166d36f8c436780694f2ce955acde87c6aChris Lattner int a; 81f69fcaeb3843297757251a19f0a6f5bbffed7f32Chris Lattner asm volatile("foo %0 %1" : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}} 8249ac88166d36f8c436780694f2ce955acde87c6aChris Lattner return a; 8349ac88166d36f8c436780694f2ce955acde87c6aChris Lattner} 847a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCall 857a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCall// <rdar://problem/7574870> 867a6ae743b2ecfdfadadf7df53b569a9a3871a8fdJohn McCallasm volatile (""); // expected-warning {{meaningless 'volatile' on asm outside function}} 8786eda39c8af47280273758debf0432933bdeee3cAnders Carlsson 8886eda39c8af47280273758debf0432933bdeee3cAnders Carlsson// PR3904 8979ca1ee4b637c01458584bb571f1b309180c780dAnders Carlssonvoid test8(int i) { 9086eda39c8af47280273758debf0432933bdeee3cAnders Carlsson // A number in an input constraint can't point to a read-write constraint. 9179ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : "+r" (i), "=r"(i) : "0" (i)); // expected-error{{invalid input constraint '0' in asm}} 9279ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson} 9379ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 9479ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson// PR3905 9579ca1ee4b637c01458584bb571f1b309180c780dAnders Carlssonvoid test9(int i) { 9679ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : [foo] "=r" (i), "=r"(i) : "1[foo]"(i)); // expected-error{{invalid input constraint '1[foo]' in asm}} 9779ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson asm("" : [foo] "=r" (i), "=r"(i) : "[foo]1"(i)); // expected-error{{invalid input constraint '[foo]1' in asm}} 9886eda39c8af47280273758debf0432933bdeee3cAnders Carlsson} 99baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindola 100baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindolavoid test10(void){ 1012b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara static int g asm ("g_asm") = 0; 1022b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara extern int gg asm ("gg_asm"); 1032b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara __private_extern__ int ggg asm ("ggg_asm"); 1042b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara 1052b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara int a asm ("a_asm"); // expected-warning{{ignored asm label 'a_asm' on automatic variable}} 1062b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara auto int aa asm ("aa_asm"); // expected-warning{{ignored asm label 'aa_asm' on automatic variable}} 1072b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara 1082b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara register int r asm ("cx"); 1092b57aefea762f526405937b3c01901f8e1047edbAbramo Bagnara register int rr asm ("rr_asm"); // expected-error{{unknown register name 'rr_asm' in asm}} 110baf86955a9a390f2643a1ea9806832eb4a92f716Rafael Espindola} 1114da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall 1124da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// This is just an assert because of the boolean conversion. 1134da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// Feel free to change the assembly to something sensible if it causes a problem. 1144da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall// rdar://problem/9414925 1154da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCallvoid test11(void) { 1164da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall _Bool b; 1174da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall asm volatile ("movb %%gs:%P2,%b0" : "=q"(b) : "0"(0), "i"(5L)); 1184da89c87b2b6ca31f1015ec19aae65a02971ea9aJohn McCall} 119de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher 120de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christophervoid test12(void) { 121de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher register int cc __asm ("cc"); // expected-error{{unknown register name 'cc' in asm}} 122de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher} 123935a70c1e76d78985f20d422940280161b941299Hans Wennborg 124935a70c1e76d78985f20d422940280161b941299Hans Wennborg// PR10223 125935a70c1e76d78985f20d422940280161b941299Hans Wennborgvoid test13(void) { 126935a70c1e76d78985f20d422940280161b941299Hans Wennborg void *esp; 127935a70c1e76d78985f20d422940280161b941299Hans Wennborg __asm__ volatile ("mov %%esp, %o" : "=r"(esp) : : ); // expected-error {{invalid % escape in inline assembly string}} 128935a70c1e76d78985f20d422940280161b941299Hans Wennborg} 12914df23bd114919abc374b2bcd2b2e16b79936584Bill Wendling 13014df23bd114919abc374b2bcd2b2e16b79936584Bill Wendling// <rdar://problem/12700799> 131cbd739410be5ecd8161cab1caba54df8cf15b02dBill Wendlingstruct S; // expected-note 2 {{forward declaration of 'struct S'}} 13214df23bd114919abc374b2bcd2b2e16b79936584Bill Wendlingvoid test14(struct S *s) { 13314df23bd114919abc374b2bcd2b2e16b79936584Bill Wendling __asm("": : "a"(*s)); // expected-error {{dereference of pointer to incomplete type 'struct S'}} 13414df23bd114919abc374b2bcd2b2e16b79936584Bill Wendling __asm("": "=a" (*s) :); // expected-error {{dereference of pointer to incomplete type 'struct S'}} 13514df23bd114919abc374b2bcd2b2e16b79936584Bill Wendling} 1365ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer 1375ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer// PR15759. 1385ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramerdouble test15() { 1395ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer double ret = 0; 1405ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"="(ret)); // expected-error {{invalid output constraint '=' in asm}} 1415ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"=&"(ret)); // expected-error {{invalid output constraint '=&' in asm}} 1425ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"+?"(ret)); // expected-error {{invalid output constraint '+?' in asm}} 1435ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"+!"(ret)); // expected-error {{invalid output constraint '+!' in asm}} 1445ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"+#"(ret)); // expected-error {{invalid output constraint '+#' in asm}} 1455ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"+*"(ret)); // expected-error {{invalid output constraint '+*' in asm}} 1465ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"=%"(ret)); // expected-error {{invalid output constraint '=%' in asm}} 1475ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"=,="(ret)); // expected-error {{invalid output constraint '=,=' in asm}} 1485ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"=,g"(ret)); // no-error 1495ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer __asm("0.0":"=g"(ret)); // no-error 1505ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer return ret; 1515ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer} 152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// PR19837 154ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct foo { 155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int a; 156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines char b; 157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 158ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesregister struct foo bar asm("sp"); // expected-error {{bad type for named register variable}} 159ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesregister float baz asm("sp"); // expected-error {{bad type for named register variable}} 160