diff options
author | Chris Lattner <sabre@nondot.org> | 2008-02-19 04:36:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-02-19 04:36:07 +0000 |
commit | 689e8b294edd21ffe146a59145db3e03ef1ff2fe (patch) | |
tree | 2afee1c57b936d9e851f2015c35c6f34eb2baebc /lib | |
parent | fa113f815513414a874c5801a5b4dc0ef7dfe8ef (diff) |
Fix PR2060 by rejecting invalid types for integer constants.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47311 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 9674bba4d5..ccfe44ab82 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -378,7 +378,8 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) { // Check to make sure that "Ty" is an integral type, and that our // value will fit into the specified type... case ValID::ConstSIntVal: // Is it a constant pool reference?? - if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { + if (!isa<IntegerType>(Ty) || + !ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { GenerateError("Signed integral constant '" + itostr(D.ConstPool64) + "' is invalid for type '" + Ty->getDescription() + "'"); @@ -387,20 +388,23 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) { return ConstantInt::get(Ty, D.ConstPool64, true); case ValID::ConstUIntVal: // Is it an unsigned const pool reference? - if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) { - if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { - GenerateError("Integral constant '" + utostr(D.UConstPool64) + - "' is invalid or out of range"); - return 0; - } else { // This is really a signed reference. Transmogrify. - return ConstantInt::get(Ty, D.ConstPool64, true); - } - } else { + if (isa<IntegerType>(Ty) && + ConstantInt::isValueValidForType(Ty, D.UConstPool64)) return ConstantInt::get(Ty, D.UConstPool64); + + if (!isa<IntegerType>(Ty) || + !ConstantInt::isValueValidForType(Ty, D.ConstPool64)) { + GenerateError("Integral constant '" + utostr(D.UConstPool64) + + "' is invalid or out of range for type '" + + Ty->getDescription() + "'"); + return 0; } + // This is really a signed reference. Transmogrify. + return ConstantInt::get(Ty, D.ConstPool64, true); case ValID::ConstFPVal: // Is it a floating point const pool reference? - if (!ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) { + if (!Ty->isFloatingPoint() || + !ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) { GenerateError("FP constant invalid for type"); return 0; } |