]> granicus.if.org Git - clang/commitdiff
Produce a better error message for invalid register names.
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 1 Jan 2011 21:47:03 +0000 (21:47 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 1 Jan 2011 21:47:03 +0000 (21:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122670 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGStmt.cpp
lib/Sema/SemaDecl.cpp
test/Sema/asm.c

index a46a41262709ed4b4cd00c71da625d572fdee9b8..8ccd2893b83c7c2651b08177556bdf42b2823276 100644 (file)
@@ -937,10 +937,7 @@ AddVariableConstraints(const std::string &Constraint, const Expr &AsmExpr,
   if (!Attr)
     return Constraint;
   llvm::StringRef Register = Attr->getLabel();
-  if (!Target.isValidGCCRegisterName(Register)) {
-    CGM.ErrorUnsupported(Variable, "__asm__");
-    return Constraint;
-  }
+  assert(Target.isValidGCCRegisterName(Register));
   if (Constraint != "r") {
     CGM.ErrorUnsupported(&Stmt, "__asm__");
     return Constraint;
index 62262bc60b5361c12ee6c2675eb3ae5be292ff62..abd63198d47b5138b4366919d3f5ac81d67c2478 100644 (file)
@@ -2995,8 +2995,12 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
   if (Expr *E = (Expr*)D.getAsmLabel()) {
     // The parser guarantees this is a string.
     StringLiteral *SE = cast<StringLiteral>(E);
+    llvm::StringRef Label = SE->getString();
+    if (S->getFnParent() != 0 &&
+        !Context.Target.isValidGCCRegisterName(Label))
+      Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
     NewVD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0), 
-                                                Context, SE->getString()));
+                                                Context, Label));
   }
 
   // Diagnose shadowed variables before filtering for scope.
index 814849037911e399540fc8f03d69c5c293e63621..af6754a68b4dc291a1d781b67f94920a7d2688df 100644 (file)
@@ -91,3 +91,7 @@ void test9(int i) {
   asm("" : [foo] "=r" (i), "=r"(i) : "1[foo]"(i)); // expected-error{{invalid input constraint '1[foo]' in asm}}
   asm("" : [foo] "=r" (i), "=r"(i) : "[foo]1"(i)); // expected-error{{invalid input constraint '[foo]1' in asm}}
 }
+
+void test10(void){
+        register unsigned long long bar asm("foo"); // expected-error {{unknown register name 'foo' in asm}}
+}