From: Joerg Sonnenberger Date: Thu, 22 Jan 2015 21:01:00 +0000 (+0000) Subject: When reporting constraints that should be constant, the type doesn't X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae54b1db164ef7a651363924bde84fc5c1c32738;p=clang When reporting constraints that should be constant, the type doesn't really help. Improve diagnostics. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226863 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 3e41564a39..19e6861685 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -6173,6 +6173,8 @@ let CategoryName = "Inline Assembly Issue" in { "invalid lvalue in asm input for constraint '%0'">; def err_asm_invalid_input_constraint : Error< "invalid input constraint '%0' in asm">; + def err_asm_immediate_expected : Error<"constraint '%0' expects " + "an integer constant expression">; def err_asm_invalid_type_in_input : Error< "invalid type %0 in asm input for constraint '%1'">; def err_asm_tying_incompatible_types : Error< diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 286c7619ed..0d32581e8d 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -230,9 +230,8 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, llvm::APSInt Result; if (!InputExpr->EvaluateAsInt(Result, Context)) return StmtError( - Diag(InputExpr->getLocStart(), diag::err_asm_invalid_type_in_input) - << InputExpr->getType() << Info.getConstraintStr() - << InputExpr->getSourceRange()); + Diag(InputExpr->getLocStart(), diag::err_asm_immediate_expected) + << Info.getConstraintStr() << InputExpr->getSourceRange()); if (Result.slt(Info.getImmConstantMin()) || Result.sgt(Info.getImmConstantMax())) return StmtError(Diag(InputExpr->getLocStart(), diff --git a/test/Sema/inline-asm-validate-x86.c b/test/Sema/inline-asm-validate-x86.c index 174deca80b..658b714056 100644 --- a/test/Sema/inline-asm-validate-x86.c +++ b/test/Sema/inline-asm-validate-x86.c @@ -6,7 +6,7 @@ void I(int i, int j) { static const int AboveMax = 32; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "I"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'I'}} + : "0"(i), "I"(j)); // expected-error{{constraint 'I' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "I"(BelowMin)); // expected-error{{value '-1' out of range for constraint 'I'}} @@ -23,7 +23,7 @@ void J(int i, int j) { static const int AboveMax = 64; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "J"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'J'}} + : "0"(i), "J"(j)); // expected-error{{constraint 'J' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "J"(BelowMin)); // expected-error{{value '-1' out of range for constraint 'J'}} @@ -40,7 +40,7 @@ void K(int i, int j) { static const int AboveMax = 128; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "K"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'K'}} + : "0"(i), "K"(j)); // expected-error{{constraint 'K' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "K"(BelowMin)); // expected-error{{value '-129' out of range for constraint 'K'}} @@ -57,7 +57,7 @@ void M(int i, int j) { static const int AboveMax = 4; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "M"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'M'}} + : "0"(i), "M"(j)); // expected-error{{constraint 'M' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "M"(BelowMin)); // expected-error{{value '-1' out of range for constraint 'M'}} @@ -74,7 +74,7 @@ void N(int i, int j) { static const int AboveMax = 256; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "N"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'N'}} + : "0"(i), "N"(j)); // expected-error{{constraint 'N' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "N"(BelowMin)); // expected-error{{value '-1' out of range for constraint 'N'}} @@ -91,7 +91,7 @@ void O(int i, int j) { static const int AboveMax = 128; __asm__("xorl %0,%2" : "=r"(i) - : "0"(i), "O"(j)); // expected-error{{invalid type 'int' in asm input for constraint 'O'}} + : "0"(i), "O"(j)); // expected-error{{constraint 'O' expects an integer constant expression}} __asm__("xorl %0,%2" : "=r"(i) : "0"(i), "O"(BelowMin)); // expected-error{{value '-1' out of range for constraint 'O'}}