1; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s 2 3define void @okay(ptr %p, i32 %x) { 4 call void asm "addl $1, $0", "=*rm,r"(ptr elementtype(i32) %p, i32 %x) 5 ret void 6} 7 8; CHECK: Operand for indirect constraint must have pointer type 9; CHECK-NEXT: call void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 10define void @not_pointer_arg(i32 %p, i32 %x) { 11 call void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 12 ret void 13} 14 15; CHECK: Elementtype attribute can only be applied for indirect constraints 16; CHECK-NEXT: call void asm "addl $1, $0", "=*rm,r"(ptr elementtype(i32) %p, ptr elementtype(i32) %x) 17define void @not_indirect(ptr %p, ptr %x) { 18 call void asm "addl $1, $0", "=*rm,r"(ptr elementtype(i32) %p, ptr elementtype(i32) %x) 19 ret void 20} 21 22; CHECK: Operand for indirect constraint must have elementtype attribute 23; CHECK-NEXT: call void asm "addl $1, $0", "=*rm,r"(ptr %p, i32 %x) 24define void @missing_elementtype(ptr %p, i32 %x) { 25 call void asm "addl $1, $0", "=*rm,r"(ptr %p, i32 %x) 26 ret void 27} 28 29; CHECK: Operand for indirect constraint must have pointer type 30; CHECK-NEXT: invoke void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 31define void @not_pointer_arg_invoke(i32 %p, i32 %x) personality ptr null { 32 invoke void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 33 to label %cont unwind label %lpad 34 35lpad: 36 %lp = landingpad i32 37 cleanup 38 ret void 39 40cont: 41 ret void 42} 43 44; CHECK: Operand for indirect constraint must have pointer type 45; CHECK-NEXT: callbr void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 46define void @not_pointer_arg_callbr(i32 %p, i32 %x) { 47 callbr void asm "addl $1, $0", "=*rm,r"(i32 %p, i32 %x) 48 to label %cont [] 49 50cont: 51 ret void 52} 53