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;
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.
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}}
+}