Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -717,9 +717,10 @@ ]>; // Inline ASM warnings. +def ASMImmediateOperand : DiagGroup<"asm-immediate-operand">; def ASMOperandWidths : DiagGroup<"asm-operand-widths">; def ASM : DiagGroup<"asm", [ - ASMOperandWidths + ASMImmediateOperand, ASMOperandWidths ]>; // OpenMP warnings. Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -6167,6 +6167,9 @@ "invalid lvalue in asm input for constraint '%0'">; def err_asm_invalid_input_constraint : Error< "invalid input constraint '%0' in asm">; + def warn_asm_immediate_expected : Warning<"constraint '%0' expects " + "an integer constant expression">, DefaultError, + InGroup; def err_asm_invalid_type_in_input : Error< "invalid type %0 in asm input for constraint '%1'">; def err_asm_tying_incompatible_types : Error< Index: lib/Sema/SemaStmtAsm.cpp =================================================================== --- lib/Sema/SemaStmtAsm.cpp +++ lib/Sema/SemaStmtAsm.cpp @@ -228,13 +228,11 @@ << InputExpr->getSourceRange()); } else if (Info.requiresImmediateConstant() && !Info.allowsRegister()) { 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()); - if (Result.slt(Info.getImmConstantMin()) || - Result.sgt(Info.getImmConstantMax())) + if (!InputExpr->EvaluateAsInt(Result, Context)) { + Diag(InputExpr->getLocStart(), diag::warn_asm_immediate_expected) + << Info.getConstraintStr() << InputExpr->getSourceRange(); + } else if (Result.slt(Info.getImmConstantMin()) || + Result.sgt(Info.getImmConstantMax())) return StmtError(Diag(InputExpr->getLocStart(), diag::err_invalid_asm_value_for_constraint) << Result.toString(10) << Info.getConstraintStr() Index: test/Sema/inline-asm-validate-x86.c =================================================================== --- test/Sema/inline-asm-validate-x86.c +++ test/Sema/inline-asm-validate-x86.c @@ -6,7 +6,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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'}}