diff --git a/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 92acdd825d5..486784859bd 100644 --- a/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -146,6 +146,8 @@ public: template bool isBareSimmNLsb0() const { int64_t Imm; RISCVMCExpr::VariantKind VK; + if (!isImm()) + return false; bool IsConstantImm = evaluateConstantImm(Imm, VK); bool IsValid; if (!IsConstantImm) @@ -185,6 +187,8 @@ public: bool isUImm5() const { int64_t Imm; RISCVMCExpr::VariantKind VK; + if (!isImm()) + return false; bool IsConstantImm = evaluateConstantImm(Imm, VK); return IsConstantImm && isUInt<5>(Imm) && VK == RISCVMCExpr::VK_RISCV_None; } @@ -193,6 +197,8 @@ public: RISCVMCExpr::VariantKind VK; int64_t Imm; bool IsValid; + if (!isImm()) + return false; bool IsConstantImm = evaluateConstantImm(Imm, VK); if (!IsConstantImm) IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm); @@ -205,6 +211,8 @@ public: bool isUImm12() const { int64_t Imm; RISCVMCExpr::VariantKind VK; + if (!isImm()) + return false; bool IsConstantImm = evaluateConstantImm(Imm, VK); return IsConstantImm && isUInt<12>(Imm) && VK == RISCVMCExpr::VK_RISCV_None; } @@ -215,6 +223,8 @@ public: RISCVMCExpr::VariantKind VK; int64_t Imm; bool IsValid; + if (!isImm()) + return false; bool IsConstantImm = evaluateConstantImm(Imm, VK); if (!IsConstantImm) IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm); diff --git a/test/MC/RISCV/rv32i-invalid.s b/test/MC/RISCV/rv32i-invalid.s index da49b93bb62..3e4ac85ed60 100644 --- a/test/MC/RISCV/rv32i-invalid.s +++ b/test/MC/RISCV/rv32i-invalid.s @@ -122,6 +122,9 @@ sub t0, t2, 1 # CHECK: :[[@LINE]]:13: error: invalid operand for instruction add ra, zero, zero, zero # CHECK: :[[@LINE]]:21: error: invalid operand for instruction sltiu s2, s3, 0x50, 0x60 # CHECK: :[[@LINE]]:21: error: invalid operand for instruction +# Memory operand not formatted correctly +lw a4, a5, 111 # CHECK: :[[@LINE]]:8: error: immediate must be an integer in the range [-2048, 2047] + # Too few operands ori a0, a1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction xor s2, s2 # CHECK: :[[@LINE]]:1: error: too few operands for instruction