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