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 | |
parent | fa113f815513414a874c5801a5b4dc0ef7dfe8ef (diff) | |
download | external_llvm-689e8b294edd21ffe146a59145db3e03ef1ff2fe.zip external_llvm-689e8b294edd21ffe146a59145db3e03ef1ff2fe.tar.gz external_llvm-689e8b294edd21ffe146a59145db3e03ef1ff2fe.tar.bz2 |
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
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 26 | ||||
-rw-r--r-- | test/Assembler/2008-02-18-IntPointerCrash.ll | 6 |
2 files changed, 21 insertions, 11 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 9674bba..ccfe44a 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; } diff --git a/test/Assembler/2008-02-18-IntPointerCrash.ll b/test/Assembler/2008-02-18-IntPointerCrash.ll new file mode 100644 index 0000000..69632ae --- /dev/null +++ b/test/Assembler/2008-02-18-IntPointerCrash.ll @@ -0,0 +1,6 @@ +; RUN: not llvm-as %s |& grep {is invalid or} +; PR2060 + +define i8* @foo() { + ret i8* 0 +} |