diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -1802,10 +1802,15 @@ } Lex.Lex(); return false; - } else if (Lex.getKind() != lltok::APSInt) { - return tokError("expected integer or string constant"); } - return parseUInt32(AddrSpace); + if (Lex.getKind() != lltok::APSInt) + return tokError("expected integer or string constant"); + SMLoc Loc = Lex.getLoc(); + if (parseUInt32(AddrSpace)) + return true; + if (!isUInt<24>(AddrSpace)) + return error(Loc, "invalid address space, must be a 24-bit integer"); + return false; }; return parseToken(lltok::lparen, "expected '(' in address space") || diff --git a/llvm/test/Assembler/invalid-addrspace.ll b/llvm/test/Assembler/invalid-addrspace.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Assembler/invalid-addrspace.ll @@ -0,0 +1,8 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +; Check that parser rejects address spaces that are too large to fit in the 24 bits + +define void @f() { +; CHECK: invalid address space, must be a 24-bit integer + %y = alloca i32, addrspace(16777216) + ret void +}