[X86] Fix lifetime of SMRange temporaries.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 30 Jul 2016 11:31:24 +0000 (11:31 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 30 Jul 2016 11:31:24 +0000 (11:31 +0000)
Found by asan -fsanitize-address-use-after-scope.

llvm-svn: 277266

llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp

index bf9f240..d90fa16 100644 (file)
@@ -2685,8 +2685,8 @@ bool X86AsmParser::MatchAndEmitATTInstruction(SMLoc IDLoc, unsigned &Opcode,
   // mnemonic was invalid.
   if (std::count(std::begin(Match), std::end(Match), Match_MnemonicFail) == 4) {
     if (!WasOriginallyInvalidOperand) {
-      ArrayRef<SMRange> Ranges =
-          MatchingInlineAsm ? EmptyRanges : Op.getLocRange();
+      SMRange OpRange = Op.getLocRange();
+      ArrayRef<SMRange> Ranges = MatchingInlineAsm ? EmptyRanges : OpRange;
       return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'",
                    Ranges, MatchingInlineAsm);
     }
@@ -2839,8 +2839,8 @@ bool X86AsmParser::MatchAndEmitIntelInstruction(SMLoc IDLoc, unsigned &Opcode,
   } else if (NumSuccessfulMatches > 1) {
     assert(UnsizedMemOp &&
            "multiple matches only possible with unsized memory operands");
-    ArrayRef<SMRange> Ranges =
-        MatchingInlineAsm ? EmptyRanges : UnsizedMemOp->getLocRange();
+    SMRange OpRange = UnsizedMemOp->getLocRange();
+    ArrayRef<SMRange> Ranges = MatchingInlineAsm ? EmptyRanges : OpRange;
     return Error(UnsizedMemOp->getStartLoc(),
                  "ambiguous operand size for instruction '" + Mnemonic + "\'",
                  Ranges, MatchingInlineAsm);