diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 593d5636f2455..ddfa24d9cacf5 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -1229,6 +1229,8 @@ SymbolAssignment *ScriptParser::readSymbolAssignment(StringRef name) { // This is an operator-precedence parser to parse a linker // script expression. Expr ScriptParser::readExpr() { + if (atEOF()) + return []() { return 0; }; // Our lexer is context-aware. Set the in-expression bit so that // they apply different tokenization rules. SaveAndRestore saved(lexState, State::Expr); diff --git a/lld/test/ELF/linkerscript/align-section.test b/lld/test/ELF/linkerscript/align-section.test index 7a28fef2076ed..1324be24a9328 100644 --- a/lld/test/ELF/linkerscript/align-section.test +++ b/lld/test/ELF/linkerscript/align-section.test @@ -1,7 +1,24 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux /dev/null -o %t.o -# RUN: ld.lld -o %t --script %s %t.o -shared +# RUN: rm -rf %t && split-file %s %t && cd %t + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux /dev/null -o a.o +# RUN: ld.lld --script a.t a.o -shared # lld shouldn't crash. +#--- a.t SECTIONS { .foo : ALIGN(2M) {} } + +# RUN: not ld.lld --script b.t 2>&1 | FileCheck %s --match-full-lines --strict-whitespace + +# lld should not crash and report the error properly. + +# CHECK:{{.*}} error: b.t:3: malformed number: : +# CHECK:>>> S :ALIGN(4096) {} +# CHECK:>>> ^ + +#--- b.t +SECTIONS +{ + S :ALIGN(4096) {} +}