diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-01-21 06:27:20 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-01-21 06:27:20 +0000 |
| commit | dc6ceca4bab233e755ea6853e8eca57bb062b69d (patch) | |
| tree | 3757deefc83027090c1ce89fc1a43df1dedfdda1 | |
| parent | f7373377078352d4b900799b3bc80f0c50785243 (diff) | |
| download | bcm5719-llvm-dc6ceca4bab233e755ea6853e8eca57bb062b69d.tar.gz bcm5719-llvm-dc6ceca4bab233e755ea6853e8eca57bb062b69d.zip | |
Fix an inline asm sema bug that I introduced.
llvm-svn: 62666
| -rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Sema/asm.c | 8 |
2 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 4b89acb6901..9b6da0504ad 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -899,8 +899,8 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, ParenExpr *InputExpr = cast<ParenExpr>(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/clang/test/Sema/asm.c b/clang/test/Sema/asm.c index 312b800ec70..4093b1abeb9 100644 --- a/clang/test/Sema/asm.c +++ b/clang/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'}} +} + +// <rdar://problem/6512595> +void test5() +{ + asm("nop" : : "X" (8)); } |

