]> granicus.if.org Git - clang/commitdiff
Fix an inline asm sema bug that I introduced.
authorAnders Carlsson <andersca@mac.com>
Wed, 21 Jan 2009 06:27:20 +0000 (06:27 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 21 Jan 2009 06:27:20 +0000 (06:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62666 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/Sema/asm.c

index 4b89acb6901ed35183dbc1e5f2f3d4ecbdefa407..9b6da0504ad0d5f589c71cdc0ceb8ab6af852846 100644 (file)
@@ -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)
index 312b800ec7097edf166ca087f1373e3722468cc5..4093b1abeb943bcade979137f092e3b52631b0ce 100644 (file)
@@ -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)); 
 }