From: Anders Carlsson Date: Wed, 21 Jan 2009 06:27:20 +0000 (+0000) Subject: Fix an inline asm sema bug that I introduced. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6ea27995fb15add0de47588b4226049fa0753e5;p=clang Fix an inline asm sema bug that I introduced. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62666 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 4b89acb690..9b6da0504a 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -899,8 +899,8 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, ParenExpr *InputExpr = cast(Exprs[i]); // Only allow void types for memory constraints. - if (info & TargetInfo::CI_AllowsMemory) { - + if ((info & TargetInfo::CI_AllowsMemory) + && !(info & TargetInfo::CI_AllowsRegister)) { if (InputExpr->isLvalue(Context) != Expr::LV_Valid) return StmtError(Diag(InputExpr->getSubExpr()->getLocStart(), diag::err_asm_invalid_lvalue_in_input) diff --git a/test/Sema/asm.c b/test/Sema/asm.c index 312b800ec7..4093b1abeb 100644 --- a/test/Sema/asm.c +++ b/test/Sema/asm.c @@ -46,5 +46,11 @@ void test4(const volatile void *addr) asm ("nop" : : "r"(test4(addr))); // expected-error {{invalid type 'void' in asm input for constraint 'r'}} asm ("nop" : : "m"(test4(addr))); // expected-error {{invalid lvalue in asm input for constraint 'm'}} - asm("nop" : : "m"(f())); // expected-error {{invalid lvalue in asm input for constraint 'm'}} + asm ("nop" : : "m"(f())); // expected-error {{invalid lvalue in asm input for constraint 'm'}} +} + +// +void test5() +{ + asm("nop" : : "X" (8)); }