Implement PR2538
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53438 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index a8f0f9b..6f483fa 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -402,6 +402,20 @@
// This is really a signed reference. Transmogrify.
return ConstantInt::get(Ty, D.ConstPool64, true);
+ case ValID::ConstAPInt: // Is it an unsigned const pool reference?
+ if (!isa<IntegerType>(Ty)) {
+ GenerateError("Integral constant '" + D.getName() +
+ "' is invalid or out of range for type '" +
+ Ty->getDescription() + "'");
+ return 0;
+ }
+
+ {
+ APSInt Tmp = *D.ConstPoolInt;
+ Tmp.extOrTrunc(Ty->getPrimitiveSizeInBits());
+ return ConstantInt::get(Tmp);
+ }
+
case ValID::ConstFPVal: // Is it a floating point const pool reference?
if (!Ty->isFloatingPoint() ||
!ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) {
@@ -2453,6 +2467,16 @@
$$ = ValID::create($1);
CHECK_FOR_ERROR
}
+ | ESAPINTVAL { // arbitrary precision integer constants
+ $$ = ValID::create(*$1, true);
+ delete $1;
+ CHECK_FOR_ERROR
+ }
+ | EUAPINTVAL { // arbitrary precision integer constants
+ $$ = ValID::create(*$1, false);
+ delete $1;
+ CHECK_FOR_ERROR
+ }
| FPVAL { // Perhaps it's an FP constant?
$$ = ValID::create($1);
CHECK_FOR_ERROR