[ARM, Asm] Use correct source location for register tokens

tryParseRegister advances the lexer, so we need to take copies of the start and
end locations of the register operand before calling it.

Previously, the caret in the diagnostic pointer to the comma after the r0
operand in the test, rather than the start of the operand.

Differential revision: https://reviews.llvm.org/D31537

llvm-svn: 314799
This commit is contained in:
Oliver Stannard 2017-10-03 14:30:58 +00:00
parent 487e504edd
commit 17b7236099
2 changed files with 15 additions and 3 deletions

View File

@ -3407,13 +3407,13 @@ int ARMAsmParser::tryParseShiftRegister(OperandVector &Operands) {
/// parse for a specific register type.
bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
MCAsmParser &Parser = getParser();
const AsmToken &RegTok = Parser.getTok();
SMLoc RegStartLoc = Parser.getTok().getLoc();
SMLoc RegEndLoc = Parser.getTok().getEndLoc();
int RegNo = tryParseRegister();
if (RegNo == -1)
return true;
Operands.push_back(ARMOperand::CreateReg(RegNo, RegTok.getLoc(),
RegTok.getEndLoc()));
Operands.push_back(ARMOperand::CreateReg(RegNo, RegStartLoc, RegEndLoc));
const AsmToken &ExclaimTok = Parser.getTok();
if (ExclaimTok.is(AsmToken::Exclaim)) {

View File

@ -0,0 +1,12 @@
// RUN: not llvm-mc -triple armv6m--none-eabi < %s 2>&1 | FileCheck %s
// Some of these CHECK lines need to uses regexes to that the amount of
// whitespace between the start of the line and the caret is significant.
add sp, r0, #4
// CHECK: error: invalid instruction, any one of the following would fix this:
// CHECK: note: instruction requires: thumb2
// CHECK: note: invalid operand for instruction
// CHECK-NEXT: {{^ add sp, r0, #4}}
// CHECK-NEXT: {{^ \^}}
// CHECK: note: too many operands for instruction